技术博客 / 公开脱敏版

先搭工程体系,再做功能

图 0:AI 参与智能硬件开发,前提是设备工程闭环已经可观察、可升级、可验证。
图 0:AI 参与智能硬件开发,前提是设备工程闭环已经可观察、可升级、可验证。

核心观点

D3000 的价值不只是完成了一批功能,而是把源码、构建、OTA、真实设备、日志和硬件约束接成了一个工程系统。

AI Agent 想要可靠参与智能硬件开发,首先需要可读取的上下文、可执行的工具链和可验证的真机反馈。

速读

D3000 初期真正混乱的不是功能,而是编译链路、调试方式、LVGL 可视化和真机反馈没有形成统一闭环。

AI Agent 能参与智能硬件开发,但前提是源码、构建、升级、日志、健康检查、硬件规格都被工程化。

Hardware harness 是 AI 与真实硬件之间的翻译层:它让设备状态、升级过程和硬件约束变成可读取的工程事实。

图 1:D3000 的 AI 软硬件一体工程闭环。AI Agent 不是直接面对黑盒硬件,而是通过文档、脚本、远程构建、OTA 和 hardware harness 与真实设备协作。
图 1:D3000 的 AI 软硬件一体工程闭环。AI Agent 不是直接面对黑盒硬件,而是通过文档、脚本、远程构建、OTA 和 hardware harness 与真实设备协作。

一开始混乱的不是功能,而是工程闭环

D3000 这个项目给我最大的提醒是:智能硬件开发的难点,往往不是某一个功能怎么写,而是整个工程系统一开始没有准备好让人,也没有准备好让 AI Agent 稳定接手。

如果只是写一段业务代码、改一个页面、加一个接口,AI 已经能做很多事。但一旦进入智能硬件,事情马上复杂起来:源码可能在远程构建机上,编译链路一开始并不稳定,设备又没有顺手可用的串口,真实屏幕和预览效果不一致,Wi-Fi 既要联网又要投屏,OTA 成败还要等设备重启后才知道。

这时候,AI 的能力不是不能用,而是必须先给它一个可观察、可验证、可交接的工程环境。D3000 的经验可以总结成一句话:先搭 AI 工程体系,再做功能。

项目初期最混乱的地方,其实不是单个页面不好看,或者某个网络状态判断错了。真正的问题集中在三件事:编译链路不稳定、设备调试困难、LVGL UI 缺少可视化开发方案。它们不是孤立问题,而是共同指向同一个缺口:没有形成完整的硬件在环开发闭环。

AI Agent 接手硬件项目,第一步不是写代码

在 D3000 里,我越来越明显地感受到:如果希望 AI Agent 真正参与智能硬件开发,第一步不是让它马上改功能,而是让它知道工程在哪里。

源码在哪里?当前分支是什么?哪些文件是主业务?哪些目录是 UI?哪些目录是 Wi-Fi、云端、OTA、硬件输入?编译命令是什么?构建产物在哪里?怎样判断编译成功?怎样判断固件真的升级到了设备?怎样确认设备升级后恢复健康?

这些问题看似基础,但它们决定了 AI 能不能参与项目。AI 很擅长读代码、归纳结构、生成补丁、修复局部逻辑。但 AI 不擅长猜测隐藏环境。如果构建环境、产物路径、legacy warning、真实失败信号、OTA 验收方式都只存在于人的脑子里,AI 就会变成一个会写代码但不知道设备在哪里的工具。

D3000 后来的工作方式,本质上是把工程知识从人的记忆里迁移到可读取的项目上下文里。本地控制仓库保存文档、脚本、记录、预览和调试证据;远程构建环境负责真实固件源码和编译;真实设备负责最终验证。三层分清以后,AI Agent 才知道自己在哪一层工作,哪些文件可以改,哪些产物不能乱动,哪些日志才是验收依据。

Hardware harness:让硬件变得可测

我会把 D3000 里沉淀出来的这套能力称为 hardware harness 编程。这里的 harness 不只是测试脚本,也不只是硬件抽象层,而是围绕真实硬件建立的调试、验证、适配、升级和状态观测框架。

它有两层含义。第一层是调试验证框架,也就是健康检查、日志、OTA 状态、持久化日志、一键 build OTA 这些能力。第二层是软硬件适配层,也就是把屏幕、字体、实体按键、触摸、Wi-Fi 模块、休眠唤醒、存储空间、OTA 风险这些硬件约束,变成软件开发必须尊重的边界。

没有 harness,智能硬件开发就会变成盲调。你不知道设备现在是死了、断网了、服务没起来、UI 卡住了,还是只是状态显示错了。D3000 里的 /health、/logs、/ota_status、持久化日志和一键 build OTA 脚本,表面看是调试工具,实际上是项目能继续推进的基础设施。

