1

全部,

我有一个 OBDII 设备,里面有一个网络服务器。我通过wifi连接。我想创建一个应用程序来发送命令并读取从设备接收到的数据。

我首先使用终端对其进行测试。我使用 telnet 会话连接并可以发送命令(0104)并得到响应。这工作正常。

现在,我想创建一个应用程序来做同样的事情。我知道我可以使用以下方式连接:

- (void)initNetworkCommunication {
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.0.10", 35000, &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:(id)sender {
    NSString *response  = [NSString stringWithFormat:@"%@", commandText.text];
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
    [outputStream write:[data bytes] maxLength:[data length]];   
}

但我没有得到正确的答案,我得到一个?背部。所以设备无法识别命令......
我做错了什么?是不是格式不对?它不应该是一个字符串吗?还是应该不同于ASCII?

我已经尝试将 \r 放在命令的末尾,但这无济于事。

4

2 回答 2

1

解决方案:

发送附加数据\r\n。也可以更改 UTF 编码中的编码,但这不是强制性的...

- (IBAction)sendCommand:(id)sender {
    NSString *response  = [NSString stringWithFormat:@"%@\r\n", commandText.text];
    NSLog(@"Response send: %@", response);
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
    NSInteger bytesWritten = [outputStream write:[data bytes] maxLength:[data length]];

}
于 2014-02-25T19:37:15.627 回答
0

...有一个网络服务器。我通过wifi连接...

如果是这种情况,人们会认为最好的解决方案是高级解决方案。用于NSURLRequest发送您的请求,并以NSHTTPURLResponse. 让 iOS 为您处理 HTTP 内容。如果这不起作用,那么您设备的服务器就不能真正称为 Web 服务器。

于 2014-02-25T20:48:11.657 回答