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

标签 ios bluetooth core-bluetooth

我有一个外部设备通过蓝牙与支持 iOS6+iPhone 应用程序 通信。

问题是我需要将超过 20 个字节 写入特征,而根据我阅读和尝试的内容,使用 BLE 是不可能的。 p>

这是我的方法的基本结构:

NSData * payload = ... //53 bytes, last 2 bytes CRC
[peripheral writeValue:payload forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

发送 >20 个字节时我得到的错误是 CBErrorOperationCancelled(代码 5)和 CBErrorConnectionTimeout(代码 6)。我认为这是正常的。

我将数据分成20 字节的 block (这里的示例: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 字节的 block ,并将 附加 CRC 到我发送的每个字节 block 。这得到了与将 CRC 附加到最后一个数据 block 相同的结果。

在应用程序的 Android 版本 中,发送了整个数据,所以我知道设备可以通过单个命令读取 >20 字节

我的问题是:

  1. 是否可以将整个数据分 block 发送到外部 不修改外围硬件/软件的设备?

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

  3. 我了解到在 iOS 7 中可以发送更大的字节数组。如果 我支持 iOS 7+,它能解决我的问题吗?

  4. 除了 CB,我还有哪些选择?

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

编辑

当我尝试像在 BTLE sample 中那样以 block 的形式发送数据时我收到以下回复:

// 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>

最佳答案

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

请注意,当有很多数据包要发送非常快时,IOS 可能会发送某些数据包失败,因此在调用时

 success = [self.peripheral updateValue:chunk forCharacteristic:myChar onSubscribedCentrals:nil];

success 会告诉你发送是否成功,如果不成功你需要重新发送这个数据包。 在这种情况下,您应该实现 IOS BLE 协议(protocol) CBPeripheralManagerDelegate

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

关于ios - 在 iOS 中向外部蓝牙设备写入 >20 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995264/

相关文章:

ios - 没有为 URL 方案 itms-apps 注册处理程序 - 评分按钮模拟器

ios - ReactiveCocoa 如何监听数据模型属性的变化

android - 通过蓝牙以编程方式从 Android 上的被动手持式打印机打印

ios - 使用 CoreBluetooth 提高文件传输速度

iOS:Objective C 代码如何读取 Swift 中的静态变量?

c# - 在 Xamarin C# 中向 MKMapView 的边缘添加填充

cordova - Ionic 2 - 使用蓝牙耳机录音

c# - 为什么我无法使用 C# 检测到蓝牙 Estimote 信标,但 Windows 操作系统可以找到它们?

macos - blued 是否缓存 ATT 值,以及如何清除缓存?

swift - CoreBluetooth 将中央委托(delegate)设置为另一个 View Controller