目录
简介
Bluetooth Core version 5.0已经发布了很久一段时间了,对于进行蓝牙设备的相关开发蓝牙协议核心规范是一份不错的攻略指导书,2822页覆盖其相关的协议、规范、数据包解读等等。接下来我们借助smartRF packet sniffer蓝牙通信抓包软件以及Bluetooth Core v5.0进行相关的数据解读。
PS:此处默认大伙都安装了smartRF packet sniffer,没的话我在这儿贴一个该软件的传送门:https://download.csdn.net/download/qq_33475105/11832890 ,现在CSDN都默认了下载积分真是无语。
免费下载地址: http://www.ghostyu.com/download/10
Start:
一、常见的广播包
上图是一个最为常见的广播包,解析开始:
Time:抓取的数据包的间隔的时间;
Channel:通信频道。
①在广播期间,设备的通信频道是37、38、39三个频道。
②设备与Host连接成功后使用的频道是0~36频道。
③通信期间的跳频的经由数据信道选择算法确定的,在接下来的数据包解析中会有相关的叙述。
Access Address:访问地址,按照协议文档所述该访问地址是默认的,The Access Address for all other advertising channel packets shall be 10001110100010011011111011010110b (0x8E89BED6)。
Adv PDU Type:广播包数据类型。常见的广播包类型如下:
• ADV_IND
• ADV_DIRECT_IND
• ADV_NONCONN_IND
• ADV_SCAN_IND
• ADV_EXT_IND
• AUX_ADV_IND
• AUX_SYNC_IND
• AUX_CHAIN_IND
PS:在此插入介绍一下PDU的概念 ,PDU是什么呢?
协议数据单元PDU(Protocol Data Unit)是指对等层次之间的传递的数据包。
Adv PDU Header:该Header包括四个部分:Type、Txadd、Rxadd、PDU-Length。
①Type:此处的指的是广播包的数据类型,主要有一下几种。
![](https://img-blog.csdnimg.cn/20191006183219295.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNDc1MTA1,size_16,color_FFFFFF,t_70)
②Txadd和Rxadd这两个参数的位是由the advertiser's address是否是公共的还是随机的来决定该参数是“1”或者是“0”,public(Txadd ==0) or random (Rxadd == 1)。
③PDU-Length:数据包的长度。所以上述的数据包的Adv Header中表示的内容是:广播包类型是0,即ADV_IND,Txadd和Rxadd地址都是公共的非随机,该数据包的长度为33。
ADV_IND类型的广播包的组成架构如上图,6 octets的广播地址 + 31 octets以内的广播数据,所以一个广播包最大为37个字节。
AdvA:广播地址。
AdvData:数据包的格式为:Length + Type +Data,由这三项组成一个小包。
按上面的描述一个Bluetooth devide能广播31个octets的数据内容,然而并不是最多只能广播31 octets,看下面这幅数据包的图像:
该Bluetooth device在广播的时候,总共有三个不同Type的广播包,分别是:ADV_IND、ADV_SCAN_REQ、ADV_SCAN_RSP。其中ADV_IDN广播包的介绍上面以及叙述了,剩下的ADV_SCAN_REQ、ADV_SCAN_RSP是scanning PDUs。
ADV_SCAN_REQ:该数据的字段由ScanA和AdvA字段组成。 ScanA字段应包含TxAdd指示的扫描仪的公共或随机设备地址。 AdvA字段是此PDU寻址到的设备的地址。AdvA字段应包含广播的公共或随机设备地址,如RxAdd所示。这些PDU不包含任何主机数据。
ADV_SCAN_RSP:该数据字段由AdvA和ScanRspData字段组成。 AdvA字段应包含TxAdd指示的广告客户的公共或随机设备地址。 ScanRspData字段可以包含来自广播的设备的任何数据。
综上所述,在一次完整的广播中,Bluetooth devive可以最多广播31 octets + 31 octets的数据内容,即最多进行62字节的广播。
二、广播包的结束,解析连接successfully的数据包
ADV_CONNECT_REQ 数据包,主要为LLDATA数据段,其他部分和上述的广播数据包雷同。
①AA:AccessAddr,链路层连接的访问地址。该地址是后续数据通信时的访问地址,是一个32bit的值,每次访问它都会需要一个新的访问地址时,链路层应生成一个满足下列要求的新随机值:
•不得是该设备上任何现有链路层连接的访问地址。
•它不应是任何已启用的定期广告的访问地址。
•它不得超过六个连续的零或一。
•不得是广告频道数据包的访问地址。
•序列不得与广告频道数据包的访问地址仅相差一位。
•它不能使所有四个八位位组相等。
•过渡不得超过24个。
•它的最高有效六位应至少有两个转换。
援引蓝牙Core v5.0中的描述On an implementation that also supports the LE Coded PHY ,该AA还需要满足以下的条件:
•它的最低有效8位中至少应有3个。
•最低有效16位中的跳变不得超过11个。
②CRCInit:该参数用于数据通道PDU的CRC校验的配置,其中该参数的大小为24 bit,移位寄存器预先设置为链路层连接设置的CRC初始化值即该参数CRCInit的值。linear feedback shift register (LFSR)使用线性反馈移位寄存器来生成CRC校验。
③WinSize:该字段应设置为指示sendWindowSize值,其方式如下:sendWindowSize = WinSize * 1.25 ms。用于确定传输窗口开放的时间。
④WinOffset:该字段设置为指示transmitWindowOffset值:transmitWindowOffset= WinOffset * 1.25 ms。
Therefore the start of the first packet will be no earlier than
transmitWindowDelay + transmitWindowOffset
and no later than
transmitWindowDelay + transmitWindowOffset + transmitWindowSize
⑤Interval:该参数用于设置connlnterval的值,其相关公式为:connInterval = Interval * 1.25 ms,范围是7.5ms至4.0s,connInterval参数由发起方的链路层在CONNECT_IND PDU中从主机指定的范围设置。
⑥Latency:该参数用于设置connSlaveLatency的值,其设置的方式如下:connSlaveLatency = Latency,假如Latency设置为x,则从机累计x次未应答,连接就会断开。
⑦Timeout:该参数用于设置 connSupervisionTimeout 的值, 其设置方式如下: connSupervisionTimeout = Timeout * 10 ms。
连接可能由于各种原因而中断,例如设备超出范围,遇到严重的干扰或电源故障情况。由于这可能会在没有任何事先警告的情况下发生,很重要的一点就是主机和从机都必须监视连接状态,为了能够检测到链路丢失,主机和从机都应使用链路层连接监视计时器TLLconnSupervision。接收到有效数据包后,计时器应复位。如果在建立连接之前链路层连接监督计时器达到6 * connInterval,则应将连接视为丢失。这样可以快速终止无法建立的连接。
连接监督超时(connSupervisionTimeout)是一个参数,它定义在两个连接被视为丢失之前,两个接收到的数据包PDU之间的最长时间。 connSupervisionTimeout应为100毫秒至32.0 s范围内的10毫秒的倍数,并且应大于(1 + connSlaveLatency)* connInterval * 2。如果在建立连接和计时器之后的任何时候处于连接状态达到connSupervisionTimeout值,则应认为连接已丢失。如果认为连接丢失,则链路层不得再发送任何其他数据包。 链路层退出连接状态,并应过渡到待机状态。 应通知主机失去连接。
连接事件的时间由两个参数确定:连接间隔(connInterval)和从属延迟(connSlaveLatency)。connSlaveLatency的值应为0到((connSupervisionTimeout /(connInterval * 2))-1)范围内的整数。 connSlaveLatency参数也应小于500。当connSlaveLatency设置为0时,从属设备应在每个锚点侦听。 如果从属服务器在应用了从属服务器延迟之后没有收到来自主机的数据包,则它应该在每个锚点上侦听,并且直到从主机接收到数据包之后才应用从属服务器延迟。
⑧ChM:该参数包含了指示已使用和未使用的数据信道的信道映射。下图显示了从PHY通道到通道索引和通道类型的映射。下表中“●”表示指定通道类型使用了PHY通道和索引。上述抓包数据中该参数的值为“1FFFFFFFFF”,即“0001111111111111111111111111111111111111”。
⑨Hop:该参数应用于设置指示数据频道选择算法中使用的hopIncrement。它的随机值应在5到16之间。
频道选择算法Channel Selection Algorithm #1
该算法仅支持连接事件的通道选择,其包括两个阶段:计算未映射的信道索引,然后将该索引映射到已使用信道集中的数据信道索引。 unmappedChannel和lastUnmappedChannel是两个连续连接事件的未映射通道索引。 unmappedChannel是当前连接事件的未映射通道索引。 lastUnmappedChannel是上一个连接事件的未映射通道索引。 对于连接的第一个连接事件,lastUnmappedChannel应为0。
在连接事件开始时,应使用以下基本算法来计算unmappedChannel:
unmappedChannel =(lastUnmappedChannel + hopIncrement)mod 37
当连接事件关闭时,lastUnmappedChannel必须设置为unmappedChannel的值。使用以下算法将unmappedChannel重新映射到频道图中已使用的频道之一:
remappingIndex = unmappedChannel mod numUsedChannels
⑩SCA:该参数应用于设置指示用于确定最坏情况的MasterSCA的睡眠时钟精度,SCA字段的值应按照下中的定义进行设置,
三、数据包解析(DATA CHANNEL PDU)
①LL Data PDU Data header字段:该字段的数据封装格式如下图所示
该字段的数据主要由:LLID、NESN、SN、MD、RFU和Length构成,每个参数的描述如下图所示,在常见的数据包类型是01b和10b,以及11b型,分别是空的数据包,L2CAP的消息数据包以及控制信息的数据包。LL Data PDU是用于发送L2CAP数据的数据信道PDU,Header中的LLID字段应设置为01b或10b。
②LL Control PDU:LL Control PDU是用于控制链路层连接的数据信道PDU。该数据包构成形式如下图所示
LL Control PDU的长度字段不得设置为00000000b。 所有的LL Control PDU都有固定的长度,具体取决于操作码。
操作码Opcode:
注:上文部分插图摘录自Bluetooth Core v5.0。目前正在学习蓝牙5.0,有什么错误敬请大家指正,谢谢!