私は BluetoothLE センサー デバイスに取り組んでいます。このデバイスでは、1 対多のデータ ブロードキャストを形成する必要があります。仕様によると、ペリフェラルは 1 つのマスターしか持つことができず、私が設計しているチップとスタックの制限により、マスターは 3 つのスレーブしか持つことができません。私が理解していることから、Android はとにかく BLE スレーブになることはできないため、デバイスをマスターにすることはできません。
BT4 の仕様と製造元のドキュメントの両方で、ブロードキャスト モードと呼ばれる別の動作モードについて説明しています。ブロードキャスト モードでは、接続は確立されず、アプリケーション データはアドバタイジング パケットの一部として送信されます。多くの Android/iOS 携帯電話が各パケットを同時にスキャンできるため、これは私のニーズにぴったりです。アドバタイジング パケットはバーストで複数回送信されるため、データの受信はほぼ確実であると思われます。パケットがあちこちで失われても、許容できます。
これが興味深いのは、これらのパケットが 10 ~ 20Hz のレートで更新されるライブ センサー データを運ぶことです。Web で見つけた例によると、このモードの BLE は主に、静的データをブロードキャストする「iBeacon」タイプの実装に使用されています。Android スタック内でアドバタイジング パケットがどのようにフィルタリングされるかに関する情報が見つかりません。Bluetooth ハードウェア アドレスごとに 1 つの結果を返すか、アドレスとデータの一意の組み合わせである可能性があります。このアプリケーションでは、2 番目のオプションが有効です。スキャンの開始と停止によってフィルターがリセットされる場合は、何かを機能させることもできます。
Android のドキュメントでは、スキャン メソッドでのデバイス フィルタリングの仕組みについては何も言及されていません。この同じ問題を解決しようとしているネット上の 1 つの投稿を見つけることができましたが、これには未解決の応答があります: BLE: Multiple discovery of the sameperipheral during scan。iOS では、これを可能にするスキャン関数に渡すことができるパラメータがあることを同僚が教えてくれました。
Android ソースの startLeScan() 呼び出しからコードをさかのぼって追跡しようとしましたが、コードは非常に複雑で、抽象化を使用しているため、それを含むオブジェクトの実装を識別するのが困難です。私が得た最も遠いものは、BluetoothManagerService クラス メソッド getBluetoothGatt() から返された IBluetoothGatt オブジェクトです。このオブジェクトは、スキャンの開始要求を受け取ります。github にある現在のリビジョンの BluetoothManagerService.java の 790 行付近でインスタンス化されています。オブジェクトはメッセージの結果からキャストされているため、結果は電話/ドライバー固有のものである可能性があります。これ以上追跡できるかどうかは、私の専門外です。
解決したいもう 1 つの問題は、スキャンのオンとオフをどれだけ迅速に切り替えることができるかということです。スキャンは電力を大量に消費する操作ですが、データのブロードキャストはかなり正確なリアルタイム タイマーで定期的に行われます。その結果、ブロードキャストとスキャンが同期され、残りの 90% 以上の時間はスキャナーがシャットダウンされるように、スキャンのオンとオフを切り替えることができれば、最適化に最適です。これはおそらく実験的にテストする必要があります。
Android用のアクセサリでこれが可能かどうかを確認するために、まだ実現可能性の調査を行っています. 私の現在の電話はまだバージョン 4.3 を実行できないため、これを実験的にテスト/ハッキングする方法がありません。