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

我目前正在实施一个使用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的BTLE示例代码时,他们实现了一种将数据分成20个字节块的机制。 但是,上面的代码打印的东西,如Writing data of length 124的数据Writing data of length 124 – 数据到达罚款在其他设备,但。

那么: 为什么这个工作呢? 而且更重要的是,恐怕这可能会在某些时候中断,特别是当非iOS设备发挥作用的时候。

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

蓝牙规范版本4.2 [第3卷,A部分]:

所有的L2CAP实现应该通过LE-U逻辑链路支持最小的23个八位字节的MTU; 但是,有些协议和configuration文件明确要求支持更大的MTU。

在build立连接时,两个设备将交换它们的ATT_MTU大小,并且使用两个值中较小的一个。 当苹果开始使用BLE的时候,他们只会支持最低限度的,但是已经扩大了可能的规模。 这就是为什么你的124个字节可以工作,但是以前的文档和示例代码使用的是更小的ATT_MTU。

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

 [central maximumUpdateValueLength]; 

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

作为起点,所谓的ATT_MTU大小决定了可以写入的字节数。 这个值在两个设备之间交换/协商。 不幸的是,这个值似乎并没有暴露在苹果的CoreBluetooth接口:(

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

如果你写的数据比ATT_MTU多,那么BlueTooth堆栈可能会使用所谓的Prepare-Write过程,但并不是所有的堆栈都支持这个过程。 还没有testing,如果苹果支持这…

🙂