iPhone 5C/5S 上的 CoreBluetooth:收到的数据损坏

Posted

技术标签:

【中文标题】iPhone 5C/5S 上的 CoreBluetooth:收到的数据损坏【英文标题】:CoreBluetooth on iPhone 5C/5S: broken received data 【发布时间】:2013-10-10 14:49:28 【问题描述】:

我在 iPhone 5C 和 iPhone 5S 上使用 CoreBluetooth 时遇到了一个奇怪的问题。 根据场景,我将接收 83 个字节的数据,按 20 个字节分块(共有 5 个块)。 iPhone 5S/5C 上的数据不同(请参阅下面的转储):在这些设备下,块 #4 替换了块 #3。 但在 iPad3(带有 6.1 和 7.0.2 ios)上一切正常

// iPhone 5C, iOS 7.0.2
nRF UART[237:60b] Received data on a characteristic. 0x01=001,0x02=5B2226
nRF UART[237:60b] Received data on a characteristic. 400192,0x05=1.0.0,0x
nRF UART[237:60b] Received data on a characteristic. ,0x09=2,0x0a=0,0x0b=
nRF UART[237:60b] Received data on a characteristic. ,0x09=2,0x0a=0,0x0b=
nRF UART[237:60b] Received data on a characteristic. 100ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ

// iPad 3, iOS 6.1.3 && iPad 3, iOS 7.0.2
nRF UART[221:60b] Received data on a characteristic. 0x01=001,0x02=5B2226
nRF UART[221:60b] Received data on a characteristic. 400192,0x05=1.0.0,0x
nRF UART[221:60b] Received data on a characteristic. 07=2013.010,0x08=001
nRF UART[221:60b] Received data on a characteristic. ,0x09=2,0x0a=0,0x0b=
nRF UART[221:60b] Received data on a characteristic. 100ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ

// iPhone 4S, iOS 6.1.3
nRF UART[241:60b] Received data on a characteristic. 0x01=001,0x02=5B2226
nRF UART[241:60b] Received data on a characteristic. 400192,0x05=1.0.0,0x
nRF UART[241:60b] Received data on a characteristic. 07=2013.010,0x08=001
nRF UART[241:60b] Received data on a characteristic. ,0x09=2,0x0a=0,0x0b=
nRF UART[241:60b] Received data on a characteristic. 100ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ

我的问题是:如何从 5S/5C 设备中获取正常数据?或许,CBCharacteristic 或 CBCentralManager 有一些技巧?

谢谢。

编辑

正如 @allprog 所建议的,这里是我如何使用 CoreBluetooth 的代码片段。

这是非常基本的方法:

// CBCentralManager init
self.cm = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

// Getting data chunks from CBCharacteristic in CBPeripheral's Delegate
- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
    
        if (error)
        
            NSLog(@"Error receiving notification for characteristic %@: %@", characteristic, error);
    return;
        

        NSLog(@"Received data on a characteristic. %s", [[characteristic value] bytes]);
        // ... the rest of code

【问题讨论】:

另外,你有没有试过降低数据发送的速度?这是一个一致的错误还是仅偶尔发生?如果您使用通知,那么这些可能会丢失。使用专用队列初始化 CBCentralManager 以避免主队列过载。你能展示处理数据接收的代码部分吗?或者,改为使用适应症。它们速度较慢但可靠。 【参考方案1】:

如果您要传输大量数据并且必须将其拆分为多个数据包,我建议您为每个数据包添加某种 ID。这将为您提供接收方所需的附加信息,以确定数据包是否被丢弃、接收两次等。如果您检测到数据包被丢弃,您可能需要一种通过 ID 重新请求数据包的方法外围设备。

编辑:另外,如 cmets 中所述,您可以切换到指示,让蓝牙堆栈满足您对保证和非重复交付的需求。

【讨论】:

通过修改我用于开发的 Arduino 板的固件,我最终遇到了这个问题。所以问题在于当 Arduino 将数据包发送回我的 iOS 应用程序时,每个数据包之间的延迟很小(为 15 毫秒)。我已将此延迟增加到 30 毫秒,问题消失了。奇怪的是,这个问题只出现在现代设备(5C 和 5S 手机)上。它不依赖于iOS版本。我还在 iPad 3 和 iPhone 4S 上使用 6.1 和 7.0.2 进行了测试:所有“旧”设备都可以正常处理数据。

以上是关于iPhone 5C/5S 上的 CoreBluetooth:收到的数据损坏的主要内容,如果未能解决你的问题,请参考以下文章

iOS适配

iPhone尺寸大全(包含iPhone14系列)

iPhone尺寸大全(包含iPhone14系列)

iPhone尺寸大全(包含iPhone14系列)

自动布局 iPhone 6 不起作用

Storyboards + UIcollectionView:UI 在 iOS 模拟器和设备上的显示方式不同