在iOS上通过BLE发送数据时的最大数据大小

时间:2014-06-22 09:32:41

标签: ios objective-c bluetooth-lowenergy core-bluetooth data-transfer

我目前正在实施一个使用CoreBluetooth在两台设备之间传输数据的iOS应用程序。例如,要将数据从中央发送到外设,我使用以下代码:

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil];
NSLog(@"Writing data of length %d", [data length]);
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

这个工作绝对正常,但问题是我已多次读取,因为特性可以一次传输最多20个字节。此外,当我查看Apple's BTLE Example Code时,他们实现了一种机制,将数据拆分为20个字节的块。但是上面的代码打印出像Writing data of length 124这样的东西 - 但数据在其他设备上很好。

所以:为什么这个有效?更重要的是,我担心这会在某些时候出现故障,特别是当非iOS设备发挥作用时。

5 个答案:

答案 0 :(得分:2)

我正在使用iOS 7.1.1,并且还发现我可以使用BLE从iPhone可靠地发送132个字节到iPad。我还听说20个字节是最大的,但它确实看起来不像是

答案 1 :(得分:2)

BLE标准要求23个字节作为所有BLE设备必须支持的最小ATT_MTU(属性协议最大传输单元)。但是,最大ATT_MTU是255个字节,并且对于BLE 4.2再次加倍。

BLUETOOTH SPECIFICATION 4.2版[第3卷,A部分]:

  

所有L2CAP实现都应在LE-U逻辑链路上支持23个八位字节的最小MTU;   但是,某些协议和配置文件明确要求支持a   更大的MTU。

建立连接时,两个设备将交换其ATT_MTU大小,并使用较小的两个值。当Apple开始使用BLE时,他们只支持最低限度,但后来扩大了可能的尺寸。这就是你的124字节工作的原因,但是较旧的文档和示例代码使用了更小的ATT_MTU。

答案 2 :(得分:1)

作为起点,所谓的ATT_MTU大小决定了可写入的字节数。该值在两个设备之间进行交换/协商。不幸的是,这个值似乎没有暴露在Apple的CoreBluetooth界面中:(

但我刚刚使用了BLE嗅探器,在我的情况下它是158字节。但是,这个价值会随着时间的推移而改变......

如果您编写的数据多于ATT_MTU,则蓝牙堆栈可能会使用所谓的准备 - 写入过程,但并非所有堆栈都支持该过程。尚未测试Apple是否支持此...

:)

答案 3 :(得分:1)

在iOS 9+上,您可以在每个订阅的CBCentral上使用此方法来确定每个块发送的数据量:

[central maximumUpdateValueLength];

答案 4 :(得分:0)

通过以下方式将数据写入远程设备的特征时

func writeValue(_ data:数据,用于特征:CBCharacteristic,类型:CBCharacteristicWriteType) https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518747-writevalue

您应该使用

func maximumWriteValueLength(用于类型:CBCharacteristicWriteType)-> Int https://developer.apple.com/documentation/corebluetooth/cbperipheral/1620312-maximumwritevaluelength

找出将数据拆分成的块的大小。