蓝牙协议栈 hci分析初始化

本文详细介绍了蓝牙协议栈的初始化过程,从Linux系统加载HCI驱动开始,包括发送重置命令、查询本地支持特性、读取MAC地址、版本号、设置事件掩码等步骤。通过Wireshark抓包分析,验证了每个步骤的正确性,并展示了ESP32 HCI在蓝牙4.2版本下的配置细节。此外,还涉及BLE缓冲区大小、LE特征、设备名称等配置,为理解蓝牙协议栈提供了基础参考。
摘要由CSDN通过智能技术生成

最近研究蓝牙协议栈,以下笔记从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抓包慢慢分析,并且看文档非常重要。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值