使用TI cc2540 usb dongle smartRF packet sniffer 对广播包和扫描包的分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_24179601/article/details/87262087

这里主要讲解如何查看抓包内容,进行分析。

一、对广播包的内容分析

在这里插入图片描述
该图中
1、P.nbr.上位机软件收到的包序号
2、Time(us):从开始收包起算,此包的相对时间,单位us
3、Channel:此包的广播通道,这个值与Radio Configuration里设定的通道始终保持一致。
4、Access Address:广播者的接入地址
5、Adv PDU Type:广播类型
已知广播包类型有以下几种,这里为ADV_IND,值为0x00,只看低四位。高四位中,bit7表示RxAdd,bit6表示TxAdd。
在这里插入图片描述
6、Adv PDU Header
Type即为该包的数据类型(红框中裸数据第四个数据的低四位)
TxAdd指示了扫描设备使用的是公共地址还是随机地址,0:公共地址;1:随机地址,(红框中裸数据第四个数据的bit6)
RxAdd指示了广播设备使用的是公共地址还是随机地址,0:公共地址;1:随机地址,(红框中裸数据第四个数据的bit7)
PDU-Length表示真正有效数据的数据长度,以十进制表示,这里即为AdvA与AdvData数据长度之和(6+27)。

7、AdvA:广播者的MAC地址
8、AdvData:实际广播包的数据,需要注意的是,相比平板这里没有包含完全的数据。
9、CRC
10、RSSI:抓包工具处的该广播信号的功率。
11、FCS:表示经过CRC校验计算后发现收包错误。
12、在下面灰色框中,Length的长度是指下面原始数据的长度,这个原始数据也是上面协议解析的再现。

二、对扫描包的内容分析

在这里插入图片描述
有些字段在第一部分已经讲解了,这里不再赘述。
由红框处可知,第433个包为扫描请求包,这里说下:
1、ScanA:表示扫描设备的MAC地址
2、AdvA:表示广播包的MAC地址
第434个包即为广播者对该扫描请求的回应,即扫描响应包
1、AdvA:自身的MAC地址
2、ScanRspData:携带的回应数据,这里为空,表示没有回应数据

三、对连接请求包的内容分析

在这里插入图片描述
这里主机开始发起连接请求
1、InitA:表示主机的MAC地址
2、AdvA:表示从机的MAC地址
3、LLData(Part 1/2):这里的一些参数,这里可参考https://blog.csdn.net/weixin_42583147/article/details/82382176
①、AccessAddr:这里为连接成功后新生成的接入地址
②、CRCInit:CRC校验码,暂时不清楚怎么来的
③、WinSize:主机发送第一包数据的时间窗口大小,一次扫描进行的时间宽度
④、Winoffset:主机发送第一包数据的偏移时间,
这里补充一下:扫描间隔:两个连续的扫描窗口的起始时间之间的时间差,包括扫描休息的时间和扫描进行的时间。这里要注意:
④①、扫描窗口和扫描间隔设置的时间不能大于10.24s
④②、扫描窗口设置的值不能大于扫描间隔的值
④③、如果扫描窗口=扫描间隔的话,说明主机一直在扫描。
⑤、Interval:默认连接间隔
⑥、Latency:默认连接延迟,跳
⑦、Timeout:默认超时时间
⑧、ChM:信道图,主机根据周围环境的信达情况给出的,共37个数据通道,0表示不可用,1表示可用
⑨、Hop:跳频阶跃,值范围为5-16,用于计算下一跳
⑩、SCA:休眠时钟的校准范围,用于计算即将到来的睡眠多久后醒。

四、对连接包的内容分析

一、通用分析

通常情况下,连接包大部分都是空包,俗称呼吸包,只有当有数据传输时才会有值
在这里插入图片描述
上图为空包图,最明显的地方就是Data Type显示为Empty PDU,这里主从都会发送空包。
1、Direction:指示该包的传输方向,在每个连接事件中,都是先主机到从机,再从机到主机,且为同一信道。
2、ACK Status:表示是传输出错,或者超时未收到从机端回应,则需要重传,而且在第470个包里,我们确实看到了ACK Status值为RETRY。
3、Data type:数据类型,从抓包可以看到这里有三种连接后数据包类型:
①、Empty PDU:空包,俗称心跳包,没数据传输时使用,LLID = 0x01
②、Control:控制包,LLID = 0x03
③、L2CAP-S:L2CAP层上的一些操作,比如请求更新MTU时,数据读写时。LLID = 0x02
4、Data Header
①、LLID:数据包类型格式
①①、0x01:Continuation/empty L2CAP packet
①②、0x02:Start of an L2CAP packet
①③、0x03:LL Control packet
以上可以从包里看出来是对应上了的。
②、NESN:下一个数据包序列,表示对端设备想要的值,这个值需要对端设备在下一次发出
③、SN:数据包序列,发送对端设备上次要求的序列号。NESN和SN共同标识主从是否正确交互,若不对,表示数据可能在空中存在错误,此时需要重传。
④、MD:More data,其他数据
⑤、PDU-Length:十进制表示,指后面深黄色的数据长度,空包则为0

二、MTU 更新

在这里插入图片描述
这里我们看到主机发起了MTU更新请求,之后从机会响应此次请求。
1、L2CAP Header:
①、L2CAP-Length:表示在这之后的数据长度
②、ChanId:暂时不清楚
2、ATT_Exchange_MTU_Req:
①、Opcode:操作码
②、ClientRxMTU:表建议要使用的值
在第85个包中,从机回给了主机
ServerRxMTU:表示从机使用的MTU,即已采纳主机建议值。这里已为蓝牙协议规定的最大值247,反应在DA14585的SDK里就是user_gapm_conf.max_mtu,并且在发送数据时填的数据长度最大值为MTU值(req->length)最好不能比user_gapm_conf.max_mtu大。
需要说明的是:DA14585中是在user_gapm_conf.max_mtu 设置mtu。并进行了以下测试:
在这里插入图片描述

三、准备完毕后的通信数据收发

在这里插入图片描述
这里我们可以看到,数据发起者是从机,之后主机会返回一串数据,
这里可以看到,从机到主机是notify形式,数据为0x41020548,主机到从机是write,数据是0x80024100C3。

五、

通过以上分析,要想连接一个蓝牙设备,主设备只需要做几个动作,自身初始化,扫描周边设备,对广播设备发出连接请求,连接成功开始交换数据。到此低功耗蓝牙就相互连接上了,之后应用层数据交互交给GAP层和GATT层,加密解密由SM层来完成。

猜你喜欢

转载自blog.csdn.net/qq_24179601/article/details/87262087