RTU_ALL_AI/PLAN.md

22 KiB
Raw Blame History

RTU_ALL_AI 项目 — AI 开发工作计划

版本: v2.0
日期: 2026-07-07
远程仓库: http://127.0.0.1:3000/admin/RTU_ALL_AI.git
分支策略: master主分支所有开发在 master 上直接进行)


一、项目定位

RTU_ALL_AI 是一个C/C++ 混合编程的嵌入式通讯装置工程100% 由 AI 编写。项目采用与 RTU 一致的模块化架构。

编程语言策略

  • 对外接口强制 C 接口:所有 .h 头文件使用 extern "C" 包裹,兼容 C/C++ 调用者
  • 内部实现灵活选择:核心逻辑优先用 C如链表、协议栈、日志允许使用 C++ 容器简化复杂业务(如 XML 解析保留 tinyxml2 的 C++ 实现),但代码风格需保持 C 开发者可读
  • 不硬性纯 C:以功能实现为目的,安全稳定为前提

工程既是 AI 编程能力的验证,也是后续 RTU 实际模块开发的参考模板。


二、项目架构(对齐 RTU 结构)

RTU_ALL_AI/
├── .gitignore
├── README.md
├── CHANGELOG.md                    # 开发问题解决记录(每个模块遇到的问题 + 解决方案)
├── COMPLETION.md                   # 各模块开发完成事项清单
├── src/
│   ├── public/                        # 公共基础库12 个模块)
│   │   ├── liblist/                   # [P0★] 侵入式链表纯C头文件
│   │   │   └── inc/list.h
│   │   ├── libfunc/                   # [P0★] 基础工具纯CCRC、校验、文件操作
│   │   │   ├── inc/myFunc.h
│   │   │   └── src/myFunc.c
│   │   ├── liblog/                    # [P0★] 日志系统纯C异步队列控制台+文件)
│   │   │   ├── inc/myLog.h
│   │   │   └── src/myLog.c
│   │   ├── libtask/                   # [P1★] 任务调度C接口 + C++内部线程/chrono
│   │   │   ├── inc/myTask.h
│   │   │   └── src/myTask.cpp
│   │   ├── libdatacenter/             # [P1★] 数据中心C接口 + C++内部容器)
│   │   │   ├── inc/myDatacenter.h
│   │   │   └── src/myDatacenter.cpp
│   │   ├── libcJSON/                  # [P1★] JSON 解析纯CcJSON 裁剪版)
│   │   │   ├── inc/cJSON.h
│   │   │   └── src/cJSON.c
│   │   ├── libxml/                    # [P2★] XML 解析C接口 + tinyxml2 C++内部)
│   │   │   ├── inc/myXml.h            # <- C 接口封装头文件
│   │   │   └── src/myXml.cpp          # <- C++ 内部实现
│   │   ├── libmd5/                    # [P1★] MD5 摘要纯C
│   │   │   ├── inc/myMd5.h
│   │   │   └── src/myMd5.c
│   │   ├── libmy_xxhash/              # [P1★] xxHash 快速哈希纯C
│   │   │   ├── inc/xxhash.h
│   │   │   └── src/xxhash.c
│   │   ├── libcomm/                   # [P2★] 通讯抽象层C接口 + C++内部)
│   │   │   ├── inc/myComm.h
│   │   │   └── src/myComm.cpp
│   │   ├── libcmd/                    # [P2★] 命令处理C接口 + C++内部map/queue
│   │   │   ├── inc/myCmd.h
│   │   │   └── src/myCmd.cpp
│   │   └── libmy_mosquitto/           # [P3○] MQTT 客户端C接口预留
│   │       ├── inc/myMosquitto.h
│   │       └── src/myMosquitto.cpp
│   ├── protocol/                      # 协议实现层6 个模块)
│   │   ├── libmodbus/                 # [P1★] Modbus 协议栈纯C
│   │   │   ├── inc/myModbus.h
│   │   │   └── src/myModbus.c
│   │   ├── lib60870/                  # [P2★] IEC 60870 协议栈纯C
│   │   │   ├── inc/lib60870_common.h
│   │   │   ├── inc/gb101.h / gb103.h / gb104.h
│   │   │   └── src/*.c
│   │   ├── libicp67/                  # [P2○] ICP67 协议纯C预留
│   │   │   ├── inc/icp67.h
│   │   │   └── src/icp67.c
│   │   ├── libmms_m/                  # [P3○] MMS 主站C接口 + C++内部,预留)
│   │   │   ├── inc/myMms_m.h
│   │   │   └── src/myMms_m.cpp
│   │   ├── libmms_s/                  # [P3○] MMS 从站C接口 + C++内部,预留)
│   │   │   ├── inc/myMms_s.h
│   │   │   └── src/myMms_s.cpp
│   │   └── libmongoose/               # [P3○] HTTP/WebSocket纯C预留
│   │       ├── inc/mongoose.h
│   │       └── src/mongoose.c
│   ├── system/                        # 系统管理层9 个模块)
│   │   ├── RTU/                       # [P2★] 主程序C/C++ 入口)
│   │   │   ├── inc/app_sys.h
│   │   │   ├── inc/app_cmd.h
│   │   │   └── src/main.c
│   │   ├── libiec/                    # [P2★] IEC 点表解析C接口 + C++内部)
│   │   │   ├── inc/iec.h
│   │   │   ├── inc/iec_point.h
│   │   │   ├── inc/iec_method.h
│   │   │   └── src/iec_cfg_parse.cpp
│   │   ├── libcom_decode/             # [P2★] 通讯通道解码C接口 + C++内部)
│   │   │   ├── inc/com_decode.h
│   │   │   ├── inc/com_channel_def.h
│   │   │   └── src/com_decode.cpp
│   │   ├── libmodbus_m/               # [P2★] Modbus 主站管理C接口 + C++内部)
│   │   │   ├── inc/modbus_m.h
│   │   │   └── src/modbus_m.cpp
│   │   ├── libiec61850m/              # [P3○] 61850 主站管理(预留)
│   │   │   ├── inc/iec61850m.h
│   │   │   ├── inc/parse_xml.h
│   │   │   └── src/iec61850m.cpp
│   │   ├── libiec61850s/              # [P3○] 61850 从站管理(预留)
│   │   │   ├── inc/iec61850s.h
│   │   │   ├── inc/parse_xml.h
│   │   │   └── src/iec61850s.cpp
│   │   ├── libplc/                    # [P3○] PLC 逻辑引擎(预留)
│   │   │   ├── inc/plc.h
│   │   │   └── src/plc.cpp
│   │   ├── libself_ptl/               # [P3○] 内部自定义协议(预留)
│   │   │   ├── inc/self_ptl.h
│   │   │   ├── inc/method.h
│   │   │   └── src/self_ptl.cpp
│   │   └── libweb_server/             # [P2★] Web 管理服务C接口 + C++内部)
│   │       ├── inc/web_server.h
│   │       ├── inc/ws_method.h
│   │       └── src/web_server.cpp
│   └── test/                          # 单元测试
│       ├── test_list.c                # [P0★] 链表测试纯C
│       ├── test_log.c                 # [P0★] 日志测试纯C
│       ├── test_datacenter.cpp        # [P1★] 数据中心测试C++调用C接口
│       ├── test_cjson.c               # [P1★] JSON 测试纯C
│       ├── test_modbus.c              # [P1★] Modbus 测试纯C
│       └── test_60870.c               # [P2★] IEC104 测试纯C
└── release/                           # 构建系统(与 RTU 结构完全一致)
    ├── build.sh                       # 编译脚本x86 / arm 一键切换)
    ├── linux.mk                       # 公共编译选项CROSS_COMPILE、路径
    ├── makefile                       # 顶层 Makefile递归 src/
    ├── pack_web.sh                    # Web 资源打包脚本P3 阶段)
    ├── inc/                           # 对外暴露的公共头文件
    └── src/                           # 每个模块的 makefile同 RTU 多层结构)

图例: [P0★] 本期实现 | [P1★] 本期实现 | [P2★] 本期实现 | [P3○] 预留(目录+stub 文件后缀: .c = 纯C | .cpp = C++内部可用容器对外C接口


三、代码规范

3.1 命名规范(对齐 RTU 风格)

类型 规范 示例
文件名 驼峰/下划线混合 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/C++ 混合编程规范

对外头文件模板(强制 C 接口)

#ifndef _MY_MODULE_H_
#define _MY_MODULE_H_

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* 所有对外接口声明放这里 — 纯 C 兼容 */
int my_module_init(void);
int my_module_do_something(uint32_t id, const char *data);

