gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:17:18 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com