さて、私はここで必死になっています。私はこれに対する答えを探していましたが、運が悪くて4時間続きました。これが私がやっていることの要点です。ソケット経由で別のデバイスに接続する Android アプリがあります。出力ストリームが正しく動作しています (接続されたデバイスは、送信したバイト値を正しく受信できます。したがって、デバイスに 10 を送信すると、10 が認識されます)。反対に、私のアプリはデバイスにコマンドを送信するたびに入力を受け取ります。デバイスはコマンドを認識し、[DOUBLE+EOL] 構造のパケットを送り返します。EOL は特に 0x0A - '\n' です。
これをPythonで問題なく動作させることができました。ただし、私は非常に新しいJavaであり、これを完全に理解していません。私は多くのことを試しましたが、現在、使用してDataInputStream(socket.getInputStream())
います。BufferedReader を使用してみましたが、文字列を希望どおりに double に変換できませんでした。これは、私が仕事をしようとしているコミュニケーションの重要なコードです:
if ( send_command( 40 ) )
{
try {
final double left_servo_pos = input_stream.readDouble();
try {
left_servo_pos_view.setText( Double.toString( left_servo_pos ) );
} catch ( Throwable t ) {
left_servo_pos_view.setText( t.toString() );
}
} catch ( UnknownHostException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
コマンド「40」は、上記で指定された形式のパケットを送信するようにデバイスに指示するだけです。これcatch ( Throwable t )
は、私が何を使用しているかを正確に把握するまでの代役に過ぎません (したがって、どのようなエラーが発生する可能性がありますか? Double.parseDouble() を使用しようとしたときに、もともとこれが変換型エラーをキャッチしました)。
それで、今何が起こっているのですか?TextView「left_servo_pos_view」にさまざまな値が表示されます。それらはすべて「e-312」の周りで終わります。これは、.readDouble() メソッドがストリームを通過するたびにストリームの一部を取得しているだけであることを示しています (したがって、送信している実際の Double 値の一部を取得しています。全部)。
それが私の問題です。必要に応じて追加の詳細を提供できます (他に何が役立つかはわかりません)。私が言ったように、この部分を除いてすべてが機能しているようです (そのため、初期化コードや、通信をセットアップする関数のようなものを提供していません)。input_stream の型を必要に応じて変更できます (先ほど言ったように、BufferedReader を試してみましたが、うまくいきませんでしたが、DataInputStream に戻りました。
ありがとう!
編集:
予想とはまったく異なる方法で問題を解決することになりました。コントローラからの出力のパケット キャプチャを行った後、データが「リトル エンディアン」スタイルで送信されていることがわかりました (理由はまだよくわかりませんが、コントローラがそれを実装する方法だと思います)。そこで、実装したリトル エンディアンの InputStream クラスをオンラインで見つけて、問題をほぼ解決しました。最初の値は正しく、それが再び正しくなるまでにさらに 8 つの値が必要です。それで、パケットに何か欠けているものがあると考えました。詳しく調べたところ、最後に余分なバイト「00」があります。そこで、コードに「skipBytes(1)」を追加したところ、正しく機能するようになりました。