
一台能 JS 二次开发、协议 AI 生成、远程 OTA 的智能食品留样柜作者:老码农 Ewin · 拇指三兄弟系列第三篇一、写在前面:我为什么写这篇上周接了个区教育局项目,13 所学校、26 台智能食品留样柜采购。预算小于1W 一台。调研两周,市面上主流报价1.5 万到 2.8 万,协议改一次再收 1–2 万,界面基本不能改。项目基本卡死。后来找到 MCPIOT 这套方案——** 一台,含税含质保,JS 现场改流程,AI 生成协议适配,OTA 一次下发全区**。三个月项目落完,预算还省下来 12 台额外的钱。故事就说到这。下面看一下成品。二、需求:一台留样柜到底要改什么先把甲方视角的痛点列清楚。传统留样柜厂家默认整机固件,以下三样基本改不动:1. 界面市区中学后勤 vs 乡镇教学点阿姨,需要的界面完全不同默认多层菜单 术语,乡镇场景直接不能用想改?返厂、刷固件、按台收费2. 业务流程存样 8 步,顺序各校不同:有的先称重后扫码,有的必须双人核脸前置打印标签字段学校自定义、语音播报开关分学校想改?同上,返厂3. 上传协议每个区教育局监管平台上传格式不一样有的 HTTP form,有的 JSONHMAC 签名,有的 MQTT平台升级时字段增删是常态想改?一次性开发费 3–8 万,工期两个月核心矛盾:硬件同质化严重,BOM 差异不大,但改的能力被固件锁死,导致每次改都得走返厂链路。MCPIOT 这套方案的解法:把业务逻辑从固件里剥出来,搬到 JS 运行时里,配 Studio 工具支持现场改 OTA 下发。以skills形式其它AI开发工具也能使用三、架构:JS 运行时怎么塞进 Android 留样柜先看整体分层。底层(Native · Android)Android 工控主板,6 路 Modbus 门锁、称重串口、打印机、扫码模组、双目摄像头、监控摄像头,全部封装成 Native 桥接方法暴露给上层:Android.openCabinetLock(cabinetNo)Android.getCurrentSampleWeight()Android.printSampleLabels(json)Android.startFaceVerify()Android.getDishList()/Android.getMealSessionList()Native 层只负责硬件抽象,不写业务逻辑。中间层(MCPIOT JS Runtime)这是关键。运行时基于 QuickJS-NG,常驻 Android 后台,提供三样:Bridge API—— 把上面那些Android.xxx方法包装成 async JS 调用Flow Engine—— 存样、取样、双人核验这些业务流程,全部用 JS 描述,热更新Uploader Registry—— 上传协议适配器注册中心,可挂多个 adapter,按学校配置动态选择上层(业务代码 · JS)flows/store.js、flows/take.js、ui/screens/*.html、uploaders/edu-monitor-*.js——全部是 JS 和 HTML,在 Studio 里改完,一键推送到设备,秒级生效。原理很直白:把留样柜从一台嵌入式设备变成一台跑 Web 应用的工控终端,硬件不动,业务代码天天改。四、JS 二次开发:改一个存样流程需要几行代码举个真实案例。默认流程是这样:// flows/store.js (默认版)exportasyncfunctionstoreSample(cabinetNo){constcodeawaitscanBarcode();constformawaitopenSampleForm(code);awaitverifyTwoPersons();constweightawaitgetWeight();awaitsaveAndPrint({...form,weight});awaitopenCabinetLock(cabinetNo);}某学校要求称重前置、双人核脸后置,而且要在开锁前语音播报请第二人刷脸。改法:// flows/store.js (该校定制)exportasyncfunctionstoreSample(cabinetNo){// 1. 先称重(前置)constweightawaitgetWeight();if(weightconfig.get(weightThreshold,125)){returntoast(样品重量不足,请重新放置);}// 2. 扫码 表单constcodeawaitscanBarcode();constformawaitopenSampleForm(code);// 3. 保存 打印awaitsaveAndPrint({...form,weight});// 4. 双人核脸(后置,开锁前)awaitspeakTts(请第二人刷脸);awaitverifyTwoPersons();// 5. 开锁入柜awaitopenCabinetLock(cabinetNo);}改完 CtrlS,Studio 通过 WebSocket 长连接推到设备,JS 运行时热重载flows/store.js模块。从改代码到设备生效,平均 3 秒。界面同理。存样弹窗是一份 HTML,想加字段、想去掉字段、想改按钮位置,改 HTML 就行:!-- ui/screens/store-form.html --divclassform-rowlabel菜品名称/labelinputiddishNamelistdishListrequired/divdivclassform-rowlabel留样时长(天)/labelinputiddaystypenumbermin1value2required/div!-- 该校要求增加备注字段 --divclassform-rowlabel备注/labeltextareaidremarkrows2/textarea/div**没有 IDE 里的智能提示?有。**Studio 内置了完整 Bridge API 的 TypeScript 声明,Android.敲下去自动补全,getCurrentSampleWeight()悬浮显示返回值单位(克)、轮询周期(1秒)、注意事项(净重已扣去皮)。写业务代码和写普通前端项目区别不大。五、AI 生成协议适配:从两个月开发到三分钟对上 支持微信ClawBot 随时开发这块是这套架构里我最想说的部分.5.1 上传协议的抽象MCPIOT 把上传到监管平台抽象成一个统一接口:// uploaders/base.jsexportclassUploader{asyncupload(record){thrownewError(not implemented);}asynchealthCheck(){returntrue;}}默认实现有几个内置版本:uploaders/http-form.js—— HTTP POST formuploaders/http-json.js—— HTTP POST JSONuploaders/mqtt-v1.js—— MQTT 上传uploaders/gov-standard.js—— 国家市场监管总局标准接口设备启动时读配置,决定挂哪个 uploader:// config.yamluploader:type:http-jsonendpoint:https://edu.xxx.gov.cn/api/sampleauth:bearerbearer_token:${ORG_TOKEN}上传就一行:awaituploader.upload(sampleRecord);5.2 AI 生成新的 Adapter假设某区教育局说:“我们平台要 JSON HMAC-SHA256 签名,签名字段名叫sig,盐值每个学校单独下发。”以前的做法:写需求文档、开发排期、俩月后交付。现在的做法:在 MCPIOT Studio 里对 AI 说一句话。Studio 集成了 Vercel AI SDK 的 Tool Calling 能力,AI 有 3 个可调工具:readBridgeAPI—— 读设备当前所有可用的 Bridge APIgenerateFile(path, content)—— 在项目里创建文件registerUploader(name, path)—— 把新 uploader 挂到 Registry对话大概长这样:用户:给这台设备加一个上传适配器,把当前 JSON 上传改成带签名的:在 JSON 外层包一层{ payload, sig }sig HMAC-SHA256(payload, salt) 后 Base64 编码salt从设备配置orgSalt读AI:好的,我生成uploaders/edu-monitor-hmac.js,并注册到 Registry。是否需要保留原有 JSON 上传 uploader?用户:保留,新的作为默认。AI:已生成。以下是文件内容(可编辑):import{config}frommcpiot/device;import{hmacSha256Base64}frommcpiot/crypto;exportclassEduMonitorHmacUploader{asyncupload(record){constsaltawaitconfig.get(orgSalt);constpayloadJSON.stringify({school_id:record.orgId,sample_code:record.sampleCode,dish_name:record.dishName,meal_session:record.mealSession,weight_g:record.weight,store_time:record.storeTime,store_users:record.storeUsers,});constsigawaithmacSha256Base64(payload,salt);constrespawaitfetch(config.get(eduEndpoint),{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({payload,sig}),});if(!resp.ok)thrownewError(Upload failed:${resp.status});returnresp.json();}}已注册为edu-monitor-hmac,并写入配置文件默认 uploader。生成加校对 部署,一杯咖啡的时间。核心不是AI 神奇,而是 AI 拿到了三张牌:完整的 Bridge API 定义(知道设备能干什么)Uploader 基类和现有实现(知道要生成什么形状的代码)项目配置结构(知道往哪儿挂)有这三张牌,普通 LLM 就能可靠输出可运行代码。不是 AI 变强了,是把上下文喂全了。六、设备更新:一次下发,全区更新单台设备改完之后,同区里另外 93 台怎么办?MCPIOT Studio 里有个下发按钮,底层做的事:打包:把改动的flows/*.js、ui/**/*.html、uploaders/*.js打成 diff 包,按文件 hash 增量签名:私钥签名,防止中间人替换分发:设备端 MQTT 长连接收到通知,拉包校验:公钥验签 文件 hash 比对热重载:JS 运行时无缝切换模块引用,不重启 Android 应用、不重启硬件**关键点:业务代码 OTA 不重启硬件。**冷藏正在运行、门锁正在通信、监控正在录像,全部不受影响。离线设备怎么办?下次联网时自动拉取。设备端保留最近 3 个版本,可回滚。命令行版长这样:$ mcpiot deploy--projectcabinet-edu-zoneA--scopeall Diffinglocalvs remote… modified: flows/store.js added: uploaders/edu-monitor-hmac.js modified: config.yaml Bundling…47KB Signing with team key: ewincompany.com Notifying94devices…(89online /5offline)✅89devices updatedin12.4s ⏸5offline devices will update on next connect七、平台接入零协议门槛:再说一句第五节讲了单个 uploader 怎么生成。放在项目层面,这意味着:用户平台接入这台设备时,不需要问设备默认支持什么协议。设备默认支持一批标准协议;不支持的,用 Studio 生成一个 adapter;平台改协议了,再改一次 adapter。协议不再是采购决策里的硬约束。传统采购流程:选设备 → 看设备支持啥协议 → 看平台支持啥协议 → 交集 → 谈定制费用这套架构后:选设备 → 部署 → 有需要就改 uploader采购前那一堆你们支持不支持 XXX 协议的电话,可以不用打了。八、成本账:为什么能做到别人三分之一传统厂家为什么卖 1.5 万?固件研发摊销:每家单独开发嵌入式固件,平摊到销量上是大头大代理渠道:传统集成商链路,渠道分润 25–35%协议定制:项目里标准报价定制加价的商业模式品牌溢价:行业里没啥可比标的,报价没有天花板MCPIOT 这套的成本结构:固件研发是一次性投入,JS 运行时和 Studio 复用到公司所有 IoT 产品(锥桶、水质监测、留样柜、下一个……),边际研发成本≈0不走大代理,直接给集成商供货,砍掉渠道 30%协议定制不收钱,因为 AI 生成 OTA 部署,几乎没有人工成本团队和公司在无锡,人力成本比北上广低 30–40%四项加起来,把终端价压到 7800 是可以做到的。净利润率不高,但可持续。我问过老李一句:“这样能一直做下去吗?”老李原话:“够养团队、够继续研发,就行。学校预算不宽裕,但学校里坐的都是孩子。这个账不能只算利润,也得算算社会账。”九、写在最后拇指三兄弟这个系列写了三篇了:第一篇讲串口中枢:硬件模块可复用,底层协议可扩展第二篇讲智能锥桶:现场可改协议,不用返厂第三篇讲留样柜:同一套架构,做到把合规设备装进乡镇小学背后是同一支团队、同一套MCPIOT底层架构、同一套哲学:把可编程能力开放给现场,而不是锁在固件里。技术栈:Native 层:Android JNI 硬件桥接中间层:QuickJS-NG 自研 Runtime WebSocket 热更新工具链:MCPIOT Studio(Tauri 2.0 Monaco Vercel AI SDK)分发:MQTT 签名 OTA 增量 diff有需要的自己去mcpiot.taobao.com看。做集成的、做甲方采购的、做食品安全监管的、以及做智慧校园的,都能找到能对上的部分。不需要的,就当没看见。(本文首发于 CSDN。文中出现的技术细节均基于 MCPIOT 平台真实产品能力。项目金额与学校数量为示意场景,不代表实际合同信息。)#物联网 #食品安全 #JS二次开发 #MCPIOT #AIGC开发工具 #教育信息化 #OTA