我已经实施了一个可行的解决方案,请在下面查看我的评论
您好,感谢您抽出宝贵时间阅读这篇文章!
我正在开发一个应用程序,该应用程序连接到广播自己的 AdHoc WiFi 网络的硬件设备。我能够通过 CFNetwork 与 NSStream 的免费桥接连接到设备、发送字节和接收字节。我正在使用相当“事实上”的流打开代码,并且流委托正在报告 NSStreamEvents。
初始化与设备的连接后,我可以看到输入和输出流都打开(NSStreamEventOpenCompleted),并且由于硬件设备不断发送“HELLO!”,因此输入流上立即有 BytesAvailable(NSStreamEventHasBytesAvailable)。
在 NSStreamEventHasBytesAvailable 的案例事件中,我从 inputStream 读取数据并将其记录为:
case NSStreamEventHasBytesAvailable:
NSLog(@"CASE LOG -- NSStreamEventHasBytesAvailable");
uint8_t buffer[256];
int len;
while ([inputStream hasBytesAvailable]) {
//NSLog(@"LOG -- inputStream hasBytesAvailable");
len = [inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0) {
NSLog(@"Length of inputStream Bytes -- %i",len);
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
// This global boolean affects the rest of the apps functionality. Buttons are not able to send bytes to the hardware device if this boolean is FALSE.
deviceIsConnected = true;
// If buttons to send bytes are disabled due to lack of network connection on appLaunch, then go ahead and show them, allowing the user to send bytes to the hardware device
if(buttonsAreDisabled == true)
{
[ self setButtonVisibility:true ];
// Reset the status of the "No Connection" Alert
connectionAlertShown = false;
}
// Log the incoming data
if (nil != output) {
NSLog(@"LOG -- device said: %@", output);
}
}
}
break;
正如预期的那样,当我的设备连接时,我有一个恒定的“LOG -- 设备说:xxxx”流。但是,如果我断开设备与电源的连接,我不会收到任何类型的流事件;日志记录只是一起停止。
我试图通过在我的 viewDidLoad 中启动一个 backgroundTimer 来解决这个问题,它每 0.1 秒尝试从 inputStream 中读取。如果无法读取,则布尔值deviceIsConnected
设置为FALSE
,我会显示一条警报,通知用户他们与设备的连接已断开。
这种方法已被证明是相当不可靠的,也是一种非常不优雅的方式来执行一项看似简单的检测套接字连接关闭的任务。如果我理解正确, NSStream 类本质上是底层 BSD 套接字架构之上的“中间人”或抽象层。
将硬件设备与其电源断开是模拟走出设备板载 WiFi 芯片的范围。这不是“真实世界”的测试,就像您在物理上离开设备一样,您不会突然失去连接;相反,inputStream 接收到的数据会慢慢恶化,从而导致“网络警报”弹出窗口在设备在“已连接”和“未连接”之间跳转时不断闪烁。
我想实现某种 KeepAlive 处理程序,但我缺乏 iPhone / iOS / BSD 套接字的经验严重阻碍了我。如果你们中的任何一个出色的人可以提供一个方法的基本示例(可能在计时器上运行,我认为我在正确的道路上!)可以检测到套接字变得不可用并继续尝试重新建立连接,我将永远感激不尽。我不知疲倦地搜索了谷歌,发现了一些有希望的想法,但都未能成功实施。
CocoaASyncSocket 能否成为我所有问题/挫折的答案?
再次感谢您花时间阅读这篇文章。我希望我已经清楚地解释了我的问题和我想要的解决方案。如果您有任何问题,请随时提出,我会尽力回答。