1. BLE广播报文结构解析与自定义广播数据构造
任务说明
本案例基于 Nordic nRF52840 DK 开发板与 Zephyr RTOS,实现一个 BLE 外设:以可配置的广播间隔周期发送包含自定义厂商数据的广播包,并设定发射功率。完成目标后,可使用 nRF Connect 或手机 BLE 扫描工具观察到该设备及其广播数据。
硬件与软件准备
- 硬件:nRF52840 DK 开发板 ×1,USB 线 ×1
- 软件:Zephyr SDK(v3.4+),nRF Connect for Desktop(用于验证)
- 依赖:
CONFIG_BT=y、CONFIG_BT_EXT_ADV=y(Zephyr 广播扩展)
实现代码
在 prj.conf 中启用 BLE 与扩展广播:
CONFIG_BT=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="BLE5_Adv_Demo"
主程序 main.c 完整实现如下:
#include <zephyr/kernel.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/adv.h>
#include <zephyr/sys/printk.h>
/* 自定义厂商数据:Company ID 0x0059 (Nordic) */
static const struct bt_data adv_data[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR),
BT_DATA_BYTES(BT_DATA_MANUFACTURER_DATA,
0x59, 0x00, /* Company ID: Nordic */
0x01, 0x02, 0x03, 0x04), /* 自定义4字节负载 */
};
/* 广播参数:间隔 100ms,可连接 */
static const struct bt_le_adv_param adv_param =
BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_EXT_ADV |
BT_LE_ADV_OPT_USE_NAME,
BT_GAP_ADV_FAST_INT_MIN_2,
BT_GAP_ADV_FAST_INT_MAX_2,
NULL);
void main(void)
{
int err;
printk("BLE 5.0 Extended Advertising Demo\n");
/* 初始化蓝牙协议栈 */
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return;
}
/* 设置发射功率为 0 dBm(典型值,范围 -20~+8 dBm) */
err = bt_le_set_tx_power(0);
if (err) {
printk("Set TX power failed (err %d)\n", err);
return;
}
/* 启动扩展广播 */
err = bt_le_adv_start(&adv_param, adv_data, ARRAY_SIZE(adv_data),
NULL, 0);
if (err) {
printk("Advertising start failed (err %d)\n", err);
return;
}
printk("Advertising started, interval=100ms, TX power=0dBm\n");
/* 主线程保持运行 */
while (1) {
k_sleep(K_SECONDS(10));
printk("Still advertising...\n");
}
}
广播数据布局
广播包中自定义厂商数据段的结构如下:
AD Type (0xFF) | Length | Company ID (2B) | Payload (4B)
1B | 1B | 0x0059 | 0x01 0x02 0x03 0x04
其中 Company ID 采用小端序发送(0x59 0x00),后接 4 字节自定义负载。扫描端可据此解析出厂商数据。
构建与烧录
west build -b nrf52840dk_nrf52840 .
west flash
验证方法
- 打开 nRF Connect 桌面版,进入 Bluetooth 扫描界面。
- 观察列表中出现名为
BLE5_Adv_Demo的设备。 - 点击设备查看广播数据,确认包含:
- Flags 字段(General Discoverable)
- 完整设备名称
- 厂商数据段:
0x59 0x00 0x01 0x02 0x03 0x04 - 使用 nRF Connect 的 RSSI 指示器,可观察到信号强度随距离变化,间接反映发射功率设置生效。
判定标准
- 扫描到设备名与预期一致,广播间隔约 100ms(可通过抓包工具确认)。
- 厂商数据内容与代码中定义的 4 字节负载完全匹配。
- 修改
bt_le_set_tx_power()参数(如 -8、+8)后重新烧录,近距离 RSSI 读数有明显差异,证明功率设置生效。
关键配置说明
- 广播间隔:
BT_GAP_ADV_FAST_INT_MIN_2/MAX_2对应 100ms,可改为BT_GAP_ADV_SLOW_INT_MIN/MAX(约 1s)以降低功耗。 - 发射功率:
bt_le_set_tx_power()参数单位为 dBm,nRF52840 支持 -20 至 +8 dBm,步进 4 dB。 - 扩展广播:
BT_LE_ADV_OPT_EXT_ADV启用 BLE 5.0 扩展广播特性,支持更大数据负载。