目录
概述
1 静态设置蓝牙地址(编译时配置)
1.1 通过 prj.conf 文件设置
1.2 通过 overlay 文件设置
2 动态修改蓝牙地址(运行时修改)
2.1 使用 bt_addr_le_t 结构
2.2 使用 bt_set_id_addr(适用于 Public Address)
3. 使用 NRF_FICR->DEVICEADDR(适用于 nRF52/nRF53 系列)
4. 使用 Zephyr Shell 命令(调试模式)
5 总结
概述
在 nRF Connect SDK(基于 Zephyr RTOS)中,修改蓝牙设备的 MAC 地址(Bluetooth Address) 可以通过以下几种方式实现:
1 静态设置蓝牙地址(编译时配置)
1.1 通过 prj.conf
文件设置
在项目的 prj.conf
文件中添加以下配置:
# 启用静态随机地址
CONFIG_BT_PRIVACY=n
CONFIG_BT_RPA=n
CONFIG_BT_USE_DEBUG_KEYS=n# 设置固定的静态随机地址(示例:AA:BB:CC:DD:EE:FF)
CONFIG_BT_DEVICE_NAME="MyDevice"
CONFIG_BT_DEVICE_ADDR="aa:bb:cc:dd:ee:ff"
1.2 通过 overlay
文件设置
/ {chosen {zephyr,bt-device-addr = [aa bb cc dd ee ff];};
};
2 动态修改蓝牙地址(运行时修改)
2.1 使用 bt_addr_le_t
结构
在代码中动态修改蓝牙地址:
#include <bluetooth/bluetooth.h>void set_ble_address(void) {// 定义新的蓝牙地址(Public or Random Static)bt_addr_le_t addr = {.type = BT_ADDR_LE_RANDOM, // 或 BT_ADDR_LE_PUBLIC.a = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},};// 设置新的蓝牙地址int err = bt_id_create(&addr, NULL);if (err) {printk("Failed to set BLE address (err %d)\n", err);} else {printk("BLE address set to: %02X:%02X:%02X:%02X:%02X:%02X\n",addr.a.val[5], addr.a.val[4], addr.a.val[3],addr.a.val[2], addr.a.val[1], addr.a.val[0]);}
}
2.2 使用 bt_set_id_addr
(适用于 Public Address)
#include <bluetooth/bluetooth.h>void set_public_ble_address(void) {bt_addr_t addr = {.val = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55},};int err = bt_set_id_addr(&addr);if (err) {printk("Failed to set Public BLE address (err %d)\n", err);} else {printk("Public BLE address set successfully\n");}
}
3. 使用 NRF_FICR->DEVICEADDR(适用于 nRF52/nRF53 系列)
某些 Nordic 芯片(如 nRF52840)的 Factory Information Configuration Registers (FICR) 存储了默认的蓝牙地址,可以直接读取或修改:
#include <hal/nrf_ficr.h>void print_default_ble_address(void) {uint32_t addr_low = NRF_FICR->DEVICEADDR[0];uint32_t addr_high = NRF_FICR->DEVICEADDR[1];uint8_t ble_addr[6] = {(addr_low >> 0) & 0xFF,(addr_low >> 8) & 0xFF,(addr_low >> 16) & 0xFF,(addr_low >> 24) & 0xFF,(addr_high >> 0) & 0xFF,(addr_high >> 8) & 0xFF,};printk("Factory BLE Address: %02X:%02X:%02X:%02X:%02X:%02X\n",ble_addr[5], ble_addr[4], ble_addr[3],ble_addr[2], ble_addr[1], ble_addr[0]);
}
⚠️ 注意:
某些芯片(如 nRF52840)的 FICR 地址是只读的,无法直接修改。
如果需要修改,建议使用 方法 1 或 方法 2(运行时配置)。
4. 使用 Zephyr Shell 命令(调试模式)
# 设置随机静态地址
bt init
bt id-create 00:11:22:33:44:55 random# 查看当前地址
bt id-show
5 总结
方法 | 适用场景 | 备注 |
---|---|---|
prj.conf 静态配置 | 编译时固定地址 | 适用于量产设备 |
bt_id_create() 动态修改 | 运行时修改 | 支持 Public/Random 地址 |
NRF_FICR->DEVICEADDR | 读取芯片出厂地址 | 只读(部分芯片) |
Zephyr Shell 命令 | 调试模式 | 方便测试 |
如果需要 合规的 BLE 地址(符合蓝牙 SIG 规范),请确保:
-
Public Address:需向 IEEE 申请(通常芯片厂商已预烧录)。
-
Random Static Address:最高 2 位应为
11
(如0xCF:...
)。
如果有更具体的需求(如 NRF52840 地址修改),可以提供芯片型号,我可以给出更详细的方案!