/health 让我们知道设备是否活着,网络是否连上,关键服务是否恢复。/logs 让我们看到真实运行路径,而不是只凭 UI 状态猜。/ota_status 让升级过程从黑盒变成可观察状态。持久化日志解决了设备重启、断网、投屏异常这类问题最难取证的部分。一键 build OTA 脚本则把编译、取包、起服务、触发升级、等待恢复、保存证据串成一个可重复流程。

图 2:D3000 的真机闭环开发流程。完成标准不是代码写完,而是设备证据闭环。
图 2:D3000 的真机闭环开发流程。完成标准不是代码写完,而是设备证据闭环。

软硬件适配层:硬件约束不是实现细节

D3000 的 UI 适配很能说明这个问题。很多软件项目里,UI 问题可以靠浏览器调试器、设计稿、响应式布局和截图测试解决。但在嵌入式设备上,UI 是另一回事。

屏幕尺寸固定,字体资源有限,中文字体可能不完整,图片解码器可能没初始化,缩放位图字体会发虚,LVGL 的某些对象创建后自带默认对齐行为,样式重置可能连坐标和尺寸一起影响。你在代码里看到的设置 x、y、w、h,不一定等于最终屏幕上的真实结果。

D3000 里就出现过典型问题:预览正常,真机不对;代码逻辑看起来没问题,但字体显示发虚;布局计算没有错,但 LVGL 对象默认行为把位置带偏;Wi-Fi 列表和密码键盘在真实屏幕上不符合使用预期。

这些问题不是靠多写一点业务代码解决的,而是靠建立 UI 开发闭环解决的。先用本地预览工具捕捉明显的坐标和布局错误,再通过真实设备确认显示效果。预览工具不是完整 LVGL 模拟器,它只能降低试错成本,不能替代真机。真机照片、截图、用户反馈和运行日志,才是最终依据。

还有一个很容易被低估的点:D3000 的主流程不是纯触摸优先。实体按键、焦点组、鼠标、键盘、触摸都可能参与交互。首页不能只考虑手指点哪里,还要考虑固定物理按键怎么移动焦点,默认焦点在哪里,哪个元素应该被选中,哪些控件不能看起来像按钮但实际上不能操作。这就是硬件 UI 和 Web UI 的差别。

Wi-Fi STA/P2P 共存是系统问题,不是网络开关

D3000 另一个典型挑战是 Wi-Fi STA/P2P 共存和投屏恢复。这类问题特别适合说明智能硬件开发的复杂性。

设备既要通过 STA 连接网络,用于云端登录、数据上传、调试服务、OTA、头像下载;又要保留 P2P 能力,用于 AirPlay、Miracast 这类投屏服务。看起来都是 Wi-Fi,实际上背后涉及接口、驱动、服务启动顺序、状态恢复和投屏期间的资源竞争。

如果只从业务代码角度看,很容易把它理解成连上 Wi-Fi 就行。但真实设备不会这么简单。投屏可能改变通道占用,驱动可能暂停某些连接,P2P 服务可能影响 STA 稳定性,UI 上显示的连接状态可能滞后于真实网络状态。某些扫描路径走错接口,看到的 AP 列表就会不完整。某些恢复逻辑没做好,投屏断开以后服务不能自动回到可用状态。

这就是为什么 D3000 必须把 Wi-Fi、P2P、投屏、调试服务、云端能力放在同一个健康检查和日志体系里看。网络不是单独模块。网络是 OTA 的前提,是云端登录的前提,是日志拉取的前提,是 AI 远程调试的前提,也是用户体验的前提。

基础库不完整,会把小问题变成系统问题

D3000 还有一类问题很真实:基础库不完整。在桌面软件或 Web 项目里,我们默认图片解码、字体渲染、TLS、HTTP、日志、文件系统、输入事件都已经比较成熟。但在嵌入式项目里,这些能力经常是部分可用的。

字体存在不代表已经链接进应用。PNG/JPEG 能否显示,取决于解码器有没有初始化。TLS 能不能开,取决于证书、内存、库配置和线程上下文。UI 字体看起来只是视觉问题,但它可能牵涉到资源大小、链接符号、渲染性能和多语言支持。

一个头像显示不出来,背后可能不是 UI 问题,而是下载、解码、缓存、裁剪、透明通道、画布资源和刷新时机共同作用的问题。这类问题特别考验 AI Agent。AI 看到函数名,可能会认为调用即可。但硬件项目里,经常需要继续追问:这个符号真的链接了吗?这个库在当前应用里初始化了吗?这个资源大小会不会影响固件?这个操作能不能放在 UI 线程?这个日志会不会泄露凭据或用户隐私?

代码没问题,不等于设备没问题

