未调用 Android BLE onCharacteristicChanged()

Posted

技术标签:

【中文标题】未调用 Android BLE onCharacteristicChanged()【英文标题】:Android BLE onCharacteristicChanged() not called 【发布时间】:2016-06-09 05:30:26 【问题描述】:

我正在开发一个包含 Bluegiga BLE113 模块和 android 应用程序的项目。在 Bluegiga 模块上,我设置了几个特性。对于一个特征,我定义了一个描述符来激活 clieenter code herent 通知(在我的例子中,客户端是 Android 应用程序。)。 BLE113模块的特征定义如下:

 <characteristic uuid="dcfa2671-974d-4e4a-96cd-6221afeabb62"        id="ez1_flow_data_out">
     <!-- org.bluetooth.descriptor.gatt.characteristic_user_description -->
     <description>Data to transmit to Android device</description>
     <properties write="true" read="true" />
     <value variable_length="true" length="255" type="hex" />
     <!-- org.bluetooth.descriptor.gatt.client_characteristic_configuration -->
     <descriptor uuid="2902">
     <properties write="true" read="true" const="false" />
     <!-- Bit 0 = 1: Notifications enabled -->
    <value type="hex">0001</value>
    </descriptor>


   </characteristic>

在 Android 端,我根据 Android 蓝牙低功耗指南在 onServicesDiscovered(...) 回调中设置了通知:

characteristic=gatt.getService(BLEuuids.DATAFLOW_SERVICE).getCharacteristic(BLEuuids.DATAFLOW_OUT_CHARACT);
//Enable local notifications
gatt.setCharacteristicNotification(characteristic, true);
//Enabled remote notifications
BluetoothGattDescriptor desc = characteristic.getDescriptor(BLEuuids.DATAFLOW_OUT_DESCRIPT);
boolean test;
test = desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); // return value = true
test = gatt.readDescriptor(desc); // return value = true
test = gatt.writeDescriptor(desc); // return value = true

但是,如果我使用 Bluegiga 模块的串行接口更改 DATAFLOW_OUT_CHARACT 特征 UUID 的值,则不会在我的 Android 应用上触发预期的回调 onCharacteristicChanged(...)。

我的描述符设置正确还是我的 Android 代码失败?

【问题讨论】:

【参考方案1】:

现在启用通知以回调 onCharactersticsChanged() 并设置属性 ENABLE_NOTIFICATION_VALUE 和 ENABLE_INDICATION_VALUE

Log.d(TAG, "setCharacteristicNotification");
        if (mBluetoothAdapter == null || customBluetoothGatt == null) 
            Log.d(TAG, "BluetoothAdapter not initialized");
            return;
        cx
        customBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
        boolean success = customBluetoothGatt.writeDescriptor(descriptor);

【讨论】:

以上是关于未调用 Android BLE onCharacteristicChanged()的主要内容,如果未能解决你的问题,请参考以下文章

未调用 Android BLE onCharacteristicChanged()

BLE 5 外围设备未在支持 BLE 5 的 Android 手机和 iPhone 上得到扫描

未调用 BLE 外设委托

Android和双模蓝牙设备:与BR / EDR(经典)配对时未找到自定义BLE服务

Android BLE低功耗蓝牙开发极简系列(二)之读写操作

Android BLE,扫描开始,找到设备但未连接过滤器(ESP32 和三星)