2011-10-18 13 views
0

私はシミュレータで実行しているiPhoneアプリを持っています。 XCode ver 3.2.6/4.3。私は同じサーバー上の両方の無線LAN経由でPCのシリアルポート上でラジオと通信しようとしています...私はNSStreamとGCDAsyncSocketを試しました。ラジオは独自のIPアドレスとポート番号を持っています。これは実際にはTCP/IP Wi-Fiモジュールです。私のIPアドレスを受け入れるようにPCのリモートアクセスを変更した後、私はついに接続することができましたが、私はすぐに開始されます。私はそれが読み書きしようとしていると仮定しています。 Telnetを使用して接続してから切断するときも同じことが起こります。誰かが接続したときにラジオの問題HELLOが送信されるため、Telnetはデータが送信されてから読み取ろうとする必要があります。私は推測している。私は接続できるので、私は読み書きができるはずだと思った。 (はい、ここの初心者)AsycnSocketはWi-Fi経由でTCPシリアルポートに接続していません

私はどんな考えや方向性もありがとう。私は今一週間以上にわたり研究してきており、嫌がらせをしています。

ありがとうございました。私は以下のコードとエラーメッセージを追加しました。

socketDidDisconnect:withError: "エラードメイン= NSOSStatusErrorDomain コード= -9844"この操作は完了できませんでした。 (OSStatusエラー -9844) "のUserInfo = 0x4c38a60 {}"

- (IBAction)performConnection:(id)sender 
{ 
    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 
    NSError *error = nil; 
    uint16_t port = [[[self serverPort] text] intValue]; 

    if (![asyncSocket connectToHost:[serverAddr text] onPort:port error:&error]) 
    { 
     DDLogError(@"Unable to connect due to invalid configuration: %@", error); 
     [self debugPrint:[NSString stringWithFormat:@"Unable to connect due to invalid configuration: %@", error]]; 
    } 
    else 
    { 
     DDLogVerbose(@"Connecting...IP:%@, port:%i", [serverAddr text], port); 
    } 
} 

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port 
{ 
    DDLogInfo(@"socket:%p didConnectToHost:%@ port:%hu", sock, host, port); 

    NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3]; 
    [settings setObject:@"XXX.XXX.X.XXX" 
      forKey:(NSString *)kCFStreamSSLPeerName]; 

    // In fact, don't even validate the certificate chain 
    [settings setObject:[NSNumber numberWithBool:NO] 
      forKey:(NSString *)kCFStreamSSLValidatesCertificateChain]; 
    [settings setObject:(NSString*)kCFStreamPropertySocketSecurityLevel 
      forKey:(NSString*)kCFStreamSocketSecurityLevelNegotiatedSSL]; 

    DDLogVerbose(@"Starting TLS with settings:\n%@", settings); 

    [sock startTLS:settings]; 

    [self debugPrint:[NSString stringWithFormat:@"socket:didConnectToHost:%@ port:%hu", host, port]]; 

    //[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0]; 
    [sock readDataWithTimeout:-1 tag:0]; 

} 

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag 
{ 
    DDLogVerbose(@"socket:didWriteDataWithTag:"); 
    [sock readDataWithTimeout:-1 tag:0]; 

} 


- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{ 
    DDLogVerbose(@"socket:didReadData:withTag:"); 

    NSString *response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
    NSLog(@"read response:%@", response); 
    [self debugPrint:[NSString stringWithFormat:@"Read: \n%@",response]]; 
    [response release]; 

    //NSData *newline = [@"\n" dataUsingEncoding:NSASCIIStringEncoding]; 
    //[sock readDataToData:newline withTimeout:-1 tag: 0]; 
    [sock readDataWithTimeout:-1 tag:0]; 

} 

- (IBAction)sendBuf:(id)sender 
{ 
    if ([[bufOut text] length] > 0) 
    { 
      NSString *requestStr = [NSString stringWithFormat:@"%@\r\n", [bufOut text]]; 
     NSLog(@"Sending:%@",requestStr); 
     NSData *requestData = [requestStr dataUsingEncoding:NSASCIIStringEncoding]; 
     [asyncSocket writeData:requestData withTimeout:-1.0 tag:0]; 
     [self debugPrint:[NSString stringWithFormat:@"Sent: \n%@",requestStr]]; 
    } 

} 
+0

私はあなたがそれを例示するためにいくつかのコードを追加すべきだと思います – ppaulojr

答えて

0

私は(薄手事故によって)部分的な解決策を見つけました。ラジオやラジオの設定は、自分のアプリやiMacが接続を開始した場合にのみ、接続/読み取り/書き込みが可能になります。それは別のPCでうまくいく。両方とも接続を開始することができ、すべてが機能します。これを解決する必要がありますが、少なくとも私のコードが動作していることを知っています。 私の問題を与えた人に感謝しました。

関連する問題