相关链接AI语音智能体开发日记一如何为“小智”服务器启用并调试 License 功能-CSDN博客AI语音智能体开发日记二解决 Wi-Fi 配网小程序的兼容性问题-CSDN博客AI语音智能体开发日记三解决小程序配网中的蓝牙命名与MAC地址获取问题-CSDN博客AI语音智能体开发日记四在FreeRTOS中构建线程安全的UART2通信模块-CSDN博客AI语音智能体开发日记五为智能设备注入“灵魂”——详解MCP工具的注册与使用-CSDN博客AI语音智能体开发日记六为智能体注入旋律——七牛云音乐服务的接入与避坑指南-CSDN博客AI语音智能体开发日记七搞定功放控制——详解GX8006平台Mute电平配置-CSDN博客AI语音智能体开发日记八LVGL 8.4.0 移植实战——从零构建嵌入式GUI-CSDN博客AI语音智能体开发日记九LVGL 8.4.0 中文字体配置全攻略-CSDN博客AI语音智能体开发日记十LVGL 图标字体实战——从 FontAwesome 到屏幕显示-CSDN博客AI语音智能体开发日记十一为智能设备“声”临其境——详解音频资源自动化生成流程-CSDN博客AI语音智能体开发日记十二GX8006 固件定制指南——从双唤醒词到 UART 音频传输-CSDN博客AI语音智能体开发日记十三一次由寄存器溢出引发的串口波特率“玄学”问题排查-CSDN博客AI语音智能体开发日记十四为语音智能体打造 LCD 表情动画位图BMP显示-CSDN博客AI语音智能体开发日记十五智能体LCD屏幕GIF动画显示方案——从GIF到BMP的完整实战-CSDN博客AI语音智能体开发日记十六智能体OTA失败的“401未授权”玄学问题排查-CSDN博客AI语音智能体开发日记十七智能体“失语“ -- 大量MCP指令与LCD内存分配引发的问题-CSDN博客AI语音智能体开发日记十八智能体服务器xiaozhi-esp32-server源码部署指南-CSDN博客AI语音智能体开发日记十九智能体服务器xiaozhi-esp32-server配置与调试-CSDN博客推荐链接AI语音智能体架构解析一系统架构全景图-CSDN博客AI语音智能体架构解析二大模型AI 的大脑-CSDN博客AI语音智能体架构解析三智控台指挥中心-CSDN博客AI语音智能体架构解析四AI 语音终端执行器官-CSDN博客AI语音智能体架构解析五小程序/APP遥控器-CSDN博客推荐链接AI 应用 图文 解说 (一) -- 百度智能云 实现 语音 聊天-CSDN博客AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手程序 -CSDN博客开发手记解决小程序配网中的蓝牙命名与MAC地址获取问题继上次解决了配网方案的兼容性问题后这次我们遇到了一个更隐蔽的坑在小程序配网过程中设备蓝牙名称不规范导致无法正确获取MAC地址。这个问题在iOS上尤为突出直接导致了配网流程的失败。问题背景在实现“小智云”和七牛小程序的Wi-Fi配网功能时我们遇到了一个棘手的问题小程序无法正确识别并连接到我们的设备。经过排查问题根源指向了设备的蓝牙广播名称Local Name以及MAC地址的获取方式。问题定位根据灵矽平台的官方文档《设备识别》章节我们找到了问题的关键所在。蓝牙配网 BluFi 协议规范 | 文档中心设备名称规范文档明确规定为了让客户端如小程序正确识别设备蓝牙广播的设备名称name必须符合特定的格式例如DTXZ*、BLUFI_DEVICE*或ESP_*。MAC地址获取文档指出由于iOS系统的安全机制无法像Android那样直接从广播包中获取设备的MAC地址。因此解决方案是将设备的MAC地址嵌入到蓝牙广播名称localName中。MAC地址格式文档推荐了三种MAC地址格式其中AABBCCDDEEFF这种无分隔符的连续格式是首选并且与智能体绑定所使用的格式一致。结合代码分析我们发现项目中的blufi.c文件存在两个问题蓝牙服务启动时广播名称被硬编码为DTXZ虽然符合命名规则但没有包含MAC地址。在生成广播名称的函数update_adv_data_if_need中MAC地址的拼接逻辑被注释掉了取而代之的是一个固定的示例MAC地址。解决方案解决这个问题的核心是修改project/ln_model_public/app/blufi.c文件确保蓝牙广播名称既符合命名规范又包含了设备真实的MAC地址。第一步启用正确的蓝牙服务首先我们需要确保启动的是BLUFI服务并且广播名称前缀正确。1// 文件: project/ln_model_public/app/blufi.c 2 3void netcfg_task_entry(void *params) { 4 // ... 其他代码 ... 5 sys_ble_init(2); 6 // 启动BLUFI服务 7 sys_ble_service_start(SERVICE_TYPE_BLUFI); 8 // 设置广播名称前缀为 DTXZ符合灵矽规范 9 sys_ble_adv_start(DTXZ); 10 // ... 其他代码 ... 11}这里的关键是调用sys_ble_adv_start(DTXZ)将广播名称的前缀设置为DTXZ。第二步将真实MAC地址嵌入广播名称这是最关键的一步。我们需要修改update_adv_data_if_need函数取消注释并修正MAC地址的拼接逻辑。1// 文件: project/ln_model_public/app/blufi.c 2 3static void update_adv_data_if_need(const char *name_format) { 4 // ... 其他代码 ... 5 uint8_t *adv_data g_ble_cfg.adv_data; 6 char *dev_name g_ble_cfg.dev_name; 7 int index 0; 8 9 // ... 其他代码 ... 10 11 // 获取设备真实的Wi-Fi MAC地址 12 uint8_t *wifi_mac get_mac_addr(); // 返回 uint8_t[6] 13 14 // 将MAC地址格式化为 AABBCCDDEEFF 的形式并拼接到设备名称中 15 // 最终的设备名将会是类似 DTXZ-A0B1C2D3E4F5 的格式 16 snprintf(dev_name, sizeof(g_ble_cfg.dev_name), %s-%02X%02X%02X%02X%02X%02X, 17 name_format ? name_format : LN_DEV, // name_format 对应上一步的 DTXZ 18 wifi_mac[0], wifi_mac[1], wifi_mac[2], 19 wifi_mac[3], wifi_mac[4], wifi_mac[5]); 20 21 // ... 后续处理 adv_data 的代码 ... 22}原理分析这个解决方案完美地遵循了灵矽平台的设计规范满足命名规则通过sys_ble_adv_start(DTXZ)我们确保了广播名称以DTXZ开头满足了小程序识别设备的第一个条件。解决iOS限制通过snprintf将get_mac_addr()获取到的真实MAC地址以AABBCCDDEEFF的格式拼接到广播名称中。这样iOS小程序在扫描到设备后就可以通过解析localName字段用正则表达式轻松提取出设备的MAC地址从而解决了无法直接获取MAC的问题。最终设备广播的名称会变成一个类似DTXZ-A0B1C2D3E4F5的字符串。这个字符串既告诉了小程序“我是谁”DTXZ设备也告诉了小程序“我的唯一标识是什么”MAC地址从而打通了整个配网流程。