Android Bluetooth Chat サンプル アプリをセットアップして、一度に複数のユーザーと接続し、ミニ チャット ルームを用意することはできますか? それは何を伴うでしょうか?
3 に答える
tl;dr バージョン: Bluetooth はこれに対応していません。使用しないでください。代わりに Wi-Fi を使用してください。おそらく Web バックエンドに支えられています。
私は、ソーシャル ワイヤレス ネットワークの研究プロジェクトのために、この問題を何年にもわたって徹底的に調査してきました。私の一般的なアドバイスは、2 ~ 3 人以上では機能しないということです。Bluetooth は、ワイヤレス ピア ツー ピア ネットワークを念頭に置いて設計されていません。
一般に、Android デバイス (特にHTC のデバイス、iirc)に含まれる安価な Bluetooth コントローラーは、一度に 2 つまたは 3 つ以上の接続を処理できないようです。これがハードウェアの問題なのかファームウェアの問題なのかはわかりませんが、いくつかの基本的な逸話を語ることはできます。私は 2011 年の初め頃に、SDK レベルで (つまり、ファームウェアの変更なしで) このアイデアを実装する作業を行っていました。接続が突然切断され、ソケットが使用できなくなり、再接続が必要になるまで、数分から 1 時間ほど作業してください。残念ながら、20 分が上限であり、通常、複数の接続を確立することは不可能でした。他のデバイスでも確実に。
このプロジェクトの目標は、複数の人がバックグラウンドで静かにやり取りできるようにすることでしたが、これは実現しませんでした。代わりに、Bluetooth を捨てて代わりに Wi-Fi を使用したところ、はるかにうまく機能しました。要約すると、人々は Bluetooth を信頼性の高いピアツーピア通信の可能な媒体と見なしていると思いますが、実際にはそのように設計されたわけではありません。小型デバイス間の短距離通信に使用される媒体のようなものです (ヘッドセットを考えてください)。
これを行う場合、接続できるデバイスの最大数が固定されていることに注意してください。これは、Bluetooth 仕様に従って、ピコネットは最大 7 つのデバイスをサポートするためです。(ウィキペディアの記事を参照してください。)
必要な変更は簡単です。デバイスごとに異なるUUID を使用します。これは、帯域外交換メカニズム、または増加する方法で UUID を割り当て、ネットワークに接続するときにそれぞれを連続して試す単純なスキームを使用して、さまざまな方法で実装できます。
関連する Google グループのスレッドを次に示します。
これを(コードで)行う方法を詳しく説明した、より精巧なものを投稿したことを覚えています。2010 年後半か 2011 年前半のはずです。
したがって、答えは、要約すると、はい、複数のUUIDを使用してこれを試みることができます(1つを使用した後はそれだけで、割り当てプロトコルを使用して別のUUIDを試す必要があります)。ただし、実際には、多くの試行錯誤の後、これはおそらく使用したい目的に対しては実際には機能せず、代わりにインターネット バックエンドを使用する方がはるかに優れています。ちなみに、これには別の理由もあります。ほとんどのユーザーは、バッテリーが消耗するのを恐れて Bluetooth をオンにしたくないのです..
他の誰かを助ける場合に備えて、これをここに残します。
公式の bluetooth チュートリアルに従って、それを少し変更して、カスタム チャット ルームを作成することができました。残念ながら、私のコードのほとんどを提供することはできませんが、主なアイデアは次のとおりです。
すべてのデバイスは、サーバーとクライアントの両方として機能します。チャットが開始されると、デバイスはサーバー スレッドを開始します。サーバースレッドは公式と同じですが、接続を受け付けても終了しません。聞き続けるだけです。
クライアント スレッドはチュートリアルと同じです。
サーバースレッドとクライアントスレッドの両方が同じ接続を管理します。このチュートリアルに従って、メッセージを受け入れるための別のスレッドと、メッセージを送信するための別のスレッドを作成しました。
private void manageConnectedSocket(BluetoothSocket socket) {
//create thread responsible for sending messages.
SendingThread w = new SendingThread(socket);
MainActivity.addSendingThread(w);
//Creates listener for messages to accept.
MainActivity.addListener(socket);
}
ユーザーが送信ボタンをクリックすると、常にメイン アクティビティになり、ワーカー (送信スレッド) ごとにリモート デバイスにメッセージが送信されます。リスニングは非同期で実行されています。
重要:
- メッセージの送信に失敗した場合は例外を処理し、切断されたことを検出した場合はデバイスの送受信スレッドを削除する必要があります。私の場合、よく知られている UUID "00001101-0000-1000-8000-00805f9b34fb" を使用しました。すべてのデバイスに。
- 一部のデバイスは弱い Bluetooth ハードウェアを備えており、クライアントとしての接続を拒否しているため、クライアントとして接続する試行の間に 3 秒間待機する必要があります。