RN42 蓝牙在流式传输数据的几秒钟内在 iOS 上断开连接



我一直在尝试使用 RN-2.1 通过蓝牙从设备读取数据 42.该设备与iPhone或iPad Mini配对,数据短暂流传输,但iOS和BT模块在几秒钟内断开连接(取消配对)(不到10个)。该设备输出的数据速度为5-10kB/s,完全符合蓝牙的规格。我还注意到,当我运行函数 NSInputStream [NSInputStream read: maxLength:] 时,返回的字节数始终为 158 或更少。应用程序和硬件不会崩溃,但蓝牙只是取消配对。

即使在断开连接后,该器件仍会向 RN42 发送数据,这降低了电子端出现问题的可能性。此设置在Android设备上也可以正常工作。我可以流式传输数据而不会断开连接或崩溃。

我尝试过的事情...

  • 遵循Apple提供的外部配件示例EADemo。
  • 纯粹使用运行循环而不是轮询。
  • 按照这篇文章中的建议将流放在后台线程上。
  • 删除所有 NSLogs 以帮助提高性能。
  • 在调试和发布模式下编译。
一种

有效的方法是减慢数据传输速度(即小于5kB/s),因为这允许iOS和BT模块保持连接并在断开连接之前传输数据更长时间。

#define EAD_INPUT_BUFFER_SIZE 1024
/**
 * Stream delegate
 */
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
[... other cases ...]
        case NSStreamEventHasBytesAvailable:
        {            
            uint8_t buf[EAD_INPUT_BUFFER_SIZE];
            unsigned int len = 0;
            len = [(NSInputStream *)aStream read:buf maxLength:EAD_INPUT_BUFFER_SIZE];
            if(len) {
                // Read successful, process data
            } else {
                // Fail
            }     
            break;
        }
        default:
            break;
    }
}
/**
 * Stream delegate with polling (for better or worse)
 */
    [...]
        case NSStreamEventHasBytesAvailable:
        {            
            while ([[_session inputStream] hasBytesAvailable])
            {
                // Read the data
                NSInteger bytesRead = [[_session inputStream] read:_buf maxLength:EAD_INPUT_BUFFER_SIZE];
                if (bytesRead > 0) {
                    // Read successful, process data
                } else if (bytesRead == 0) {
                    // End of buffer reached
                    return;
                } else if (bytesRead == -1) {
                    // Failed to read
                    return;
                }
            }
            break;
    [...]

我和Microchip(收购Roving Networks的公司,他们是RN42的原始制造商)的人谈过这种类型的问题,似乎有一个不幸的小"功能"没有记录在RN42手册的任何地方。

当RN42用于与iOS设备通信时,它的通信速度不能超过2.5-3kB/s...如果它用于与Android或计算机或其他任何东西进行通信,它可以以35kB/s(通过SPP)的速度传输。

原因是RN42中的芯片功率不足,无法处理BT堆栈和以iOS设备所需的格式(iAP协议)重新打包字节。

他们推荐以下选项:

  1. 切换到使用 WiFi 模块。
  2. 在微控制器上实现iAP协议,并使用原版RN42传输数据(理论上应该回到35kB/s)。
  3. 在设备上缓冲数据,并以较慢的速度将其发回。
  4. 使用原版RN42,以及实现iAP堆栈的PIC设备之一。

我有一个礼貌的第5个建议...查找支持 Apple 的新蓝牙模块。

此外,使用4线UART通信应该有助于解决崩溃问题。

最新更新