蓝牙学习五(广播包分析wireshark)
可以看到1号的信道为37,开始到结束时间为296us。2号的信道为38,开始到结束时间为296us。3号的信道为39,开始到结束时间为296us。1号到2号的间隔为1000us左右,2号到3号的间隔为1000us左右。从上图可以看到,1号广播是37信道,并且在37信道接收到了SCAN_RSP。因为SCAN_RSP是对SCAN_REQ的回应,所以其中会包含一些其他的信息。scanner也就是获得了这
1.简介
软件工具:wireshark
硬件抓包工具:nrf52840 dongle
2.数据包分析
使用wireshark抓到的数据包分为两个部分,一部分是软件自己添加的内容,另一部分才是广播出来的数据。
2.1软件添加部分
软件添加的大部分内容可以不关注。这里需要关注的内容如下:
这里主要关注信道和时间戳。
还记得在上一章的内容吗?蓝牙总共有40个信道,而广播是在37、38、39三个信道依次发送。且广播间隔不超过10ms。不记得得话,可以回去复习一下。蓝牙学习四(广播)_t_guest的博客-CSDN博客
这里我们截取三个相邻的广播包来分析一下:
上边截取了相邻的三个广播数据包。可以看到1号的信道为37,开始到结束时间为296us。2号的信道为38,开始到结束时间为296us。3号的信道为39,开始到结束时间为296us。1号到2号的间隔为1000us左右,2号到3号的间隔为1000us左右。
可以看到,此时广播是从37信道开始,依次为37、38、39信道。当在39信道广播数据后,收到了SCAN_RSP。此时则停止广播。下次再进行广播的话,又从37信道开始。
如果说在一次广播事件中,没有广播到39信道就收到SCAN_RSP会如何呢?上一章我们也说过,就算收到了SCAN_RSP,依旧会继续广播。见下图:
从上图可以看到,1号广播是37信道,并且在37信道接收到了SCAN_RSP。而此时广播事件并没有停止,而是继续在38、39信道进行广播。这也与上一章我们介绍的相同。
2.2 广播数据内容
2.2.1 非定向可连接广播事件(ADV_IND)
蓝色数据部分就是真是广播的内容。这里进行拆分。总共分为6部分。
Access Address(目标地址):
4字节,小端。上图的值为 0x8e89bed6。所以BLE设备的广播帧都是使用这个地址。
PDU Header(PDU 包头)
PDU Header 虽然只有2字节。但是包含了很多内容。
PDU Header拆分如下:
PDU type为广播类型:
ADV_IND:非定向可连接广播,即通用广播
ADV_DIRECT_IND:定向可连接广播,即快速广播。
ADV_NONCONN_IND:非定向必可连接广播,即不能建立连接的广播。
ADV_SCAN_IND:扫描帧,是由scanner(手机、平板、PC)发出的。主动扫描时使用。
SCAN_REQ:扫描请求帧,是由scanner(手机、平板、PC)发出的。只在scanner想从advertiser获取更多的广播数据的时候才由scanner发出。
SCAN_RSP:当advertiser收到SCAN_REQ时的回应。
CONNECT_REQ(CONNECT_IND):scanner(手机、平板、PC)向advertiser发送的连接请求。
本次抓的数据,使用的就是ADV_IND。
Advertising Address (广播设备MAC地址)
Advertising Data (广播包数据)
广播包数据都是以 长度+内容来表示的。比如这里我们抓的数据。
02 01 06为一组,11-00为一组。
长度为02,01表示指令类型, 表示当前设备不支持经典蓝牙,是通用可发现模式。
长度为0x11(17),0x16表示为服务数据。后续内容为在程序中组包的内容。
CRC(CRC校验值)
广播数据内容的校验值
2.2.2扫描应答(SCAN_RSP)
数据结构与ADV_IND是相同的,这里不再重复介绍。直说关键点。
PUD type:显示为0100,即为SCAN_RSP
与ADV_IND不同的是,SCAN_RSP中的advertising data变成了Scan Response Data。
因为SCAN_RSP是对SCAN_REQ的回应,所以其中会包含一些其他的信息。这些信息是程序中自己设置的。此次抓的包中内容为外貌和设备名称。scanner也就是获得了这些内容,才知道扫描到的设备是什么类型,叫什么名字。
2.2.3连接请求(CONNECT_REQ/CONNECT_IND)
连接请求包的格式是固定的:
通过wireshark抓取到的连接请求包如下图:
Access Address:还是我们的老熟人,固定广播地址。
Packet Header:包含了PUD类型为连接请求包(Connect_ind),发送地址和接收地址类型。
Initiator Address:初始地址,也就是主机的地址
Advertising Address:广播者地址,也就是设备的MAC地址。
Link Layer Data:负载信息,可以展开介绍。
Access Address:接入地址
CRC Init:CRC校验
Window Size:传输窗口大小,2.5ms
Window Offset:传输窗口偏移,2.5ms
Interval:连接间隔30ms
Latency:潜伏周期0
Timeout:连接最大超时时间5000ms
Channel Map:信道映射,可用的信道为1,不可用的为0.
Hop:调频增加(跳频算法使用)
Sleep Clock Accuracy:主机睡眠时间精度
Connect_IND数据包中的一些信息,在Nrf connect中也是可以看到的。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)