samsung ble api 无法从多个 GATT 特征中获取通知

Posted

技术标签:

【中文标题】samsung ble api 无法从多个 GATT 特征中获取通知【英文标题】:samsung ble api cannot get notification from multiple GATT characteristics 【发布时间】:2013-11-13 09:10:05 【问题描述】:

我正在三星 ACE3 上开发一个应用程序来连接蓝牙低功耗设备。由于三星不希望ACE3升级到android 4.3,所以我需要使用三星ble api。目前,连接、读取数据、发送数据和从一个特性获取通知都可以。但是,当我为多个特征启用通知时,只有第一个启用的特征才能获得通知。有人有同样的问题吗?感谢您的帮助!

以下代码是启用连接通知

 if (mBluetoothGatt != null && device != null) 
        BluetoothGattService pucService = mBluetoothGatt.getService(device, PROFILE_UART_CONTROL_SERVICE);
        if (pucService == null) 
            showMessage("PUC service not found!");
            return;
        

        BluetoothGattCharacteristic motion = pucService.getCharacteristic(MOTION_READ);
        if (motion == null) 
            showMessage("charateristic not found!");
            return;
        
        enableNotification(true, motion);            

        BluetoothGattCharacteristic voltage = pucService.getCharacteristic(VOLTAGE_READ);
        if (voltage == null) 
            showMessage("charateristic not found!");
            return;
        
        enableNotification(true, voltage);


        BluetoothGattCharacteristic pressure = pucService.getCharacteristic(PRESSURE_READ);
        if (pressure == null) 
            showMessage("charateristic not found!");
            return;
        
        enableNotification(true, pressure);
    

下面是 enableNotification 方法:

    public boolean enableNotification(boolean enable, BluetoothGattCharacteristic characteristic) 
    if (mBluetoothGatt == null)
        return false;
    if (!mBluetoothGatt.setCharacteristicNotification(characteristic, enable))
        return false;

    BluetoothGattDescriptor clientConfig = characteristic.getDescriptor(CCC);
    if (clientConfig == null)
        return false;

    if (enable) 
         Log.i(TAG,"enable notification");
        clientConfig.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
     else 
        Log.i(TAG,"disable notification");
        clientConfig.setValue(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
    
    return mBluetoothGatt.writeDescriptor(clientConfig);

【问题讨论】:

【参考方案1】:

刚刚意识到这个问题在 this post 的 miznick 的第二个答案中得到了解决。主要是因为三星 BLE Api 的行为是同步的。基本上,api 一次只能处理 1 条 Gatt 指令,例如写/读特性、w/r 描述符等。通过调用 w/r GATT 方法,就像将 Gatt 指令附加到等待执行的系统中一样。执行后,系统会调用相关的回调方法,如onCharacterWrite、OnDescriptorWrite等。只有在这一点上或之后,我们才应该调用另一个 Gatt w/r 方法。代码在 miznick 的帖子中给出。

This post 也有助于理解 Samsung Ble api 的行为。请查看三星 BLE 官方网站中的指南和提示。

【讨论】:

以上是关于samsung ble api 无法从多个 GATT 特征中获取通知的主要内容,如果未能解决你的问题,请参考以下文章

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

无法取消注册 ble 通知的 dbus 信号

蓝牙 4.0+ BLE 吗?

无法定期在 IOS 中进行后台 API 调用以推送应用程序中从 BLE 设备接收的数据

Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

如何从多个数组中找到单个字符串?