在iOS中向外部蓝牙设备写入> 20字节

时间:2014-04-10 17:43:08

标签: ios bluetooth core-bluetooth

我有一个外部设备通过蓝牙与支持 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个字节

我的问题是:

  1. 是否可以将整个数据以块的形式发送到外部 没有修改外围设备硬件/软件的设备?

  2. 第一个数据块中是否有标志/信号字节通知     设备整个消息的长度?

  3. 我已经读过,在iOS 7中可以发送更大的字节数组。如果 我支持iOS 7+会解决我的问题吗?

  4. 我对CB有哪些替代方案?

  5. 任何帮助将不胜感激。非常感谢!

    修改

    当我尝试按照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>
    

2 个答案:

答案 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调用中添加的内容将被缓冲。如果缓冲区已满,则您的呼叫将被删除。