在蓝牙协议栈中,设备名称是通过EIR(Extended Inquiry Response)数据包进行广播的。HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME是蓝牙核心规范定义的标准数据类型标识符(0x09),用于声明设备的完整名称。
注意:修改设备名称时需确保名称长度不超过蓝牙协议规定的31字节限制(UTF-8编码),否则会导致广播数据截断。
蓝牙名称的存储位置通常有三种实现方式:
在杰理AC63/AC69系列SDK中,蓝牙名称通常定义在以下文件:
c复制// 典型路径(具体版本可能不同)
sdk/ble/ble_user/ble_comm/ble_common.c
使用全局搜索技巧:
bash复制grep -rn "HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME" sdk/
找到的代码段通常类似:
c复制uint8_t ble_adv_data[] = {
0x02, // Length
HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME,
'A', 'C', '6', '3', '_', 'D', 'E', 'M', 'O' // 示例名称
};
直接修改数组内容(需重新编译固件):
c复制// 修改为不超过31字节的UTF-8字符串
uint8_t ble_adv_data[] = {
0x0A, // 新长度(需同步更新)
HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME,
'M', 'Y', '_', 'B', 'L', 'E', '_', 'D', 'E', 'V'
};
通过BLE协议栈API修改(需芯片支持):
c复制void update_ble_name(const char *new_name) {
uint8_t name_len = strlen(new_name);
uint8_t adv_data[32] = {
name_len + 1,
HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME
};
memcpy(&adv_data[2], new_name, name_len);
ble_stack_update_adv_data(adv_data);
}
杰理提供的量产工具通常支持:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 手机扫描不到设备 | 广播数据格式错误 | 检查长度字节是否匹配实际数据 |
| 名称显示乱码 | 非UTF-8编码 | 使用ASCII或确保UTF-8编码正确 |
| 名称被截断 | 超过31字节限制 | 缩短名称或使用短名称类型(0x08) |
| 修改后需重启生效 | 未调用更新API | 检查ble_stack_update_adv_data调用 |
使用蓝牙嗅探工具验证实际广播数据:
c复制// 同时包含完整名和短名称(节省广播空间)
uint8_t adv_data[] = {
0x02, HCI_EIR_DATATYPE_SHORT_LOCAL_NAME, 'J', 'L',
0x0A, HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME, 'J', 'I', 'E', 'L', 'I', '_', 'B', 'L', 'E'
};
结合设备MAC地址生成唯一名称:
c复制void gen_unique_name(uint8_t *output) {
uint8_t mac[6];
ble_get_mac_address(mac);
sprintf(output, "JL_%02X%02X%02X", mac[3], mac[4], mac[5]);
}
批量烧录处理:
合规性检查:
版本管理:
c复制#define BLE_NAME_PREFIX "JL_"
#define BLE_NAME_SUFFIX "2024"
const char *ble_name = BLE_NAME_PREFIX BLE_NAME_SUFFIX;
实际项目中,我遇到过因名称包含中文导致iOS设备无法识别的情况。后来采用"品牌_型号_功能"的命名规则(如JL_AC63_AUDIO),兼容性测试通过率提升至100%。建议在名称修改后,至少用以下设备验证: