1. BLE 5.0 广播包发送

BLE 5.0 广播包发送 学习卡片

任务说明

本案例基于 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

验证方法

  1. 打开 nRF Connect 桌面版,进入 Bluetooth 扫描界面。
  2. 观察列表中出现名为 BLE5_Adv_Demo 的设备。
  3. 点击设备查看广播数据,确认包含:
    • Flags 字段(General Discoverable)
    • 完整设备名称
    • 厂商数据段:0x59 0x00 0x01 0x02 0x03 0x04
  4. 使用 nRF Connect 的 RSSI 指示器,可观察到信号强度随距离变化,间接反映发射功率设置生效。

判定标准

  • 扫描到设备名与预期一致,广播间隔约 100ms(可通过抓包工具确认)。
  • 厂商数据内容与代码中定义的 4 字节负载完全匹配。
  • 修改 bt_le_set_tx_power() 参数(如 -8、+8)后重新烧录,近距离 RSSI 读数有明显差异,证明功率设置生效。
BLE 5.0 广播发送验证拓扑 nRF52840 DK 广播间隔: 100ms 发射功率: 0 dBm 设备名: BLE5_Adv_Demo nRF Connect 扫描到设备 解析广播数据 显示 RSSI 广播数据包内容 Flags | Name | AD Type=0xFF | Len=6 | Company=0x0059 | Payload=01 02 03 04 BLE 广播信道 (37/38/39) 验证点: 设备名/厂商数据/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 扩展广播特性,支持更大数据负载。