Android BluetoothGatt setCharacteristicNotification 仅设置第一个特征
Posted
技术标签:
【中文标题】Android BluetoothGatt setCharacteristicNotification 仅设置第一个特征【英文标题】:Android BluetoothGatt setCharacteristicNotification only setting first characteristic 【发布时间】:2015-05-19 19:13:20 【问题描述】:我在通过同一蓝牙 LE 设备同时使用两种不同的特性时遇到了问题。它只记录第一个特征而不是第二个特征。如果我切换它们,它仍然会注册第一个,但不会注册第二个。第一和第二特征都需要注册和接收。如果有帮助,我使用的是运行 4.4.2 的三星 Galaxy S4。
这里是调用 setCharacteristicNotification() 的代码部分
if (mBluetoothBeaconGatt != null && mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE) != null)
characteristicBracelet = mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE)
.getCharacteristic(UUID_CUSTOM_BRACELET);
characteristicBeacon = mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE)
.getCharacteristic(UUID_CUSTOM_BEACON);
if(characteristicBracelet != null)
Log.i(TAG, "Init Bracelet Characteristics");
this.setCharacteristicNotification(characteristicBracelet,
true);
if(characteristicBeacon != null)
Log.i(TAG, "Init Beacon Characteristics");
this.setCharacteristicNotification(characteristicBeacon, true);
setCharacteristicNotification
if (UUID_CUSTOM_BEACON.equals(characteristic.getUuid()))
if (mBluetoothBeaconGatt != null)
Log.i(TAG, "Enabling indication for beacon");
mBluetoothBeaconGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic
.getDescriptor(UUID
.fromString(CustomGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor
.setValue((enabled) ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
: BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
mBluetoothBeaconGatt.writeDescriptor(descriptor);
else if (UUID_CUSTOM_BRACELET.equals(characteristic.getUuid()))
if (mBluetoothBraceletGatt != null || mBluetoothBeaconGatt != null)
BluetoothGatt gatt = (mBluetoothBeaconGatt != null) ? mBluetoothBeaconGatt : mBluetoothBraceletGatt;
gatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic
.getDescriptor(UUID
.fromString(CustomGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor
.setValue((enabled) ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
: BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
经过测试以查看它们是否为空的变量验证它们不为空。
如果您需要其他信息或者这是重复的,请告诉我。
感谢您抽出宝贵时间提供帮助。
【问题讨论】:
【参考方案1】:您不能同时执行多个蓝牙操作。获得onDescriptorWrite
后,您可以启用/禁用您的下一个特征:
private int index;
private boolean enabled;
private BluetoothGattCallback mGattCallback = new BluetoothGattCallback()
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)
index++;
setNotification();
public void notify(boolean enabled)
index = 0;
this.enabled = enabled;
setNotification();
private void setNotification()
BluetoothGattCharacteristic characteristic;
switch(index)
case 0:
characteristic = mBluetoothGatt.getService(MY_SERVICE_UUID)
.getCharacteristic(UUID_CUSTOM_BRACELET);
break;
case 1:
characteristic = mBluetoothGatt.getService(MY_SERVICE_UUID)
.getCharacteristic(UUID_CUSTOM_BEACON);
break;
default:
return;
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG);
descriptor.setValue((enabled) ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
: BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(desc);
来自 NewCircle 的精彩教程:https://newcircle.com/s/post/1553/bluetooth_smart_le_android_tutorial
【讨论】:
我不确定你对多个BluetoothGatt
对象做了什么。以上是关于Android BluetoothGatt setCharacteristicNotification 仅设置第一个特征的主要内容,如果未能解决你的问题,请参考以下文章
如何为所有连接的设备同时执行 BluetoothGatt 读写请求?
BluetoothGatt.setCharacteristicNotification() 有啥作用?