#ifdef __cplusplus
}
#endif

#endif /* _MY_MODULE_H_ */

内部 .cpp 实现模板

#include "myModule.h"
#include <map>          // 内部可用 C++ STL 容器,但保持 C 开发者可读
#include <string>
// ... C++ 实现代码 ...

3.3 注释规范

  • 函数头部:/** 功能简述 */// 功能描述
  • 复杂逻辑:行间注释 // 步骤1: xxx
  • 段落分隔:/******...******/ 分隔不同功能区域

3.4 编码规范

  • 缩进Tab4 空格宽度)
  • 所有函数入口参数必须校验NULL、越界检查
  • 函数行数控制在 80 行以内
  • 复杂逻辑拆分为独立静态函数
  • 错误路径必须打 LOG_E

四、模块优先级说明

标记 含义
P0 基础模块,无外部依赖,最先实现
P1 核心模块,依赖 P0 模块,第二批次
P2 业务模块,依赖 P0/P1第三批次
○ P3 预留模块,仅创建目录+stub后续扩展

五、分阶段开发计划

阶段 0基础设施搭建

序号 任务 模块 产出 状态
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 7 个预留模块的目录骨架 + 返回 0 的 stub
0.7 链表 + 日志单元测试 src/test/test_list.c, test_log.c
0.8 编译验证 + 代码审查 全量编译通过、测试通过

