1


1

BluetoothとSPPを使用したマルチデバイスとの接続

SPPを使用して、Androidベースの携帯電話から同時に2つのデバイスに接続できますが、入力ストリーム(socket.getInputStream()など)をオンにすると、その1つはストリームで0を返します。つまり、ストリームで利用可能なデータはありません。 。 たとえば、デバイスA(devA)とデバイスB(devB)にそれぞれ接続されたスレッドA(thA)とスレッドB(thB)。 そのため、thAは入力ストリームA(inA)を使用してdevAからデータを受信し、thBは入力ストリームB(inB)を使用してdevBからデータを受信します。 次のように:devA --→ inA --→ thA devB --→ inB --→ thB各デバイスに個別に接続すればうまく動作します。 ただし、2つのデバイスを同時に接続する場合、inAまたはinBのみにデータがあります。

それがあなたに起こったら、私とあなたの経験を共有してください、私は非常に感謝します! 前もって感謝します。 YT

1 Answer


0


  1. createRFCommSocketにリフレクションを使用しているのはなぜですか? device.getClass()。getMethod( "createRfcommSocket"、new Class [] \ {int.class});

とは対照的に

        try {mBTSocket = mBTDevice.createRfcommSocketToServiceRecord(UUID_RFCOMM_GENERIC);
        } catch (Exception e1) {
            msg ("connect(): Failed to bind to RFCOMM by UUID. msg=" + e1.getMessage());
            return false;
        }

反射は問題の原因になりやすい。 それを使用する理由がない場合は、すべてのコストでそれを避けてください。

さらに、getClass呼び出しが失敗した場合、「m」変数はnullになり、その状況に陥ることはありません。 特定の例外を使用する代わりに、上記のコードスニペットのように「例外」を使用するだけで、例外もより一般化する必要があります。 スローされる可能性のあるすべてのタイプの例外にキャッチを追加するよりもはるかに簡単です。

  1. 私はあなたがハンドラで何をしているのか混乱していますが、そうではありません 私には理にかなっています。 ハンドラーコードを削除して、物事を単純化できますか?

  2. 複雑すぎます。 すべての反射を削除し、余分な キャッチの。

  3. メソッドを1ページ以下にすることをお勧めします。 When メソッドはページ以上のものであり、複雑すぎて読みにくく、デバッグも非常に困難です。 一般的なタスクを実行する他のメソッドを作成して、メソッドのサイズを小さくします。

  4. I / Oロジックからconnect()ロジックを分離します。 あなたが持っている必要があります データを送信するメソッド、およびデータを受信するメソッド、connect()のメソッド。 次に、これらを機能させたら、データブロック全体を送受信するための高レベルI / Oのメソッドをまとめて作成します。 それらの方法を完成させ、成長し続けます。

私のコードでは、読み取り、書き込み、接続、およびすべてのI / Oメソッドはそれぞれ1〜20行です。 I / Oロジックはアプリのコアであり、クリーンでクリーンである必要があるため、非常にシンプルにしてください。