BLE-3の蓝牙4.0协议栈の空口包格式

上面两篇文章,总结了BLE的协议栈概览(包括各层的功能)以及BLE的LL链路层基本,这一章总结BLE空中包格式,以便更好的理解BLE是如何通信的。本文内容仍然是来源于网络上比较优质的博文整合。下文列出了所有的出处。

在说空包格式之前,需要先把物理层简单的串一下。

1.前戏:物理层(PHY)

  • 频段
    BLE 使用2.4GHz 工业、科学及医疗(ISM)频段,从2400MHz~2483.5MHz 约 83.5MHz 的频谱资源在任何地方都可以使用。
    在这里插入图片描述
  • 调制
    BLE 采用的 GFSK 调制方式(髙斯频移键控),物理层的比特率为 1Mbit/s(1Mbps)。
  • 信道
    一共 40 个通道,37 个自适应自动调频数据通道用于两个连接设备的通讯,3 个固定广播通道分别是 37、 38、 39。
    在这里插入图片描述
    参考:https://blog.csdn.net/qq_15391889/article/details/87937452

2. 正文:BLE空中包格式

这部分转载:详解BLE 空中包格式—兼BLE Link layer协议解析

BLE空口包(packet,又称air interface packet)涉及BLE协议栈link layer,L2CAP,SMP和ATT等各层次,但link layer跟空口包格式关系最紧密。

2.1 BLE Packet格式

BLE链路层(link layer)只定义了一种packet(空中包)格式,如下所示:
在这里插入图片描述
PDU(protocol data unit,协议数据单元) 前两个字节固定为LL header(1个字节长)和payload length(1个字节长,又称data length)。

preamble(前导帧) 为1个字节,根据Access Address第一个Bit,有两种取值情况:0x55或者0xAA(纯PHY层行为),如下所示:
在这里插入图片描述

Access Address用来标示接收者ID或者空中包身份,
如前所示,BLE只有一种packet格式,根据Access Address的不同,又区分两种Packet类型:广播包和数据包。

  • 广播包Access Address 固定为0x8E89BED6,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输(蓝牙5.0做出了更改,可能支持了在其他通道上进行广播)。广播包发送给附近所有的observer(扫描者)。

  • 数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。

    下图是两种数据包的格式对比,下文还会具体细讲:
    在这里插入图片描述

CRC为24bit,初始向量为:
在这里插入图片描述

2.2 广播包格式

在这里插入图片描述
蓝牙广播包,全名蓝牙广播通道(channel)空中包,即在蓝牙广播通道(37/38/39信道(channel))上传输的空中包,为两种空中包的一种。

Advertising Header即前述的LL header,长度为一个字节,其每bit定义如下所示:

在这里插入图片描述
PDU Type为3bit。可以看出扫描PDU和发起连接PDU都属于广播包。

TxAdd/RxAdd,各占1bit,表示随后的Device Address字段代表的蓝牙MAC地址类型,值0代表Public地址,值1代表Random地址。

Payload length定义如下所示,所以广播包PDU最长37个字节。
在这里插入图片描述

Device Address,广播包中的强制字段,俗称蓝牙MAC地址,如果是广播包,则是advertiser的MAC地址;如果是scan包或者连接请求包,则是scanner的MAC地址。蓝牙device address为6个字节,这样Advertising data最长为:37-6 = 31B,这就是广播包数据最长只能31个字节的由来。如前所述,device address分publicrandom两种,定义如下所示:
在这里插入图片描述
Random device address又有三种类型,定义如下所示:
在这里插入图片描述

Advertising data我会另写一篇文章来详述,这里就不再介绍了。
<插入链接>

如下为一个完整的真实的广播包示例,注意:BLE空中包采用小端模式。

在这里插入图片描述

AAD6BE898E600E3B75AB2A02E102010504FF5900538EC7B2
AA – 前导帧(preamble)
D6BE898E – 访问地址(access address):由该地址区分广播包和数据包
60 – LL帧头字段(LL header)
0E – 有效数据包长度(payload length)
3B75AB2A02E1 – 广播者设备地址(advertiser address)
02010504FF590053 – 广播数据
8EC7B2 – CRC24值
注:上述广播包是蓝牙4.x格式,蓝牙5.0广播包除了包含上述格式外(记住:蓝牙5是跟蓝牙4.x兼容的!),还有一些新的定义,以后我也会写一篇关于蓝牙5广播的文章来专门阐述蓝牙5扩展广播包。