阶段 1数据基础设施

序号 任务 模块 产出 状态
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 C 接口 CRUDC++ 内部用 std::map/vector
1.6 实现任务调度 libtask C 接口C++ 内部 std::thread + std::chrono
1.7 编写单元测试 test_cjson.c, test_datacenter.cpp
1.8 编译验证 + 代码审查 全量编译通过、测试通过

阶段 2通讯与协议

序号 任务 模块 产出 状态
2.1 实现通讯抽象层 libcomm 串口/TCP 统一 C 接口,内部 C++ 封装
2.2 实现命令处理框架 libcmd C 接口,内部 std::unordered_map + std::queue
2.3 实现 XML 解析 libxml C 接口myXml.h内部 tinyxml2 C++ 实现
2.4 实现 Modbus 协议栈 libmodbus RTU/TCP 从站纯C
2.5 实现 IEC 60870-5-104 lib60870 总召、遥测、遥信、遥控纯C
2.6 实现 IEC 点表解析 libiec src/system/libiec/
2.7 实现 Modbus 主站管理 libmodbus_m 轮询队列、采集调度
2.8 编写单元测试 test_modbus.c, test_60870.c
2.9 编译验证 + 代码审查 全量编译通过、测试通过

阶段 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
4.2 IEC 61850 MMS 主站 libmms_m + libiec61850m
4.3 IEC 61850 MMS 从站 libmms_s + libiec61850s
4.4 嵌入式 HTTP 服务 libmongoose
4.5 MQTT 客户端 libmy_mosquitto
4.6 PLC 逻辑引擎 libplc
4.7 内部自定义协议 libself_ptl

六、单模块开发流程(质量保证)

