网络子系统
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 Socket API 落在 CH395F 之上.
核心约束:
- CH395F 配置为 8 Socket(索引寻址)+ TCP Server 单连接(
set_fun_para(0x08), bit3SOCKET_CLOSE; bit0 为保留位必须为 0)。 - Socket 0 复用监听与数据通道: 监听 → CONNECT 后转数据通道 → DISCONNECT/TIMEOUT 后重开 LISTEN。
- 四个 TCP 服务串行占用连接; 连接断开后自动回到 LISTEN。
- 所有 CH395F 操作必须经
netMsgQueue在netTask串行执行; 非netTask任务只调net_*API, 不要直接碰 CH395F 驱动。
2. BSD Socket 抽象
图: 挂起请求与完成语义.
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]; TAG0xAA客户端→服务端,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 修改方式
- UI: 通讯参数 → 网口设置; 保存后请求
SYS_EVT_CFG_SAVE,defaultTask写盘, 再置SYS_EVT_NET_RECONFIG让netTask重建网络。 - FTP: 下载
/config.ini, 修改[network]段后上传;defaultTask每 2 sf_stat检测, 连续 2 次稳定后重载; 网络段变化在 2~5 s 内生效(含等链路 ≤3 s)。 - 恢复出厂: 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 |
STM32F4-Base 百科
入门
子系统
开发与验证
参考
仓库
STM32F4-Base 百科 · 基于仓库 master 分支整理 · 最后更新: 2026-11-01
内容以源码、AGENTS.md 与 docs/ 为准; 发现页面过期, 请在 维护指南 中按流程更新。