android - 蓝牙 : Relationship between MTU and maximum characteristic size?

标签 android ios bluetooth bluetooth-lowenergy

如何找出低功耗蓝牙 (BLE) 中的 MTU 与最大特征尺寸之间的关系?

我有一个运行“回声”程序的 BLE 开发板 - 所以无论它收到什么,它都会立即回复。

在我的 Android 设备上,如果我请求 247 字节的 MTU(成功)然后写入 247 字节的特征,它会作为两个数据包发送:一个 242 字节,一个 5 字节。任何尝试写入超过 244 字节的特征都会导致 2 个数据包 - 第一个有 242 字节,第二个有剩余字节。不确定为什么第一个数据包的长度是 242 字节而不是 244,但确实如此。

如果相反,我请求 100 字节的 MTU,同样的事情会发生,但是当特征长度超过 97 字节时数据包会被拆分,并且第一个数据包总是 95 字节长。

所以很明显,在这个特定的 Android 设备上,最大数据包长度比 MTU 值短 3 个字节。我在 iOS 上看到过有关 MTU 的页面,其中数据包长度比 MTU 值短 3 个字节。

我能否保证在所有移动设备和所有 BLE 实现上 MTU 和最大特征长度之间的差异为 3 个字节?

最佳答案

差不多。 ATT header 由一个字节的操作码和两个用于 ATT 句柄的字节组成。如果您使用“Write Long Characteristic Values”,还有一个两字节的偏移量参数。如果您使用“无响应的签名写入”过程(没有人使用并且几乎没有堆栈支持),还有一个 12 字节的签名。

另请注意,最大特征长度为 512 字节。然而,允许的最大 MTU 是 65535 字节。无论您的 MTU 有多大,您都不能写入大于 512 字节的特征值。

如果您对 ATT 协议(protocol)的底层细节感兴趣,您可以在 https://www.bluetooth.com/specifications/bluetooth-core-specification 阅读蓝牙核心规范。 , 第 3 卷 F 部分。

关于android - 蓝牙 : Relationship between MTU and maximum characteristic size?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45555751/

相关文章:

android - 如何在可过滤的ListView中显示 "No Result"?

android - 将街道地址转换为坐标android

ios - 为什么在调用 `privateManagedObjectContext.perform` 时会发生崩溃(从 com.apple.main-thread(线程 1)排队)?

java - 无法确定空指针异常背后的原因

android - Android 上的快速视频压缩

ios - 在 ParentViewController 中检测 ChildViewController 的 Pop

ios - UIScrollView 在自动布局中尺寸不正确

ios - objective c 检查蓝牙可用性是否改变

java - Android BluetoothSocket 输出流写入速度太慢

android - 如何在android中的指定矩形中绘制文本?