每次只开发一个模块,严格按照以下流程执行:

┌────────────┐    ┌────────────┐    ┌────────────┐    ┌────────────┐
│ 1. 模块    │───▶│ 2. 设计    │───▶│ 3. AI      │───▶│ 4. 编译    │
│    启动    │    │    评审    │    │    编码    │    │    验证    │
└────────────┘    └────────────┘    └────────────┘    └────────────┘
                                                             │
┌────────────┐    ┌────────────┐    ┌────────────┐           │
│ 8. 推送    │◀───│ 7. 完成    │◀───│ 6. 代码    │◀──────────┘
│    远程    │    │    事项    │    │    审查    │
└────────────┘    └────────────┘    └────────────┘

6.1 流程详细说明

步骤 名称 动作 产出
1 模块启动 选定单一模块,确认依赖已就绪 无阻塞启动
2 设计评审 输出数据结构、API 签名、依赖关系,人工审查 设计文档(可嵌入代码注释)
3 AI 编码 按计划编写 .h + .c/.cpp + makefile 可编译源代码
4 编译验证 make 消除所有编译错误/警告 编译 0 error 0 warning
5 单元测试 编写 test_xxx覆盖正常路径 + 边界条件 测试通过
6 代码审查 检查风格、注释、边界处理、内存安全 审查通过
7 完成事项 写入 COMPLETION.mdAPI、已知限制、测试覆盖率 完成事项条目
8 推送远程 git commit + git push 远程同步

6.2 开发问题解决文档CHANGELOG.md

每个模块开发过程中遇到的问题,记录到 CHANGELOG.md,格式如下:

## [模块名] 开发记录 — YYYY-MM-DD

### 问题 1: [问题简述]
- **现象**: xxx
- **原因**: xxx
- **解决方案**: xxx
- **影响范围**: xxx

### 问题 2: ...

6.3 开发完成事项COMPLETION.md

每个模块开发完成后,在 COMPLETION.md 中添加条目:

## [模块名] — 完成日期: YYYY-MM-DD

### 基本信息
- **语言**: C / C++ 混合 / 纯C
- **对外接口**: C 接口extern "C"
- **依赖模块**: liblist, liblog
- **被依赖模块**: libdatacenter, libmodbus_m

### API 清单
| 函数 | 功能 | 参数 | 返回值 |
|------|------|------|--------|
| xxx_init() | 初始化 | void | 0=成功 |
| xxx_do() | 执行 | id, data | 0=成功 |

### 已知限制
- xxx

### 测试覆盖
- 正常路径: ✅
- 边界条件: ✅
- 错误路径: ✅
- 内存泄漏: ✅valgrind 检查通过)

七、Git 推送规则(对齐 RTU

  • 分支: 所有开发在 master 分支
  • Commit 格式: [模块名] 功能描述
    • 例: [liblist] 实现 Linux 内核侵入式双向链表
    • 例: [libdatacenter] 添加信号点 CRUD 接口
  • 推送频率: 每个模块完成后推送一次
  • 远程: originhttp://admin:admin123@127.0.0.1:3000/admin/RTU_ALL_AI.git

八、关键技术点

8.1 编程语言分布

层级 纯C 模块 C接口+C++内部 说明
public/ liblist, libfunc, liblog, libcJSON, libmd5, libmy_xxhash libtask, libdatacenter, libxml, libcomm, libcmd 基础库优先C
protocol/ libmodbus, lib60870, libmongoose libmms_m, libmms_s, libicp67 协议栈优先C
system/ RTU, libiec, libcom_decode, libmodbus_m, libweb_server 管理模块可用C++
test/ test_list, test_log, test_cjson, test_modbus, test_60870 test_datacenter 测试对应实现语言

8.2 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 等宏
  • 所有模块的数据结构使用侵入式链表管理

8.3 编译系统

  • 支持 x86(本地调试)和 armRK3568 交叉编译)两种模式
  • 每个模块编译为 .a 静态库,顶层递归构建
  • .cgcc.cppg++makefile 自动识别
  • build.sh x86build.sh arm 一键编译
  • 公共头文件统一复制到 release/inc/

