実用的なソリューションを実装しました。以下のコメントをご覧ください。
こんにちは、そしてこの投稿を読むために時間を割いていただきありがとうございます!
独自のAdHocWiFiネットワークをブロードキャストするハードウェアデバイスに接続するアプリを開発しています。NSStreamを使用したCFNetworkフリーダイヤルブリッジを介して、デバイスに接続し、バイトを送信し、バイトを受信することができます。私はかなり「事実上の」ストリーム開始コードを使用しており、ストリームデリゲートは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 --devicesayed:xxxx」の一定のストリームがあります。ただし、デバイスを電源から切断すると、どのような種類のストリームイベントも受信しません。ロギングは単にすべて一緒に停止します。
私はviewDidLoadでbackgroundTimerを開始することでこの問題を解決しようとしました。これは、0.1秒ごとにinputStreamからの読み取りを試みます。読み取ることができない場合は、ブール値deviceIsConnected
がに設定されFALSE
、デバイスへの接続が切断されたことをユーザーに通知するアラートを表示します。
この方法は、信頼性がかなり低く、ソケット接続の終了を検出するという一見単純なタスクを実行するための非常に不潔な方法であることが証明されています。私が正しく理解していれば、NSStreamクラスは本質的に、基盤となるBSDソケットアーキテクチャの上の「ミドルマン」または抽象化レイヤーです。
ハードウェアデバイスを電源から切断することは、デバイスのオンボードWiFiチップの範囲外を歩くことをシミュレートしています。これは「現実世界」のテストではありません。デバイスから物理的に離れているかのように、突然接続が失われることはありません。むしろ、inputStreamによって受信されたデータはゆっくりと劣化するため、デバイスが「接続済み」と「未接続」の間をジャンプすると、「ネットワークアラート」ポップアップが継続的に点滅します。
ある種のキープアライブハンドラーを実装したいのですが、iPhone / iOS/BSDソケットの経験が不足しているために深刻な障害になっています。素晴らしい個人の誰かが、ソケットが使用できなくなったことを検出して接続の再確立を試みることができる方法の基本的な例を提供できれば(タイマーで実行されている可能性があります、私はそこに正しい道を進んでいると思います!)、私は永遠に感謝するでしょう。私はグーグルを精力的に検索し、いくつかの有望なアイデアを見つけましたが、それらのどれもうまく実装することができませんでした。
CocoaASyncSocketは、私のすべての質問/フラストレーションに対する答えになるでしょうか?
この投稿をお読みいただき、ありがとうございました。私の問題と希望する解決策について明確に説明できたと思います。ご不明な点がございましたら、お気軽にお問い合わせください。できる限りお答えいたします。