Android BLE APIを使用してNexus 4でBLEアプリケーションを開発しています。私にはいくつかの質問/疑問があります:
1)BLEセントラルデバイスの接続または通知間隔を設定/オーバーライドする方法はありますか。 Androidの場合、デフォルトの接続間隔は7.5msに固定されていることがわかりました。この接続/通知遅延間隔の設定を変更する方法はありますか。
2)リモートデバイスへの接続時に、ランダムな時間間隔の後に切断されるという問題に直面しています。 BLE接続にAndroid 4.3 APIを使用している場合、Androidが不安定であると述べる接続ドロップの問題に直面している多くの人々がいます。これに対する解決策はありますか?
[〜#〜] edit [〜#〜]
ここで私が観察する他のことは、再接続に時間がかかっているときであり、それはいくつかのL2CAPログとともに来ています...ログに続いて
Trying to create a new connection laststate_ BOND_NONE
D/BluetoothGatt( 9620): connect() - device: 1C:BA:81:11:CA:36, auto: true
D/BluetoothGatt( 9620): registerApp()
D/BluetoothGatt( 9620): registerApp() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510
D/BtGatt.GattService( 3208): registerClient() - UUID=1adsds0911-4sdsc-41dc-8ac0-0sdsdf550510
D/BtGatt.btif( 3208): btif_gattc_register_app
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1000
D/BtGatt.btif( 3208): btif_gattc_upstreams_evt: Event 0
D/BtGatt.GattService( 3208): onClientRegistered() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510, clientIf=5
D/BluetoothGatt( 9620): onClientRegistered() - status=0 clientIf=5
D/BtGatt.GattService( 3208): clientConnect() - address=1C:BA:8C:1E:CA:36, isDirect=true
D/BtGatt.btif( 3208): btif_gattc_open
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1004
D/BtGatt.btif( 3208): btif_get_device_type: Device [1c:ba:8c:1e:ca:36] type 2, addr. type 0
W/bt-l2cap( 3208): L2CAP - LE - cannot start new connection at conn st: 3
L2CAPでcahce mantainをクリアする方法はありますか?
Android BLE API、接続間隔と監視タイムアウトを変更するためのAPIを見つけることができませんでした(おそらく、スレーブレイテンシーも頭の上から思い出せません)。これらを変更する必要がある場合は、スレーブデバイスから変更する必要があります。
あなたがただ無視できるアシュウィニからの答えは、彼が言うことは単に間違っています。 Bluetooth 4.0準拠のマスターデバイスは、7.5ミリ秒から4.0秒までの接続間隔をサポートする必要があります。スレーブデバイスは接続パラメーターの変更を要求し、接続パラメーター更新要求を送信できます。マスターはそれに応じて接続パラメーターを更新します。
一方、マスター(あなたの場合、Androidデバイス)は、電力を節約するために、接続間隔を変更することに関心を持つ可能性があります。接続間隔からより緩やかな間隔へ。
私の意見では、Android APIといくつかのデバイスのハードウェア実装さえも未熟であり、BLEを使用するという意味でBLEを使用しているため、Android device。将来的には、モバイルデバイスのメインCPUがスリープしている場合でもコントローラーが接続を維持できるように、APIレベルとホストとコントローラーの分割でより良いサポートが提供されると思います。大量の電力を使用し、バッテリー寿命に大きな制約を課すことなく、BLEデバイスとの接続を24時間いつでも維持できます。
@Ashwini:接続間隔7.5の最後のコメントで述べたように、しばらくの間はより良く機能しています。しばらくすると、L2CAPの問題が表示され、Bluetoothアダプターがリセットされない限り接続は機能しません。また、ブルートゥースアダプターを無効にし、プログラムで再度有効にすると、奇妙な動作が発生します。以下のGKIエラーが表示されます。
> /GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception(): Task State Table
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [0] task name [BTU] state [0]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest#####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception:
> 02-05 15:49:24.466 E/GKI_LINUX( 2232):
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: ***************
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
また、このcreateBond APIは、BLEデバイス(実際には接続にペアリングを必要としない)との接続の改善に役立ちますか?
接続間隔の変更に関して:
Android Lollipop API level 21]を使用できます: requestConnectionPriority() 3つのレベル:CONNECTION_PRIORITY_BALANCED、CONNECTION_PRIORITY_HIGH、またはCONNECTION_PRIORITY_LOW_POWER。
開発者が望むほど汎用性はありませんが、少なくとも何か...
最初の質問については、OneWorldが言ったように、スマートフォンに接続遅延間隔の設定を処理させることをお勧めします。この設定は、特定のスマートフォンに使用されるBluetoothハードウェアとスタックに密接に依存しています。
切断の問題についても、同様の問題に直面しました。これは、特定のリンクにログインしている issue によるものだと思います。 OSが接続とペアリングを処理する場合、デバイスのペアリングを解除することはできず、この後すべての再接続試行は失敗します。 4.3でプライベートAPIを使用してプログラムでデバイスがペアリング(およびペアリング解除)された場合、GATT接続が正しく処理されていると仮定すると、これは発生しません。 Android 4.4.2では、ペアリング用にcreateBond APIが追加されています。したがって、4.4.2では、通信は非常にうまく機能します。
AndroidでのBluetooth Low Energyの安定性に関しては、かなり不安定であることが確認できます。 Nexus 4およびNexus 5にインストールされたアプリケーションで低エネルギーセンサーをテストしました。同じOSバージョン4.4.2を使用しているにもかかわらず、両方のデバイスの接続結果が異なりました。 Nexus 4では特定の時間後にデバイスが切断され、Nexus 5では問題なく動作することがわかりました。
これがあなたの問題の前進に役立つことを願っています。
2番目の質問と同じ自動切断の問題が発生しました。それを解決する2つの方法:
1)アプリケーションを実行する前に、Bluetooth設定を介して、手動でAndroidデバイスとリモートデバイスをペアリングします。
2)または、プログラムでそれらをコードでペアにすることができます。これは私がオンラインで見つけたペアリングコードです。
private void pairDevice(BluetoothDevice device) {
try {
Log.d("pairDevice()", "Start Pairing...");
Method m = device.getClass()
.getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
Log.d("pairDevice()", "Pairing finished.");
} catch (Exception e) {
Log.e("pairDevice()", e.getMessage());
}
}