Имам приложение за iPhone, което стартирам на симулатора. XCode версия 3.2.6/4.3. Опитвам се да комуникирам с радио на сериен порт на компютър през wifi, и двете на един и същ сървър... Опитах NSStream и GCDAsyncSocket (само за да се уверя). Радиото има собствен IP адрес и номер на порт. Всъщност това е TCP/IP wifi модул. След като промених отдалечения достъп на компютъра, за да приеме моя IP адрес, най-накрая успях да се свържа, но веднага ме изритаха, предполагам, че е, когато се опитвам да чета или пиша. Същото се случва, когато използвате Telnet, свързва се и след това прекъсва. Радиото издава HELLO, когато някой се свърже, така че Telnet трябва да се опита да прочете, тъй като данните се изпращат. предполагам. Мислех, че след като мога да се свържа, трябва да мога да чета/пиша. (Да, начинаещ тук)
Ще се радвам на всякакви мисли или насоки. Проучвам повече от седмица и полудях.
Благодаря. Добавих кода по-долу, както и съобщението за грешка.
Това е съобщението за грешка: socketDidDisconnect:withError: "Error Domain=NSOSStatusErrorDomain Code=-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]];
}
}