web-dev-qa-db-ja.com

AndroidでのBluetooth Low Energyのバックグラウンドサービスの作成

背景

理想的には、特定のプロパティを持つ新しいデバイスが表示されるたびにアプリケーションを起動できるように、AndroidデバイスがBluetooth Low Energyデバイスをスキャンするようにしたいと思います。

したがって、BLEのブロードキャストパケットは、たとえば、ブロードキャストデバイスによって提供されるサービスのセットを列挙します。これにより、アプリは特定のサービスに対する関心を登録し、このサービスを備えたデバイスが範囲に入ると自動的に開始されます。

私が理解していることから、これはAndroid BLE APIがどのように機能するかではありません。

可能な最も簡単な例

周囲温度を経時的に記録するBLEセンサーがあります。 Android電話が十分近くにあるときはいつでも、すべてのデータを接続してダウンロードし、クラウドストレージソリューションに送信します。 。しかし、バッテリーを消耗させずにバックグラウンドでどのように実行する必要がありますが、それでも範囲内になったらすぐにデバイスをすばやく接続できる可能性がかなりありますか?

質問

タイマーを設定し、時々アプリを起動してから、手動でスキャンを開始する必要がありますか?次に、どのような間隔を選択する必要があります。バッテリーに悪影響を与えることなく、スキャナーを稼働させたままにすることができますか?

可能な解決策

これは私がこれまでに思いついたものです。

  • スキャンする間隔とデバイスを設定する構成アクティビティ
  • 構成アクティビティは、 Scheduler の例と同様のWakefulBroadcastReceiverをセットアップします
  • 受信者がonReceiveイベントを取得すると、覚醒サービスとしてBLEスキャンサービス(作成した)を開始します。
  • スキャンサービスは、(登録されたコールバックを使用して)スキャンを開始します。
  • サービスは、実行可能なadvレポートを取得する場合があります
  • タイムアウト後、サービスはスキャナーを停止し、ウェイクフルサービスを終了します。

これは機能しますが、最善の方法であるかどうかはわかりません。また、間隔をどれだけ短くできるかわかりませんが、バッテリーの寿命を損なうことはありません。私が望んでいるのは、2分ごとにスキャンを開始し、10〜20秒スキャンすることです。しかし、デバイスを起動するのはかなり頻繁になるのではないかと心配していますか?

46

この機能はすべてオープンソースに移動されました Android Beacon Library

  • 目的のパターンに一致するiBeaconsが検出されたときにアプリを起動または起動する

  • ユーザーがアプリをまだ起動していない場合でも、バックグラウンドでビーコンスキャンを実行する

  • バックグラウンドでスキャンレートを5分ごとに30秒に自動的に下げて、バッテリーを節約します。 (タイミング設定可能。)

コード例はshow here です

BLEデバイスがビーコンではない場合、このライブラリを使用して、センサーがビーコンとしても送信し、検出された後にメインサービスに接続することでこれを実現できます。

21
davidgyoung