現在、Android 4.3 Bluetooth Low Energy に取り組んでいます。デバイスに接続し、サービスを取得し、サービスの読み取り/書き込みを行うことができます。2 番目のデバイスに接続しようとすると、2 番目のデバイスのサービスが受信され、最初のデバイスのサービスが失われます。最初のデバイスの書き込み/読み取り特性に接続しようとすると、何も機能しません。
複数のデバイスに接続しようとした人はいますか。2 つのデバイスの Gatt をどのように初期化しますか?
現在、Android 4.3 Bluetooth Low Energy に取り組んでいます。デバイスに接続し、サービスを取得し、サービスの読み取り/書き込みを行うことができます。2 番目のデバイスに接続しようとすると、2 番目のデバイスのサービスが受信され、最初のデバイスのサービスが失われます。最初のデバイスの書き込み/読み取り特性に接続しようとすると、何も機能しません。
複数のデバイスに接続しようとした人はいますか。2 つのデバイスの Gatt をどのように初期化しますか?
SAMSUNG BLE API と Google の API には Broadcom Ble スタックがあり、Broadcom スタックは現在複数の ble デバイスをサポートしていないと思います。
Samsung BLE スタック (galaxy S4) でもまったく同じ動作をしました。サムスンのコードをハッキングして修正しました:
クラス BluetoothGatt は、「すべての」検出されたサービスのリストを保持します。BluetoothGatt->discoverServices を呼び出すと、このリストがクリアされます。私は独自のクラスを駆動し、関数の動作を変更して、関連する BluetoothDevice のサービスのみを削除しました。これは私のコードです:
public class MyBluetoothGatt extends BluetoothGatt {
MyBluetoothGatt(Context paramContext, BluetoothProfile.ServiceListener paramServiceListener)
{
super(paramContext, paramServiceListener);
}
public final boolean discoverServices(BluetoothDevice paramBluetoothDevice)
{
if (paramBluetoothDevice == null)
{
Log.e("BtGatt.BluetoothGatt", "discoverServices() - device is null ");
return false;
}
Log.d("BtGatt.BluetoothGatt", "discoverServices() - device: " + paramBluetoothDevice.getAddress());
if ((d == null) || (this.f == 0))
return false;
// old code this.h.clear();
//--new code
@SuppressWarnings("rawtypes")
Iterator localIterator = this.h.iterator();
while (localIterator.hasNext())
{
BluetoothGattService localBluetoothGattService;
localBluetoothGattService = (BluetoothGattService)localIterator.next();
if (localBluetoothGattService.a().equals(paramBluetoothDevice))
{
this.h.remove(paramBluetoothDevice);
}
}
//end new code
this.d.discoverServices(this.f, paramBluetoothDevice.getAddress());
return true;
}
}
また、独自のクラスを派生できるようにするために、クラス エディターを使用して「最終」修飾子の一部を削除する必要がありました。それは大きなハックでしたが、今では美しく機能しています。公式リリースが公開されたら、S4 を Android 4.3 にアップグレードし、コードを移植する予定です。指を交差させれば、Android 4.3 でも機能します。