BLE蓝牙链路层数据包结构

0x00 前提

BLE5.0物理层设计2Mpbs的码元率,实际我们的数据传输速率远远到不了这个级别,主要原因就是我们没有办法直接单次发送1M或者1K数据,必须按照我们知道的ATT_MTU作为最大值进行拆包发送,不断拆包的过程中导致整体蓝牙有效数据吞吐量下降。


0x01 BLE PHY 包格式

BLE PHY 包格式由以下组成,排除 前导码、访问地址、CRC地址 对于BLE4.0/BLE4.1 上层协议(LL)最大可以包含39字节长度的PDU(协议数据单元)。

注意: 39字节是广告数据包达到的最大 LL PDU 大小(2字节头,6字节设备地址,31字节 AD)。对于数据包,最大 PDU 大小为33字节(2 Header + 4 L2CAP + 23 ATT + 4 MIC)。


但是更新后的BLE4.2/BLE5.0 直接升级硬件,将这一长度扩展到257。但是默认了兼容BLE4.0/4.1还是采用了上面的39设计。

注意: PHY 的数据包最大长度直接由硬件决定,也是限制我们BLE 数据包大小的根本原因。


拓展:

preamble(前导帧)为1个字节,根据Access Address第一个Bit,有两种取值情况:0x55或者0xAA

  • 0b010101010
  • 0b101010101

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

  1. 广播包Access Address 固定为0x8E89BED6,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输(注:从蓝牙5.0开始广播包可以在其它信道上传输)。广播包发送给附近所有的observer(扫描者)。
  2. 数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。
  3. 蓝牙数据包又分空包(empty packet)和普通数据包(data packet)两种.空包整个payload为空,故名空包。

逻辑链路层再往上就是L2CAP------逻辑链路控制适配协议,如下的Basic L2CAP Header+Information Payload组成我们这里的基本帧(B-frame)。

L2CAP协议再上就是我们操作特征值的ATT层,这一层数据长度被 最大传输单元 ATT_MTU限制,ATT_Payload = Attribute OPCode + Attribute Parames + Authentication Signature(可选)组成。排除12字节可选的认证签名,和一个字节属性操作码。

对于我们这里的写属性值,其 Attribute Parameters = 其 Attribute Handle(2) + Attribute Value, Attribute Value 就是我们操作属性的值,其最大长度 = ATT_MTU - Attribute OPCode(1) - Attribute Handle(2) = ATT_MTU - 3。

对于读操作属性,主要包含在 ReadResponse 操作码。最大长度 = ATT_MTU - Attribute OPCode(1) = ATT_MTU - 1。

以上,读写属性值最大有效数据长度直接由ATT_MTU决定,但是根本收LL PDU 大小限制。


0x02 LE Data Length Extension

BLE4.2/5.0 新增功能 DLE 数据长度扩展(LE Data Length Extension)功能允许LE控制器在连接状态下发送具有高达251字节的PDU。在连接期间的任何时刻,主从设备可以协商该PDU大小。

对比与BLE4.0/4.1的控制器数据通道最大有效载荷为27字节。使能数据扩展功能后的BLE4.2/BLE5.0能够达到251,数据速率提高了大约2.5倍。

  1. 如果PDU大小和传输时间都被设置为默认值(即TX和RX都为27B,328us),则LL_LENGTH_REQ不发送。如果对等连接的主从设备发送LL_LENGTH_REQ,此时对等设备同样以默认大小LL_LENGTH_RSP回应。
  2. 如果PDU的大小收发双方或者有一方不是默认值,则设备的LE控制器将使用LL_LENGTH_REQ和LL_LENGTH_RSP控制PDU协商一个PDU的较大的有效负载大小。

0x03 小结

  • 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直接跟蓝牙芯片的射频能力有关,如果PHY层已经做死了,无法扩展。
  • L2CAP length,2字节长度,表示后面information payload的长度,information payload最大长度除了受这个L2CAP length字段约束,同时还受MTU的限制。
  • MTU,Maximum Transmission Unit,是ATT层与L2CAP层可以交互的最大数据长度,或者说是Client与Server可以交互的最大长度。MTU size则可以通过后面要讲到的Exchange MTU Request和Exchange MTU Response来改变,而L2CAP length无法动态改变,也就是说不能超过65535。

0x04 示例数据包

AAAB5D65501E08040004001B130053D550F6

  • AA -- 前导帧(preamble)
  • 0x50655DAB -- 访问地址(access address)
  • 1E -- LL帧头字段(LL header)
  • 08 -- 有效数据包长度(payload length)
  • 04000400 -- ATT数据长度,以及L2CAP通道编号
  • 1B -- notify command
  • 0x0013 -- 应用数据handle
  • 0x53 -- 真正要发送的应用数据
  • 0xF650D5 -- CRC24值
相关推荐
jiang_bluetooth3 小时前
Simple fast pair design
蓝牙·gfps·fast pair·蓝牙快连·蓝牙架构设计
Lenzetech3 天前
科技资讯|谷歌Play应用商店有望支持 XR 头显,AR / VR设备有望得到发展
科技·物联网·ar·xr·蓝牙·find my
Lenzetech4 天前
蓝牙资讯|苹果AirPods Pro 2推出听力测试、助听器和听力保护等功能
科技·物联网·蓝牙·find my
Marko_Chai8 天前
Android BLE 杂谈
android·蓝牙
Lenzetech13 天前
Find My平板键盘|苹果Find My技术与键盘结合,智能防丢,全球定位
科技·物联网·蓝牙·find my
Lenzetech15 天前
蓝牙资讯|iOS 18.1 正式版下周推送,AirPods Pro 2耳机将带来助听器功能
科技·物联网·蓝牙·find my
jiang_bluetooth21 天前
结合空口分析BLE AUDIO之PAC
嵌入式硬件·信息与通信·蓝牙·智能硬件·蓝牙5.2·ble audio
jiang_bluetooth1 个月前
分享蓝牙耳机A2DP音频卡顿原因及解决思路
嵌入式硬件·音视频·信息与通信·蓝牙·智能硬件·a2dp
Lenzetech1 个月前
蓝牙技术|国产手机厂商推出蓝牙的公里级无网通信技术,可实现1500米无网通话
科技·物联网·蓝牙·find my
Android技术栈1 个月前
鸿蒙开发(NEXT/API 12)【蓝牙服务开发】网络篇
网络·华为·蓝牙·harmonyos·鸿蒙·鸿蒙系统·openharmony