传统蓝牙BR/EDR的搜索Inquiry

传统蓝牙BR/EDR的搜索Inquiry

传统蓝牙BR/EDR的搜索Inquiry_第1张图片

一提到蓝牙想必大家都会随口而出蓝牙音乐、蓝牙免提电话等等蓝牙技术提供的这些功能,这也是用户使用蓝牙的目的。但所有这些功能得以正常使用,有一个必要条件——蓝牙搜索。操作蓝牙的这些功能必须得知道对端蓝牙设备的存在,再与之建立ACL连接,那这就离不开这期的主题,本篇文章就简单介绍下传统蓝牙搜索Inquiry。

蓝牙搜索协议简介

参考文件:蓝牙核心协议《Core_v5.0.pdf》,第二卷,F部分

搜索Inquiry顾名思义就是检测和收集周围环境中的蓝牙设备,根据询问的方式可分为 One-Time Inquiry(一次性询问)Periodic inquiry(周期性询问) 两种搜索模式。需要周期性地搜索蓝牙设备的情况下才会采用周期性询问这种方式,但是由于该种模式使用的场景有限且对功耗是个不小的负担,所以现在市面上的蓝牙设备基本不采用这种搜索模式,接下来就主要介绍下一次性询问。

One-Time Inquiry
步骤1:蓝牙Host通过命令HCI_Inquiry告知控制器Controller进入查询模式,用于发现周围环境中的其他蓝牙设备。
传统蓝牙BR/EDR的搜索Inquiry_第2张图片

步骤2:蓝牙控制器Controller接收到上层开启搜索指令后将以指定的查询访问代码(IAC)和查询时长启动蓝牙基带搜索查询流程,对外发送ID包。周围环境中的蓝牙设备接收到ID包后会自己的设备信息封装到FHS包中做出响应,控制器解析FHS包获取所需的信息,并使用一个或多个查询结果事件将找到的设备相关信息返回给主机Host。
传统蓝牙BR/EDR的搜索Inquiry_第3张图片

步骤3(a):如果主机Host希望停止搜索查询,则使用HCI_Inquiry_Cancel命令通知控制器Controller立即停止查询过程,控制器接收到指令就会停止对外发送ID包执行停止查询流程。
传统蓝牙BR/EDR的搜索Inquiry_第4张图片

步骤3(b):如果主机Host没有主动停止查询,则控制器Controller会在查询上报的结果已达数量限制或者查询时长已到而停止查询,并将查询的完成事件上报给Host。
传统蓝牙BR/EDR的搜索Inquiry_第5张图片

经过以上三步,一个完整的搜索查询Inquiry流程就完成了。对于流程中涉及到的HCI命令或事件再做如下说明:

1、 HCI_Inquiry
传统蓝牙BR/EDR的搜索Inquiry_第6张图片

命令中三个参数的含义如下所示

LAP:上述步骤2中的查询访问代码就是从该值派生得到的,具体取值范围为是 0x9E8B00 ~ 0x9E8B3F,但是只有 0x9E8B000x9E8B33 这两个数值是有效的,其他值保留供将来使用。

  • 0x9E8B33 代表一般/无限制查询访问代码(GIAC)
  • 0x9E8B00 代表有限的专用查询访问代码(LIAC)

由于LIAC的使用有其局限性,所以参数LAP基本上都是使用GIAC这一固定参数。

详细介绍可以参考蓝牙SIG官网Assigned Numbers中的Baseband部分。
链接:https://www.bluetooth.com/specifications/assigned-numbers/baseband/
传统蓝牙BR/EDR的搜索Inquiry_第7张图片

Inquiry_Length:查询模式的总持续时间,当此时间超时后查询将被停止,该参数的取值范围及对应的超时时间如下图:
传统蓝牙BR/EDR的搜索Inquiry_第8张图片

Num_Responses:在查询停止之前可以接收的响应数,当响应数达到该值后,控制器Controller停止当前的查询,并上报Host查询完成事件。该参数的取值范围如下:
传统蓝牙BR/EDR的搜索Inquiry_第9张图片

2、 上报查询的结果
在当前查询期间响应的蓝牙设备如果未被上报过且该设备没有被命令Set_Event_Filter过滤掉应始终以如下三种事件之一(Inquiry Result、Inquiry Result with RSSI或者Extended Inquiry Result)上报主机Host查询的结果,不管采用哪个事件上报Host,都是将查询到的设备信息告知主机。事件中具体包含什么信息感兴趣的同学可以执行查看具体协议中HCI COMMANDS AND EVENTS部分。主机协议栈依次接收到这些设备信息后,解析出相应的数据保存并上报蓝牙服务层。

如果搜索到的蓝牙设备在当前查询或查询期间已经被上报过,则该设备这次可能被上报,也可能不被上报,这取决于控制器Controller中的实现(对同一设备是只上报一次,还是只要设备响应就上报)。

最后随着HCI_Inquiry_Complete事件的上报,查询流程就完结了。那本篇传统蓝牙查询协议分享就到这,感兴趣的小伙伴欢迎私信留言一起讨论。

更多互联互通技术,欢迎关注微信公众号:Connectivity
传统蓝牙BR/EDR的搜索Inquiry_第10张图片

你可能感兴趣的:(Bluetooth)