数据采集器(PLC)配网流程 & 硬件对接待确认事项
用途:SunPro App 与硬件方开会核对协议、时序与异常行为。
App 实现:lib/features/owner/home/plc_collector_protocol.dart
版本:2026-05-29(与当前 App 配网逻辑一致)
一、背景
- 配网阶段:手机连接采集器 Wi‑Fi 热点 → TCP 二进制协议下发家庭路由器 Wi‑Fi、MQTT、退出设置模式并重启 Wi‑Fi 模块。
- 业务阶段:配网完成后,电站/采集器信息经 Installer API 提交后端,与 TCP 无关。
- 现场验证:用 PC/手机 TCP 调试工具 按 HEX 顺序发令可成功;App 已对齐同一顺序,但存在 首次失败、第二次成功、上电后需等待 等现象,需硬件方给明确时序与协议说明。
二、网络与连接前提
| 项目 | 当前约定 / App 行为 | 备注 |
|---|
| 角色 | PLC = TCP Server | 手机 = Client |
| IP | 192.168.43.1(优先) | 连 ddd_102 等热点时,App 也会尝试 手机 Wi‑Fi 网关 |
| 端口 | 8888 | |
| 热点 SSID | MY_WIFI / ddd_102(App 均识别) | 文档曾写 MY_WIFI,现场刷机后为 ddd_102 |
| 热点密码 | 默认 12345678(87654321 等需确认是否量产一致) | |
| 单连接 | 调试工具与 App 不宜同时占 8888 | 现场常见「工具连着则 App 连不上」 |
| iOS | 需 本地网络权限(访问 192.168.x.x) | 首次弹窗未允许时,常需第二次配网才成功 |
用户侧必须:配网全程手机连 采集器热点,不能连家庭路由器 Wi‑Fi 去访问 192.168.43.1。
三、帧格式(双方已用)
3.1 状态帧(PLC → App,350 字节)
- 固定长度 350;末 2 字节 CRC16(Modbus),高位在前。
- 关键字段(字节偏移从 0 起):
| 偏移 | 长度 | 含义 |
|---|
| 0–3 | 4 | PLC ID(大端) |
| 4–29 | 26 | PLC 标号 ASCII,\0 结束 |
| 31 | 1 | 是否已连路由器:0/1 |
| 32 | 1 | 是否已连 MQTT:0/1 |
| 33 | 1 | 0=正常 / 1=手机设置模式 |
| 35–54 | 20 | 路由器 WiFi 名称 |
| 55–74 | 20 | 路由器 WiFi 密码 |
| 76–125 | 50 | MQTT 服务器 |
| 126–131 | 6 | MQTT 端口(字符串) |
| … | | 用户/密码/主题等见代码 plcParseStatusFrame |
3.2 命令帧(App → PLC,55 字节)
- 固定 55 字节 + CRC16(末 2 字节,高位在前)。
- 发送后在帧后追加
0x0D(回车)。
- 命令号在 第 2 字节(
buf[1]);字符串 payload 一般从 第 4 字节(buf[3])起。
四、配网命令顺序(App 与 TCP 工具一致)
原则:
- TCP 连接后 不单独读「首帧」;发每条命令前 清空接收缓冲,发令后 等一包回帧(按 CRC 对齐读 350 字节)。
- 11 / 12 / 21 / 22:回读字段必须与下发一致,否则 重发同一命令(最多 8 次),不进入下一步。
- 15:收到回帧后 立刻发 19。
- 19:无回帧,发出即视为本阶段结束;App 再等 约 10 秒 观察重启/指示灯。
4.1 步骤总览
| 步骤 | 命令 | 作用 | 是否等回帧 | App 校验 |
|---|
| ① | — | TCP 连接 192.168.43.1:8888 | — | 连接成功 |
| ② | 11 | 写入家庭 WiFi 名称 | ✅ 是 | 状态帧 offset 35–54 == 下发 SSID |
| ③ | 12 | 写入家庭 WiFi 密码 | ✅ 是 | offset 55–74 == 下发密码 |
| ④ | 21 | 写入 MQTT 服务器 | ✅ 是 | offset 76–125 == 下发 host |
| ⑤ | 22 | 写入 MQTT 端口 | ✅ 是 | offset 126–131 == 下发 port |
| ⑥ | 15 | WiFi 设置选项取反(退出手机设置) | ✅ 是 | 收到 CRC 正确的一帧即可 |
| ⑦ | 19 | WiFi 模块重启(buf[2]=0) | ❌ 否 | 发出成功即可 |
4.2 当前 App 使用的 MQTT 默认值(调试用)
| 命令 | 值 |
|---|
| 21 | 47.111.189.184 |
| 22 | 1883 |
量产是否固定为该地址、是否由云端下发,需产品/硬件确认(见第六节)。
4.3 参考 HEX(与工具对照)
以下为现场验证过的示例(SSID=CMCC-rR3P,密码=x6TMM2NT),实际 CRC 以计算为准:
11 000b00 + CMCC-rR3P(UTF-8) + 填充 + CRC + 0d
12 000c00 + x6TMM2NT(UTF-8) + 填充 + CRC + 0d
21 001500 + 47.111.189.184 + 填充 + CRC + 0d
22 001600 + 1883 + 填充 + CRC + 0d
15 000f00 + 全 0 填充 + CRC + 0d
19 001300 + buf[2]=00 + 填充 + CRC + 0d (例:…aa760d)
App 配网日志中会打印每条命令的 TX HEX:(55 字节 + 0d,无空格),便于与工具逐字节对比。
4.4 配网成功现象(现场)
- 命令 15 → 19 完成后,TCP 常 断开。
- 约 10 s 后:绿/蓝灯亮,热点
ddd_102 / MY_WIFI 消失。
- 仅发 11→12→19(跳过 15) 时,现场 不成功(灯不亮、热点仍在);15 为必选项。
4.5 流程图(Sequence)
sequenceDiagram
participant U as 用户
participant App as SunPro App
participant PLC as PLC 热点+TCP:8888
U->>App: 连采集器热点,填家庭 WiFi/MQTT
App->>App: 等 3s(TCP 就绪)
App->>PLC: TCP Connect 192.168.43.1:8888
Note over App,PLC: 不单独读首帧
App->>PLC: 命令 11 + 0x0D
PLC-->>App: 350B 状态帧(校验 WiFi 名)
App->>PLC: 命令 12 + 0x0D
PLC-->>App: 350B 状态帧(校验密码)
App->>PLC: 命令 21 + 0x0D
PLC-->>App: 350B 状态帧(校验 MQTT Host)
App->>PLC: 命令 22 + 0x0D
PLC-->>App: 350B 状态帧(校验 MQTT Port)
App->>PLC: 命令 15 + 0x0D
PLC-->>App: 350B 状态帧
App->>PLC: 命令 19 + 0x0D(不等回帧)
Note over PLC: 断热点、重启 WiFi
App->>U: 等 10s,提示看指示灯
五、App 侧实现要点(已实现)
| 行为 | 说明 |
|---|
| 连热点后等待 | 默认 3 秒 再发起 TCP(apConnectSettleDelay) |
| TCP 重试 | 每个候选 IP 最多 5 次,间隔 1–2 s |
| 读回帧 | CRC 滑动对齐 取 350 字节,避免 TCP 流错位解析出乱码 |
| 写失败重试 | 11/12/21/22 回读不一致则 重发同一命令 HEX |
| 命令超时 | 单条命令等回帧最长 90 s |
| 配网 UI | 弹窗 逐步日志 + TX HEX;失败标红并标明步骤编号 |
| 第二次成功 | 常见原因:iOS 本地网络权限、8888 占用、首包错位;用户可再点「完成添加」 |
六、需硬件方确认的问题(开会清单)
建议逐条过,并记录 结论 / 责任人 / 固件版本。
6.1 上电、热点与 TCP 就绪时间(重点)
| # | 问题 | 现场现象 / App 假设 |
|---|
| 1 | 新设备上电后,热点 SSID 多久可见? | 用户反馈需等一会才能搜到 ddd_102 |
| 2 | 热点就绪后,TCP 8888 多久可连? | App 固定再等 3 s;是否不够?建议给出 最小/典型/最大 秒数 |
| 3 | 刷机/恢复出厂后,时序是否与正常上电一致? | 刷机后 byte33 常为 1,是否必须走 15? |
| 4 | SoftAP 窗口 文档写「上电约 10 分钟内」是否仍准确? | 超时后是否只能串口/其他方式配网? |
| 5 | TCP 拒绝连接(errno 61) 在何种状态下出现? | iOS 首次连接失败、第二次成功 — 是否 8888 启动晚于热点? |
6.2 TCP 连接与并发
| # | 问题 |
|---|
| 6 | 是否只允许 1 个 TCP 客户端? 调试工具占用时 App 是否必然失败? |
| 7 | 连接成功后 是否必定先发一帧 350B? App 已选择「不读首帧、发 11 前清缓冲」,是否与固件一致? |
| 8 | 除「每命令一回帧」外,是否 周期推送 状态帧?推送周期多少?是否影响 App 读包对齐? |
| 9 | 命令 15 之后、19 之前 是否会 主动断 TCP?19 是否必须同连接内发出? |
6.3 命令顺序与必选项
| # | 问题 |
|---|
| 10 | 配网最小命令集是否为 11→12→21→22→15→19?能否省略 21/22(出厂已写 MQTT)? |
| 11 | 仅 11→12→19(无 15) 为何无效?15 的语义是否「退出手机设置模式」? |
| 12 | 19 是否保证无回帧? 若偶发回帧,App 应忽略还是解析? |
| 13 | 15 与 19 之间 有无最小间隔要求? |
| 14 | 命令 8、18、20、23–25、29 在配网流程是否还需要? |
6.4 状态字节与成功判定
| # | 问题 |
|---|
| 15 | byte33=1 是否表示必须在「手机设置模式」才能写 11/12?byte33=0 时是否要先发 15 再 11? |
| 16 | byte31=1 是否表示已连上家庭路由器?配网成功是否必须等 byte31=1?大概需要多久? |
| 17 | byte32=1 与 MQTT 命令 21/22 的关系?是否 22 成功后很快变 1? |
| 18 | 配网成功的 官方判定:指示灯颜色?byte31?热点消失?是否需写进协议文档? |
6.5 字段长度、编码与回读
| # | 问题 |
|---|
| 19 | WiFi 名/密码 20 字节 为 UTF-8 字节数还是字符数?含中文 SSID 规则? |
| 20 | 命令 11 回读 是否应在 下一帧 的 offset 35–54 立刻变为新 SSID?最长延迟? |
| 21 | 若回读仍为旧 SSID(如 cyh1),是命令未生效、模式不对,还是回帧不是「命令响应帧」? |
| 22 | MQTT 服务器 50 字节、端口 6 字节 字符串是否含 \0、是否允许域名? |
6.6 MQTT 与用户/主题(命令 23–25、29)
| # | 问题 |
|---|
| 23 | 量产 MQTT Host/Port 是否固定?是否由云端/App 动态下发? |
| 24 | 23–25(用户/密码)、29(主题) 出厂是否已烧录?配网是否必须写入? |
| 25 | 当前 App 仅写 21/22,是否满足上线?不满足时的完整写入顺序? |
6.7 网络地址与热点命名
| # | 问题 |
|---|
| 26 | TCP IP 是否恒为 192.168.43.1?有无机型使用 192.168.4.1 等? |
| 27 | 网关 IP 与 TCP IP 是否总一致? |
| 28 | 热点 SSID MY_WIFI / ddd_102 对应固件版本或 SKU?未来是否统一? |
| 29 | 热点密码是否有 87654321 等第二套规则? |
6.8 异常与重试
| # | 问题 |
|---|
| 30 | 单条命令处理 最长时间 建议值?(App 现 90 s 超时) |
| 31 | CRC 错误帧是否应 丢弃并继续读?有无帧头魔数? |
| 32 | 同一命令连续发送 8 次 是否会对设备有副作用? |
| 33 | 配网失败后设备状态机如何复位?是否需断电/等待热点再次出现? |
七、现场问题记录(供硬件对照)
| 现象 | 可能原因(待硬件确认) |
|---|
| 第一次 App 配网失败,第二次成功 | iOS 本地网络权限首次授权;8888 占用;首包错位 |
回读 WiFi 名为乱码如 5,350 43.100,192 | TCP 流未按帧边界读(App 已改 CRC 对齐) |
回读一直为旧名 cyh1 | 未进设置模式、命令未生效、或读到推送帧而非命令响应 |
| TCP 工具能成、App 不能 | 手机未连热点、连了家庭 WiFi、或工具占连接 |
| 跳过 15 只发 11/12/19 无效 | 15 为必选项(已与工具验证一致) |
八、建议会议输出(Action Items)
- 给出《上电→热点→TCP 8888 就绪》时间表(最小/典型/最大,单位秒)。
- 确认配网命令全集与顺序:
11→12→21→22→15→19 是否为量产标准。
- 确认 19 无回帧、15 后是否断 TCP 的固件行为。
- 确认 byte33 / byte31 与配网流程关系,更新协议 PDF/Word。
- 确认 MQTT 出厂默认值 及是否还需 23–25、29。
- 确认单客户端、周期推帧 规则,便于 App 读包。
- 提供 1 份固件版本号 与 1 套标准抓包/HEX 示例(含成功全流程)。
九、代码与文档索引
| 文件 | 内容 |
|---|
lib/features/owner/home/plc_collector_protocol.dart | 协议、TCP、配网 runProvision |
lib/features/owner/home/owner_station_create_wizard_page.dart | 向导 UI、配网弹窗日志 |
docs/数据采集器与App通信流程.md | 简要流程(可与此文档交叉引用) |
十、开会可带的 Quick Checklist
文档结束。会后请把第六节结论回填或另附《协议变更记录》。