6

たとえば1〜100MBのデータを1024バイトのチャンクでリモートBluetoothデバイスにプログラムで書き込む必要があります。どちらもAndroidデバイスです。これは、データを転送するためのクライアントプログラムのサンプルコードスニペットです– </ p>

bTSocket.connect(); //connect to remote BT device
DataOutputStream outStream = new DataOutputStream(bTSocket.getOutputStream());
byte[] buffer = new byte[1024];
int bytesToTransfer = 1000000;
while (bytesToTransfer > 0) {
    outStream.write(buffer);
    outStream.flush();
    bytesToTransfer -= 1024;
}
outStream.close();

このコードをAndroid2.2(Froyo)で実行している間は、正常に動作します。ただし、Android 2.3.4および4.0.4の場合、outStream.write(buffer)は、一部のデータ(たとえば、100 KB)の転送後に無限にブロックします。言及する価値があるのは、リモートデバイスがデータをリッスンするように構成されていないことです。書き込み可能なデータ量に制限はありますか?

4

1 に答える 1

6

Bluetooth ソケットは、読み取りと書き込みの両方でブロッキング モードで動作します。

送信バッファーがいっぱいになった場合、.write()これ以上データを送信しようとするのを止めるためにできる唯一のことは、ブロックすることです。それをブロックする代わりに、「操作がブロックされます!」を返すことです。ノンブロッキング モードに置かれたときに TCP ソケットが実行できるのと同じように、エラー コード。しかし、Bluetooth ソケットには、そのような非ブロック モードはありません。

リモート Bluetooth デバイスがソケットから読み取っていないと述べています。この場合、ローカルの送信バッファーとリモートの受信バッファーは、それぞれ特定の有限サイズしかなく、最終的にはいっぱいになります。この時点で、.write()リモート エンドがソケットから何かを読み取るまで、操作はブロックされます。メガバイトのデータをポンピングし続けて、それがすべてどこかにバッファリングされることを期待することはできません。

さまざまな Android プラットフォーム間で発生する違いは、おそらく、関連する Bluetooth スタックで使用できるバッファー スペースの量が異なることに起因します。

于 2012-09-10T17:30:37.597 に答える