1

サンプルの Bluetooth チャット アプリケーションに、画像を送信する機能を追加しました。わからない問題にぶち当たりました。サンプル アプリでは、データを送受信するために文字列が必要です。選択した画像でテキストを送信できるように、ビットマップをバイトに変換してから文字列に変換するためにBase64を訴えています。小さな画像 (例: 4kb サイズの完全に黒い画像) を送信すると、それが送受信され、リストビューに表示されます。しかし、大きな画像を送信すると、多くのパッケージに分割されます。つまり、1 つの画像ではなく多数のテキストが取得され、リストビューにデータを入力するために使用する配列のサイズは、パッケージの数に応じて 1 以上になるため、リストビューには多くのテキストが入力されます。

結局のところ、それは画像のサイズに依存します。私は多くの画像で実験しました。長さ (文字列として) が 50096 の写真の場合、受信側で 51 個のパッケージが取得されます。長さが 77896 の別のイメージの場合、81 個のパッケージを取得します。そこで、本当に小さな画像で試してみることにしました。ペイントで黒の画像を作成したところ、無事に送受信できました。長さを測定したところ、280 でした。次に、長さ 980 の白い画像に少し黄色を加えて実験しました。これも正常に送信されました。次に、画像に黒を追加した結果、長さが 1554 になりました。今回は、画像の代わりにいくつかのテキストを受け取りました。

したがって、Bluetooth を介してデータを送信する場合、文字列の長さが制限されるというのが私の結論です。これは、テクノロジーに精通している人にとっては明白かもしれません。

これについて何ができますか?1 つのパッケージで送信できる最大文字数がわかっていれば、送信側でパッケージの数を計算でき、受信側のサイズですべてのパッケージを連結できます。

この動作を示すために、レシーバー側の 2 つの画像を示します。最初の関数は正しい関数で、2 番目の関数は間違った関数です。

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

0

ブルートゥースチャットのソースコードからこの関数で見つけることができるように、あなたの問題はレシーバー部分にあります:

    public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[1024];
        int bytes;

        // Keep listening to the InputStream while connected
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);

                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                // Start the service over to restart listening mode
                BluetoothChatService.this.start();
                break;
            }
        }
    }

具体的には、に注意してくださいbyte[] buffer = new byte[1024];。1Kのみに制限されています。さらに多くのことをしたい場合は、バッファのサイズを増やすか、ファイルがこのバッファサイズを超えていることを検出するメソッドを構築する必要があります。

これを処理するプロトコルを設計する必要があることに注意してください。

  1. これをbase64で送信する必要はありません。ストリームは、バイナリを問題なく受け入れます。
  2. ファイルタイプ、パケット番号、およびパケットの総数を含むヘッダーを配置します。本当に凝ったものにしたい場合は、パケットが無傷であることを確認するために、ある種のチェックサムを含めてください。
  3. 欠落しているパケットを再送信するメカニズムを含める必要があります。
  4. 何が来るのかを説明する最初のヘッダーを送信することをお勧めします。
于 2012-12-01T15:51:03.660 に答える