D3000 有几类非常典型的场景,足以说明智能硬件不能只看代码。

第一类是代码逻辑没问题,但真机显示不对。这在 UI 开发里非常常见。坐标计算是对的,预览工具也渲染了一个合理结果,但真实 LVGL 对象的默认行为、字体资源、缩放方式、屏幕方向、焦点状态,都会影响最终效果。用户看到的是屏幕,不是代码。

第二类是编译成功,但设备不健康。固件构建成功,只说明编译链路走通了,不代表设备升级后服务恢复了。OTA 触发成功,也不代表烧写成功、重启成功、网络恢复成功。真正的完成标准必须包括升级后健康检查正常、关键服务状态正确、日志证明新逻辑生效。

第三类是预览正常,但屏幕效果不对。本地预览工具很有价值,它能提前发现明显布局错误,也能减少远程编译和 OTA 的次数。但它不是完整硬件。它不能完全模拟字体、焦点、输入设备、真实屏幕观感、LVGL 内部行为和性能边界。

这三类问题背后是同一个结论:智能硬件开发必须把真实设备纳入开发闭环。代码只是输入,设备状态才是输出。

AI 时代的硬件开发,需要给 AI 写工程说明书

D3000 让我更确信一件事:未来智能硬件团队会越来越多地使用 AI Agent,但前提不是让 AI 更聪明,而是让工程环境更适合 AI 工作。

AI 需要的不是一句帮我修一下 Wi-Fi,而是一套上下文。当前源码在哪,怎么构建,怎么升级,怎么验收;哪些日志能看,哪些状态字段可信;哪些目录是源码,哪些是生成物;哪些文件可以提交,哪些记录只是证据;哪些问题必须真机确认,哪些可以本地预览;哪些隐私信息不能写进日志,哪些凭据不能进入文档。

这就是 AI 工程体系。它不是额外负担,本质上也是给人看的工程体系。只不过 AI 把这些隐性问题放大了。过去团队靠老工程师记忆、聊天记录截图、口头交接也许能勉强推进;到了 AI Agent 参与开发的时候,这些隐性知识必须变成文档、脚本、接口和验收标准。

这件事做成以后,收益非常明显。新人能更快接手,AI 能更可靠地修改,远程调试不再完全依赖现场,构建和 OTA 能复现,每次改动都有证据,问题可以被分类,而不是混成一句设备有问题。

四个工程基础可以压缩成下面这张表。它不是流程海报,而是给团队和 AI Agent 共同遵守的工作约定。

工程基础D3000 的经验对 AI 开发的意义
源码与编译先确认真实源码、分支、模块、构建命令、产物路径和成功标准。AI 不需要猜项目入口,能快速进入可执行上下文。
调试与升级建设健康检查、日志、OTA 状态、持久化日志和一键 build OTA。AI 可以用设备证据判断修改是否生效,而不是停留在代码层。
硬件规格把屏幕、字体、输入、Wi-Fi、休眠、存储、OTA 风险写成开发边界。AI 的实现会被真实硬件约束,而不是默认成 Web 或桌面软件。
真机流程每次修改都走构建、升级、健康检查、日志、照片或现场确认。AI 产出的补丁能进入闭环验证,团队也能追溯结果。
表 1:D3000 沉淀出的四个智能硬件工程基础

配套解决方案:把经验落成 AI-ready 工程底座

如果要把 D3000 的经验变成一套可以复用的解决方案,我不会从功能清单开始,而会先从工程底座开始。因为功能会变,硬件会换,云端接口也会调整,但智能硬件开发需要的底层能力非常稳定:源码要可定位,固件要可构建,设备要可升级,状态要可观察,约束要可读取,验收要可复现。

这套解决方案的目标不是做一个很重的平台,而是先把最关键的工作面打通。工程师和 AI Agent 都围绕同一组入口工作:同一份源码地图,同一套构建脚本,同一组调试端点,同一份硬件规格,同一张验收矩阵。只要这些入口稳定,AI 才能从“会写补丁”进一步变成“能参与闭环交付”。

在 D3000 里,这个方案可以概括为五个组件:工程入口层、构建升级层、观测调试层、硬件约束层、验收闭环层。工程入口层解决 AI 找不到项目的问题;构建升级层解决代码无法快速上设备的问题;观测调试层解决设备黑盒问题;硬件约束层解决 AI 默认软件化的问题;验收闭环层解决编译通过被误认为完成的问题。

这五个组件之间的关系很简单:入口让 AI 能开始工作,构建升级让修改能到设备,观测调试让设备能反馈事实,硬件约束让实现不越界,验收闭环让每次修改都能被证明。它们组合起来,才是真正适合 AI 参与的智能硬件工程底座。

