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

admin 2023年1月8日02:09:00评论82 views字数 2366阅读7分53秒阅读模式

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

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

HCI Command packet

HCI数据格式与蓝牙初始化流程HCI数据格式与蓝牙初始化流程
HCI Command 是蓝牙协议栈发送个蓝牙芯片的命令,有两个字节的 Opcode,其中 OCF 占 10bit,OGF 占 6bit,一个字节的参数长度,剩下的是参数,因为参数长度用一个字节表示所以后面参数最大有 255 个,整个 Command 的长度最大就是 258
HCI数据格式与蓝牙初始化流程
每一个命令去执行都有自己的 Opcode,这个 Opcode 是唯一的,OGF 是一个组,OCF 是组中的一个,在 HCI COMMANDS AND EVENTS 这个目录下面,每一个小标题都有一个 OGF,里面每个 command 都有自己的 OCF(另外还有个 0x3F 是给厂商预留能自己定义的)
比如截图这里 LINK CONTROL 的 OGF 是 0x01,还有个 OCF 是 0x0001 的 Inquiry,他俩组合起来的 opcode 表示 HCI_Inquiry,其他的 command 道理是一样的
HCI数据格式与蓝牙初始化流程
接下来随便打开一个 hci log,看一下 hci_reset,wireshark 已经帮我们解析出来了,OGF 和 OCF 都是 3,并且他们是咋拼起来的也很清楚了,OGF 左移两位,然后和 OCF 拼起来
HCI数据格式与蓝牙初始化流程
按照 OGF 和 OCF 去找也能在核心规范里面找到
HCI数据格式与蓝牙初始化流程
再找一个带参数的,看一下格式
HCI数据格式与蓝牙初始化流程
根据 OGF 和 OCF 在定位核心规范中定位
HCI数据格式与蓝牙初始化流程
一共有两个参数,一个是 BD_ADDR(蓝牙地址),长度是 6 字节,一个是 Role(角色) 长度是 1 字节

HCI Event packet

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

HCI Event 是蓝牙芯片上报给蓝牙协议栈的事件,相比 command,event 的数据格式比较简单,直接用 event code 来定位 event
HCI数据格式与蓝牙初始化流程
比如 HCI_Command_Status 的 event code 是 0xf
HCI数据格式与蓝牙初始化流程
HCI数据格式与蓝牙初始化流程


SIG标准初始化流程

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

接下来通过一个 HCI 日志看一下标准的蓝牙初始化流程
首先下达一个 HCI Reset,相当于芯片的软复位,OGF 是 0x03,OCF 也是 0x0003,他没有参数
HCI数据格式与蓝牙初始化流程
芯片会回复一个 Command Complete,他的 event code 是 0x0e,还有三个参数,Num_HCI_Command_Packets,1byte,对应 Number of Allowed Command Packets 表示可以发送数据包的数量
Command Opcode 就是 command 的 opcode,Return_Parameters 对应 Status: Success (0x00) 表示状态
HCI数据格式与蓝牙初始化流程
Read Local Version Information 读取芯片版本,对应的 OGF 是 0x04,OCF 是 0x01,他返回的参数就比较多了
HCI数据格式与蓝牙初始化流程
主要是返回了蓝牙芯片的版本信息
HCI数据格式与蓝牙初始化流程
这些版本对应的编号在:
https://www.bluetooth.com/specifications/assigned-numbers/ 
第七页中有定义,HCI Version 就是蓝牙协议的版本
HCI数据格式与蓝牙初始化流程
Read Buffer Size,读取缓冲区大小 OGF 是 0x04,OCF 是 0x05,没有参数,缓冲区大小是流控用到的
HCI数据格式与蓝牙初始化流程
Read BD ADDR 获取蓝牙地址,OGF 是 0x04,OCF 是 0x09,返回一个状态和一个蓝牙地址
HCI数据格式与蓝牙初始化流程
Write Class of Device 设置 Class of Device,OGF 是 0x03,OCF 是 0x024 用来标识设备类型,手机配对蓝牙设备的时候前面的耳机、键盘图标类型就是靠 cod 来标识的,详细见:
https://blog.csdn.net/XiaoXiaoPengBo/article/details/108366776
HCI数据格式与蓝牙初始化流程
Write Local Name设置蓝牙设备的名字,OGF是0x03,OCF是0x013,有一个参数是设备的名字
HCI数据格式与蓝牙初始化流程
Write Page Timeout 作用是给 controller 设置一个超时时间,当 controller 超过了这个时间还连接不上对端设备就给 host 上报
HCI数据格式与蓝牙初始化流程
Set Event Mask 是 host 告诉 controller 想要接受哪些事件,不想接受哪些事件,controller 就只会上报 host 想接收的的事件
HCI数据格式与蓝牙初始化流程
Write Simple Pairing Mode 是设置 SSP 配对方式,如果 Simple Pairing Mode 是 disable 的话就是 PINCODE 方式,需要手动输入配对码;如果双方都是 Simple Pairing Mode enable 的话,会以弹出一个小窗口展示配对码,点击配对的形式
HCI数据格式与蓝牙初始化流程
Write Inquiry Mode 设置搜索模式有三种搜索模式

第一种模式每个设备只上报一次标准信息,有蓝牙地址、cod 等,不管信号强度咋变,只上报一次


第二种模式会在标准的蓝牙信息前提再带上信号强度 RSSI,会重复上报


第三种模式会带 EIR 会带蓝牙名称、支持的 UUID 以及自定义的信息,会重复上报

这个数据包就是告诉告诉芯片要第三种模式,对端支持的信息都要拿到 Inquiry Result with RSSI format or Extended Inquiry Result format
HCI数据格式与蓝牙初始化流程
Write Scan Enable 设置 scan 模式,有两种模式,一个是 Inquiry Scan 一种是 Page Scan,只有开启了 Inquiry Scan 才能被搜索到,只有开启了 Page Scan 才能被连接,这里全部开启了,即可以被搜索和连接
HCI数据格式与蓝牙初始化流程
Write LE Host Supported 这一步相当于是使能 LE
HCI数据格式与蓝牙初始化流程
Write LE Host Supported 设置 EIR 信息,这个东西之后具体学习
HCI数据格式与蓝牙初始化流程
初始化到这里就算是结束了,再往下就是对端设备的连接请求了
如果只是想要被搜索到,一个 HCI Reset、一个 Write Local Name、一个 Scan Enable 就足够了

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


原文始发于微信公众号(陈冠男的游戏人生):HCI数据格式与蓝牙初始化流程

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月8日02:09:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HCI数据格式与蓝牙初始化流程http://cn-sec.com/archives/1444350.html

发表评论

匿名网友 填写信息