使用蓝牙SIG应用加速器代码,它可以很好地演示蓝牙低功耗的不同概念。但是,没有提及与通知相反的适应症。我知道,与通知不同,指示需要得到承认,在代码中我会byte[] val = enabled ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE : BluetoothGattDescriptor.DISABLE_INDICATION_VALUE;
而不是byte[] val = enabled ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE;
,但我还需要做什么吗?我究竟如何让服务器知道我收到了指示,因为这是必需的?是否需要添加
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic)
{
notification_id++;
Log.d("BleWrapper","notification count = " + notification_id);
// characteristic's value was updated due to enabled notification, lets get this value
// the value itself will be reported to the UI inside getCharacteristicValue
getCharacteristicValue(characteristic);
// also, notify UI that notification are enabled for particular characteristic
mUiCallback.uiGotNotification(mBluetoothGatt, mBluetoothDevice, mBluetoothSelectedService, characteristic);
}
答案 0 :(得分:16)
您所描述的内容已足够,但存在轻微错误。
事实上,BLE指示需要得到客户的承认,而通知则不需要。但是,这完全由Android幕后处理。系统会在您调用onCharacteristicChanged
回调时确认指示。
您已经发现的唯一区别是,您需要在BLE服务器上的客户端特性配置描述符中启用右侧标志。对于常规通知,请使用ENABLE_NOTIFICATION_VALUE
。有关适应症,请使用ENABLE_INDICATION_VALUE
。请注意,您可以通过编写DISABLE_NOTIFICATION_VALUE
来停用两者。根据文档,您提到的 不存在!DISABLE_INDICATION_VALUE
在Android方面,使用BluetoothGatt#setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enable)
enable = true
就足够了。这适用于通知和指示。在这两种情况下,都会使用onCharacteristicChanged
回调。
(你现在可能已经想到了这一点,但是如果有人通过谷歌来到这里,可能会发布。)