在Android BLE中处理指示而非通知

时间:2015-06-24 15:27:14

标签: android bluetooth-lowenergy

使用蓝牙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);
        }

1 个答案:

答案 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回调。

(你现在可能已经想到了这一点,但是如果有人通过谷歌来到这里,可能会发布。)