UUID: abcd5678-1234-90ab-cdef-1234567890ab
时间: 2025-07-26 13:22:26 浏览: 11
<think>我们正在讨论蓝牙通信中使用特定UUID传输自定义报文的问题。用户指定了一个具体的128位UUID:abcd5678-1234-90ab-cdef-1234567890ab,并询问如何使用它来传输自定义报文。
在蓝牙通信中,UUID(通用唯一标识符)用于标识服务和特征。服务是设备提供的功能集合,而特征是服务中的具体数据点。自定义UUID通常用于厂商特定的服务或特征,以便传输自定义数据。
### 步骤概述
1. **定义GATT服务结构**:创建一个自定义服务,使用给定的UUID作为服务UUID。
2. **定义特征**:在该服务下定义一个或多个特征,每个特征也有自己的UUID(可以是自定义的,也可以基于基础UUID生成)。
3. **配置特征属性**:设置特征的属性(如可读、可写、通知等)。
4. **实现数据传输**:通过写入特征值(对于发送数据)或启用通知/指示(对于接收数据)来传输自定义报文。
### 详细实现步骤
#### 1. **定义自定义服务**
使用给定的UUID `abcd5678-1234-90ab-cdef-1234567890ab` 作为服务UUID。在设备端(服务器),需要将此服务添加到GATT服务器中。
例如,在蓝牙协议栈中(如使用Bluetooth LE):
```c
// 示例代码(基于Bluetooth LE协议栈)
static const ble_uuid128_t custom_service_uuid = {
.uuid = { 0xab, 0xcd, 0x56, 0x78, 0x12, 0x34, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab }
};
// 创建服务
ble_gatt_svc_def_t custom_service = {
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &custom_service_uuid.u,
.characteristics = (ble_gatt_chr_def_t[]) { /* 特征列表 */ }
};
```
#### 2. **定义特征**
在自定义服务下,定义至少一个特征用于传输自定义报文。假设我们定义一个特征用于发送和接收数据,其UUID可以基于基础UUID生成,也可以使用另一个自定义UUID。这里我们可以使用同样的服务UUID并修改部分字节(根据规范,特征UUID通常在服务UUID的基础上递增或使用独立的128位UUID)。
例如,我们定义一个特征UUID为`abcd5678-1234-90ab-cdef-1234567890ac`(将最后一个字节从`ab`改为`ac`)。
```c
static const ble_uuid128_t custom_char_tx_uuid = {
.uuid = { 0xab, 0xcd, 0x56, 0x78, 0x12, 0x34, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xac }
};
static const ble_uuid128_t custom_char_rx_uuid = {
.uuid = { 0xab, 0xcd, 0x56, 0x78, 0x12, 0x34, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xad }
};
```
然后,定义特征的属性:
- **TX特征**:用于设备向客户端发送数据(例如,启用通知或指示),属性为`BLE_GATT_CHR_F_NOTIFY`。
- **RX特征**:用于客户端向设备发送数据(例如,写入),属性为`BLE_GATT_CHR_F_WRITE`。
#### 3. **配置特征描述符(可选)**
如果需要启用通知,通常需要为特征添加一个客户端特征配置描述符(CCCD),其标准UUID为`0x2902`。当客户端写入该描述符(启用或禁用通知)后,设备可以在数据变化时发送通知。
#### 4. **数据传输过程**
- **发送自定义报文(设备到客户端)**:
设备更新特征值,并通过通知(notify)或指示(indicate)发送给已启用的客户端。
```c
// 更新特征值
uint8_t custom_data[] = {0x01, 0x02, 0x03}; // 自定义报文
ble_gatts_chr_updated(custom_char_tx_handle, sizeof(custom_data), custom_data);
```
客户端需要先启用通知(写入CCCD为0x0001)。
- **接收自定义报文(客户端到设备)**:
客户端写入RX特征的值,设备在GATT写事件中接收数据。
```c
// 在设备的GATT写事件处理函数中
if (attr_handle == custom_char_rx_handle) {
// 处理接收到的数据(位于om->om_data,长度为om->om_len)
}
```
### 代码示例(设备端和客户端)
#### 设备端(GATT服务器)伪代码
```c
// 定义服务和特征
static const ble_uuid128_t custom_service_uuid = ...; // 给定的服务UUID
static const ble_uuid128_t custom_char_tx_uuid = ...; // 用于发送的特征UUID
static const ble_uuid128_t custom_char_rx_uuid = ...; // 用于接收的特征UUID
// 特征定义数组
static ble_gatt_chr_def_t custom_chars[] = {
{
.uuid = &custom_char_tx_uuid.u,
.access_cb = NULL, // 对于通知,通常不需要写回调
.flags = BLE_GATT_CHR_F_NOTIFY,
.val_handle = &custom_char_tx_handle, // 保存特征值句柄
.descriptors = (ble_gatt_dsc_def_t[]) {
{
.uuid = BLE_UUID16_DECLARE(0x2902), // CCCD
.att_flags = BLE_ATT_F_READ | BLE_ATT_F_WRITE,
.access_cb = cccd_write_callback // 处理CCCD写入
},
{ 0 }
}
},
{
.uuid = &custom_char_rx_uuid.u,
.access_cb = custom_char_rx_write_callback, // 处理写入
.flags = BLE_GATT_CHR_F_WRITE,
},
{ 0 }
};
// 服务定义
static ble_gatt_svc_def_t custom_service = {
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &custom_service_uuid.u,
.characteristics = custom_chars
};
// 注册服务
ble_gatts_count_cfg(&custom_service, 1);
ble_gatts_add_svcs(&custom_service, 1);
```
#### 客户端(如手机App)操作
1. **发现服务**:扫描并发现服务UUID为`abcd5678-1234-90ab-cdef-1234567890ab`的设备。
2. **发现特征**:发现该服务下的特征,特别是用于发送(TX)和接收(RX)的特征。
3. **启用通知**:向TX特征的CCCD写入0x0001以启用通知。
4. **发送数据**:向RX特征写入自定义报文(字节数组)。
5. **接收数据**:监听TX特征的通知,接收设备发送的自定义报文。
### 注意事项
- **UUID格式**:在代码中,UUID通常以小端格式表示(即从最后一个字节开始写),但上述示例中我们直接按照给定顺序写入字节数组(注意:蓝牙规范中UUID的传输顺序是网络字节序,即大端,但底层库可能会处理字节序)。
- **报文长度**:蓝牙特征值最大为512字节(ATT_MTU通常为23字节,但可以通过协商增大)。如果自定义报文较长,需要分段传输。
- **安全性**:对于敏感数据,应使用加密连接(LE Secure Connections)或对特征值进行加密。
### 总结
使用自定义UUID传输自定义报文的步骤包括:定义服务、定义特征(包括读写属性)、实现数据传输机制(写入和通知)。通过上述步骤,设备与客户端之间可以交换任意格式的自定义数据。
---
§§相关问题§§
1. 蓝牙特征值传输的最大长度是多少?如何传输超过MTU的数据?
2. 如何为自定义蓝牙服务添加安全加密?
3. 在Android/iOS开发中如何实现自定义UUID的蓝牙通信?</think>### 蓝牙通信中使用自定义 UUID 传输自定义报文的完整指南
在蓝牙通信中,使用自定义 UUID `abcd5678-1234-90ab-cdef-1234567890ab` 传输自定义报文需要遵循 BLE GATT 协议规范。以下是具体实现步骤和技术要点:
---
### 一、技术实现流程
#### 1. **定义 GATT 服务结构**
```mermaid
graph LR
A[自定义服务 UUID] --> B[特征1:数据接收]
A --> C[特征2:数据发送]
A --> D[特征3:配置参数]
B --> E[属性:可写]
C --> F[属性:可读+通知]
D --> G[属性:可读可写]
```
- **服务 UUID**:`abcd5678-1234-90ab-cdef-1234567890ab`
- **特征值设计**:
- **接收特征**(写操作):`abcd5678-1234-90ab-cdef-1234567890ac`
- 属性:`WRITE` 或 `WRITE_WITHOUT_RESPONSE`
- **发送特征**(读/通知):`abcd5678-1234-90ab-cdef-1234567890ad`
- 属性:`READ` + `NOTIFY`
#### 2. **设备端实现(GATT 服务器)**
```c
// 基于 Bluetooth LE 协议栈的伪代码
const ble_uuid128_t CUSTOM_SERVICE_UUID = {
.u = {.type = BLE_UUID_TYPE_128},
.value = {0xab,0xcd,0x56,0x78,0x12,0x34,0x90,0xab,
0xcd,0xef,0x12,0x34,0x56,0x78,0x90,0xab} // 小端序
};
// 注册服务
ble_gatts_service_add(BLE_GATT_SVC_TYPE_PRIMARY,
&CUSTOM_SERVICE_UUID,
&service_handle);
// 添加特征
ble_gatts_characteristic_add(service_handle,
&char_uuid,
BLE_GATT_CHR_F_WRITE,
&custom_data_handler); // 接收回调函数
```
#### 3. **客户端操作流程(手机/网关)**
1. 发现服务:扫描 `abcd5678-1234-90ab-cdef-1234567890ab`
2. 获取特征句柄:
- 写入特征:`abcd5678-1234-90ab-cdef-1234567890ac`
- 通知特征:`abcd5678-1234-90ab-cdef-1234567890ad`
3. 启用通知:向 CCCD 描述符写入 `0x0001`
4. 传输自定义报文:
```python
# Python 示例 (pybluez)
client.write_gatt_char(write_char_handle,
bytearray([0x01,0x02,0xFF]), # 自定义报文
response=True)
```
---
### 二、自定义报文设计要点
#### 1. **数据格式规范**
| 偏移量 | 长度 | 说明 | 示例值 |
|--------|------|---------------|-------------|
| 0 | 1 | 报文类型 | `0x01` (控制)|
| 1 | 2 | 数据长度 | `0x000C` |
| 3 | N | 有效载荷 | 自定义数据 |
| 3+N | 1 | CRC 校验 | `0xA5` |
#### 2. **通信优化策略
- **MTU 协商**:通过 `ATT_MTU` 交换提升至 247 字节
- **数据分片**:
```c
if(payload_len > ATT_MTU - 3) {
send_fragment(packet, current_offset);
current_offset += (ATT_MTU - 3);
}
```
- **流控机制**:使用 `WRITE_WITHOUT_RESPONSE` + 序列号确认
---
### 三、实际应用案例
#### 1. **工业传感器数据传输**
```mermaid
sequenceDiagram
participant Sensor
participant Gateway
Sensor->>Gateway: 广播服务UUID[abcd5678...]
Gateway->>Sensor: 连接请求
Gateway->>Sensor: 启用通知(CCCD=0x0001)
Sensor->>Gateway: 通知特征更新(温度数据: 25.3℃)
Gateway->>Sensor: 写入配置参数(采样间隔=10s)
```
#### 2. **智能家居控制报文**
```json
// 自定义JSON格式报文(转换为二进制)
{
"cmd": "SET_COLOR",
"values": {
"r": 255,
"g": 0,
"b": 128
},
"timestamp": 1717020000
}
```
---
### 四、安全增强措施
1. **加密传输**:
- 使用 LE Secure Connections (LESC)
- 敏感特征设置 `BLE_GATT_CHR_F_ENC_WRITE` 属性
2. **鉴权机制**:
```c
// 在写入回调中验证
if(char_id == WRITE_CHAR_HANDLE) {
if(!conn_secured(conn_handle)) { // 检查加密状态
return BLE_ATT_ERR_INSUFFICIENT_AUTH;
}
}
```
3. **报文签名**:
- 在载荷末尾添加 HMAC-SHA256 签名
- 验证签名后再执行指令
---
### 五、调试与测试工具
1. **常用工具**:
- **nRF Connect**:可视化特征操作
- **Wireshark** + BLE 嗅探器:抓包分析
- **GATTool**:命令行交互测试
2. **测试命令示例**:
```shell
gatttool -b AA:BB:CC:DD:EE:FF --char-write -a 0x0021 -n 01020304
```
---
### 总结
通过自定义 UUID `abcd5678-1234-90ab-cdef-1234567890ab` 传输报文需:
1. 设计符合 GATT 层级的服务/特征结构
2. 实现二进制报文编解码规范
3. 采用 MTU 协商和数据分片优化传输
4. 增加加密和完整性校验保障安全
5. 使用专业工具进行协议调试[^1]
在实际物联网设备中,此方案已应用于智能工业控制器(传输设备指令集)和医疗穿戴设备(传输加密生理数据)等场景。
---
阅读全文
相关推荐


















