我有一个外部设备通过蓝牙与支持 iOS6 + 的 iPhone应用程序进行通信。
问题在于我需要为一个特性写出超过 20个字节的内容,并且从我读过的内容开始,尝试使用 BLE 是不可能的。
这是我方法的基本结构:
NSData * payload = ... //53 bytes, last 2 bytes CRC
[peripheral writeValue:payload forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
发送> 20字节时收到的错误是CBErrorOperationCancelled
(代码5)和CBErrorConnectionTimeout
(代码6)。我相信这是正常的。
我将数据分成 20个字节的块(例如:https://github.com/RedBearLab/iOS/issues/8)并且数据在设备上写得不好:
NSData * chunk1 = ... //first 20 bytes
NSData * chunk2 = ... //next 20 bytes
...
NSData * chunkN = ... //remaining bytes + CRC from whole data
[peripheral writeValue:chunk1 forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];
[peripheral writeValue:chunk2 forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];
...
[peripheral writeValue:chunkN forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
我认为外部设备会处理每个字节数组,而不是整个数据。
此外,我尝试将有效负载数据分成18个字节的块,将CRC 附加到我发送的每个字节块。这得到了与将CRC附加到最后一块数据相同的结果。
在应用程序的 Android版本中,整个数据都会被发送,因此我知道设备可以在一个命令上读取> 20个字节。
我的问题是:
是否可以将整个数据以块的形式发送到外部 没有修改外围设备硬件/软件的设备?
第一个数据块中是否有标志/信号字节通知 设备整个消息的长度?
我已经读过,在iOS 7中可以发送更大的字节数组。如果 我支持iOS 7+会解决我的问题吗?
我对CB有哪些替代方案?
任何帮助将不胜感激。非常感谢!
修改
当我尝试按照BTLE sample中的数据块发送数据时,我得到以下回复:
// NSLog - data that is written on the peripheral
// Chunk 1 : <2047d001 0f002000 315b0011 b4425543 41524553>
// Chunk 2 : <54202020 20202020 20202020 20202020 20202020>
// Chunk 3 : <20202020 2009059b 56210988 b9b50408 02c7123d>
// Write to peripheral
[self.twCurrentPeripheral writeValue:chunk1 forCharacteristic:self.twCharacteristic type:CBCharacteristicWriteWithoutResponse];
[self.twCurrentPeripheral writeValue:chunk2 forCharacteristic:self.twCharacteristic type:CBCharacteristicWriteWithoutResponse];
[self.twCurrentPeripheral writeValue:chunk3 forCharacteristic:self.twCharacteristic type:CBCharacteristicWriteWithResponse];
// NSLog - Response from peripheral
// Data update char : <20470000 04d00101 00ab42>
// Data update char : <204700>
// Data update char : <0004d001 0100ab42>
// Data update char : <204700>
// Data update char : <0504d001 032c6bcf>
正确的响应应该是(如在Android版本中):
// Response <20470000 04d00101 00ab42>
// Response <20470000 04d00105 006786>
答案 0 :(得分:0)
您需要以20个字节的信号发送数据。每个数据包的大小应为20个字节。另一方(BLE中心)应该接受数据包并保存它们直到他获得他正在等待的所有数据包。为此,您必须创建某种协议: 发送消息类型然后以字节为单位的消息长度和中心应读取此标题,然后保存&#34;长度&#34;他在此消息中等待的字节数,然后解析整个数据。
请注意,当有很多数据包发送速度非常快时,IOS可能无法发送一些数据包,因此在调用
时 success = [self.peripheral updateValue:chunk forCharacteristic:myChar onSubscribedCentrals:nil];
成功将告诉您发送是否成功,如果不是您需要重新发送此数据包。
在这种情况下,您应该实施IOS BLE协议CBPeripheralManagerDelegate
并且在方法peripheralManagerIsReadyToUpdateSubscribers
处,您应该再次重试发送相同的数据包。
答案 1 :(得分:-1)
你需要将数据分成20个字节长的块,你就可以得到那个部分。如果使用“write with response”方法,那么在发送下一条数据之前,您应该在发送下一条文件之前等待外围代理发生peripheral:didWriteValueForCharacteristic:error:
回调。在“无响应写入”的情况下,您应该在发送下一个块之前等待。您在writeValue调用中添加的内容将被缓冲。如果缓冲区已满,则您的呼叫将被删除。