网络子系统
super_agent_bot edited this page 2026-11-02 07:55:38 +08:00

网络子系统

CH395F 10/100M 以太网 + 单连接 BSD Socket 抽象 + 四个 TCP 服务: FTP(21)、对时(8888)、远程显示(7003)、IEC 104(2404)。

细节见 docs/网络/BSD_Socket_API_使用指南.md、docs/网络/Net层阻塞模型架构设计.md、docs/子系统设计/网络配置说明.md、docs/子系统设计/IEC104上行设计说明.md。

1. 总体结构

BSD 网络栈分层

图: BSD Socket API 落在 CH395F 之上.

核心约束:

  • CH395F 配置为 8 Socket(索引寻址)+ TCP Server 单连接(set_fun_para(0x08), bit3 SOCKET_CLOSE; bit0 为保留位必须为 0)。
  • Socket 0 复用监听与数据通道: 监听 → CONNECT 后转数据通道 → DISCONNECT/TIMEOUT 后重开 LISTEN。
  • 四个 TCP 服务串行占用连接; 连接断开后自动回到 LISTEN。
  • 所有 CH395F 操作必须经 netMsgQueue 在 netTask 串行执行; 非 netTask 任务只调 net_* API, 不要直接碰 CH395F 驱动。

2. BSD Socket 抽象

Net 层阻塞模型

图: 挂起请求与完成语义.

net_socket 提供与 POSIX 类似的接口:

int fd = net_socket(...);
net_bind(fd, ...);
net_listen(fd, backlog);
int c = net_accept(fd, ...);
net_recv(c, buf, len, ...);
net_send(c, buf, len, ...);
net_close(fd);
  • net_select 提供 select/poll 风格的多路复用。
  • net_* 公开 API 的错误码通过任务通知值回传: net_msg_t 是按值拷入队列的, netTask 改的是自己那份副本, 调用方看不到; 所以错误码搭 xTaskNotify() 回来。
  • 不要给 net_msg_t 加“回传用”字段: 调用方只会读到栈垃圾。
  • EOF 语义: net 层在 EOF 时已 auto_relisten; 应用层不得在 EOF 时 net_close 该 fd(会把监听一起毁掉, 端口变成“连接被拒”)。仅当数据 fd ≠ 监听 fd(模拟器多连接后端)时才关。

3. 四个服务

3.1 FTP(TCP 21)

  • 实现: lftpd, root = FatFs 卷根 /, 端口 21, 单客户端。
  • 支持: 登录 / TYPE I / PASV / STOR / RETR / LIST / DELE / QUIT。
  • 鉴权(2026-10-11):
    • [ftp] 段 user / pwd_hash = SHA-256(user‖password) / write;
    • 未登录仅 USER/PASS/QUIT/FEAT/SYST/NOOP 放行, 其余一律 530;
    • write=0 可禁 STOR/DELE;
    • 连续 5 次失败锁 60 s;
    • 出厂默认 admin/admin, 默认口令在用有启动告警。
  • 启动门: ftpTask 必须等 NET_READY 且 STORAGE_READY(两位 NoClear)才 lftpd_start。
  • 单客户端注意: 同一时刻只服务 1 个会话, 旧会话异常断开后约 30 s 才恢复监听; 测试脚本必须内置重试, 不要用裸 TCP 工具探测 21 端口(探测会占掉唯一会话)。

FTP 是明文协议, 挡未授权访问、不挡网络嗅探; 现场请改默认口令并限制网络边界。

3.2 墙钟对时(TCP 8888)

  • timeSyncTask 等 NET_READY → TCP listen :8888 → 接收 PC 推送时间 → 写 RTC。
  • 30 s 无包则掉线重建监听(约 4 s)。
  • 主机侧脚本: test/host/time_sync_server.py。
  • 报文格式见 App/sync/time_sync.c; 当前文档只记录行为, 未单独固化帧格式。

