我目前正在实施一个使用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设备发挥作用时。
答案 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
找出将数据拆分成的块的大小。