图 3:D3000 经验对应的 AI-ready 智能硬件工程底座。它不是单一工具,而是源码、构建、观测、硬件约束和真机验收的组合。
图 3:D3000 经验对应的 AI-ready 智能硬件工程底座。它不是单一工具,而是源码、构建、观测、硬件约束和真机验收的组合。

如果把 D3000 的经验落成一套可复制方案,我会把它拆成五个组件。每个组件都不是为了好看,而是为了让 AI Agent 和工程师都能基于同一组事实工作。

组件解决的问题落地动作交付物
工程入口层AI 不知道项目在哪里、怎么编、哪些文件能改。维护源码地图、构建命令、产物路径、分支规则和提交边界。交接文档、源码索引、构建说明。
构建升级层代码改完后无法快速证明固件已进入设备。封装远程构建、固件校验、HTTP 分发、OTA 触发和重启等待。一键 build OTA 脚本、升级记录、固件校验值。
观测调试层设备没有串口或现场不可达时,问题容易变成黑盒。暴露健康检查、运行日志、OTA 状态、持久化日志和关键状态字段。调试服务、日志归档、失败现场证据。
硬件约束层AI 容易默认成 Web/桌面软件,忽略屏幕、字体、输入和网络限制。把屏幕、字体、实体按键、触摸、STA/P2P、休眠、存储写进规格。硬件规格书、UI/网络/电源约束清单。
验收闭环层编译通过容易被误认为功能完成。按任务类型定义真机验收:UI 看屏幕,网络看日志,OTA 看状态,数据看恢复。验收矩阵、照片/日志/健康检查记录。
表 2:AI-ready 智能硬件工程底座的五个组件

这套方案不需要一次性做成平台。更现实的方式是按三阶段推进,先让设备可观察,再让升级可重复,最后把 AI 的工作协议固化下来。

阶段重点动作完成标志
第 1 阶段:止血梳理源码、构建、设备健康字段和日志入口;补最小调试服务。AI 能读懂项目入口,工程师能确认设备是否在线。
第 2 阶段:闭环打通构建、固件校验、OTA、重启等待、日志归档和真机确认。每次改动都有升级证据和运行证据。
第 3 阶段:规模化把硬件规格、验收矩阵、AI Agent 规则和复盘记录写进项目制度。功能开发可以交给 AI 加速,但风险仍被工程流程约束。
表 3:解决方案的三阶段落地路径

把完成定义改成设备证据

D3000 还有一个值得单独写下来的变化:完成定义必须从代码视角切到设备视角。普通软件项目里,很多团队会把单元测试通过、代码合并、CI 绿色当作阶段性完成。智能硬件当然也需要这些,但它们不够。

对 D3000 来说,一个功能真正完成,至少要看到几类证据:固件构建成功,升级流程成功,设备恢复在线,健康检查字段符合预期,日志证明新路径走到了,真实屏幕或真实输入行为被确认。如果是 UI,就要看真机效果;如果是 Wi-Fi,就要看接口和恢复逻辑;如果是 OTA,就要看升级前、中、后状态;如果是云端和离线数据,就要看失败重试、恢复上传和成功后清理。

这套完成定义对 AI Agent 特别关键。因为 AI 最容易停在代码层:它会说我已经修改了某个函数,或者编译错误已经修掉。但硬件项目不能让完成停在这里。只有当 AI 能被要求继续读设备日志、检查健康状态、引用升级记录、说明真机证据时,它才从代码助手变成工程协作者。

换句话说,智能硬件里的 AI 开发不是让 AI 多写几行代码,而是让 AI 进入完整的工程责任链。它要知道怎么改,也要知道怎么证明改动真的在设备上成立。

先搭体系,再做功能

很多智能硬件项目的问题,不是团队不会写功能,而是太早开始写功能。源码没理顺,就开始改业务;调试接口没做好,就开始追网络问题;OTA 不稳定,就开始频繁升级;UI 没预览工具,就开始靠真机反复试;硬件规格没固化,就开始做复杂交互。结果就是每个功能都像在泥地里走路,越走越累。

D3000 的经验正好相反:先把工程体系搭起来。先让设备可观察、可升级、可复现、可交接。然后再让 AI Agent 参与具体功能开发,才会真正提升效率。

AI 在这里不是替代工程师,而是放大工程体系的质量。体系清楚,AI 就能放大效率;体系混乱,AI 只会放大混乱。这也是我认为 D3000 最有价值的地方。它不只是完成了一批功能,而是把智能硬件开发的底层工作方式重新梳理了一遍。

从这个角度看,D3000 的开发经验不是一个项目复盘,而是一种 AI 时代智能硬件工程方法的雏形。智能硬件开发的核心不是写固件,而是建立可复现、可验证、可交接的设备工程闭环。