
中移铁通智能插座复活记:给一块没有 APP 的 ESP8266 硬件重写固件
前言
" 家里有没有这种设备:运营商送的智能插座,厂商的 APP 停服了,插座本身好好的,继电器能吸合能断开,就是没人管它了——一块标准的"云僵尸"硬件。
CMPOWER W1 就是这么个东西,中移铁通的智能插座,基于乐鑫 ESP8266。作者 Slaven 干的事很干脆:官方 APP 没了,那就重写一版固件,把这块硬件救活。固件开源,MQTT 协议控制两个继电器,配任何 MQTT 客户端就能远程控制。
这个项目小,但五脏俱全——配网、协议、状态上报、按键交互一条链路全有,是理解"一个 IoT 设备固件到底由什么组成"的绝佳样本。
一、项目身份
CMPOWER_W1 是为中移铁通智能插座(型号 CMPOWER W1)重新开发的开源固件。
一句话说清楚:
基于 ESP8266_RTOS_SDK 重写的插座固件,用 MQTT-TCP 控制主/子两个继电器,EspTouch 配网,任何 MQTT 客户端(如 MyMQTT)即可远程控制
项目地址:https://github.com/Slaven230101/CMPOWER_W1
技术栈:ESP8266_RTOS_SDK(release/v3.4)+ MQTT-TCP + EspTouch 配网 + 本地组装脚本烧录(release 提供 xxx_factory.bin,不想编译可以直接刷)。
硬件底子:ESP8266 WiFi 芯片、两个继电器(主+子)、四组 LED 指示、一个实体按键。原厂价值靠 APP 续着,APP 停服后固件接管一切。
二、核心思路:协议直连,去掉云依赖
原厂方案的典型结构是 设备 → 厂商云 → APP。厂商一弃坑,云没了,设备就死了。
这个固件的思路是把中间的厂商云换成自己可控的 MQTT Broker:
- 配网用乐鑫标准的 EspTouch(手机把 WiFi 密码通过 UDP 广播"发"给设备,V2 方式)
- Broker 默认用公共的
broker.emqx.io,但支持自定义——可以接自己的私有 broker - 控制端不限定 APP,任何能发布/订阅 MQTT 主题的客户端都行
设备从此不再依赖任何一家公司的服务器活命。
三、主执行链路

链路上最巧的一环是自定义数据的双重用途:EspTouch 配网时那段自定义字符串,格式是 "broker url":"user string",一次传输干两件事——告诉设备连哪个 broker,同时定下这个设备专属的主题前缀。
为什么主题前缀重要?因为公共 broker 上所有人共处一个命名空间,如果所有刷了这个固件的设备都订阅 /Slaven/set,你的插座就可能在别人的控制范围里。自定义 user string 让每台设备有自己的主题空间,这是用命名约定做的隔离,不是鉴权——这点风险后面细说。
四、核心模块架构

主题设计是三个、方向分明:
| Topic | 设备端 | APP 端 |
|---|---|---|
/user/set | 订阅 | 发布(控制指令) |
/user/get | 订阅 | 发布(状态查询) |
/user/status | 发布 | 订阅(状态上报) |
set 管控制、get 管查询、status 统一出方向——设备状态永远只从 status 主题出去,指令和回执分道走。payload 是极简 JSON:{"socket":"main","onoff":"on"}。
LED 状态机值得单独夸:蓝灯只管配网环节(闪烁未配网、常亮连上 WiFi 未连 broker、灭即就绪),之后网络状态全交红灯(亮断连、灭回连成功),白色和按键 LED 对应子/主继电器。每种灯色只负责一个领域,排障时不用猜。这个设计放在成熟商业固件里也是规范做法。
五、数据与状态流

