如何通过CMake参数修改Zephyr项目的蓝牙设备名称配置?
解决方案:批量构建带唯一蓝牙设备名的Zephyr节点固件
针对你在VS Code nRF Connect环境下,为蓝牙Mesh节点批量生成唯一设备名的需求,提供两种可行方案:
方案一:CMake直接传递参数生成设备名(最简便)
无需修改Kconfig,直接通过CMake参数动态覆盖CONFIG_BT_DEVICE_NAME:
1. 修改项目CMakeLists.txt
在项目根目录的CMakeLists.txt中添加以下代码,自动将传入的MY_SERIAL_NUMBER参数转换为蓝牙设备名:
# 处理自定义序列号参数,生成蓝牙设备名 if(DEFINED MY_SERIAL_NUMBER) set(CONFIG_BT_DEVICE_NAME "Mesh_Node_${MY_SERIAL_NUMBER}" CACHE STRING "Bluetooth device name" FORCE) endif()
注:
FORCE关键字用于覆盖prj.conf中的默认配置值。
2. 在VS Code nRF Connect中创建多构建配置
- 打开nRF Connect扩展的「Build」视图,点击「Build configurations」旁的
+号添加新配置 - 每个配置设置:
- Configuration name:如
Node A - Build directory:如
${workspaceFolder}/build_A - CMake options:添加
-DMY_SERIAL_NUMBER="A"(对应节点A,节点B则改为"B",以此类推)
- Configuration name:如
- 重复上述步骤创建
Node B/C/D的配置
3. 批量构建
代码变更后,在「Build configurations」中选中所有节点配置,点击「Build all」即可一次性生成所有节点的HEX文件。
方案二:通过Kconfig扩展实现(更规范,适合长期维护)
通过自定义Kconfig配置项,在代码中动态组合设备名:
1. 添加自定义Kconfig项
在项目根目录创建Kconfig文件(若已存在则追加):
config MY_NODE_SERIAL string "Node Serial Number" default "" help Unique serial identifier for the mesh node (e.g., A, B, 001)
2. 修改代码动态设置设备名
在main.c的蓝牙初始化逻辑前,通过自定义配置项生成并设置设备名:
#include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/hci.h> #include <zephyr/sys/printk.h> void main(void) { int err; char dev_name[BT_DEVICE_NAME_MAX]; // 组合唯一设备名(格式可自定义) snprintf(dev_name, sizeof(dev_name), "Mesh_Node_%s", CONFIG_MY_NODE_SERIAL); // 设置蓝牙设备名 err = bt_set_name(dev_name); if (err) { printk("Failed to set device name: %d\n", err); return; } // 初始化蓝牙 err = bt_enable(NULL); if (err) { printk("Bluetooth init failed: %d\n", err); } // 后续业务逻辑... }
3. 配置VS Code构建参数
和方案一类似,每个节点的构建配置中,CMake参数改为:
-DCONFIG_MY_NODE_SERIAL="A"
后续同样通过「Build all」批量生成固件。
关键说明
你最初尝试在prj.conf中用宏组合CONFIG_BT_DEVICE_NAME不可行的原因是:Zephyr的Kconfig字符串配置项不支持预处理器宏展开,必须直接传入字符串值。上述两种方案分别通过CMake覆盖配置、代码动态设置的方式绕过了这个限制。
内容的提问来源于stack exchange,提问作者ulis bad
相关产品推荐
相关产品推荐

