Android智能设备上多蓝牙芯片的动态管理方法与流程

文档序号:17065721发布日期:2019-03-08 22:54阅读:561来源:国知局
Android智能设备上多蓝牙芯片的动态管理方法与流程

本发明涉及一种蓝牙芯片的管理方法,具体涉及一种android智能电视上多蓝牙芯片的动态管理方法,属于android智能设备技术领域。



背景技术:

当前android智能电视基本标配了蓝牙功能,因为蓝牙在低功耗,数据传输方面有一定优势。但是当前支持android智能电视的蓝牙芯片有不同的厂商,其采用的蓝牙应用服务,蓝牙协议栈以及蓝牙设备驱动都有芯片厂商自己的特殊定制,无法实现一套蓝牙代码兼容不同蓝牙厂商的芯片,导致android系统编译生成的镜像文件只能与某一个特定的蓝牙芯片绑定。

现有的连接方式存在如下问题:一是无法实现蓝牙芯片的更改,如用户希望使用其他的蓝牙接收器就无法实现。二是大大增加了android整机系统镜像文件的维护工作量,如采用一个新的蓝牙芯片,就需要针对这个芯片重新维护一套android整机系统镜像文件。

本发明就是针对在android智能电视上蓝牙芯片无法动态管理加载的问题,提出了一个有效的解决方法。



技术实现要素:

本发明的目的就是解决现有技术中android智能电视无法动态兼容多个蓝牙芯片的问题,提供一种android智能设备上多蓝牙芯片的动态管理方法。

本发明主要是通过在android智能电视上,动态识别接入的蓝牙芯片,然后根据蓝牙芯片的型号,在android运行的不同阶段,选择合适的时机运行加载蓝牙芯片对应的蓝牙设备驱动、蓝牙协议栈以及蓝牙应用服务,从而实现对多蓝牙芯片的动态管理。

在具体介绍本发明的技术方案之前,对本发明涉及到的相关技术内容进行说明如下:

android智能电视的蓝牙启动机制:

android系统的内核启动完成后,首先会创建init进程,在此进程中android系统会通过insmod的方式将指定蓝牙设备驱动程序载入内核,完成蓝牙芯片相关初始化工作。然后在android系统核心进程启动完毕后,在进程system_server中通过跨进程的通讯方式启动指定蓝牙应用服务。最后在蓝牙应用服务初始化的过程中,通过androidhardware动态获取蓝牙的moduleid,把蓝牙协议栈加载起来并完成相关初始化工作,这样蓝牙功能就成功打开,可以提供相关的蓝牙服务。

通过上面的描述,可以知道如果想要做到能够根据不同蓝牙芯片动态加载对应的蓝牙模块,关键就在于能够在加载运行蓝牙设备驱动、蓝牙协议栈以及蓝牙应用服务之前,能够通过合适的方法识别不同的蓝牙芯片型号,并且根据型号的不同,采取合适的方法加载不同的代码模块。

本发明具体是这样实现的:

android智能设备上多蓝牙芯片的动态管理方法,包括如下步骤:

步骤一、蓝牙芯片型号的获取

android系统的内核启动完成以后,在insmod蓝牙设备驱动之前。首先通过linux内核提供的标准方法,获取当前内核识别到的usb设备的productid和vendorid,然后在init进程中通过对pid和vid的判断,来加载当前内核识别到的蓝牙芯片的设备驱动文件。

程序加载完成之后,通过android提供的系统属性服务,设置一个系统属性作为蓝牙芯片型号的标志,以便后续的程序可以简单的通过这个标志来获取当前接入的蓝牙芯片型号。

步骤二、不同蓝牙模块的加载

首先为了运行加载不同的蓝牙应用服务和蓝牙协议栈,需要预置蓝牙芯片对应的蓝牙应用和协议栈。由于系统只支持运行一个蓝牙进程,所以必须对不同的蓝牙应用和协议栈进行区分,蓝牙应用采用定义不同的匹配动作action,让上层应用获取蓝牙服务主服务的时候通过定义的字符串启动对应蓝牙应用,其中涉及的其他服务的名字不变。蓝牙协议栈通过在android编译文件中指定不同的名字,然后把指定的名字通过前面的系统属性服务存储在系统中,这样就可以在硬件抽象层加载协议栈的时候根据系统属性进行区别。

