2011-10-18 46 views
0

我有一個iPhone應用程序,我在模擬器上運行。 XCode ver 3.2.6/4.3。我試圖通過無線網絡與個人電腦串口上的收音機進行通信,無論是在同一臺服務器上...我試過NSStream和GCDAsyncSocket(只是爲了確保)。收音機有自己的IP地址和端口號。它實際上是一個TCP/IP wifi模塊。在改變PC上的遠程訪問接受我的IP地址之後,我終於可以連接了,但是我立即就開始了,我假設這是在我嘗試讀取或寫入時。使用Telnet時,連接然後斷開連接也會發生同樣的情況。當有人連接時,收音機發出HELLO,所以Telnet必須在發送數據後嘗試讀取。我正在猜測。我以爲我能夠連接,我應該能夠讀/寫。 (是的,新手在這裏)AsycnSocket無法通過WiFi連接到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很好。兩者都可以啓動連接,一切正常。仍然需要解決這個問題,但至少我知道我的代碼正在工作。 感謝任何給我一些想法的問題。