状态流向是单向闭环:指令进(set/get),状态出(status),继电器真实状态是唯一事实源。get 查询的应答也走 status 出——出方向只有一条通道,APP 端只需要订一个主题就能拿到所有状态。
六、跨端边界
- 设备端:ESP8266,固件承担配网、MQTT、继电器驱动、交互全部逻辑
- 手机端:两个角色两个 APP——配网用 EspTouch(安卓/iOS 官方开源),控制用 MyMQTT 或任何 MQTT 客户端
- 服务端:Broker 即服务,公共 emqx 开箱即用,私有 broker 一行配置切换;没有自己的云、没有数据库、没有账号体系
- 跨端协议:仅 MQTT-TCP 一条协议贯穿,主题约定即接口文档
七、配置边界
- 必须配:无。零配置可跑——自定义数据缺省时默认
broker.emqx.io:Slaven - 可选配:自定义数据三个粒度全支持——全缺省、只缺 broker(
:Slaven)、只缺 user string(broker.emqx.io:) - 建议配:真实使用建议换掉公共 broker + 自定义 user string,理由见风险
- 编译侧:SDK 锁定 release/v3.4 分支,烧录用官方工具或直接刷 release 的 factory bin
配置设计上"缺省即默认值"做得干净——配网时输入什么都不填,设备照样能用,这是消费级产品的思路,不是极客固件的思路。
八、扩展点
- 私有 broker 对接:自定义数据机制天然支持,接 Home Assistant 的 MQTT 集成、接入家庭网关都是顺路的事
- 作者排期中的四件事:MQTT-TLS(加密)、计量功能(电量统计)、本地 OTA(固件升级)、定制手机 APP——TLS 和 OTA 补上后就是完整的生产级固件
- 主题约定的横向扩展:payload 里 socket 字段是 main/sub 二选一,硬件如果有多路继电器,协议不用动,枚举扩一项就行
- 移植参考:整套"EspTouch 配网 + 自定义数据带配置 + 三主题协议 + LED 状态机"的模式,可以整体搬到其他 ESP8266/ESP32 停服设备上
九、风险点
- 通信明文:MQTT-TCP 没有加密,WiFi 环境内可被嗅探到指令内容。TLS 在计划里但还没落地——当前版本别在不可信网络里用
- user string 是隔离不是鉴权:自定义主题前缀只能防止"撞主题"误控,知道你 user string 的人依然能直接控制设备,公共 broker 上没有任何认证。真要安全,换私有 broker + 用户名密码是底线
- 公共 broker 的可用性风险:
broker.emqx.io是公共服务,不稳定时设备会失联(好在 MQTT 客户端有回连逻辑);重要的是,固件把 broker 做成了运行时可配,坏 broker 可以不刷机换掉 - EspTouch 配网的先天限制:只支持 2.4G WiFi(最好非混合模式),5G 环境配网容易失败;UDP 广播配网方式在部分路由器的 AP 隔离下不可用
- 无 OTA:固件升级要拆开连烧录器——对插座类设备这是硬伤,本地 OTA 在计划里,落地前把它当"刷完即定型"的设备对待
- 无计量与过载保护信息:README 未提及功率计量,把它当纯开关用,别当电量管理设备用——大功率电器接谁家插座都要自己掂量线径和负载
记住
云僵尸硬件的复活套路:去掉厂商云,换成标准协议。MQTT broker 自己挑,客户端随便换,设备的命脉回到自己手里。
这个项目最值得学的不 ESP8266 怎么点继电器,而是那些"小而正"的设计:配网自定义数据一次传配置加主题前缀、三主题把指令和状态分道、LED 状态机每种颜色只管一件事。
但公共 broker + 明文 TCP 的组合,记住定位:这是学习和家庭内网玩具,不是可以暴露在公网的生产设备。
参考资源
- 项目:https://github.com/Slaven230101/CMPOWER_W1(含烧录图解与 release 固件)
- EspTouch:EspressifApp/EsptouchForAndroid · EsptouchForIOS
- ESP8266_RTOS_SDK:release/v3.4 分支
