本期承接上篇分享《传统蓝牙无法进行通信BR/EDR的搜索Inquiry》来聊聊安卓系统中传统蓝牙无法进行通信搜索是如何实现的
安卓源码版本:Android 9,P(Pie馅饼)版本
在分析之前对第三方应鼡有如下几个要求:
- 确保应用的清单文件 AndroidManifest.xml 中具有如下几个权限(也可动态申请)
- 注册了设备发现的广播接收处理这样才能接收扫描到的藍牙无法进行通信设备信息
Application通过满足上述三个条件后,只要触发搜索流程开启就可以等待设备信息的上报再做进一步处理先让我们整体看下搜索流程的时序图:
以上就是传统蓝牙无法进行通信查询的完整流程,其实在开始传统蓝牙无法进行通信查询的同时安卓系统也会開启低功耗蓝牙无法进行通信BLE的scan流程,时序图中将这部分内容去掉了留待以后分析BLE扫描时再做分析(挖个坑…)。
指令一直被下发到协議栈bluedroid后开始封装数据,并且中间的处理过程都是在协议栈中进行的所以接下来重点分析下协议栈内部是如何玩转扫描流程的。
2、 指令進一步被下发到协议栈的stack层中的 BTM_StartInquiry() 继续处理在这里判断查询模式参数如果包含ble,则发起ble的scan扫描
6、 通过设置的查询模式确定Inquiry指令中的查询訪问代码LAP值
7、 安卓系统蓝牙无法进行通信协议栈bluedroid中默认采用One-Time Inquiry查询方式,且该方式的查询结果上报的数量限制默认为 0 也就是不限制上报的數量。
11、 查询时间12.8s触发控制器Controller通过Inquiry Complete事件通知协议栈查询Inquiry流程完成。但协议栈在收到该完成事件时不会立即上报服务层查询结束。
12、 协議栈会先通过查询记录对每一个设备发起Discovery流程(主要通过请求远端名)
13、 最后所有查询记录中的设备都Discovery完成后,才会上报传统蓝牙无法進行通信查询结束
经过以上这些步骤,安卓系统中的搜索流程成功完成流程对应的HCI交互如下:
本篇流程的分析主要看上述的那幅时序圖就可以了,其他细枝末节的问题可以参照安卓源码或协议再分析这里就不做分析了。感兴趣的小伙伴欢迎私信留言一起讨论
更多互聯互通技术,欢迎关注微信公众号:Connectivity