PLC光伏板ios的TCP断链

0 阅读10分钟

数据采集器(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
IP192.168.43.1(优先)ddd_102 等热点时,App 也会尝试 手机 Wi‑Fi 网关
端口8888
热点 SSIDMY_WIFI / ddd_102(App 均识别)文档曾写 MY_WIFI,现场刷机后为 ddd_102
热点密码默认 1234567887654321 等需确认是否量产一致)
单连接调试工具与 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–34PLC ID(大端)
4–2926PLC 标号 ASCII,\0 结束
311是否已连路由器:0/1
321是否已连 MQTT:0/1
3310=正常 / 1=手机设置模式
35–5420路由器 WiFi 名称
55–7420路由器 WiFi 密码
76–12550MQTT 服务器
126–1316MQTT 端口(字符串)
用户/密码/主题等见代码 plcParseStatusFrame

3.2 命令帧(App → PLC,55 字节)

  • 固定 55 字节 + CRC16(末 2 字节,高位在前)。
  • 发送后在帧后追加 0x0D(回车)
  • 命令号在 第 2 字节buf[1]);字符串 payload 一般从 第 4 字节buf[3])起。

四、配网命令顺序(App 与 TCP 工具一致)

原则

  1. TCP 连接后 不单独读「首帧」;发每条命令前 清空接收缓冲,发令后 等一包回帧(按 CRC 对齐读 350 字节)。
  2. 11 / 12 / 21 / 22:回读字段必须与下发一致,否则 重发同一命令(最多 8 次),不进入下一步
  3. 15:收到回帧后 立刻发 19
  4. 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
15WiFi 设置选项取反(退出手机设置)✅ 是收到 CRC 正确的一帧即可
19WiFi 模块重启(buf[2]=0❌ 否发出成功即可

4.2 当前 App 使用的 MQTT 默认值(调试用)

命令
2147.111.189.184
221883

量产是否固定为该地址、是否由云端下发,需产品/硬件确认(见第六节)。

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?
4SoftAP 窗口 文档写「上电约 10 分钟内」是否仍准确?超时后是否只能串口/其他方式配网?
5TCP 拒绝连接(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 的语义是否「退出手机设置模式」?
1219 是否保证无回帧? 若偶发回帧,App 应忽略还是解析?
1315 与 19 之间 有无最小间隔要求?
14命令 8、18、20、23–25、29 在配网流程是否还需要?

6.4 状态字节与成功判定

#问题
15byte33=1 是否表示必须在「手机设置模式」才能写 11/12?byte33=0 时是否要先发 15 再 11?
16byte31=1 是否表示已连上家庭路由器?配网成功是否必须等 byte31=1?大概需要多久?
17byte32=1 与 MQTT 命令 21/22 的关系?是否 22 成功后很快变 1?
18配网成功的 官方判定:指示灯颜色?byte31?热点消失?是否需写进协议文档?

6.5 字段长度、编码与回读

#问题
19WiFi 名/密码 20 字节 为 UTF-8 字节数还是字符数?含中文 SSID 规则?
20命令 11 回读 是否应在 下一帧 的 offset 35–54 立刻变为新 SSID?最长延迟?
21若回读仍为旧 SSID(如 cyh1),是命令未生效、模式不对,还是回帧不是「命令响应帧」?
22MQTT 服务器 50 字节、端口 6 字节 字符串是否含 \0、是否允许域名?

6.6 MQTT 与用户/主题(命令 23–25、29)

#问题
23量产 MQTT Host/Port 是否固定?是否由云端/App 动态下发?
2423–25(用户/密码)29(主题) 出厂是否已烧录?配网是否必须写入?
25当前 App 仅写 21/22,是否满足上线?不满足时的完整写入顺序?

6.7 网络地址与热点命名

#问题
26TCP 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 超时)
31CRC 错误帧是否应 丢弃并继续读?有无帧头魔数?
32同一命令连续发送 8 次 是否会对设备有副作用?
33配网失败后设备状态机如何复位?是否需断电/等待热点再次出现?

七、现场问题记录(供硬件对照)

现象可能原因(待硬件确认)
第一次 App 配网失败,第二次成功iOS 本地网络权限首次授权;8888 占用;首包错位
回读 WiFi 名为乱码如 5,350 43.100,192TCP 流未按帧边界读(App 已改 CRC 对齐)
回读一直为旧名 cyh1未进设置模式、命令未生效、或读到推送帧而非命令响应
TCP 工具能成、App 不能手机未连热点、连了家庭 WiFi、或工具占连接
跳过 15 只发 11/12/19 无效15 为必选项(已与工具验证一致)

八、建议会议输出(Action Items)

  1. 给出《上电→热点→TCP 8888 就绪》时间表(最小/典型/最大,单位秒)。
  2. 确认配网命令全集与顺序11→12→21→22→15→19 是否为量产标准。
  3. 确认 19 无回帧、15 后是否断 TCP 的固件行为。
  4. 确认 byte33 / byte31 与配网流程关系,更新协议 PDF/Word。
  5. 确认 MQTT 出厂默认值 及是否还需 23–25、29。
  6. 确认单客户端、周期推帧 规则,便于 App 读包。
  7. 提供 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

  • 上电后 ___ 秒 热点可见
  • 热点后 ___ 秒 TCP 8888 可连
  • 标准命令序:11 → 12 → ___ → ___ → 15 → 19
  • 19 是否有回帧:是 / 否
  • 15 是否必发:是 / 否
  • byte33 配网前要求:0 / 1 / 不限
  • 成功判定:灯 / byte31 / 热点消失
  • MQTT 出厂:47.111.189.184:1883 / 其他___
  • 是否仅 1 路 TCP
  • 固件版本:________

文档结束。会后请把第六节结论回填或另附《协议变更记录》。