0

私はAndroid携帯からBLEビーコンの距離推定に取り組んでいます。私は、RSSIに基づいて距離を推定する独自のアルゴリズムを開発しました。 (私はすぐにライブラリーの形で距離計算アルゴリズムを展開します)。計算のためには、電話はビーコンから膨大な数の広告パケットを必要とする。BLEビーコンパケットのための無限のAndroid BLEスキャン

これまでのところ、BLEスキャンの通常の方法でコードをテストしました。現在、ターゲットAPIレベル19のコードを書いています。以下は、私が作業しているコードの一部です。ここで、ビーコンのスキャンを開始し、10秒後に停止します。

現在、私はUIスレッドでほとんどのことを行っています。スレッドをさらに作成することで、次のような機能を実現する必要があります。

  1. UIスレッドは、すべての計算またはLeScanから解放されます。
  2. PacketReaderThread - パケットをスキャンし、それらをarrayListに追加し続けるための別のスレッドです(アルゴリズムでの消費時に不要なデータをarrayListから消去します)。一定時間後にスキャンを停止するのではなく、アプリが実行されている限り、リアルタイムで作業を継続するために無期限にスキャンをオンにしたいと考えています。だから私はIntentServiceをこのために使うかもしれない。
  3. DistanceCalculatorThread(またはAsyncTask) - ArrayListオブジェクト(スキャンされたパケットを含む)は、データパケットを取得または消去し、距離計算をUIに通知するためにPacketReaderThreadとの間で同期されます。

は、私が質問している以下のGrepcode 上BluetoothAdapter.LeScanCallbackの実装を見ました。

  1. BluetoothAdapter.LeScanCallbackは、暗黙的にメイン/ UIスレッドにバインドされているか、他のスレッドと移植可能ですか?
  2. 上記のコードの両方の実装を他のスレッドに移動すると、そのスレッドでコールバックが機能するのですか、それともmain/uiスレッドにバインドされますか? (別のスレッドでパケットをスキャンする必要があるので、私はbluetoothAdapter.startLeScan(LEScanCallback)とBluetoothAdapter.LeScanCallbackについて知っておく必要があります)
    注 - 私はすでにthis questionに従っています。メインスレッド上で、私は、実際の答えが得られませんでした。また、私はaltBeaconの仕様を見て、そのリファレンスアプリを研究し、それはまた、スキャン・ストップ・scanAgainの方法でCycledScanメカニズムを使用しています)

答えて

1

はい、アンドロイドブルートゥーススキャンコールバックは常にメインスレッド上で行われます。これは4.x APIと5+ APIの両方に当てはまります。コールバック内の情報を使って重要な処理を行っている場合は、記述したとおりに別のスレッドに渡すのが賢明です。そうしないと、アプリのUIが遅くなり、Bluetooth処理がバックアップされ、ログにエラーが表示されることがあります。

これは公式にはどこにでも書かれているとは思いませんが、これらのコールバックを使用して長年の経験を積んだことが、常に正しいことが示されています。コールバックが別のスレッドで発生するようにスキャンを設定する方法はありません。ベストプラクティスは、処理を実行してすぐにコールバックを終了するために、別のスレッドへの単一の呼び出しを行うことです。

これは、コールバックのボディは、単にこのラインでバックグラウンドスレッドでそれを実行しAsyncTaskを使用していることhere.注意を示すようAndroid Beacon Libraryで行われているものです。

new ScanProcessor(...).executeOnExecutor(mExecutor, 
        new ScanData(device, rssi, scanRecord)); 

はまた、それがために重要です新しいAndroid搭載デバイスでスキャンを停止する理由はありませんが、一部の古いデバイスでは、ビーコン広告が接続可能であれば、固有のビーコンMACアドレスごとに1つのコールバックしか取得できません。これらのデバイスでこれを回避する唯一の方法は、追加のコールバックを取得するためにスキャンを停止して再開することです。

あなたの距離アルゴリズムで幸運を祈る - 良い結果があり、Androidビーコンライブラリの共有に興味があるなら、私は議論したいと思います。

+0

はい、いい結果があります。 RSSIと距離のマッピングはLocateよりも速く収束します;)あなたはそのライブラリをとてもよく書いています。私はそれを研究しました。デイビッドのおかげで、LooperThreadを使用します。コールバックに関する公式の文書が見つかった場合は、お知らせください。そして私が数週間でデモを完了すると、私たちは間違いなく議論するでしょう。 – Tejas

関連する問題