阅读蓝牙低能耗属性(阅读,通知) - 它是如何工作的?

时间:2016-12-27 15:31:15

标签: android properties bluetooth-lowenergy

我正在分析一个来自android的示例,它解释了android上的蓝牙低能耗。我找到了以下代码,它设置了一个通知,但是我无法通过在ifs中使用属性整数和条件来获得这里发生的事情。有人可以解释一下吗?

无论如何,也许你有一些更好的资源,这可以解释一个关于android的概念 - 什么以及如何在这里工作?官方的android教程非常糟糕,蓝牙官方页面几乎什么都没有......

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                            int childPosition, long id) {
    if (mGattCharacteristics != null) {
        final BluetoothGattCharacteristic characteristic =
                mGattCharacteristics.get(groupPosition).get(childPosition);
        final int charaProp = characteristic.getProperties();
        if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
            // If there is an active notification on a characteristic, clear
            // it first so it doesn't update the data field on the user interface.
            if (mNotifyCharacteristic != null) {
                mBluetoothLeService.setCharacteristicNotification(
                        mNotifyCharacteristic, false);
                mNotifyCharacteristic = null;
            }
            mBluetoothLeService.readCharacteristic(characteristic);
        }
        if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
            mNotifyCharacteristic = characteristic;
            mBluetoothLeService.setCharacteristicNotification(
                    characteristic, true);
        }
        return true;
    }
    return false;
}

1 个答案:

答案 0 :(得分:0)

您可以尝试阅读蓝牙规范(https://www.bluetooth.com/specifications/adopted-specifications,核心版本5.0),第3卷G部分。请注意Android摘要了属性句柄。

然而,大多数人所做的是编写专为特定硬件设计的应用程序,即假设gatt db已知。

为了获取代表服务,特征和描述符的对象,请调用gatt.discoverServices()。使用onServicesDiscovered()回调异步返回结果。每次设备连接时都应该这样做(当newState为GATT_CONNECTED时,在onConnectionStateChange回调中)。

要写入特征,首先使用setValue方法在BluetoothGattCharacteristic对象上设置值,然后调用gatt.writeCharacteristic(特征)。操作完成后,将调用onCharacteristicWrite。

读取操作以类似的方式工作;调用gatt.readCharacteristic(特征),并在调用onCharacteristicRead时准备好结果。在特征对象上使用getValue()来获取值。

要使通知正常工作,您必须首先将BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE(0x0001)写入客户端特性配置描述符,以便外围设备开始发送通知。您还必须通过调用setCharacteristicNotification告诉Android蓝牙堆栈将通知转发到您的应用。

请注意,您一次只能有一个未完成的操作(读/写),这意味着您必须在发出新请求之前等待回调。

如果你知道你正在处理的硬件,通常不需要检查特征属性(characteristic.getProperties())。蓝牙核心V 5.0规范,第3卷,第G部分,第3.3.1.1节中描述了位掩码,并描述了为每个特性启用了哪些功能(例如读,写,通知)。

如何处理16位和128位UUID之间的转换,请参见蓝牙核心V 5.0规范,第3卷,B部分,第2.5.1节。请注意,Android的客户端库仅使用128位UUID。