最近研究蓝牙协议栈,以下笔记从hci层说明蓝牙协议栈初始化过程,以下截图是通过wireshark截取证明的
实验电脑:x86 ubuntu-20
蓝牙模块:ESP32 hci
硬件连接 :h4(串口流控)
1.初始化硬件
host主机(linux系统)初始化h4硬件,系统(host主机)加载驱动
2.发送ESP32 reset命令(host->control)
3.读取 Local Supported Features(host->control)
该命令可以查询hci支持功能
返回值:
通过hciconfig -a,可以看到命令行打印出支持功能,刚好跟上图wireshark抓包返回值数据符合
4.查询设备esp32 hci版本号
把wireshark抓包数据跟hciconfig -a命令数据进行对比,发现支持esp32 hci 和LMP支持版本是4.2,其他参数看不懂,有兴趣小伙伴请自行百度。
5.读取mac地址
6.读取 buffer size
返回值包含以下:ACL pakcet length为1021,在raw data 为fd 03,SCO packet length为255,在raw data 为ff。
7.读取class device
8.读取device name
9.发送Set Event Mask,接收到command complete with comand opcode.
10.设置Connection Accept Timeout
这里返回值raw data为00 7d,所以timeout时间为0.625*32000=20000ms.
接着会初始化ble 参数
11.读取ble buffer size
根据返回值,ble acl为251
12.读取le feature
13.读取支持status
14.读取支持 command 版本
15.发送Write Simple Pairing command,接收到command complete with comand opcode.
下面看下Write Simple Pairing(OGF=0x03)的封包格式
参数:
Simple_Pairing_mode:设置SSP的参数
查看抓包信息可知,raw data为1,所以为enable pairing
16.设置irquiry mode
根据这个设定值,我们知道controller 可能会上传event的类型。假如mode = 0x02,那么controller上传的event的类型就可能是Inquiry Result with RSSI format or Extended Inquiry Result format ,如果mode = 1,那么上传的event只能是Inquiry Result format with RSSI。
17.读取发射功率
18.设置le event mask.
19.读取link key
20.设置 Default Link Policy Settings
从以上截图可以知道,只是打开LINK POLICY为RSWITCH SNIFF,link mode 为Slave Accept.
21.读取 le White list size
后面我就不展开秒数,其实每个芯片逻辑顺序有不一样,但是原理都是差不多,我写这篇博客出来,只是给大家提供hci初始化大概流程。如果还是要深入了解,还是必须手动操作,自己根据wireshark抓包慢慢分析,并且看文档非常重要。