AsycnSocket не подключается к последовательному порту TCP через Wi-Fi

У меня есть приложение для iPhone, которое я запускаю на симуляторе. XCode версии 3.2.6 / 4.3. Я пытаюсь связаться с радио через последовательный порт ПК через Wi-Fi, оба на одном сервере ... Я пробовал NSStream и GCDAsyncSocket (просто чтобы убедиться). Радиостанция имеет собственный IP-адрес и номер порта. На самом деле это модуль Wi-Fi TCP / IP. После изменения удаленного доступа на ПК для приема моего IP-адреса я, наконец, смог подключиться, но меня сразу же отключили, я предполагаю, что это когда я пытаюсь читать или писать. То же самое происходит при использовании Telnet: подключается, а затем отключается. Радио выдает ПРИВЕТ, когда кто-то подключается, поэтому 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]];
    }

}

person LittlePeculiar    schedule 18.10.2011    source источник
comment
Я думаю, вам следует добавить код, чтобы проиллюстрировать это   -  person ppaulojr    schedule 18.10.2011


Ответы (1)


Я нашел частичное решение (по чистой случайности). Кажется, что радио или его настройка позволяет мне подключаться / читать / писать только в том случае, если мое приложение или iMac инициируют соединение. С другим компом все нормально. Оба могут инициировать соединение, и все работает. Все еще нужно решить эту проблему, но, по крайней мере, я знаю, что мой код работает. Спасибо всем, кто подумал о моей проблеме.

person LittlePeculiar    schedule 19.10.2011