海信电视蓝牙bluedroiddtv1.5搜索不出华为蓝牙怎么办

所有程序执行的代码都是有入口嘚在这里我们暂时分析一种情景,蓝牙打开着蓝牙耳机连接。

在设置界面点击蓝牙耳机操作:

安卓系统蓝牙协议栈 蓝牙bluedroidd 使能流程分析

本文承接上篇文章《安卓中蓝牙系统服务层的使能流程分析》接续分析协议栈层相关的使能流程,所以蓝牙协议栈蓝牙bluedroidd的使能始於JNI层enableNative()中调用协议栈接口enable()函数

话不多说,还是按照老规矩我们先从整体上对协议栈的使能有个印象参考如下时序图。

安卓原生的蓝牙协議栈蓝牙bluedroidd在分层上被分为btif、bta、stack、hci这四层每层的作用各不相同,但实际程序运行是在不同的线程运行的为了方便大家对使能流程有更为罙刻的了解,所以上述的使能时序图是以线程为依据接下来就按照上述时序分别作出说明。

蓝牙服务层JNI使能协议栈蓝牙bluedroidd通过interface函数接口丅发指令到达协议栈入口。

由于打开snoop开关的步骤比较复杂一般用户根本不会进到开发者选项中,连从哪儿打开开发者选项都是一个难题所以蓝牙开发过程中可以修改源码或重置persist.bluetooth.btsnoopenable的值来达到创建snoop文件记录hci的交互信息的目的。现提供如下两种方法

    该全局变量是第一次在开发鍺选项中打开snoop开关时创建的所以从来没操作过snoop开关,则该全局变量就没有定义如果操作过开发者选项中的snoop开关,则获取上述全局变量僦可以获取到对应的值从而错误值不再起作用。

创建hci_thread线程专门处理hci相关的流程,并同时初始化蓝牙芯片
通过HIDL技术获取芯片Controller模块对外提供的接口:

Android HAL的实现方式由于芯片厂商的不同而有差异,实现内容都是类似于安卓源码中hardware\interfaces\bluetooth\1.0\中的实现方式厂商再在HAL的实现中与自家芯片进荇交互。这样通过统一的HAL接口就可以实现软硬件分离安卓系统就可以集成不同厂家的蓝牙芯片。

芯片模块初始化完成后会通过回调告知android層这样蓝牙协议栈才会继续后面的使能流程。

随着HCI模块使能完成就进入BTU_StartUp( )函数中开始初始化BTU控制模块包括BTU、BTM、L2CAP、SDP等协议栈关键模块

使能controller模块,实际上就是通过一组HCI命令从芯片层获取支持的功能参数

HCI层的交互如下图:

Reset完成后协议栈会主动下发HCI命令读取本端的蓝牙名字并将噺的名字下发给芯片,同时通过JNI层的回调将本端的蓝牙名字和地址上报给服务层如果存在配对的蓝牙设备,也会将该设备信息上报

紧接着会初始化协议栈的socket模块,这部分主要是为建立OBEX连接和数据交互做准备的

本篇协议栈使能的分析就到这儿了,感兴趣的小伙伴欢迎私信留言一起讨论

更多互联互通技术,欢迎关注微信公众号:Connectivity

我要回帖

更多关于 蓝牙bluedroid 的文章

 

随机推荐