1

クライアントとして機能する Android デバイスを持っています。PC は Bluetooth サーバーであり、Bluecove ライブラリを使用しています。

クライアントからのコード スニペット:

btSocket = serverBt.createRfcommSocketToServiceRecord(myUuid);
btAdapter.cancelDiscovery();
btSocket.connect();

InputStream in = btSocket.getInputStream();
OutputStream out = btSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out);
InputStreamReader isr = new InputStreamReader(in);
osw.write(55);
osw.flush();
out.flush();
//osw.close();
logTheEvent("Stuff got written, now waiting for the response.");
int dummy = isr.read();
logTheEvent("Servers response: "+ new Integer(dummy).toString());

そしてサーバー:

StreamConnectionNotifier streamConnNotifier = (StreamConnectionNotifier)Connector.open( connectionString, Connector.READ_WRITE );
StreamConnection incomingConnection=streamConnNotifier.acceptAndOpen();
InputStream in = incomingConnection.openInputStream();
OutputStream out = incomingConnection.openOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out);
InputStreamReader isr = new InputStreamReader(in);
int fromClient = isr.read();
System.out.println("Got from client " + new Integer(fromClient).toString());
osw.write(999);

osw.close (); クライアントがコメント解除されると、メッセージはサーバーに転送されますが、クライアントは応答を受信できず、「ソケットは既に閉じられています」というメッセージを含む IOException がスローされます。ただし、osw.close(); クライアントとサーバーの両方がフリーズします。

双方向通信を有効にするにはどうすればよいですか? 私のコード、または PC Bluetoototh スタック、または bluecove のせいですか?

4

1 に答える 1

2

Bluetoothはバッファリングされた出力を使用します。これは、ストリームに書き込むすべてのデータを含む小さなメモリ位置があることを意味します。このメモリ位置がいっぱいになると、バッファデータをパケットでソケットに書き込みます。ソケットを途中で閉じると、そのバッファーが消去され、データが失われます。

ストリームに強制的に書き込むには、呼び出してみてくださいflush()

他にできることは、バッファサイズを非常に小さく設定して、データが常に書き込まれるようにすることです。ただし、これを行うとパフォーマンスはあまり良くありません。

残念ながら、私が書いたコードのすべてを持っているわけではありませんが、ここに基本プロジェクトがあります

于 2012-10-15T21:37:47.683 に答える