您的位置:

BLEGATT——蓝牙 Low Energy 通信协议

一、介绍

BLEGATT是基于蓝牙 Low Energy 技术的一种通信协议。BLEGATT协议提供了一种通用的方式来连接多个不同的设备,将数据传输到和从这些设备中读取数据。这个协议是使用搭建在标准蓝牙技术之上的标准,具有可靠性、低功耗和安全性。

二、BLEGATT的架构

BLEGATT协议之间的通信采用了基于客户端和服务端的数据模型。通常情况下,服务端提供数据和操作,而客户端将请求发送到服务端,等待查询结果。服务端可以报告数据更新、新事件或通知客户端需要采取行动的事件。在BLEGATT的框架下,数据模型包含一个服务层,服务层包含特征层,特征层包含描述符。每一个层级的数据模型都包含一些数字属性,如UUID,用于标识数据层级和服务类型。通过一个专用的区分符号(“:”)来将这些属性从服务层到数据层逐个接收成链接起来:


        /*
         * Note: The fields of this struct are structured in such a way that
         * the common members with the GattCharacteristic struct are all
         * contiguous, which makes the two structs easy to correlate in the code.
         *
         * If additions are made to this struct please consider if the way it's
         * laid out makes it harder to read.
         */
        struct GattAttribute {
            UUID uuid;
            GattAttribute *next;
            GattAttribute *prev;
            GattAttributeType_t type : 8;
            uint16_t value_handle;
            uint16_t decl_handle;
            uint16_t *cached_value_attr_data;
            uint16_t cached_value_attr_len;
            uint8_t *user_value_buf;
            uint16_t user_value_buf_len;
            uint16_t handle;
        };

三、BLEGATT服务类型

BLEGATT服务类型 经常会被认为是一种用于互联网的服务,实际上,BLEGATT服务是操作BLE设备的一个基本单元。每个服务代表一个可通过BLE进行访问的可用数据集合。这些数据集合可以是任何类型和大小的数据类型,包括字符、浮点数等。你可以使用BLEGATT协议访问这些数据,操作设备或从设备读取数据。

四、BLEGATT特性和描述符

BLEGATT特性和描述符是两种不同的数据类型,这两种数据类型分别用于服务中的数据元素和数据元素属性。特性是数据元素的基本单位,通常可以是浮点数、整数或字符串。描述符是用于定义特性某些属性及其行为的数据元素。你可以使用BLEGATT协议来自定义服务中的所有内容,包括特性和描述符。


class GattCharacteristic {
public:
    enum {
        BLE_GATT_CHAR_PROPERTIES_NONE                    = 0x00, /**< Characteristic has no property set. */
        BLE_GATT_CHAR_PROPERTIES_BROADCAST               = 0x01, /**< Characteristic is broadcastable. */
        BLE_GATT_CHAR_PROPERTIES_READ                    = 0x02, /**< Characteristic is readable. */
        BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE  = 0x04, /**< Characteristic can be written without response. */
        BLE_GATT_CHAR_PROPERTIES_WRITE                   = 0x08, /**< Characteristic can be written. */
        BLE_GATT_CHAR_PROPERTIES_NOTIFY                  = 0x10, /**< Characteristic can be notified. */
        BLE_GATT_CHAR_PROPERTIES_INDICATE                = 0x20, /**< Characteristic can be indicated. */
        BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Characteristic requires authentication for write access. */
        BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES     = 0x80  /**< Characteristic has extended properties. */
    };

    enum {
        REPORT_REF_DEFAULT_VAL_HANDLE_RANGE_START = 0x0001,
        REPORT_REF_DEFAULT_VAL_HANDLE_RANGE_END   = 0xffff
    };

    enum {
        CCCD_DEFAULT_VAL_HANDLE_RANGE_START = 0x0001,
        CCCD_DEFAULT_VAL_HANDLE_RANGE_END   = 0xffff
    };

    /**
     * Constructor.
     *
     * @param[in] uuid The UUID of this characteristic. You can use @p UUID::ShortUUIDBytes_t to create
     * a UUID from a 16-bit bluetooth.org assigned number.
     * @param[in] valuePtr The initial value of the characteristic
     * @param[in] valueSize The size of the initial value.
     * @param[in] valueCapacity The maximum capacity of the value attribute (default: @p valueSize + 1); including null-termination.
     * @param[in] security The security requirement associated with this characteristic (default: SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM)
     * @param[in] properties The property of this characteristic (default:
     * BLE_GATT_CHAR_PROPERTIES_READ | BLE_GATT_CHAR_PROPERTIES_WRITE)
     */
    GattCharacteristic(UUID uuid, uint8_t *valuePtr = NULL, uint16_t valueLength = 0,
                        uint16_t valueCapacity = 1, uint8_t properties = BLE_GATT_CHAR_PROPERTIES_READ,
                        SecurityManager::SecurityMode_t security = SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM);
};

五、BLEGATT的应用

BLEGATT协议在智能家居和医疗监测等领域应用广泛,可以帮助开发人员在手表上实现读取心率数据、与智能家居设备通信等功能,同时低功耗的设计也让 BLEGATT 协议在 IoT 等资源有限的场景中极具优势。