8.4 日志系统

  • 支持控制台 + 文件双输出,异步日志队列(侵入式链表实现)
  • 级别INFO / ERRORLOG_I / LOG_E
  • 文件日志支持按大小轮转

8.5 基础公共库public/

模块 语言 来源 核心功能
liblist 纯C Linux 内核 侵入式双向循环链表,纯头文件
libfunc 纯C 自研 CRC16/32、校验和、文件操作、字节序
liblog 纯C 自研 异步日志(控制台+文件)、轮转
libtask C+C++ 自研 任务调度、定时器、线程池std::thread
libdatacenter C+C++ 自研 信号点 CRUD、侵入式链表索引、xxHash 查找
libcJSON 纯C cJSON 裁剪 JSON 解析/生成
libxml C+C++ tinyxml2 XML 解析C接口封装 + tinyxml2 C++内部)
libmd5 纯C RFC 1321 MD5 摘要
libmy_xxhash 纯C xxHash 极速哈希
libcomm C+C++ 自研 串口/TCP 统一抽象
libcmd C+C++ 自研 命令注册表、分发执行
libmy_mosquitto C+C++ mosquitto MQTT 客户端(预留 P3

8.6 协议层protocol/

模块 语言 来源 核心功能
libmodbus 纯C libmodbus 裁剪 Modbus RTU/TCP 从站01/03/05/06/15/16 功能码
lib60870 纯C lib60870 裁剪 IEC 101/103/104 从站,总召/对时/遥控
libicp67 预留 P3 ICP67 专有协议
libmms_m 预留 P3 MMS 客户端
libmms_s 预留 P3 MMS 服务端
libmongoose 预留 P3 嵌入式 HTTP/WebSocket

8.7 系统管理层system/

模块 语言 来源 核心功能
RTU C/C++ 自研 主入口:模块初始化、主循环
libiec C+C++ 自研 IEC 规约点表定义、解析、数据中心映射
libcom_decode C+C++ 自研 通讯通道帧解析、协议识别、分发
libmodbus_m C+C++ 自研 Modbus 主站:轮询队列、采集调度
libiec61850m 预留 P3 61850 主站管理
libiec61850s 预留 P3 61850 从站管理
libplc 预留 P3 PLC 逻辑引擎
libself_ptl 预留 P3 内部自定义协议
libweb_server C+C++ 自研 REST API + WebSocket

九、风险与对策

风险 对策
AI 编码风格不一致 严格对照 RTU 已有代码,代码审查逐项检查
C++ 内部实现过于复杂 C 开发者需能读懂避免模板元编程、lambda 嵌套
侵入式链表使用不当 先写完整单元测试,覆盖增删改查、空链表、边界
编译环境差异 优先 x86 本地编译通过ARM 交叉编译作为验证
模块间耦合过重 每个模块独立 .a依赖通过 release/inc/ 接口明确
cJSON/tinyxml2 安全漏洞 裁剪版本,单元测试覆盖畸形输入
P3 预留模块过度设计 P3 仅创建目录 + 返回 0 的 stub 函数

十、审查清单

  • 编程语言策略是否合理C 接口 + C++ 内部)?
  • 模块列表是否覆盖了 RTU 全部 27 个模块12+6+9
  • 模块优先级P0/P1/P2/P3排序是否合理
  • 单模块开发流程是否清晰可执行?
  • CHANGELOG.md + COMPLETION.md 格式是否满足质量追溯需求?
  • 代码规范(命名/注释/头文件模板)是否对齐 RTU
  • 构建系统方案是否可行gcc/g++ 混合编译)?
  • XML 库 C++ 实现但对外 C 接口的方案是否合理?
  • 是否需要调整模块范围(增/删/改优先级)?