其次,在系统核心进程启动完毕后,通过判断前面在init中设置的标志,指定跨进程启动对应蓝牙芯片的蓝牙应用服务,这样上层的应用接口就和当前接入芯片的蓝牙应用服务实现了对应。

最后,在蓝牙应用服务初始化的过程中,会通过jni去获取硬件抽象层的id,需要在获取硬件抽象层接口中,根据init中设置的标志,查找系统hardware目录下的对应蓝牙协议栈的库文件,找到对应的蓝牙库文件后,把库文件的路径和名字传入load方法,这样就完成了蓝牙芯片对应蓝牙协议栈的加载。

通过以上的步骤,就可以动态根据接入的蓝牙芯片不同,从而使能对应蓝牙功能。

在步骤一之前,需要预先将不同蓝牙芯片的驱动程序、蓝牙协议栈,以及蓝牙应用服务程序预置在系统中,具体包括:

为不同蓝牙芯片的蓝牙设备驱动程序和蓝牙协议栈定制不同的名字,然后在对驱动程序和蓝牙协议栈进行命名,比如在makefile中按照btusb_xxx.ko(xxx代表厂商型号)的格式命名驱动程序,在android.mk中按照bluetooth,xxx.so的格式命名蓝牙协议栈。

对蓝牙应用服务程序进行编译,编译出包名与action完全不一样的应用,从而使得系统bind指定的蓝牙应用服务程序。

本发明具有如下有益效果:

解决了当前android智能电视无法根据接入蓝牙芯片动态加载使能的问题。采用此方案可以实现一套android整机镜像版本兼容多个蓝牙芯片,大大减少软件移植的工作量。也可以让用户在蓝牙接收器上有了选择,提升了用户体验。同样,本申请还适用于除了android智能电视之外的其他android智能设备上。

附图说明

图1为系统获取蓝牙芯片型号的流程

图2为系统动态加载蓝牙各个模块实施流程

具体实施方式

下面结合附图和具体实施例对本发明作进一步的说明。

本实施实例采用以上的发明方案,应用于android6.0智能电视机芯平台具体实施方式是:

1、定制不同芯片厂家的蓝牙设备驱动程序、蓝牙协议栈的名字,在makefile中按照btusb_xxx.ko(xxx代表厂商型号)的格式命名驱动程序,在android.mk中按照bluetooth,xxx.so的格式命名蓝牙协议栈。

2、由于androidframework层是通过bindservice启动蓝牙应用服务,而蓝牙应用服务是一个apk文件,蓝牙应用的编译需要依赖androidsdk,然后通过android标准makefile文件进行编译。由于系统服务的启动可以通过包名来区别,所以为了让android的系统启动服务程序可以获取到不同的蓝牙应用服务,所以我们需要编译出两个或多个包名和action完全不一样的应用,这样才能让系统bind指定的蓝牙应用服务程序。

3、android系统启动init进程之后,在init脚本文件中通过lsusb的方式向系统查询当前所有接入的usb设备,然后在内核返回的查询结果中通过pid和vid进行筛选,找到当前实际接入的蓝牙芯片,然后根据设备驱动程序的名字insmod对应的驱动。最后通过android系统属性的方式设置一个蓝牙系统属性来表示当前接入设备的型号,具体如附图1所示。

4、在系统核心进程system_server中启动bluetoothmanagerservice服务并完成初始化工作,当收到系统开机完毕的广播后,首先通过判断dev设备节点来确定蓝牙设备驱动程序是否加载正确,然后通过系统属性获取当前蓝牙芯片型号,最后向bindservice方法传入指定的包名和action,这样就通过跨进程的方式启动了蓝牙芯片对应的蓝牙应用服务。

5、上层以bindservice的方式启动蓝牙应用服务,蓝牙应用服务初始化的过程中会通过jni的方式调用hw_get_module接口来获取硬件抽象层的id,在硬件抽象层中我们根据init设置的系统属性来选择对应的device_id,最后把device_id传入load蓝牙协议栈的方法,系统会根据device_id加载对应的蓝牙库文件。

尽管这里参照本发明的解释性实施例对本发明进行了描述,上述实施例仅为本发明较佳的实施方式,本发明的实施方式并不受上述实施例的限制,应该理解,本领域技术人员可以设计出很多其他的修改和实施方式,这些修改和实施方式将落在本申请公开的原则范围和精神之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1