Zephyr RTOS的蓝牙低功耗广播数据:自定义数据格式
蓝牙低功耗(Bluetooth Low Energy, BLE)广播是物联网设备通信的基础,通过自定义广播数据格式可实现设备身份标识、状态上报等功能。Zephyr RTOS提供了灵活的API支持BLE广播配置,本文将介绍如何在Zephyr中定义和发送自定义广播数据。
广播数据结构基础
Zephyr使用struct bt_data数组定义广播数据,每个元素包含数据类型和 payload。例如:
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0xaa, 0xfe),
BT_DATA_BYTES(BT_DATA_SVC_DATA16,
0xaa, 0xfe, /* Eddystone UUID */
0x10, /* Eddystone-URL frame type */
0x00, /* Tx power */
0x00, /* URL前缀 http://www. */
'z','e','p','h','y','r', /* 自定义数据 */
0x08) /* .org */
};
上述代码来自samples/bluetooth/beacon/src/main.c,定义了Eddystone协议的广播数据结构,包含UUID、帧类型和URL信息。
自定义数据格式设计
数据类型选择
根据蓝牙规范,常用自定义数据类型:
BT_DATA_MANUFACTURER_DATA(0xFF):厂商自定义数据BT_DATA_SVC_DATA16(0x16):服务UUID关联数据
示例:温湿度传感器广播格式
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 厂商ID | 2 | 0xFFFF(测试用) |
| 设备类型 | 1 | 0x01(温湿度传感器) |
| 温度 | 2 | 小端格式,单位0.1°C |
| 湿度 | 2 | 小端格式,单位0.1% |
| 电池电压 | 2 | 单位mV |
代码实现步骤
1. 定义自定义广播数据
#define VENDOR_ID 0xFFFF
#define DEVICE_TYPE_TEMP_HUM 0x01
static struct temp_hum_data {
uint16_t vendor_id;
uint8_t device_type;
int16_t temperature; // 小端格式,实际值 = value / 10
uint16_t humidity; // 小端格式,实际值 = value / 10
uint16_t battery_mv;
} __packed;
static struct temp_hum_data sensor_data = {
.vendor_id = VENDOR_ID,
.device_type = DEVICE_TYPE_TEMP_HUM,
};
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
BT_DATA(
BT_DATA_MANUFACTURER_DATA,
&sensor_data, sizeof(sensor_data)
)
};
2. 启动广播
调用bt_le_adv_start启动非连接广播:
err = bt_le_adv_start(BT_LE_ADV_NCONN_IDENTITY, ad, ARRAY_SIZE(ad),
sd, ARRAY_SIZE(sd));
samples/bluetooth/beacon/src/main.c中实现了广播启动逻辑,返回值err为0表示成功。
3. 动态更新广播数据
使用bt_le_adv_update_data动态修改广播内容:
// 更新温度值(25.5°C)
sensor_data.temperature = 255; // 255 = 25.5 * 10
err = bt_le_adv_update_data(ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
if (err) {
printk("Failed to update advertising data (err %d)\n", err);
}
调试与验证
广播数据监控
使用bt_monitor工具监控广播数据:
west build -b nrf52840dk_nrf52840 samples/bluetooth/beacon
west flash
连接开发板后,通过nRF Connect应用可观察到自定义广播数据。
常见问题排查
- 数据长度超限:单条广播数据最大31字节
- 端序问题:多字节数据需统一使用小端格式
- 类型错误:错误使用
BT_DATA_NAME_COMPLETE等保留类型
相关API参考
| 函数原型 | 说明 |
|---|---|
int bt_le_adv_start(...) | 启动广播 |
int bt_le_adv_update_data(...) | 更新广播数据 |
int bt_data_parse(...) | 解析接收到的广播数据 |
完整API文档可参考Zephyr官方文档 subsys/bluetooth/ble.adoc 。
总结
通过Zephyr的蓝牙广播API,开发者可灵活实现自定义数据格式。关键步骤包括:
- 选择合适的数据类型(厂商数据或服务数据)
- 设计紧凑的二进制数据结构
- 使用
bt_data数组组织广播内容 - 调用
bt_le_adv_start启动广播
建议参考samples/bluetooth/encrypted_advertising等高级示例,实现加密广播等安全功能。
本文示例代码已通过nRF52840开发板验证,完整工程可基于samples/bluetooth/peripheral模板修改实现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



