如何通过ArduinoBLE库批量为Arduino Nano 33 BLE设备命名?
Arduino Nano 33 BLE批量命名的最佳方案
一、先解决你当前的特征值改设备名问题
你之前的代码没生效,核心原因是BLE设备的广播名称(Local Name)在启动广播后没法直接修改——BLE.setLocalName()和BLE.setDeviceName()需要重启BLE广播才能让新名称生效,而且得先停掉当前的广播。
修正后的代码示例:
void changeNameCharWritten(BLEDevice central, BLECharacteristic characteristic) { // 获取写入的新名称 String newName = characteristic.value(); // 先停止当前广播 BLE.stopAdvertise(); // 设置新名称(注意转成c字符串) BLE.setLocalName(newName.c_str()); BLE.setDeviceName(newName.c_str()); // 重新启动广播 BLE.advertise(); }
另外要确保这个特征值的权限是可写(BLEWrite),而且修改后需要断开BLE连接再重新扫描,才能看到新的设备名。
二、批量生产场景的更优方案
完全没必要给每个设备刷专属固件,推荐这几种实用方法:
1. 靠硬件唯一ID自动生成名称
Nano 33 BLE用的nRF52840芯片自带全球唯一的硬件ID,直接读取这个ID就能生成每个设备独有的名称,全程不用手动配置。
示例代码:
#include <ArduinoBLE.h> void setup() { // 读取nRF52840的唯一硬件ID(地址是固定的0x100000A0) uint8_t* deviceID = (uint8_t*)0x100000A0; // 生成带前缀的唯一名称,比如取ID后两位做标识 char deviceName[20]; snprintf(deviceName, sizeof(deviceName), "NanoBLE-%02X%02X", deviceID[6], deviceID[7]); // 初始化BLE并设置名称 if (!BLE.begin()) { while (1); // 初始化失败就死等 } BLE.setLocalName(deviceName); BLE.setDeviceName(deviceName); BLE.advertise(); } void loop() { // 你的业务逻辑 }
2. 用内置EEPROM存自定义名称
如果需要给设备设置自定义名称(比如包含产品型号+序号),可以用Nano 33 BLE自带的EEPROM,生产时用工具把名称写入EEPROM,设备启动时自动读取并设置BLE名称。
示例代码:
#include <ArduinoBLE.h> #include <EEPROM.h> #define NAME_STORAGE_START 0 // 名称存在EEPROM的起始地址 #define MAX_NAME_LEN 16 // 最大名称长度 void setup() { EEPROM.begin(MAX_NAME_LEN); // 从EEPROM读取预存的设备名 char deviceName[MAX_NAME_LEN] = {0}; for(int i=0; i<MAX_NAME_LEN; i++){ deviceName[i] = EEPROM.read(NAME_STORAGE_START + i); if(deviceName[i] == 0) break; // 读到结束符就停止 } // 初始化BLE if (!BLE.begin()) { while (1); } BLE.setLocalName(deviceName); BLE.setDeviceName(deviceName); BLE.advertise(); } void loop() { // 可选:加一个BLE特征值,支持后期修改名称并写入EEPROM }
生产时可以写个简单的USB配置工具,连接设备后发送自定义名称,工具把名称写入EEPROM即可,不用重新刷固件。
3. 批量编程工具自动化配置
如果需要大规模批量设置不同名称,可以用Arduino批量编程器配合脚本:
- 脚本自动生成带序号的名称(比如
Product-001、Product-002) - 把名称写入每个设备的EEPROM,或者在编译固件时动态替换名称变量(需要修改编译脚本)
三、总结
不用给每个设备做专属固件,优先选硬件ID生成名称(零配置,适合标准化生产),如果需要自定义名称就用EEPROM存储方案,用BLE特征值改名称的话记得重启广播。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

