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

iOS:发送缓冲区中的套接字连接错误,ios,sockets,network-programming,inputstream,outputstream,Ios,Sockets,Network Programming,Inputstream,Outputstream,我们尝试了太多不同的方法来解决我们的问题,也在网上搜索过,但我们只找到了发送字符串的示例,而没有找到字节数组。我们需要通过套接字连接发送字节数组。请阅读下面的问题说明 我们需要将wi-fi设备与iOS应用程序连接。我们已成功连接设备,但当我们以字节数组格式发送命令时,它将返回NSSTREATEVENTHASSPACEABLE作为响应。这是错误的,我们需要NSStreamVenthasbytesAvailable事件 以下是连接代码: -(void) initNetworkCommunicatio

我们尝试了太多不同的方法来解决我们的问题,也在网上搜索过,但我们只找到了发送字符串的示例,而没有找到字节数组。我们需要通过套接字连接发送字节数组。请阅读下面的问题说明

我们需要将wi-fi设备与iOS应用程序连接。我们已成功连接设备,但当我们以字节数组格式发送命令时,它将返回NSSTREATEVENTHASSPACEABLE作为响应。这是错误的,我们需要NSStreamVenthasbytesAvailable事件

以下是连接代码:

-(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方法中存在一些问题,因为我们接收到的NSSTREAVENTHASSPACEABLE是错误的。因为它应该在响应中返回nsstreamventhasbytesavailable。请任何人帮助我们如何在iOS中发送字节数组{0x3a,0x04,0x01,0x07,0x0c},以便我们可以接收NSSTREAVENTHASBYTESAVAILable事件

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

所有命令均为16位,位于数据字节1(MSB)和 数据字节2(LSB)。 对命令的响应可以是特定的响应 命令或简单的响应。三个简单的回答是 阿克,纳克和乌克。确认表示已收到该命令 成功地NAK表示以下任一项发生错误: 计算的长度字节或校验和不正确。冷淡的回答 指示收件人无法识别所发送的命令 发送

  • 值应答状态
    • 0x06=确认(正常)
    • 0x15=NAK(不正常)
    • 0x09=UNK(未知命令)
因此,我们应该收到上述任何标志(ACK、NAK或UNK),但我们收到的是NSSTREATEVENTHASSPACE AVAILABLE,这是错误的。任何人请帮我解决我的问题


提前感谢。

NSSTREAVENTHASSPACE available是在输出流上发送数据后要接收的正确事件-它表示您可以在不阻塞的情况下写入至少一个字节(即有空间写入数据)<当在与输入流相关联的套接字上接收到数据时,将针对输入流向code>nsstreamventhasbytesavailable发出信号,指示您可以在不阻塞的情况下发出读取


如果您发送数据的设备响应该数据,则我希望您在
inputStream

上收到
nsstreamventhasbytesavailable
。我已经编辑了我的问题。根据命令手册,当我们发送这个命令时,我们应该接收一些字节,比如0x06作为ACK,或者其他两个字节的任何字节。但我们收到的是可供使用的NSTRAVENTHSBYTESAVABLE。请再次查看我的问题。如果您检查传递给您的代表的
nsstreamventhassspaceavailable
事件流,您将看到它是您的输出流。如果远程设备正在发送响应,您还应该在输入流上收到一个
nsstreamventhasbytesavailable
事件。您也可以尝试在输入流上发出一个read。结果表明,我使用的是一些没有发送ack的协议,而不是发送ack的协议。当我发现这一点并切换协议时,ACK就如上面所述进入了