我已经开始新开发Android应用程序了。我有完全相同的设备具有不同的MAC地址,我需要同时或分别发现服务,特性和读取数据。在我的使用案例中,设备必须与平板电脑或手机配对。我可以连接到BluetoothGatt并获得BluetoothGattCalback,我可以发现服务,特性和读取数据。如果我将两个或更多设备配对,我只能发现一个设备的服务。当我列出我正在编写设备的服务时#39; MAC地址,以了解哪个服务属于哪个设备。 这是我的BluetoothGattCalback:
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
String intentAction;
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
mConnectionState = STATE_CONNECTED;
broadcastUpdate(intentAction);
Log.i(TAG, "Connected to GATT server.");
// Attempts to discover services after successful connection.
Log.i(TAG, "Attempting to start service discovery:" +
mBluetoothGatt.discoverServices());
try{
mBluetoothGatt.wait(1000);
}catch (Exception e){
}
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
intentAction = ACTION_GATT_DISCONNECTED;
mConnectionState = STATE_DISCONNECTED;
Log.i(TAG, "Disconnected from GATT server.");
broadcastUpdate(intentAction);
//mBluetoothGatt.disconnect();
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
} else {
Log.w(TAG, "onServicesDiscovered received: " + status);
}
//mBluetoothGatt.disconnect();
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
mBluetoothGatt.disconnect();
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
};
以下代码是我如何连接到gatt:
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
for (BluetoothDevice bd:mBluetoothAdapter.getBondedDevices()
) {
mBluetoothGatt=bd.connectGatt(this,false,mGattCallback);
try{
Thread.sleep(250);
}catch(Exception e){
}
}
我试图将Thread.sleep(250)增加到500-1000-2000没有任何改变。 也许我不知道如何正确循环以连接每个设备的gatt。
注意:有时会发现服务,并且两个设备的列表加倍,但列出的设备MAC地址全部相同。
重要提示:我不想构建多个BluetoothGattCalback和BluetoothGatt,因为设备数量在任何情况下都可能发生变化。
任何帮助将不胜感激。 感谢。
编辑:
通过使BluetoothGattCallback的Override方法同步并使用内部BluetoothGatt参数而不是@Emil提到的全局参数来解决上述问题。但它给我带来了所有新问题:
如果我没有重新启动我的BLE设备,那么在发现服务后它就无法连接到GATT服务器,即使我重新启动程序。
答案 0 :(得分:1)
问题是你在第二次循环迭代中覆盖了mBluetoothGatt。当您在设备连接后再调用mBluetoothGatt.discoverServices()时,您将在错误的gatt对象上执行discoverServices()。只需直接使用gatt参数而不是mBluetoothGatt。
你应该删除那些睡眠并等待电话。