191

現在、Bluetooth Low Energy を使用するアプリケーションを開発しています (Nexus 4 でテスト中)。Android 4.3 で公式の BLE API を使い始めた後、デバイスを初めて接続した後、そのデバイスまたは他のデバイスに再び正常に接続/通信できることはめったにないことに気付きました。

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

これが発生したら、アプリケーションをアンインストールし、Bluetooth を無効にし、電話機を再起動してから、再び動作を開始する必要があります。

デバイスが切断されるたびに、必ず BluetoothGatt オブジェクトで close() を呼び出して null に設定します。洞察はありますか?


編集:
ログ ダンプ: これらのログについては、電話をルート化し、/etc/bluetooth/bt_stack.conf 内の関連項目のトレース レベルを上げました。

接続成功- 電話を再起動してアプリをインストールした後の最初の試行。接続、すべてのサービス/特性の検出、および読み取り/書き込みができます。

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

試行の失敗 2 - サービス/特性を発見することさえできない例。


編集 2:
接続しようとしているデバイスは、TI の CC2541 チップに基づいています。私はTI SensorTag (これも CC2541 ベース) を入手して遊んでみましたが、昨日 TIが SensorTag 用のAndroid アプリをリリースしたことを発見しました。ただし、このアプリにも同じ問題があります。他の 2 台の Nexus 4 でこれをテストしたところ、同じ結果が得られました。SensorTag への接続は 1 回目または 2 回目は成功しましたが、(ログによると) その後サービスを検出できず、あらゆる種類のクラッシュが発生しました。この特定のチップの問題なのだろうか?

4

5 に答える 5

19

WIFI をオフにする:

WIFIをオフにすると、特にGoogle Nexus(Nexus 7を持っています)でBluetooth 4.0がより安定することも確認できます。

問題

私が開発しているアプリケーションには、 WIFIと継続的なBluetooth LE スキャンの両方が必要です。そのため、WIFIをオフにすることは私にとって選択肢ではありませんでした.

さらに、継続的なBluetooth LE スキャンが実際にWIFI 接続を強制終了し、BLE スキャンがオンになるまでWIFI アダプターが WIFI ネットワークに再接続できなくなる可能性があることに気付きました。(モバイルネットワークとモバイルインターネットについてはわかりません)。
これは、次のデバイスで確実に発生しました。

  • ネクサス7
  • モトローラ Moto G

ただし、WIFI をオンにした BLE スキャンは、次の環境ではかなり安定しているように見えました。

  • サムスン S4
  • HTC ワン

私の回避策

BLE を3 ~ 4 秒間スキャンしてから、スキャンを 3 ~ 4 秒間オフにします。その後、再度オンにします。

  • もちろん、BLE デバイスに接続するときは、常に BLE スキャンをオフにします。
  • デバイスから切断すると、BLE を再起動し (アダプターをオフにしてからオンにする)、スキャンを再開する前にスタックをリセットします。
  • services発見時やcharacteristics失敗時もBLEをリセットしています。
  • アプリが接続する必要があるデバイスから広告データを取得すると (接続できずに 500 回としましょう - 広告の約 5 ~ 10 秒)、もう一度 BLE をリセットします。
于 2014-02-12T14:54:47.173 に答える
8

一部のモデルには欠陥があります: https://code.google.com/p/android/issues/detail?id=180440

一方、私の場合の問題は、 onDestroy メソッドで接続が適切に閉じられなかったことです。正しく閉じた後、wifiのオン/オフに関係なく、私にとっての問題は存在しません。

btGatt.disconnect();
btGatt.close();
于 2016-02-13T19:07:23.683 に答える