一、介绍
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 等资源有限的场景中极具优势。