AI语音智能体开发日记(三)解决小程序配网中的蓝牙命名与MAC地址获取问题
相关链接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地址从而打通了整个配网流程。

相关新闻

remark42 依赖解析:xdg-go/stringprep 的 RFC-3454 stringprep 与 RFC-4013 SASLprep 实现

remark42 依赖解析:xdg-go/stringprep 的 RFC-3454 stringprep 与 RFC-4013 SASLprep 实现

后端前端 【免费下载链接】remark42 comment engine 项目地址: https://gitcode.com/gh_mirrors/re/remark42 点击查看 免费下载 本文聚焦于 remark42 后端 vendor 目录中随依赖携带的第三方 Go 库 xdg-go/stringprep,完整解读其 README 所声明的核心能…

2026/10/12 2:08:10 阅读更多 →
深入解析 go-toml:在 Boulder ACME CA 项目中解析与操作 TOML 配置的 Go 库实战指南

深入解析 go-toml:在 Boulder ACME CA 项目中解析与操作 TOML 配置的 Go 库实战指南

网络安全后端微服务 【免费下载链接】boulder An ACME-based certificate authority, written in Go. 项目地址: https://gitcode.com/gh_mirrors/bo/boulder 点击查看 免费下载 导读 go-toml 是一个用 Go 语言编写的 TOML(Toms Obvious, Minimal Lan…

2026/10/12 2:08:10 阅读更多 →
ESP32隐藏射频通路:绕过协议栈直控无线收发的实测记录

ESP32隐藏射频通路:绕过协议栈直控无线收发的实测记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:08:10 阅读更多 →

最新新闻

PLC程序质量四层评估模型:从能运行到可维护可演进

PLC程序质量四层评估模型:从能运行到可维护可演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:40 阅读更多 →
2026年8个AI论文写作工具实测:TaoToken统一Key接入GPT与Gemini的配置清单

2026年8个AI论文写作工具实测:TaoToken统一Key接入GPT与Gemini的配置清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:40 阅读更多 →
TAB Cursor 从 GitHub Copilot 迁移到 TaoToken:统一 Key 与 Base URL 配置指南

TAB Cursor 从 GitHub Copilot 迁移到 TaoToken:统一 Key 与 Base URL 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:39 阅读更多 →
Ubuntu Secure Boot下r8168网卡驱动签名实战指南

Ubuntu Secure Boot下r8168网卡驱动签名实战指南

1. 问题本质与真实场景还原你刚装好Ubuntu系统,网线一插,桌面右上角网络图标显示“有线已连接”,但浏览器打不开任何网页,终端里ping 8.8.8.8直接超时——连基础连通性都没有。更诡异的是,执行sudo dmesg | tail -20&a…

2026/10/12 2:54:39 阅读更多 →
开源SMU源表USMU深度拆解:从电路设计到校准实战

开源SMU源表USMU深度拆解:从电路设计到校准实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:39 阅读更多 →
嵌入式Linux安卓驱动开发:供需、实战与面试全攻略

嵌入式Linux安卓驱动开发:供需、实战与面试全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:53:39 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →