写作>;在iOS中为外部蓝牙设备发送20个字节

写作>;在iOS中为外部蓝牙设备发送20个字节,ios,bluetooth,core-bluetooth,Ios,Bluetooth,Core Bluetooth,我有一个外部设备,通过蓝牙与支持iOS6+的iPhone应用程序进行通信 问题是我需要向一个特征写入超过20个字节的数据,而根据我所读到的和尝试的数据,使用BLE是不可能的 以下是我的方法的基本结构: NSData * payload = ... //53 bytes, last 2 bytes CRC [peripheral writeValue:payload forCharacteristic:characteristic type:CBCharacteristicWriteWithRes

我有一个外部设备,通过蓝牙与支持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字节的块(示例:),数据在设备上写得不好:

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

  • 任何帮助都将不胜感激。非常感谢

    编辑

    当我尝试以块的形式发送数据(如中所示)时,我会得到以下响应:

    // 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>
    
    //NSLog—写入外围设备的数据
    //区块1:
    //组块2:
    //区块3:
    //写入外设
    [self.twCurrentPeripheral writeValue:chunk1 for Characteristic:self.twCharacteristic type:CBCharacteristicWriteWithoutResponse];
    [self.twCurrentPeripheral writeValue:chunk2 for Characteristic:self.twCharacteristic type:CBCharacteristicWriteWithoutResponse];
    [self.twCurrentPeripheral writeValue:chunk3 for Characteristic:self.twCharacteristic type:CBCharacteristicWriteWithResponse];
    //NSLog-来自外围设备的响应
    //数据更新字符:
    //数据更新字符:
    //数据更新字符:
    //数据更新字符:
    //数据更新字符:
    
    正确的回答应该是(就像Android版本中的一样):

    //响应
    //回应
    
    您需要将数据分为20字节长的块,这一部分是正确的。如果使用“随响应写入”方法,则在发送下一段数据之前,应等待外围设备:didWriteValueForCharacteristic:error:回调在发送下一段数据之前发生在外围设备代理上。如果是“无响应写入”,则应等待发送下一个数据块。您在writeValue调用中添加的内容将被缓冲。如果缓冲区已满,则您的呼叫将被丢弃。

    您需要以20字节的格式发送数据。每个数据包的大小应为20字节。另一方(BLE中心)应该接受数据包并保存它们,直到他得到他等待的所有数据包。为此,您必须创建某种协议: 发送消息类型,然后发送以字节为单位的消息长度,centeral应读取此标头,然后保存他在此消息中等待的“长度”字节,然后解析整个数据

    请注意,当有许多数据包需要快速发送时,IOS可能无法发送其中一些数据包,因此在调用

     success = [self.peripheral updateValue:chunk forCharacteristic:myChar onSubscribedCentrals:nil];
    
    success将告诉您发送是否成功,如果不成功,您需要重新发送此数据包。 在这种情况下,您应该实施IOS BLE协议
    CBPeripheralManagerDelegate


    在方法中,您应该再次尝试发送相同的数据包。

    您可以将消息分成多个部分。我不做iOS操作系统的东西,但假设>20字节真的不满意,你可以通过简单的数据分段来解决它。@NathanielWaggoner设备将每个数据块视为一个命令,它不会等待最后一个数据段。我不知道是否需要用信号表示每个数据包或整个消息的长度,以及在何处附加此字节标志。只需查看“它完全符合您的要求”。@allprog请查看更新的问题。当然,它不是这样工作的。进一步分析BTLE示例。您将看到,必须在应用程序中实现更多的传输控制,仅按顺序发送写入请求很可能会失败。另外,请查看其他相关的SO问题,我们已经多次回答了这些问题。核心蓝牙编程指南还包含有用的信息。我正在编写在iOS设备上运行的BLE Central,而不是外围设备“如果“写入而不响应”,您应该等待,然后再发送下一个数据块。”-您应该等待多久,为什么?writeValue:(…)是否在返回之前未完成写入?没有缓冲或队列吗?@DarrenBlack请检查我答案中的最后两句话。如果使用“无响应写入”,则不会在事件发生时或事件发生时收到通知。
     success = [self.peripheral updateValue:chunk forCharacteristic:myChar onSubscribedCentrals:nil];