在stream式传输数据的几秒钟内,RN42蓝牙会断开连接

我一直试图通过蓝牙2.1使用RN-42从设备读取数据。 该设备与iPhone或iPad Mini配对,数据瞬间stream过,但iOS和BT模块在几秒钟内断开(不成对)。 该设备正在输出数据5-10kB / s,在蓝牙的规范内。 我还注意到,当我运行函数NSInputStream,[NSInputStream read:maxLength:],返回的字节数始终是158或更less。 应用程序和硬件不会崩溃,但蓝牙只是不配对。

即使在断开连接之后,设备仍然向RN42发送数据,这减less了在电子设备方面出现问题的可能性。 这个设置在Android设备上也可以很好地工作。 我可以stream数据没有任何断开或崩溃。

我试过的东西…

  • 接下来是Apple提供的外部附件示例EADemo。
  • 纯粹使用运行循环而不是轮询。
  • 按照这篇文章的build议把stream放到后台线程上。
  • 删除所有NSLogs来帮助提高性能。
  • 以debugging和发布模式编译。

有一件事是减慢数据传输速度(即低于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公司(收购了RN42的原始制造商Roving Networks公司)的员工谈过这类问题,似乎有一个不幸的小“特征”,没有logging在任何地方RN42手册。

当使用RN42与iOS设备进行通信时,其通信速度不能超过2.5-3kB / s。如果使用RN42与Android或计算机等进行通信,则可以以35kB / s(超过SPP) 。

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

他们推荐以下选项:

  1. 切换到使用WiFi模块。
  2. 在微控制器上实现iAP协议,并使用一个vanilla RN42传输数据(理论上应该是35kB / s)。
  3. 缓冲设备上的数据,然后以较慢的速率发回。
  4. 使用一个香草RN42,以及他们的PIC设备之一,实现iAP堆栈。

我有一个礼貌的第五个build议…find一个新的苹果支持蓝牙模块。

另外,使用4线UART通信应该可以帮助解决崩溃问题。