前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HCI数据格式与蓝牙初始化流程

HCI数据格式与蓝牙初始化流程

作者头像
yichen
发布2023-01-13 20:58:02
1.5K0
发布2023-01-13 20:58:02
举报

HCI 是 Host Controller Interface 的缩写,是Host和Controller之间的桥梁,在蓝牙 Core Specification 5.3 的 vol4

HCI Command packet

HCI Command 是蓝牙协议栈发送个蓝牙芯片的命令,有两个字节的 Opcode,其中 OCF 占 10bit,OGF 占 6bit,一个字节的参数长度,剩下的是参数,因为参数长度用一个字节表示所以后面参数最大有 255 个,整个 Command 的长度最大就是 258

每一个命令去执行都有自己的 Opcode,这个 Opcode 是唯一的,OGF 是一个组,OCF 是组中的一个,在 HCI COMMANDS AND EVENTS 这个目录下面,每一个小标题都有一个 OGF,里面每个 command 都有自己的 OCF(另外还有个 0x3F 是给厂商预留能自己定义的)

比如截图这里 LINK CONTROL 的 OGF 是 0x01,还有个 OCF 是 0x0001 的 Inquiry,他俩组合起来的 opcode 表示 HCI_Inquiry,其他的 command 道理是一样的

接下来随便打开一个 hci log,看一下 hci_reset,wireshark 已经帮我们解析出来了,OGF 和 OCF 都是 3,并且他们是咋拼起来的也很清楚了,OGF 左移两位,然后和 OCF 拼起来

按照 OGF 和 OCF 去找也能在核心规范里面找到

再找一个带参数的,看一下格式

根据 OGF 和 OCF 在定位核心规范中定位

一共有两个参数,一个是 BD_ADDR(蓝牙地址),长度是 6 字节,一个是 Role(角色) 长度是 1 字节

HCI Event packet

HCI Event 是蓝牙芯片上报给蓝牙协议栈的事件,相比 command,event 的数据格式比较简单,直接用 event code 来定位 event

比如 HCI_Command_Status 的 event code 是 0xf

SIG标准初始化流程

接下来通过一个 HCI 日志看一下标准的蓝牙初始化流程

首先下达一个 HCI Reset,相当于芯片的软复位,OGF 是 0x03,OCF 也是 0x0003,他没有参数

芯片会回复一个 Command Complete,他的 event code 是 0x0e,还有三个参数,Num_HCI_Command_Packets,1byte,对应 Number of Allowed Command Packets 表示可以发送数据包的数量

Command Opcode 就是 command 的 opcode,Return_Parameters 对应 Status: Success (0x00) 表示状态

Read Local Version Information 读取芯片版本,对应的 OGF 是 0x04,OCF 是 0x01,他返回的参数就比较多了

主要是返回了蓝牙芯片的版本信息

这些版本对应的编号在:

https://www.bluetooth.com/specifications/assigned-numbers/

第七页中有定义,HCI Version 就是蓝牙协议的版本

Read Buffer Size,读取缓冲区大小 OGF 是 0x04,OCF 是 0x05,没有参数,缓冲区大小是流控用到的

Read BD ADDR 获取蓝牙地址,OGF 是 0x04,OCF 是 0x09,返回一个状态和一个蓝牙地址

Write Class of Device 设置 Class of Device,OGF 是 0x03,OCF 是 0x024 用来标识设备类型,手机配对蓝牙设备的时候前面的耳机、键盘图标类型就是靠 cod 来标识的,详细见:

https://blog.csdn.net/XiaoXiaoPengBo/article/details/108366776

Write Local Name设置蓝牙设备的名字,OGF是0x03,OCF是0x013,有一个参数是设备的名字

Write Page Timeout 作用是给 controller 设置一个超时时间,当 controller 超过了这个时间还连接不上对端设备就给 host 上报

Set Event Mask 是 host 告诉 controller 想要接受哪些事件,不想接受哪些事件,controller 就只会上报 host 想接收的的事件

Write Simple Pairing Mode 是设置 SSP 配对方式,如果 Simple Pairing Mode 是 disable 的话就是 PINCODE 方式,需要手动输入配对码;如果双方都是 Simple Pairing Mode enable 的话,会以弹出一个小窗口展示配对码,点击配对的形式

Write Inquiry Mode 设置搜索模式有三种搜索模式

第一种模式每个设备只上报一次标准信息,有蓝牙地址、cod 等,不管信号强度咋变,只上报一次 第二种模式会在标准的蓝牙信息前提再带上信号强度 RSSI,会重复上报 第三种模式会带 EIR 会带蓝牙名称、支持的 UUID 以及自定义的信息,会重复上报

这个数据包就是告诉告诉芯片要第三种模式,对端支持的信息都要拿到 Inquiry Result with RSSI format or Extended Inquiry Result format

Write Scan Enable 设置 scan 模式,有两种模式,一个是 Inquiry Scan 一种是 Page Scan,只有开启了 Inquiry Scan 才能被搜索到,只有开启了 Page Scan 才能被连接,这里全部开启了,即可以被搜索和连接

Write LE Host Supported 这一步相当于是使能 LE

Write LE Host Supported 设置 EIR 信息,这个东西之后具体学习

初始化到这里就算是结束了,再往下就是对端设备的连接请求了

如果只是想要被搜索到,一个 HCI Reset、一个 Write Local Name、一个 Scan Enable 就足够了

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档