标签:之间 alt 协议栈 tab hand 多个 特性 ini 数据
BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题。
虽然BLE空中包(packet)涉及BLE协议栈link layer,L2CAP,SMP和ATT等各层次,但link layer跟空中包格式关系最紧密,掌握了BLE packet的格式,就很容易理解BLE link layer协议的工作原理,因此文章取名“详解BLE空中包格式—兼BLE link layer协议解析”
BLE链路层(link layer)只定义了一种packet(空中包)格式,如下所示:
而且PDU(protocol data unit,协议数据单元)前两个字节固定为LL header(1个字节长)和payload length(1个字节长,又称data length),即上面的Packet可以展开为:
preamble(前导帧)为1个字节,根据Access Address第一个Bit,有两种取值情况:0x55或者0xAA(纯PHY层行为),如下所示:
Access Address用来标示接收者ID或者空中包身份,如前所示,BLE只有一种packet格式,根据Access Address的不同,又区分两种Packet类型:广播包和数据包:
CRC为24bit,初始向量为:
蓝牙广播包,全名蓝牙广播通道(channel)空中包,即在蓝牙广播通道(37/38/39信道(channel))上传输的空中包,为两种空中包的一种,其具体格式如下所示:
Advertising Header即前述的LL header,长度为一个字节,其每bit定义如下所示:
注:CONNECT_REQ也可写作CONNECT_IND
Payload length定义如下所示,所以广播包PDU最长37个字节。
Device Address,广播包中的强制字段,俗称蓝牙MAC地址,如果是广播包,则是advertiser的MAC地址;如果是scan包或者连接请求包,则是scanner的MAC地址。蓝牙device address为6个字节,这样Advertising data最长为:37-6 = 31B,这就是广播包数据最长只能31个字节的由来。如前所述,device address分public和random两种,定义如下所示:
Random device address又有三种类型,定义如下所示:
Advertising data我会另写一篇文章来详述,这里就不再介绍了。
如下为一个完整的真实的广播包示例,注意:BLE空中包采用小端模式。
注:上述广播包是蓝牙4.x格式,蓝牙5.0广播包除了包含上述格式外(记住:蓝牙5是跟蓝牙4.x兼容的!),还有一些新的定义,以后我也会写一篇关于蓝牙5广播的文章来专门阐述蓝牙5扩展广播包。
与蓝牙广播包相对应,蓝牙数据包是另一种BLE packet。蓝牙数据包是蓝牙数据信道空中包的简称,表示空中包只在蓝牙数据信道上传输,即除37/38/39之外的其他37信道。从格式上来说,蓝牙数据包分空包(empty packet)和普通数据包(data packet)两种,空包格式如下。
由图可见,空包整个payload为空,故名空包。
普通数据包格式如下所示:
Data header,即前述的LL header,在数据包中的定义如下所示:
Link layer支持如下control PDU:
空中包编号 |
传输方向 |
NESN |
SN |
NESN? |
SN? |
#1 |
M -> S |
1 |
0 |
|
|
#2 |
S -> M |
1 |
1 |
|
|
#3 |
M -> S |
0 |
1 |
1 |
0 |
#4 |
S -> M |
0 |
0 |
1 |
1 |
我们来分析#3数据包,#3是master发给slave的,那么#3的NESN和SN是如何确定的呢?其实#3的NESN和SN是通过比较#1和#2的NESN/SN的值来确定的,Master把#1传完之后,会把#1包的NESN和SN记录下来,即表格右边的NESN?和SN?。然后Master会拿SN?跟#2的NESN相比,两者不等,说明slave已经收到了#1包,并期待master发一个新的包给它,此时Master会把SN?增1,形成#3包的SN,表示这个数据包是一个新包,然后发出去;两者相等,说明slave没有收到#1包,此时master需要重传。Master还会拿NESN?跟#2的SN相比,两者相等,说明#2包为新包,然后Master会把NESN?增1,形成#3包的NESN发出去,告诉slave我已经收到#2包了并期待你的下一个包;两者不等,说明#2包为重传包。注意:大家可以从上述表格发现一个规律,就是同一方向相邻的两个数据包,他们的NESN和SN与另一个包的NESN和SN是相反的,比如#3 NESN = #1 #NESN ,#3 SN = #1 #SN ,同样#2和#4 各自的NESN和SN是相互相反的。
我们可以用下面的流程图来描述上述过程。
Payload Length or Data Length,BT4.0/4.1定义如下所示,这就是蓝牙4.0/4.1一个包只能传20个字节的根源。
BT4.2之后,Payload length 8 bits全部用来表示长度,这样的话,payload size最大可达251字节(255 – MIC size)。BLE连接建立之后,可以动态更改data length长度(默认为27字节),这个特性叫做Data Length Extension(DLE),DLE是通过Link layer命令:LL_LENGTH_REQ和LL_LENGTH_RSP来实现的。Data length直接跟蓝牙芯片的射频能力有关,像Nordic的nRF51822只支持BT4.1的Data length,就是因为PHY层已经做死了,无法扩展,但Nordic最新的nRF52832和nRF52840,就都支持DLE,即data length最大可到251字节。
L2CAP length,2字节长度,表示后面information payload的长度,information payload最大长度除了受这个L2CAP length字段约束,同时还受MTU的限制。MTU,Maximum Transmission Unit,是ATT层与L2CAP层可以交互的最大数据长度,或者说是Client与Server可以交互的最大长度。
总结一下,蓝牙spec里面定义了2个长度字段:LL data length和L2CAP length,同时ATT层还定义了一个MTU,以限制ATT PDU最大长度。LL data length可以通过LL_LENGTH_REQ和LL_LENGTH_RSP动态改变,MTU size则可以通过后面要讲到的Exchange MTU Request和Exchange MTU Response来改变,而L2CAP length无法动态改变,也就是说不能超过65535。
L2CAP CID,2字节长度,逻辑通道的ID,BLE使用固定的通道编号,定义如下所示:
BLE L2CAP Signaling Channel支持的PDU命令只有三个:
Security Manager Protocol(SMP)用来实现配对和密钥分发的,SMP支持如下PDU命令:
Attribute Protocol(ATT),就是我们经常用到的应用层,应用数据就跟在ATT命令后面,ATT支持如下命令列表:
如下为一个完整的真实的数据包示例,注意:BLE空中包采用小端模式。
详解BLE 空中包格式—兼BLE Link layer协议解析
标签:之间 alt 协议栈 tab hand 多个 特性 ini 数据
原文地址:https://www.cnblogs.com/iini/p/8977806.html