RTU_ALL_AI/PLAN.md

411 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RTU_ALL_AI 项目 — 纯 C AI 开发工作计划
> 版本: v1.1
> 日期: 2026-07-07
> 远程仓库: http://127.0.0.1:3000/admin/RTU_ALL_AI.git
> 分支策略: master主分支所有开发在 master 上直接进行)
---
## 一、项目定位
RTU_ALL_AI 是一个**纯 C 编写的嵌入式通讯装置示例工程**100% 由 AI 编写。项目采用与 RTU 一致的模块化架构,使用 Linux 内核侵入式链表(`list.h`)作为核心数据结构。工程既是 AI 编程能力的验证,也是后续 RTU 实际模块开发的参考模板。
---
## 二、项目架构(对齐 RTU 结构)
```
RTU_ALL_AI/
├── .gitignore
├── README.md
├── src/
│ ├── public/ # 公共基础库(对齐 RTU 全部 11 个模块)
│ │ ├── liblist/ # [P0★] Linux 内核侵入式链表纯C纯头文件
│ │ │ └── inc/list.h
│ │ ├── libfunc/ # [P0★] 基础工具函数CRC、校验、文件操作
│ │ │ ├── inc/myFunc.h
│ │ │ └── src/myFunc.c
│ │ ├── liblog/ # [P0★] 日志系统(控制台+文件,异步队列)
│ │ │ ├── inc/myLog.h
│ │ │ └── src/myLog.c
│ │ ├── libtask/ # [P1★] 任务调度(定时器、事件循环)
│ │ │ ├── inc/myTask.h
│ │ │ └── src/myTask.c
│ │ ├── libdatacenter/ # [P1★] 数据中心(信号点 CRUD侵入式链表
│ │ │ ├── inc/myDatacenter.h
│ │ │ └── src/myDatacenter.c
│ │ ├── libcJSON/ # [P1★] JSON 解析纯CcJSON 裁剪版)
│ │ │ ├── inc/cJSON.h
│ │ │ └── src/cJSON.c
│ │ ├── libxml/ # [P2★] XML 解析纯Ctinyxml2 裁剪版)
│ │ │ ├── inc/tinyxml2.h
│ │ │ └── src/tinyxml2.c
│ │ ├── libmd5/ # [P1★] MD5 摘要算法
│ │ │ ├── inc/myMd5.h
│ │ │ └── src/myMd5.c
│ │ ├── libmy_xxhash/ # [P1★] xxHash 快速哈希纯C
│ │ │ ├── inc/xxhash.h
│ │ │ └── src/xxhash.c
│ │ ├── libcomm/ # [P2★] 通讯抽象层(串口/TCP 统一接口)
│ │ │ ├── inc/myComm.h
│ │ │ └── src/myComm.c
│ │ ├── libcmd/ # [P2★] 命令处理框架(注册/分发/回传)
│ │ │ ├── inc/myCmd.h
│ │ │ └── src/myCmd.c
│ │ └── libmy_mosquitto/ # [P3○] MQTT 客户端mosquitto C 封装)
│ │ ├── inc/myMosquitto.h
│ │ └── src/myMosquitto.c
│ ├── protocol/ # 协议实现层(对齐 RTU 全部 6 个模块)
│ │ ├── libmodbus/ # [P1★] Modbus RTU/TCP 从站协议栈
│ │ │ ├── inc/myModbus.h
│ │ │ └── src/myModbus.c
│ │ ├── lib60870/ # [P2★] IEC 60870-5-101/103/104 协议栈
│ │ │ ├── inc/lib60870_common.h
│ │ │ ├── inc/lib60870_public.h
│ │ │ ├── inc/gb101.h / gb103.h / gb104.h
│ │ │ └── src/*.c
│ │ ├── libicp67/ # [P2○] ICP67 专有协议
│ │ │ ├── inc/icp67.h
│ │ │ └── src/icp67.c
│ │ ├── libmms_m/ # [P3○] IEC 61850 MMS 主站(客户端)
│ │ │ ├── inc/myMms_m.h
│ │ │ └── src/myMms_m.c
│ │ ├── libmms_s/ # [P3○] IEC 61850 MMS 从站(服务端)
│ │ │ ├── inc/myMms_s.h
│ │ │ └── src/myMms_s.c
│ │ └── libmongoose/ # [P3○] 嵌入式 HTTP/WebSocket 服务
│ │ ├── inc/mongoose.h
│ │ └── src/mongoose.c
│ ├── system/ # 系统管理层(对齐 RTU 全部 9 个模块)
│ │ ├── RTU/ # [P2★] 主程序入口(初始化、主循环)
│ │ │ ├── inc/app_sys.h
│ │ │ ├── inc/app_cmd.h
│ │ │ └── src/main.c
│ │ ├── libiec/ # [P2★] IEC 规约点表定义与解析
│ │ │ ├── inc/iec.h
│ │ │ ├── inc/iec_point.h
│ │ │ ├── inc/iec_method.h
│ │ │ └── src/iec_cfg_parse.c
│ │ ├── libcom_decode/ # [P2★] 通讯通道解码与分发
│ │ │ ├── inc/com_decode.h
│ │ │ ├── inc/com_channel_def.h
│ │ │ └── src/com_decode.c
│ │ ├── libmodbus_m/ # [P2★] Modbus 主站管理(轮询/采集)
│ │ │ ├── inc/modbus_m.h
│ │ │ └── src/modbus_m.c
│ │ ├── libiec61850m/ # [P3○] IEC 61850 MMS 主站管理
│ │ │ ├── inc/iec61850m.h
│ │ │ ├── inc/parse_xml.h
│ │ │ └── src/iec61850m.c
│ │ ├── libiec61850s/ # [P3○] IEC 61850 MMS 从站管理
│ │ │ ├── inc/iec61850s.h
│ │ │ ├── inc/parse_xml.h
│ │ │ └── src/iec61850s.c
│ │ ├── libplc/ # [P3○] PLC 逻辑引擎
│ │ │ ├── inc/plc.h
│ │ │ └── src/plc.c
│ │ ├── libself_ptl/ # [P3○] 内部自定义协议
│ │ │ ├── inc/self_ptl.h
│ │ │ ├── inc/method.h
│ │ │ └── src/self_ptl.c
│ │ └── libweb_server/ # [P2★] Web 管理服务REST + WebSocket
│ │ ├── inc/web_server.h
│ │ ├── inc/ws_method.h
│ │ └── src/web_server.c
│ └── test/ # 单元测试(每个模块一个 test_xxx.c
│ ├── test_list.c # [P0★] 链表操作全量测试
│ ├── test_log.c # [P0★] 日志队列测试
│ ├── test_datacenter.c # [P1★] 数据中心 CRUD 测试
│ ├── test_cjson.c # [P1★] JSON 解析测试
│ ├── test_modbus.c # [P1★] Modbus 协议测试
│ └── test_60870.c # [P2★] IEC104 协议测试
└── release/ # 构建系统(与 RTU 结构完全一致)
├── build.sh # 编译脚本x86 / arm 一键切换)
├── linux.mk # 公共编译选项CROSS_COMPILE、路径
├── makefile # 顶层 Makefile递归 src/
├── pack_web.sh # Web 资源打包脚本P3 阶段)
├── inc/ # 对外暴露的公共头文件
└── src/ # 每个模块的 makefile
├── makefile # 第二层(递归 public/protocol/system
├── public/
│ ├── makefile # 第三层
│ ├── liblist/makefile
│ ├── libfunc/makefile
│ ├── liblog/makefile
│ ├── libtask/makefile
│ ├── libdatacenter/makefile
│ ├── libcJSON/makefile
│ ├── libxml/makefile
│ ├── libmd5/makefile
│ ├── libmy_xxhash/makefile
│ ├── libcomm/makefile
│ ├── libcmd/makefile
│ └── libmy_mosquitto/makefile
├── protocol/
│ ├── makefile
│ ├── libmodbus/makefile
│ ├── lib60870/makefile
│ ├── libicp67/makefile
│ ├── libmms_m/makefile
│ ├── libmms_s/makefile
│ └── libmongoose/makefile
└── system/
├── makefile
├── RTU/makefile
├── libiec/makefile
├── libcom_decode/makefile
├── libmodbus_m/makefile
├── libiec61850m/makefile
├── libiec61850s/makefile
├── libplc/makefile
├── libself_ptl/makefile
└── libweb_server/makefile
```
> **图例**: [P0★] 本期实现 | [P2★] 本期实现 | [P3○] 后续扩展(预留目录+stub
---
## 三、代码规范(严格对齐 RTU 风格)
### 3.1 命名规范
| 类型 | 规范 | 示例 |
|------|------|------|
| 文件名 | 驼峰/下划线混合 | `myFunc.c`, `myLog.h`, `app_sys.h` |
| 函数名 | 小写+下划线 | `func_cal_crc16()`, `dc_signal_set()` |
| 结构体 | 小写+`_t` 后缀 | `log_message_t`, `dc_signal_t` |
| 宏/常量 | 全大写+下划线 | `LOG_LEVEL_INFO`, `SHORT_STR_LEN` |
| 全局变量 | `g_` 前缀 | `g_log_path`, `g_tableCRC16` |
| 静态函数 | `LOCAL` 宏修饰 | `LOCAL void helper_func()` |
### 3.2 头文件规范
```c
#ifndef _MY_MODULE_H_ // 全大写+下划线
#define _MY_MODULE_H_
#include <stdint.h> // 系统头文件在前
#ifdef __cplusplus
extern "C" { // 兼容 C++ 调用
#endif
// 宏定义
// 结构体
// 函数声明
#ifdef __cplusplus
}
#endif
#endif // _MY_MODULE_H_
```
### 3.3 注释规范
- 函数头部:`/** 功能简述 */` 或 `// 功能描述`
- 复杂逻辑:行间注释 `// 步骤1: xxx`
- 段落分隔:`/******...******/` 分隔不同功能区域
### 3.4 编码规范
- 缩进Tab4 空格宽度)
- 所有函数入口参数必须校验NULL、越界检查
- 函数行数控制在 80 行以内
- 复杂逻辑拆分为独立静态函数
- 错误路径必须打 LOG_E
---
## 四、模块优先级说明
| 标记 | 含义 |
|------|------|
| ⭐ P0 | 基础模块,无外部依赖,最先实现 |
| ⭐ P1 | 核心模块,依赖 P0 模块,第二批次 |
| ⭐ P2 | 业务模块,依赖 P0/P1第三批次 |
| ○ P3 | 预留模块,仅创建目录+stub后续扩展 |
---
## 五、分阶段开发计划
### 阶段 0基础设施搭建预计 1-2 天)
| 序号 | 任务 | 模块 | 产出 | 状态 |
|------|------|------|------|------|
| 0.1 | 搭建构建系统 | — | `release/linux.mk`, `release/makefile`, `release/build.sh` | ⬜ |
| 0.2 | 创建 `myBase.h` 基础定义 | — | `release/inc/myBase.h`(宏、类型、大小端转换) | ⬜ |
| 0.3 | 实现侵入式链表 | `liblist` | `src/public/liblist/inc/list.h` | ⬜ |
| 0.4 | 实现日志系统 | `liblog` | `src/public/liblog/inc/myLog.h`, `src/myLog.c` | ⬜ |
| 0.5 | 实现基础工具函数 | `libfunc` | `src/public/libfunc/inc/myFunc.h`, `src/myFunc.c` | ⬜ |
| 0.6 | 创建全部预留模块的目录+stub | 所有 P3 | 26 个模块的 `inc/` + stub `src/` 骨架 | ⬜ |
| 0.7 | 链表 + 日志单元测试 | — | `src/test/test_list.c`, `test_log.c` | ⬜ |
| 0.8 | **编译验证 + 代码审查** | — | 全量编译通过、测试通过 | ⬜ |
### 阶段 1数据基础设施预计 2-3 天)
| 序号 | 任务 | 模块 | 产出 | 状态 |
|------|------|------|------|------|
| 1.1 | 实现 MD5 摘要算法 | `libmd5` | `src/public/libmd5/` | ⬜ |
| 1.2 | 实现 xxHash 快速哈希 | `libmy_xxhash` | `src/public/libmy_xxhash/` | ⬜ |
| 1.3 | 实现 cJSON 解析 | `libcJSON` | `src/public/libcJSON/`(从 RTU 裁剪) | ⬜ |
| 1.4 | 设计信号数据模型 | — | `dc_signal_t` 等结构体设计文档 | ⬜ |
| 1.5 | 实现数据中心 | `libdatacenter` | CRUD 接口,侵入式链表管理信号点 | ⬜ |
| 1.6 | 实现任务调度 | `libtask` | 任务注册、定时触发、事件驱动 | ⬜ |
| 1.7 | 编写单元测试 | — | `test_cjson.c`, `test_datacenter.c` | ⬜ |
| 1.8 | **编译验证 + 代码审查** | — | 全量编译通过、测试通过 | ⬜ |
### 阶段 2通讯与协议预计 3-4 天)
| 序号 | 任务 | 模块 | 产出 | 状态 |
|------|------|------|------|------|
| 2.1 | 实现通讯抽象层 | `libcomm` | 串口/TCP 统一接口(打开/发送/接收/关闭) | ⬜ |
| 2.2 | 实现命令处理框架 | `libcmd` | 命令注册、分发、回调执行 | ⬜ |
| 2.3 | 实现 XML 解析 | `libxml` | `src/public/libxml/`tinyxml2 裁剪版) | ⬜ |
| 2.4 | 实现 Modbus 协议栈 | `libmodbus` | RTU/TCP 从站,线圈/寄存器读写 | ⬜ |
| 2.5 | 实现 IEC 60870-5-104 | `lib60870` | 总召、遥测、遥信、遥控、对时 | ⬜ |
| 2.6 | 实现 IEC 点表解析 | `libiec` | `src/system/libiec/`iec_cfg_parse | ⬜ |
| 2.7 | 实现 Modbus 主站管理 | `libmodbus_m` | 轮询、采集、数据分发 | ⬜ |
| 2.8 | 编写单元测试 | — | `test_modbus.c`, `test_60870.c` | ⬜ |
| 2.9 | **编译验证 + 代码审查** | — | 全量编译通过、测试通过 | ⬜ |
### 阶段 3系统集成预计 2-3 天)
| 序号 | 任务 | 模块 | 产出 | 状态 |
|------|------|------|------|------|
| 3.1 | 实现通讯通道解码 | `libcom_decode` | 多通道帧解析、分发到各协议栈 | ⬜ |
| 3.2 | 实现 Web 管理服务 | `libweb_server` | REST API + WebSocket 实时推送 | ⬜ |
| 3.3 | 实现主程序入口 | `RTU` | 模块初始化、主循环、信号处理 | ⬜ |
| 3.4 | 端到端集成测试 | — | 多模块联调、协议互通验证 | ⬜ |
| 3.5 | **编译验证 + 代码审查** | — | x86 本地 + ARM 交叉编译全通过 | ⬜ |
| 3.6 | 编写 README 文档 | — | 项目说明、编译指南、模块架构图 | ⬜ |
### 阶段 4后续扩展预留模块实现
| 序号 | 任务 | 模块 | 优先级 | 状态 |
|------|------|------|------|------|
| 4.1 | ICP67 专有协议 | `libicp67` | P3 ○ | ⬜ |
| 4.2 | IEC 61850 MMS 主站 | `libmms_m` + `libiec61850m` | P3 ○ | ⬜ |
| 4.3 | IEC 61850 MMS 从站 | `libmms_s` + `libiec61850s` | P3 ○ | ⬜ |
| 4.4 | 嵌入式 HTTP 服务 | `libmongoose` | P3 ○ | ⬜ |
| 4.5 | MQTT 客户端 | `libmy_mosquitto` | P3 ○ | ⬜ |
| 4.6 | PLC 逻辑引擎 | `libplc` | P3 ○ | ⬜ |
| 4.7 | 内部自定义协议 | `libself_ptl` | P3 ○ | ⬜ |
---
## 五、AI 开发工作流
```
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 1. 制定 │───▶│ 2. AI │───▶│ 3. 编译 │───▶│ 4. 代码 │
│ 计划 │ │ 编码 │ │ 验证 │ │ 审查 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
▲ │
└───────────────────────────────────────────────┘
5. 修复 + 迭代
```
### 工作流规则
1. **计划先行**每个模块编写前先输出设计计划数据结构、API、依赖关系经审查后再编码
2. **增量迭代**:每个函数编写后立即编译,消除编译错误再继续
3. **测试驱动**:先写单元测试框架,再实现功能代码
4. **审查门禁**:每个模块完成后必须进行代码审查(检查风格、注释、边界处理)
5. **单文件提交**:每个模块或逻辑单元完成后单独 git commitcommit message 使用中文描述
---
## 六、Git 推送规则(对齐 RTU
- **分支**: 所有开发在 `master` 分支
- **Commit 格式**: `[模块名] 功能描述`
- 例: `[liblist] 实现 Linux 内核侵入式双向链表`
- 例: `[libdatacenter] 添加信号点 CRUD 接口`
- **推送频率**: 每个模块完成后推送一次
- **远程**: `origin``http://admin:admin123@127.0.0.1:3000/admin/RTU_ALL_AI.git`
---
## 七、关键技术点
### 7.1 Linux 内核侵入式链表list.h
- 使用标准的 `struct list_head` 双向循环链表(`/usr/include/linux/list.h` 精简版)
- 实现 `list_add`, `list_add_tail`, `list_del`, `list_del_init`, `list_for_each_entry` 等宏
- 实现 `list_empty`, `list_entry`, `list_first_entry` 辅助宏
- 所有模块的数据结构使用侵入式链表管理
### 7.2 编译系统
- 支持 `x86`(本地调试)和 `arm`RK3568 交叉编译)两种模式
- 每个模块编译为 `.a` 静态库,顶层递归构建
- `build.sh x86``build.sh arm` 一键编译
- 公共头文件统一复制到 `release/inc/`
### 7.3 日志系统
- 支持控制台 + 文件双输出,异步日志队列(侵入式链表实现)
- 级别INFO / ERROR`LOG_I` / `LOG_E`
- 文件日志支持按大小轮转(`LOG_FILE_MAX_SIZE` / `LOG_FILE_MAX_COUNT`
### 7.4 基础公共库public/
| 模块 | 来源 | 核心功能 |
|------|------|------|
| `liblist` | Linux 内核 | 侵入式双向循环链表,纯头文件 |
| `libfunc` | 自研 | CRC16/32、校验和、文件操作、环境变量、字节序 |
| `liblog` | 自研 | 异步日志(控制台+文件)、按大小轮转 |
| `libtask` | 自研 | 任务注册/调度、定时器、线程池 |
| `libdatacenter` | 自研 | 信号点 CRUD、侵入式链表索引、xxHash 查找 |
| `libcJSON` | cJSON 裁剪 | JSON 解析/生成,纯 C无动态内存溢出风险 |
| `libxml` | tinyxml2 裁剪 | XML 解析(用于 IEC 61850 SCL 文件) |
| `libmd5` | RFC 1321 | MD5 摘要,用于文件校验和协议认证 |
| `libmy_xxhash` | xxHash | 极速哈希,用于数据中心信号点快速查找 |
| `libcomm` | 自研 | 串口/TCP 统一抽象open/send/recv/close |
| `libcmd` | 自研 | 命令注册表、分发执行、异步回调 |
| `libmy_mosquitto` | mosquitto 封装 | MQTT 客户端,发布/订阅(预留 P3 |
### 7.5 协议层protocol/
| 模块 | 来源 | 核心功能 |
|------|------|------|
| `libmodbus` | libmodbus 裁剪 | Modbus RTU/TCP 从站01/03/05/06/15/16 功能码 |
| `lib60870` | lib60870 裁剪 | IEC 101/103/104 从站,总召/对时/遥控 |
| `libicp67` | 自研 | ICP67 专有协议(预留 P3 |
| `libmms_m` | libiec61850 封装 | MMS 客户端(预留 P3 |
| `libmms_s` | libiec61850 封装 | MMS 服务端(预留 P3 |
| `libmongoose` | mongoose | 嵌入式 HTTP/WebSocket预留 P3 |
### 7.6 系统管理层system/
| 模块 | 来源 | 核心功能 |
|------|------|------|
| `RTU` | 自研 | 主入口:模块初始化、主循环、信号周期处理 |
| `libiec` | 自研 | IEC 规约点表定义、解析、映射到数据中心 |
| `libcom_decode` | 自研 | 通讯通道帧解析、协议识别、分发 |
| `libmodbus_m` | 自研 | Modbus 主站:轮询队列、采集调度 |
| `libiec61850m` | 自研 | 61850 主站管理(预留 P3 |
| `libiec61850s` | 自研 | 61850 从站管理(预留 P3 |
| `libplc` | 自研 | PLC 逻辑引擎(预留 P3 |
| `libself_ptl` | 自研 | 内部自定义协议(预留 P3 |
| `libweb_server` | 自研 | REST API + WebSocket嵌入式 Web 管理 |
---
## 八、风险与对策
| 风险 | 对策 |
|------|------|
| AI 编码风格不一致 | 严格对照 RTU 已有代码(`myFunc.c`, `myLog.c` 等),代码审查时逐项检查 |
| 侵入式链表使用不当 | 先写完整单元测试,覆盖增删改查、空链表、边界条件 |
| 编译环境差异 | 优先保证 x86 本地编译通过ARM 交叉编译作为验证步骤 |
| 模块间耦合过重 | 每个模块独立编译为 .a依赖通过 `release/inc/` 头文件接口明确 |
| cJSON/tinyxml2 安全漏洞 | 裁剪版本,移除不受信输入路径;单元测试覆盖畸形输入 |
| P3 预留模块过度设计 | P3 模块仅创建目录 + 返回 0 的 stub 函数,不实现业务逻辑 |
---
## 九、审查清单
- [ ] 模块列表是否覆盖了 RTU 的全部 26 个模块?
- [ ] 模块优先级P0/P1/P2/P3排序是否合理
- [ ] 代码规范是否严格对齐 RTU 风格?
- [ ] 构建系统方案是否可行(递归 makefile + x86/arm 切换)?
- [ ] 侵入式链表的实现粒度(宏列表)是否合适?
- [ ] JSON/XML/MD5/xxHash 裁剪方案是否可行?
- [ ] P3 预留模块的 stub 策略是否合适?
- [ ] 是否需要调整模块范围(增/删/改优先级)?