【问题标题】:Android BLE: Identify the Characteristic Type?Android BLE:识别特征类型?
【发布时间】:2016-12-31 09:40:09
【问题描述】:

我正在使用 BLE 开发一个 android 应用程序。此应用程序的要求是更新具有各种输入的特定硬件中的电压变化。所以我在这个应用程序中启用了 BLE 通知 API。这将在一段时间内以最新的硬件电压通知应用程序。

实施

mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor des = characteristic.getDescriptors();
des.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);         
//Set the value of the descriptor to enable notification
                    mBluetoothGatt.writeDescriptor(des);

我在 Gatt CallBack 方法的通知值中收到通知

      @Override
      public void onCharacteristicChanged(BluetoothGatt Gatt, BluetoothGattCharacteristic characteristic) {
                    Log.w(TAG, "**ACTION_DATA_AVAILABLE**" + characteristic.getUuid());
//Indication or notification was received
                    broadcastUpdate(BLEConstants.ACTION_DATA_AVAILABLE, characteristic);                     
//Go broadcast an intent with the characteristic data
                }

但我的问题是,我在相同的 Gatt 回调方法中也得到了正常响应。我想在 UI 中以特定方式更新通知。所以我需要将正常响应和通知分开。有没有办法做同样的事情?或者任何识别特定消息的选项来自通知?

【问题讨论】:

    标签: java android android-layout android-studio bluetooth-lowenergy


    【解决方案1】:

    如果您无法更改固件,则否。根据您的解释,如果您要求值或更改值,NOTIFY 特征类型似乎不会触发。

    如果是这样,我能想到的唯一解决方案就是遵循。

    1. 您要求提供价值。您必须设置标志,并且您必须考虑在设置标志时报告的所有值都是您一直要求的值。
    2. 您没有要求价值。将其视为通知。

    希望对你有帮助。

    更新:

    根据this,您似乎正在使用 RN4020 MLDP,它没有公开的私人服务文档

    我能找到的最好的是:

    //    private static final String MLDP_PRIVATE_SERVICE = "00035b03-58e6-07dd-021a-08123a000300"; //Private service for Microchip MLDP
    //    private static final String MLDP_DATA_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a000301"; //Characteristic for MLDP Data, properties - notify, write
    //    private static final String MLDP_CONTROL_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a0003ff"; //Characteristic for MLDP Control, properties - read, write
    //    private static final String CHARACTERISTIC_NOTIFICATION_CONFIG = "00002902-0000-1000-8000-00805f9b34fb";  //Special UUID for descriptor needed to enable notifications
    

    来自here

    这意味着传输数据的唯一方法是使用

    //    private static final String MLDP_DATA_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a000301"; //Characteristic for MLDP Data, properties - notify, write
    

    而且这个特性只有NOTIFY,没有read。因此,如果您正在使用它,则无法避免设备端的通知回调。

    【讨论】:

    • 好的,感谢您的回答。所以你是说通知消息和普通消息不能与 UUID 分开?
    • 如果您可以访问固件端,是的,您可以创建一个只有 READ 属性的特征,而另一个只有 NOTIFY 属性的特征。也可以组合属性。例如,characteristic 可以同时具有 READ 和 WRITE 属性,这是常用的。有必要完全理解固件端是如何工作的,BLE服务暴露了哪些特征,以及它们的属性是什么(读取、写入、无响应写入、通知、指示......)。
    【解决方案2】:

    一般来说,我们(在硬件方面)创建一个同时具有 WRITE 和 NOTIFY 属性的特性,以便我们可以随时读取或完全启用通知以获取实时数据。

    如果您可以访问硬件固件并且可以添加特性,最好将电压特性和响应特性分开。因此,您可以测试 onCharacteristicChanged 参数:

    int propertiesFlags = characteristic.getUuid();
    

    另一种好方法,也是我通常做的,是使用一个特征,但分配数据间隔。您的应用程序和硬件之间的某种约定:

    @Override
    public void onCharacteristicChanged(BluetoothGatt Gatt, BluetoothGattCharacteristic characteristic) {
        byte[] data = characteristic.getValue();
        if(data[1] < SOME_PREDIFINDED_VALUE){
            //it's a real-time data update
        }else{
            //it's a response to some data you sent.
        }
    
    }
    

    否则,响应将只是特性变化,意味着硬件电压的新值。

    【讨论】:

    • 好的。感谢您的更新。无论如何,第一个选项不适用于我的情况。因为我在数据接收部分管理一个复杂的串行通信协议。我将尝试第一个选项并更新您。
    • 在这种情况下,我使用了两个 UUID 的 MLDP_DATA_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a000301"; CHARACTERISTIC_NOTIFICATION_CONFIG = "00002902-0000-1000-8000-00805f9b34fb";根据您的理解,我们可以将第一个设置为 Normal 消息,将第二个设置为 Notfy 消息。我说的对吗?
    • 是的,如果您将固件配置为这样做。然后,您将能够将答案(由某些写入字符触发)与通知(实时数据流)分开。
    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2014-08-08
    相关资源
    最近更新 更多