1. ホーム
  2. android

[解決済み] Android 4.3 Bluetooth Low Energyの動作が不安定

2022-04-13 17:34:09

質問

現在、Bluetooth Low Energyを使用するアプリケーションを開発中です(Nexus 4でテスト中)。Android 4.3の公式BLE APIを使い始めてから、あるデバイスを初めて接続した後、そのデバイスや他のデバイスとの接続や通信に成功することはほとんどないことに気づきました。

ガイドに従うと こちら デバイスへの接続、サービスと特性のスキャン、通知の読み取り/書き込み/受信は問題なく行えます。しかし、接続を解除して再接続すると、サービスや特性のスキャンができなくなったり、読み取り/書き込みが完了できなくなったりすることがよくあります。ログを見ても、このような現象が起こる理由を示すものが見つかりません。

この現象が発生すると、アプリケーションをアンインストールし、Bluetoothを無効にし、携帯電話を再起動しないと、再び動作し始めません。

デバイスが切断されるたびに、BluetoothGattオブジェクトのclose()を呼び出し、nullに設定することを確認しています。何かヒントがありますか?


EDITです。

ログダンプです。これらのログは、私の携帯電話をルート化し、/etc/bluetooth/bt_stack.conf の関連項目のトレースレベルを増加させたものです。

接続に成功 - スマホを再起動し、アプリをインストール後、初挑戦。接続し、すべてのサービス/特性を検出し、読み取り/書き込みができるようになりました。

失敗した試み1 - 上の接続成功から切断した後の次の試行です。特性は発見できたようですが、最初の読み込みの試みでNULL値が返され、その後すぐに切断されました。

失敗した試み2 - サービス/特性を検出することさえできない例。


EDIT 2:

私が接続しようとしているデバイスは、TI社のCC2541チップをベースにしています。を入手しました。 TI SensorTag (これもCC2541ベース)で遊んでみたところ、TIがリリースした アンドロイドアプリ 昨日、SensorTagのために。しかし、このアプリには 同じ問題があります。 他の2台のNexus 4でテストしましたが、同じ結果でした。SensorTagへの接続は、最初のまたは2回目は成功しますが、(ログによると)クラッシュのすべての種類を引き起こし、その後のサービスを検出するために失敗しています。私はそれがこの特定のチップの問題であるかどうかを疑問に思ってきている?

解決方法は?

重要な実装のヒント

(Android OSのアップデートにより、これらのヒントが不要になったものもあるかもしれません)

  1. Nexus 4などAndroid 4.3搭載の一部端末 既存の gatt インスタンスを使用して接続するために 45 秒以上かかります。 . 回避策 回避策:切断時に常に gatt インスタンスを閉じ、接続のたびに gatt の新しいインスタンスを作成します。
  2. を忘れずに呼び出すこと。 android.bluetooth.BluetoothGatt#close()
  3. 中に新しいスレッドを立ち上げる onLeScan(..) をクリックしてから接続してください。理由を教えてください。 BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) の内部で呼び出された場合、常に失敗します。 LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) 同じスレッドで、Android 4.3 を搭載した Samsung Galaxy S3 (少なくともビルド JSS15J.I9300XXUGMK6) を使用しています。
  4. ほとんどのデバイスで広告をフィルタリング
  5. 使用しない方が良い android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) というパラメータで、特定のサービスのUUIDをフィルタリングします。 これは、Android 4.3 を搭載した Samsung Galaxy S3 で完全に壊れているためです。 は128bitのUUIDでは動作しません。 を使用します。
  6. ガットは常に1つのコマンドを同時に処理できる . 複数のコマンドが続けて呼ばれた場合、最初のコマンドはキャンセルされます。 gatt の実装が同期的であるためです。
  7. Android 5を搭載した最新のデバイスでも、WifiがBluetoothと干渉したり、逆にBluetoothがWifiと干渉したりするのをよく見かけます。 最後の手段として、wifiをオフにすることでブルートゥースを安定させることができます。

初心者のためのチュートリアル

このビデオチュートリアルは、初心者のための入門編として、かなり良いのではないでしょうか。Android用Bluetooth Smartアプリケーションの開発 http://youtu.be/x1y4tEHDwk0

以下の問題と回避策は、おそらくOSのアップデートによって修正されていると思われます。

回避策 自分のアプリを安定させることができました。

  1. Bluetoothを再起動する」という設定をユーザーに提供しています。この設定が有効な場合、BLEスタックが不安定になり始めたことを示すいくつかのポイントでBluetoothを再起動します。例えば、startScanがfalseを返した場合などです。また、serviceDiscoveryに失敗した場合も良いポイントかもしれません。私はBluetoothをオフにしたりオンにしたりするだけです。
  2. WiFiをオフにする」という設定も用意しました。この設定が有効な場合、私のアプリはアプリの実行中にWifiをオフにします(その後、オンに戻します)。

この回避策は、次のような経験に基づいています...

  • Bluetoothを再起動すると、ほとんどの場合BLEの問題が解決する
  • Wifiをオフにすると、BLEスタックはより安定します。しかし、Wifiをオンにしたほとんどのデバイスでも問題なく動作します。
  • Wifi をオフにした場合、Bluetooth を再起動すると、ほとんどの場合、デバイスを再起動する必要なく BLE スタックが完全に回復します。