【问题标题】:RN42 Bluetooth disconnects on iOS within seconds of streaming dataRN42 蓝牙在 iOS 上的流数据数秒内断开连接
【发布时间】:2013-11-11 17:44:19
【问题描述】:

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

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

我尝试过的事情......

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

一种有效的方法是减慢数据传输速度(即低于 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;
    [...]

【问题讨论】:

    标签: ios bluetooth nsstream external-accessory nsinputstream


    【解决方案1】:

    我已经与 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. 使用 vanilla RN42 和他们的一个实现 iAP 堆栈的 PIC 设备。

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

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

    【讨论】:

    • 你找到另一个苹果支持的蓝牙模块了吗?我也需要
    • @4ntoine 试试 AmpedRF 选项。他们有很多 BLE 和 BT 模块。
    • 似乎是我需要的。但他们似乎也不把它们卖给普通用户?
    • 如果这是一个您要购买几个的爱好项目?可能不是。如果这是 1k
    • 这是一个爱好项目(iOS App项目),但它需要一些应用程序用户应该可以自己做或在商店购买的硬件解决方案。所以我希望自己找到或开发自己(并且用户应该能够将其上传到BT模块而无需额外费用)Bt模块固件或只是找到合适的bt模块。我不打算开发新硬件,只开发软件
    猜你喜欢
    • 2012-10-09
    • 2018-06-25
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多