在 BLE(Bluetooth Low Energy)协议中,每个蓝牙设备的主要属性特征是由 GATT(Generic Attribute Profile) 结构定义的。设备的所有功能和数据都通过 GATT 服务(Service) 和 特征(Characteristic) 进行组织和访问。
1. BLE 设备的主要属性
BLE 设备的属性主要包括 广播信息(Advertising)、GATT 服务、特征(Characteristic)等。
(1) 广播信息(Advertising Data)
蓝牙设备在未连接时,会通过 广播 发送设备的基本信息,常见的字段包括:
- 设备名称(Device Name)
- 可选字段,标识设备的可读名称,如
"Mi Band 6"
。
- 可选字段,标识设备的可读名称,如
- 设备地址(MAC Address)
- 每个蓝牙设备都有唯一的
MAC
地址,例如AA:BB:CC:DD:EE:FF
(部分设备可能会随机化地址)。
- 每个蓝牙设备都有唯一的
- 信号强度(RSSI - Received Signal Strength Indicator)
- 代表设备信号的强度,一般为负值(如
-40dBm
),数值越接近0
,信号越强。
- 代表设备信号的强度,一般为负值(如
- 广播UUID(Advertised UUIDs)
- 设备可以在广播数据中发送 服务 UUID,例如
0x180D
(代表心率服务)。
- 设备可以在广播数据中发送 服务 UUID,例如
- 制造商数据(Manufacturer Specific Data)
- 厂商可以自定义数据格式,如 iBeacon 就利用这个字段传输 UUID、Major、Minor 信息。
- Tx Power(发射功率)
- 设备的信号发射强度,影响通信距离。
(2) GATT(通用属性协议)
在 BLE 设备建立连接后,所有的通信都通过 GATT(Generic Attribute Profile) 进行。GATT 主要由以下部分组成:
① 服务(Service)
服务是一个逻辑分类,表示设备支持的功能。例如:
- 0x180D(Heart Rate Service,心率服务)
- 0x180A(Device Information Service,设备信息)
- 0x180F(Battery Service,电池信息)
每个 服务 由一个 UUID
标识,可以是 官方标准 UUID(16-bit,如 0x180D
) 或 自定义 UUID(128-bit,如 f000aa80-0451-4000-b000-000000000000
)。
② 特征(Characteristic)
每个 服务 下面包含多个 特征(Characteristic),它们是 BLE 设备的核心数据单元,例如:
- 0x2A37(心率测量值)
- 0x2A19(电池电量)
每个特征有 唯一的 UUID,通常有 读(Read)、写(Write)、通知(Notify)等权限。
③ 描述符(Descriptor)
描述符用于提供额外信息,例如:
- Client Characteristic Configuration Descriptor (CCCD)
- UUID:
0x2902
- 用于启用 通知(Notify) 或 指示(Indicate) 功能。
- UUID:
- Characteristic Presentation Format Descriptor (CPF)
- UUID:
0x2904
- 定义数据格式,如
int8
、float32
等。
- UUID:
2. BLE 设备的 GATT 结构示例
假设你在 Android/iOS 上连接了一个 BLE 设备,它的 GATT 结构可能是这样的:
Device: "Mi Band 6" (MAC: AA:BB:CC:DD:EE:FF)
└── Service: Battery Service (0x180F)└── Characteristic: Battery Level (0x2A19) [Read, Notify]└── Descriptor: Client Characteristic Configuration (0x2902)└── Service: Heart Rate Service (0x180D)├── Characteristic: Heart Rate Measurement (0x2A37) [Notify]├── Characteristic: Body Sensor Location (0x2A38) [Read]└── Service: Device Information (0x180A)├── Characteristic: Manufacturer Name (0x2A29) [Read]├── Characteristic: Model Number (0x2A24) [Read]
3. BLE 设备特征(Characteristic)的属性
每个 特征(Characteristic) 具有以下 属性(Properties):
属性 | 说明 |
---|---|
Read | 允许客户端(如手机)读取数据 |
Write | 允许客户端写入数据 |
Write Without Response | 写数据时不需要设备确认(加快速度) |
Notify | 设备主动向客户端推送数据(不需要应答) |
Indicate | 设备主动向客户端推送数据(需要应答) |
Broadcast | 设备可以在广播时包含该特征的数据 |
示例
- 心率测量(Heart Rate Measurement)
- UUID:
0x2A37
- 属性:
Notify
(心率变化时推送)
- UUID:
- 电池电量(Battery Level)
- UUID:
0x2A19
- 属性:
Read, Notify
(支持读取 & 变化时通知)
- UUID:
4. 常见 BLE 设备服务 UUID
服务名称 | UUID(16-bit) | 功能 |
---|---|---|
Heart Rate Service | 0x180D |
监测心率 |
Battery Service | 0x180F |
监测电池状态 |
Device Information | 0x180A |
提供设备信息 |
Alert Notification | 0x1811 |
处理通知/警报 |
Health Thermometer | 0x1809 |
监测体温 |
Blood Pressure | 0x1810 |
监测血压 |
Cycling Speed and Cadence | 0x1816 |
自行车踏频检测 |
如果设备是自定义服务,它可能使用 128-bit UUID,如:
f000aa80-0451-4000-b000-000000000000
5. 读取 & 订阅 BLE 设备特征
在 Android 中可以使用 BluetoothGatt
进行 GATT 操作,例如:
// 读取特征数据
bluetoothGatt.readCharacteristic(characteristic);
// 订阅通知
bluetoothGatt.setCharacteristicNotification(characteristic, true);// 设置 CCCD (启用 Notify)
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);
总结
-
BLE 设备的核心概念:
- 广播数据(Advertising):设备名称、UUID、信号强度(RSSI)。
- GATT 服务(Service):设备提供的功能分类。
- 特征(Characteristic):数据存储单元,可
Read
/Write
/Notify
。 - 描述符(Descriptor):为特征提供附加信息,如
CCCD
控制Notify
/Indicate
。
-
不同设备有不同的 GATT 结构,可使用 标准 UUID 或 自定义 UUID。
-
BLE 设备的主要交互方式
- 读取数据(Read)
- 写入数据(Write)
- 订阅通知(Notify / Indicate)
如果你的设备是 Notify
类型(如心率传感器),记得启用 CCCD
订阅通知,否则收不到数据!
如果你有具体的设备想要解析 GATT 结构,欢迎提供详细信息,我可以帮你分析它的 UUID 和特征 🚀