我實現了一個工作方案,請參見下面監視器連接狀態和處理丟棄
你好我的評論,感謝您抽出時間來閱讀這篇文章!
我正在開發一個應用程序,它連接到一個廣播自己的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信號作出反應。 –