3.3 远程显示(TCP 7003)

  • ui_net_sink 在 7003 推流 160x160、1bpp 画面(3200 B/帧), 同时接收远端按键。
  • 协议名 RemoDispBus: [TAG][CMD][LEN_H][LEN_LO][DATA][CRC]; TAG 0xAA 客户端→服务端, 0xBB 服务端→客户端; CRC 为数据段逐字节异或; 多字节大端。
  • 命令: KEEPLIVE(0) / INIT(1) / KEY(2) / LCDMEM(3)。
  • 按键码: UP 0x02 / DOWN 0x40 / LEFT 0x10 / RIGHT 0x08 / ENTER 0x20 / ESC 0x01。
  • 详见UI子系统与 docs/UI设计/RemoDispBus协议与接收设计说明.md。

3.4 IEC 60870-5-104(TCP 2404)

  • 被控站; V0.1 有效子集点表; 遥测短浮点, 采集上传系数 = 1。
  • 支持总召、COV、遥控两段式、定值读写; 链路参数 k/w/t1~t3 按设计。
  • iec104Task 先等 NET_READY(100 ms 分片 + 每片喂狗)再建监听, 100 ms 循环服务; 纳入 IWDG。
  • 保护定值落盘请求由 iec104Task 置 SYS_EVT_PROT_SET_SAVE, defaultTask 消费。

详见 docs/子系统设计/IEC104上行设计说明.md 与采集与算法。

4. 网络配置

4.1 默认值

项 默认值
IP 192.168.1.100
掩码 255.255.255.0
网关 192.168.1.1
MAC 全零 = 使用 CH395F 芯片内置 MAC

4.2 修改方式

  1. UI: 通讯参数 → 网口设置; 保存后请求 SYS_EVT_CFG_SAVE, defaultTask 写盘, 再置 SYS_EVT_NET_RECONFIG 让 netTask 重建网络。
  2. FTP: 下载 /config.ini, 修改 [network] 段后上传; defaultTask 每 2 s f_stat 检测, 连续 2 次稳定后重载; 网络段变化在 2~5 s 内生效(含等链路 ≤3 s)。
  3. 恢复出厂: FTP DELE /config.ini → 下次上电重新生成模板。

旧档 /cfg/netcfg.bin 已不再读取; 存在则忽略(不读、不删、不迁移)。

4.3 网络重建

  • netTask 消费 SYS_EVT_NET_RECONFIG → 按网络代次号重建监听;
  • 服务通过代次号自愈, 不需要重启设备;
  • 重建期间连接会短暂断开, 客户端需重连。

5. 调试与验证

  • ping: 设备 IP 应通; 串口应出现 Network Init / net init: OK / PHY: 100M FULL。
  • FTP: 用 test/host/ftp_test.py / ftp_up_dl_test.py / ftp_speed_test.py; 不要用裸 TCP 探测 21。
  • 对时: 运行 test/host/time_sync_server.py, 观察设备日志时间戳。
  • 远程显示: 用 DTU-RemoteLCD 或任意 TCP 客户端连 7003, 应按 RemoDispBus 收帧。
  • 104: 用任意 104 主站连 2404, STARTDT + 总召应往返。
  • 链路时延: test/host/latency_peer.py 与 docs/测试说明/链路延迟测试说明.md。

6. 常见问题

现象 原因/处理
FTP 连不上 21 被裸 TCP 探测占用; 旧会话未断, 等约 30 s; 网络未就绪
连接被拒 应用层在 EOF 时误 net_close 了监听 fd; 检查 EOF 处理
改了 IP 不生效 /config.ini 格式/大小是否正确; 是否等够 2~5 s; 网络段是否真的变化
104 连不上 NET_READY 是否置位; 单连接是否被 FTP/对时/远程显示占用
网络重建后服务不恢复 检查服务是否使用 net_get_generation() 做自愈

7. 延伸阅读

主题 文档
BSD Socket API 使用指南 docs/网络/BSD_Socket_API_使用指南.md
内部调用关系 docs/网络/BSD_Socket_API_函数调用关系.md
Net 层阻塞模型 docs/网络/Net层阻塞模型架构设计.md
网络配置/FTP 鉴权 docs/子系统设计/网络配置说明.md
CH395F 陷阱台账 docs/问题记录/CH395F_Trap_Records.md
FTP 测试指南 docs/测试说明/FTP_Test_Guide.md
链路时延 docs/测试说明/链路延迟测试说明.md