蓝牙LE的最大包长度?

jdo*_*doe 12 bluetooth-lowenergy

我想知道蓝牙低功耗的最大数据包长度是多少.例如,如果经常说,则为20字节限制

"BLE允许您传输最大值为20个字节."

"你是对的,BLE规范不允许写操作超过20个字节."

但是,阅读蓝牙核心规范,我们可以看到ATT_MTU值写入2个字节,这意味着它可以达到65 535个字节.

这一切背后的真相是什么?

Nip*_*ipo 29

规格总是正确的!

在蓝牙4.0中,引入了BLE,最大有效载荷为33字节(不包括访问地址和CRC字段).协议栈中的每一层都采用了它的方式:

  • 包头的2个字节(类型和长度),
  • MIC为4个字节(启用加密时),
  • L2CAP报头的4个字节(信道ID和数据包长度),
  • ATT协议留有23个字节,这是ATT协议的默认和最小MTU.

使用ATT写请求(或通知),命令类型和属性ID使用3个字节,属性数据保留20个字节.

在ATT级别,可以通过两种方式扩大此限制:

  • 在L2CAP级别使用碎片:

    L2CAP将分割27个字节片段的ATT PDU(第一个片段为23个).

    缺点:

    • 它需要双方记忆,
    • 它不太可靠,因为某些实现可能会丢失数据包(即使规范没有提到L2CAP级别的数据包丢失,它也会发生)
  • 使用蓝牙4.2中引入的数据包长度扩展:

    无线电级别最多251个字节(MIC为255),因此属性数据可用242个字节.

    缺点:

    • 还是新的,需要硬件支持,所以没有在任何地方实现(即使宣布BLE 4.2支持),

    • 具有较长通话时间的分组将具有更多被干扰的机会,因此较长的分组意味着更多的重传.

如果使用这两种方法,L2CAP可能会使用更大的片段.

无论ATT PDU的低级别分裂如何,属性值长度限制为512乘3.F 3.2.9.

  • 可以在设备之间协商ATT_MTU以实现更高的吞吐量,当然,它不会影响L2CAP级别的MTU(其中MTU由LE分组扩展控制).这对我来说是一个令人困惑的BLE新人,因为不清楚哪个MTU是各种文章的主题,以及即使没有BLE 4.2也可以修改它. (3认同)
  • 关于属性值长度,3.F 3.2.9 规定:`属性值的最大长度应为 512 个八位字节。` (2认同)
  • 也许我错了,但最大 238 听起来不对(带数据包长度扩展)。该规范规定,有效负载字段的长度应小于或等于 251 个八位字节(v4.2 [第 6 卷,B 部分],2.4 数据通道 PDU),其中有效负载是指数据通道 PDU 的一部分。如果有效负载由操作码(1 个字节)、属性句柄(2 个字节)和通道/长度(4 个字节)组成,则为实际数据留下 244 个字节。我可以通过发送一些实际数据来确认这一点。 (2认同)