iOS:发送缓冲区中的套接字连接错误

时间:2015-02-26 11:22:58

标签: ios sockets network-programming inputstream outputstream

我们已经尝试了太多不同的方法来解决我们的问题并且还通过网络搜索但是我们只找到了发送字符串而不是字节数组的示例。我们需要通过套接字连接发送字节数组。请阅读下面的问题说明。

我们需要将Wi-Fi设备与iOS应用程序连接。我们已成功连接设备但是当我们以字节数组格式发送命令时,它返回NSStreamEventHasSpaceAvailable作为响应。哪个错了,我们需要NSStreamEventHasBytesAvailable事件。

以下是连接代码:

-(void) initNetworkCommunication:(NSString*)strHostName {

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)strHostName, 2000, &readStream, &writeStream);

inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;



[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];

}

当连接打开时,我们调用以下方法发送命令:

 - (IBAction) sendCommand {
 unsigned char *buffer[5] = {0x3a,0x04,0x01,0x07,0x0c};

NSData *data = [NSData dataWithBytes:buffer length:5];
[outputStream write:[data bytes] maxLength:5];

}

所以sendCommand方法存在一些问题,因为我们正在接收NSStreamEventHasSpaceAvailable,这是错误的。因为应该在响应中返回NSStreamEventHasBytesAvailable。任何人都可以帮助我们如何在iOS中发送字节数组{0x3a,0x04,0x01,0x07,0x0c},以便我们可以接收NSStreamEventHasBytesAvailable事件。

根据命令手册,当设备以正确的格式接收命令时,它将返回确认。以下是手册说明。

  

所有命令均为16位,位于数据字节1(MSB)和   数据字节2(LSB)。   对命令的响应可以是相关的特定响应   命令或简单的响应。三个简单的回答是   ACK,NAK和UNK。 ACK表示已收到命令   成功。 NAK表示任何一个都有错误   计算长度字节或不正确的校验和。 UNK的答复   表示收件人无法识别该命令   发送。

  • 价值回答状态
    • 0x06 =确认(OK)
    • 0x15 = NAK(不行)
    • 0x09 = UNK(未知命令)

所以我们应该收到上面的任何一个标志(ACK或NAK或UNK),但是我们正在接收NSStreamEventHasSpaceAvailable,这是错误的。请帮助我解决我的问题。

提前致谢。

1 个答案:

答案 0 :(得分:2)

NSStreamEventHasSpaceAvailable是在输出流上发送数据后接收的正确事件 - 它表示您可以在不阻塞的情况下写入至少一个字节(即,有可用空间来写入数据)。当在与该输入流关联的套接字上接收到数据时,将针对输入流发信号通知NSstreamEventHasBytesAvailable,以指示您可以不阻塞地发出读取。

如果您要发送数据的设备对该数据做出响应,那么我希望您在NSStreamEventHasBytesAvailable上收到inputStream