1

全て、

Web サーバーを搭載した 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

...そこにウェブサーバーがあります。Wi-Fiでつないでい...

その場合、最善の解決策は高レベルの解決策であると考えられます。を使用NSURLRequestしてリクエストを送信し、NSHTTPURLResponse. HTTP の処理は iOS に任せましょう。それが機能しない場合、デバイスのサーバーは実際には Web サーバーとは言えません。

于 2014-02-25T20:48:11.657 に答える