2.3 数据包格式

在这里插入图片描述

与蓝牙广播包相对应,蓝牙数据包是另一种BLE packet。蓝牙数据包是蓝牙数据信道空中包的简称,表示空中包只在蓝牙数据信道上传输,即除37/38/39之外的其他37信道。从格式上来说,蓝牙数据包分空包(empty packet)普通数据包(data packet) 两种,空包格式如下。

空包(empty packet):
在这里插入图片描述

普通数据包(data packet)
在这里插入图片描述
Data header,即前述的LL header,在数据包中的定义如下所示:
在这里插入图片描述
LLID(2bits), link layer ID,对LL PDU进行分类:LL data PDULL control PDU。也就是说,普通的数据信道空中包包含LL数据包和LL控制包两种,具体定义如下所示。请大家注意分清data channel packet(数据信道空中包)和LL data packet(LL数据包)的区别,如前所示data channel packet包含LL data packet和LL control packet,LL data packet只是data channel packet的一种。在不引起上下文歧义的时候,我们把他们统一称作“数据包”。
在这里插入图片描述
Link layer支持如下control PDU:
在这里插入图片描述
NESN/SN,NESN和SN各占1bit。
SN(sequence number)表示当前发送的packet编号。
NESN(next expected sequence number)用来告知对方下一个期待的packet的编号。

Link Layer使用SN来告知对方这个packet是新数据包还是重传包,用NESN来告诉对方你之前发我的包已经收到了(相当于ACK的作用),我现在期待下一个新的数据包了,因此BLE没有专门的ACK包,它是通过NESN/SN来实现ACK和重传双重功能的。请参考如下表格,仔细揣摩NESN和SN是如何编码的,以同时完成ACK和重传功能。

在这里插入图片描述
MD(1bit),more data,用来指示对方我还有数据包要传,请继续打开射频窗口准备接收。比如Nordic nRF51822一个connection interval可以发6个包或者更多的包(也就是说,一个connection event包含多个数据包交互),用的就是MD来实现的。以notify命令为例,设备(Server)notify第一个数据包并将MD置1,Client(比如手机)收到这个notify命令后,就知道Server还有数据包要传,此时手机可以继续发一个空包给设备,以让设备把第二个notify命令发过来,详情如下所示。注:Master为手机(Client),Slave为设备(Server)。

在这里插入图片描述
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_REQLL_LENGTH_RSP来实现的。Data length直接跟蓝牙芯片的射频能力有关,像Nordic的nRF51822只支持BT4.1的Data length,就是因为PHY层已经做死了,无法扩展,但Nordic最新的nRF52832和nRF52840,就都支持DLE,即data length最大可到251字节

L2CAP length (2bits),表示后面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 (2bits),逻辑通道的ID,BLE使用固定的通道编号,定义如下所示:
在这里插入图片描述
Attribute Protocol(ATT),就是我们经常用到的应用层,应用数据就跟在ATT命令后面,ATT支持如下命令列表:
在这里插入图片描述
BLE L2CAP Signaling Channel支持的PDU命令只有三个:

  • Command reject
  • Connection parameter update request,更新连接参数,比如最小连接间隔,最大连接间隔,slave latency等
  • Connection parameter update response,接受或者拒绝上面的请求。

Security Manager Protocol(SMP) 用来实现配对和密钥分发的,SMP支持如下PDU命令:
在这里插入图片描述

如下为一个完整的真实的数据包示例,注意:BLE空中包采用小端模式。
在这里插入图片描述

  • AA – 前导帧(preamble)
  • 0x50655DAB – 访问地址(access address)
  • 1E – LL帧头字段(LL header)
  • 08 – 有效数据包长度(payload length)
  • 04000400 – ATT数据长度,以及L2CAP通道编号
  • 1B – notify command
  • 0x0013 – 电量数据handle
  • 0x53 – 真正要发送的电量数据
  • 0xF650D5 – CRC24值

转载:
原文地址:https://www.cnblogs.com/iini/p/8977806.html

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读