本文介绍: 当应用调用startDiscovery()时,Host通过HCI发送一个 Inquiry HCI Command给 Controller接下来我们通过分析HCI log,来学习Inquiry流程。在分析HCI log前,我们先来学习下HCI Command数据包结构

案例1–蓝牙扫描设备过程分析

应用层发起搜索蓝牙设备,Android 官方提供的蓝牙扫描方式三种,分别如下

应用层调用startDiscovery()时,Host会通过HCI发送一个 Inquiry HCI Command给 Controller接下来我们通过分析HCI log,来学习Inquiry流程。在分析HCI log前,我们先来学习下HCI Command数据包的结构

1.1 HCI Command 数据结构

HCI Command数据包结构定义蓝牙核心协议规范Core_v5.3.pdf中。
HCI Command数据包格式如下开头的Opcode是区分不同类型命令唯一标识,Opcode由OpCode Group Field (OGF) 和 OpCode Command Field (OCF)组成。根据OGF的值,可以将HCI commands进行分类。OpCode计算公式为:** OpCode = OGF << 6 + OCF 。有了OpCode计算方式,我们就可以通过OpCode过滤**HCI log里面指定类型的HCI Command

HCI Command packet

OpCode 计算方法

1.2 过滤 Inquiry Command

Inquiry Command 是 Link Control command 类型command,通过查询 Bluetooth Core Specification 中的 Vol4-&gt; Part E-> 7.1Link Control Command小节,可知,Link Control Command的 OCF值为 0x0001.

Bluetooth Core Specification V5.3

Inquiry Command

因此,Inquiry Command 的Opcode 为 0x0001 << 6 + 0x01 = 0x0401,通过0x0401就确定某条command为 Inquiry Command,该命令名称为 HCI_Inquiry

ComProbe Protocol Analysis Syste支持过滤功能,通过设置filter可以过滤出 Opcode为 0x0401的log设置方法如图

过滤HCI_Inquiry

1.3 扫描过程分析

1.发送Inquiry请求

应用层要进行蓝牙设备扫描,Host先发一条 HCI_Inquiry的Command 通知 Controller

HOST发送HCI_Inquiry

Controller在收到HCI_Inquiry这条Command后,会回复一条Command Status的HCI Event,来表示Controller执行HCI_Inquiry后的状态,即Status: Success。并且这两条HCI log的Frame标号是挨着的,HCI_Inquiry的帧号是127,Command Status的帧号是128。

Controller:Command status

2.扫描结果

扫描完成后,Controller会发送Event: HCI Extended Inquiry Result。以列表中搜索到的Jabra Classic v0.5.3为例,它的HCI Extended Inquiry Result数据包中会包含它的设备名称、它所支持的Service的UUID,和设备类型:Wearable Headset device,因此,Jabra Classic v0.5.3的Icon是一个耳机图标

扫描结果

HCI日志详情

以上就是大致的蓝牙搜索列表显示流程分析。

原文地址:https://blog.csdn.net/sdkdlwk/article/details/134755649

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_29704.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注