从"人肉盯仪表"到"一句话出结论",嵌入式功耗调试的自动化尝试
导读:调低功耗产品的底电流,传统流程是"功耗计看数 → 导 CSV → Excel 统计 → 人肉判读",一轮下来半小时就没了。本文记录我把合宙 IoT Power 功耗分析仪封装成 MCP 工具的过程——现在对 AI 说一句"抓 30 秒底电流",它自己连设备、采样、统计、判读,直接给出排查方向。全文无第三方依赖,思路可直接搬到其他仪器上。
一、从一个真实的调试场景说起
手头有个 BLE 定位器项目,休眠底电流本应做到微安级,实测却停在一个明显偏高的电流平台上。功耗分析仪接上去,数字一目了然——但接下来才是真正的体力活:
1. 盯着屏幕看趋势,猜测异常时段;
2. 抓一段数据导出 CSV;
3. Excel 里算均值、峰值、分布;
4. 对着波形猜原因;
5. 改一版固件,重测,再走一遍……
每一步都不难,但都占用"人"这个最贵的资源。而且回归测试时,"上次平均电流多少来着?"——数据没留档,全靠记忆。我想要的其实很简单:让 AI 替我盯仪表,我只要结论。
二、MCP:给 AI 的"仪器接口标准"
MCP(Model Context Protocol)是 AI 与外部工具之间的标准化接口:你把能力封装成一组"工具"(tool),AI 就能像调用函数一样使用它们——连接设备、采样、统计、判读,全在对话里完成。
选 MCP 而不是写个一次性脚本,理由有三:①可复用——任何支持 MCP 的 AI 客户端都能直接用;②统计口径固化——底电流看 p10 分位而不是 min,这种经验固化在工具里,不会每次现算出错;③可组合——AI 能把功耗采样和烧录、日志抓取串成完整工作流。
三、四层架构:官方动态库是那把钥匙
动手前先搞清一件事:IoT Power 的新款设备(CC/Pro/Plus)走 USB WinUSB 批量传输,采样数据协议是官方刻意保密的——10kHz 原始 12bit ADC 值直接上行,档位信息藏在空闲位里。逆向?不值得。好在官方提供了开放动态库(C ABI),把私有协议整个封装在内:
图 1 · 整体架构:AI 到功耗计的四层链路
于是整个 MCP 服务端只剩下"胶水"工作:用 Python 标准库ctypes绑定动态库,上面包一层 stdio JSON-RPC,注册到 AI 客户端即可。全程零第三方依赖。
四、三个关键实现点
1)握手状态机:动态库的用法有一套固定节奏——先发初始化命令,必须等到设备状态包(0x04)才算就绪,之后开循环泵数据:
lib.send_initial() # 发初始化请求 while not got_0x04: # 必须等到状态包 r = lib.parse() # 阻塞式泵,自带限速 if r == 0xFF: reconnect() # 断线重连 if time_out: resend_initial() # 超时重发 while sampling: r = lib.parse() if r == 0x01: # 一个数据包 = 16 个样本 for i in range(16): cur.append(lib.iot_get_current(i)) vol.append(lib.iot_get_voltage(i))2)统计层设计——底电流为什么看 p10:直接取最小值会被单个毛刺或丢包污染。10kHz 采样下,把序列排序后取p10 分位当"底电流"、p99 分位当"峰值",稳定且物理意义明确;再配一张对数刻度的电流直方图,睡眠质量一眼可见:
图 2 · 数据通路:从原始采样到 AI 可用的结论
3)工具粒度取舍:暴露给 AI 的工具不是越多越好。最终收敛为 5 个,每个都对应一个明确的动作:
iotpower_list_devices 枚举可连设备
iotpower_connect 连接(USB / 串口双通道)
iotpower_status 0.5 秒快照:电压 / 电流 / 功率
iotpower_capture 定时采样 → 统计报告 + CSV 留档
iotpower_set_output 控制输出(仅 Pro/Plus 供电型)
五、实战:让 AI 看直方图下结论
这是整套设计里我最满意的部分。平均电流是个"懒惰指标"——2mA 的平均值,可能意味着"从未入睡",也可能是"睡得很深 + 频繁醒来干活"。两种原因,排查方向完全不同。把电流分布画成对数直方图后,差异一目了然:
图 3 · 三种典型分布形态与对应的排查路径
把直方图和分位数一起交给 AI,它会自己说出那句我们想说的话:"分布无 µA 谷底,设备从未进入休眠,建议先查休眠逻辑与唤醒源。"——排查方向的收敛,从半小时缩短到一句话。而且每次采样自动落盘 CSV,回归对比有了基线。
六、踩坑记录(值得你先看再动手)
坑 1 · 官方仓库会"消失":本项目依赖的官方 Gitee 仓库中途转为私有/暂停,release 附件一度无法下载。开源硬件的配套软件没有"长期承诺",遇到能下载的版本先存档。社区 fork 的接口文档仍是公开的,搜索仓库名 + dynamic library 可找到。
坑 2 · 一个系列,两种通道:初代 V1(经典版)走 CP2102 串口(921600 波特率),CC/Pro/Plus 走 USB WinUSB——动态库为此提供了两套打开接口(串口按 COM 名,USB 按设备名)。封装时要先问清设备型号,或干脆做成双通道自动兜底。
坑 3 · 设备是独占资源:官方 PC 客户端开着时,MCP 这边握手会一直等不到状态包。这类仪器接口都要考虑占用互斥——失败提示里直接写清"请先断开官方客户端",比让 AI 干等强得多。
七、下一步:把整条调试链路串起来
功耗仪只是第一步。同样的封装思路可以推广到烧录器、串口日志、示波器……想象一下这个闭环:AI 改一版休眠策略 → 自动烧录 → 自动采样 30 秒 → 和上一版基线对比 → 给出"底电流下降 62%,达到目标"的回归结论。工程师只需要在最后确认。这不是远景,是把每个环节都"工具化"之后的自然结果。
参考资料
· 合宙 IoT Power 系列文档:wiki.luatos.org(搜索 iotpower)
· 动态库接口文档(社区 fork):gitee.com/spcrxj/iot-power · dynamic_library
· 官方动态库/CLI 下载:gitee.com/openLuat/iot-power · releases
· MCP 协议规范:modelcontextprotocol.io