我一直在尝试使用 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;
[...]