我实现了一个工作方案,请参见下面监视器连接状态和处理丢弃
你好我的评论,感谢您抽出时间来阅读这篇文章!
我正在开发一个应用程序,它连接到一个广播自己的AdHoc WiFi网络的硬件设备。我可以连接到设备,发送字节,并通过CFNetwork与NSStream进行免费桥接来接收字节。我正在使用相当“事实上”的流开放代码,并且流委托正在报告NSStreamEvents。我可以看到输入和输出流都打开(NSStreamEventOpenCompleted),并且随着硬件设备不停地发送“HELLO!”,InputStream上立即有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接收的数据会慢慢恶化,从而导致“Network Alert”弹出窗口在设备在“连接”和“未连接”之间跳转时持续闪烁。
我想实现某种KeepAlive处理程序,但我缺乏iPhone/iOS/BSD套接字的经验严重阻碍了我。如果你们中的任何一个人都可以提供一个方法的基本示例(可能运行在一个定时器上,我认为我在那里正确的道路上!),它可以检测到套接字变得不可用并继续尝试重新建立连接,I会永远感激。我不知疲倦地搜索了Google,发现了一些有前途的想法,但还没有能够成功实现它们中的任何一个。
CocoaASyncSocket可以解答我所有的问题/挫折吗?
再次感谢您花时间阅读本文。我希望我已经提供了我的问题和我想要的解决方案的明确解释。如果您有任何问题,请随时询问,我会尽我所能来回答。
一个问题:你是否也控制了hw-device的行为(你是否在为它写一个固件)? –
@rokjarc是的,硬件设备是在Arduino平台上开发的。硬件逻辑非常简单:只需从远程设备(iPhone)接收一个字节值,并相应地对12v信号作出反应。 –