• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

BLE链路层空中包格式

开发技术 开发技术 2周前 (04-29) 8次浏览

空中包格式

BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式:
BLE链路层空中包格式

有上图可见,BLE空中包由4个部分组成,他们分别是:

  • 前导码(Preamble)
  • 访问地址(Access Address)
  • 协议数据单元(Protocol Data Unit)
  • CRC

前导码占1个字节,访问地址占4个字节,PDU占2到257个字节,CRC占3个字节,一个完整的空中包大小为10个字节到265个字节之间

LSB(The Least Significant)表示最低有效位;MSB(The Most Significant)表示最高有效位。最低有效位最先被链路层发往空中,最高有效位最后发送。也就是说前导码最先被发送出去,其次是访问地址,再次是PDU,最后才是CRC

前导码(Preamble)

前导码占8个比特,所有广播信道中,空中包的前导码都是10101010b;数据信道中,空中包的前导码是10101010b或者是01010101

如果从电平的角度来说,前导码其实是一个高低变化矩形波,接收者可以将接收电路的频率同步到该矩形波的频率,这就是所谓的接收端频率同步的机制。通俗点讲就是,接收者可以借此预估出一个比特的起始位置以及一个比特的宽度,从而可以准确的接收后续每一个有效比特位。

同时,前导码标记着一个有效空中包的起始位置,避免空中无效数据的干扰。

访问地址(Access Address)

广播信道和数据信道中的访问地址是不同的。广播信道的访问地址固定为0x8E89BED6;数据信道的访问地址由发起者决定。因此简单理解就是,从访问地址首先可以区分,这个空中包是一个广播包还是一个连接态的数据包。

上文讲到了数据信道的前导码是10101010b或者是01010101b,其实这取决于数据信道中的访问地址的最低有效位是0还是1,如果是1,则前导码是01010101b,否则是10101010b

当发起者向广播者发起一个连接请求的时候,它会把访问地址的值放入连接请求的相应字段中,当链路层连接成功建立之后,双方进入到连接态,以后的空中包双方都使用这个访问地址进行通讯。

由此可见,访问地址也是跟一个具体的链路层连接相互绑定的。例如,一个设备跟多个设备都建立了链路层的连接,也就是说一个设备同时维护多个链接,当这个设备收到一个空中包的时候,它只需通过访问地址就可以知道该空中包是哪个连接的包了。

协议数据单元(Protocol Data Unit)

协议数据单元是空中包的有效载荷部分,不同类型的空中包,它的PDU都不相同,大致可分为广播信道的PDU和数据信道的PDU

BLE采用跳频机制,链路层一共有40个信道,其中3个信道是广播信道,另外37个信道是数据信道

当设备处于广播态或者发起态的时候,设备发送或者接收广播信道的PDU;当设备与另一个设备建立链路层连接之后,双方进入到连接态,他们发送或者接收数据信道的PDU

广播信道PDU

广播信道PDU的结构由两部分组成,分别是Header和Payload,如下图所示:
BLE链路层空中包格式

由上图可知,Header大小为16bits,也就是2个字节,Payload的长度由Header中的Length字段决定,那么先看下Header字段的组成,如下图所示:
BLE链路层空中包格式

Header字段由以下6个部分组成:

  • PDU类型:广播包的类型
  • RFU(Reserve For Future):保留未来使用
  • TxAdd:发送者的地址类型
  • RxAdd:接收者地址类型
  • Length:Payload部分的长度
  • RFU(Reserve For Future):保留未来使用

广播包的类型如下表所示:

PDU Type Packet Name
0000 可连接非定向广播 (ADV_IND)
0001 可连接定向广播 (ADV_DIRECT_IND)
0010 不可连接广播 (ADV_NONCONN_IND)
0011 扫描请求 (SCAN_REQ)
0100 扫描响应 (SCAN_RSP)
0101 连接请求 (CONNECT_REQ)
0110 可扫描指示 (ADV_SCAN_IND)
0111-1111 保留 (Reserved)

这里不展开介绍各个包的类型了,以后的博文中会有详细介绍

数据信道PDU

数据信道PDU包含16比特的头部和一个⻓度可变的payload,以及可能还包含一个
MIC(Message Itegrity Check:消息完整性检查),数据信道PDU格式如下图所示:
BLE链路层空中包格式

其中Header的结构如下图所示:

BLE链路层空中包格式

Header包括6个部分:

LLID

2个字节,表示这个包是LL Data PDU(链路层数据包)还是LL Control PDU(链路层控制包),它可能的取值如下:

  • 00b:保留
  • 01b:LL Data PDU(链路层数据包)或者是一个Empty PDU(空包)。如果是链路层数据包,由于一个过长的L2CAP包会被分片成多个包分别发送,这个包就是被分片之后的非第一个分片包
  • 10b:LL Data PDU(链路层数据包),它表示未被分片的完整的数据包,或者是分片之后的第一个分片包。
  • 11b:是LL Control PDU(链路层控制包)

NESN

下一个包的序列号

SN

空中包的序列号

MD

More Data的意思,由于BLE是低功耗蓝牙,本质上采用的是睡眠唤醒机制,处于唤醒状态时发送和接收空中包,如果MD字段设置为1,则表示发送者后续还有更多的空中包要发送,以此通知接收者不要进入睡眠状态,要持续保持数据传输;如果该字段设置为0,则表示发送者没有更多的数据要发送了,可以进入睡眠状态了。

CRC

CRC是对PDU部分的一个校验和


程序员灯塔
转载请注明原文链接:BLE链路层空中包格式
喜欢 (0)