2 核心原理
2.1 资源内嵌与自释放
构建阶段由 embed_gen 工具把 webroot 网页目录、数据库初始化SQL、内置数据库服务二进制逐字节转换为 C++ 静态数组(embedded_assets.cpp),与网关代码一起编译进同一个可执行文件。运行期首次连接不上数据库时,把这些资源释放到程序自身目录下的 sxdb 子目录并自动拉起数据库进程;网页则直接从内存响应,不落盘。由此得到两个结果:对外只有一个文件,看不到也拷不走源码与资源;数据与日志永远生成在程序目录内,与启动时的工作目录无关。
2.2 全静态链接与跨平台构建
Windows 版使用 MSYS2 mingw64 工具链全静态编译,运行时不依赖 VC++ 运行库与任何第三方 DLL;Linux 版覆盖 x64、arm64(国产化网关/树莓派类)、arm32 三种架构,同一套 CMake 脚本一键交叉构建。目标机什么都不用装,拷贝即运行,这是Java版做不到的(Java版需匹配JRE并携带上百个jar)。
2.3 多线程数据流
网关内部按职责拆分为常驻线程,彼此通过缓存解耦,互不阻塞:
| 线程 | 职责 | 周期 |
|---|---|---|
| BootInitial | 数据库→缓存全量同步(通道/设备/属性/字典) | 启动及配置变更后 |
| 协议采集线程 | 29种协议轮询采集,写入实时缓存并按策略入库历史 | 秒级,按通道并行 |
| 写入监听 | 反控值/联动下发从缓存写入现场设备 | 秒级 |
| 规则联动 | 预警比对、条件联动、变量联动、开关机流程执行 | 秒级 |
| BootContrast | 超期实时/历史数据清理 | 分钟级 |
| DTU服务 | 7078注册 / 7058 RTU透传 / 7068 TCP透传 | 长连接 |
| Web服务 | 6836端口:登录、30+表通用CRUD、专用控制接口 | 事件驱动 |
顶栏“运行总开关”是这组业务线程的统一闸口:置停止后线程保活但跳过采集/写入/联动,现场检修不再产生误报;它与开/关机流程(按规则表顺序带时长下发)是两个独立机制。
2.4 缓存优先与降级设计
全部热数据(设备、点位、字典、实时值)驻留缓存,页面查询与联动比对只读缓存,数据库仅承担持久化,因此多用户频繁点击也不会拖慢采集。缓存服务优先使用Redis;探测不到时自动降级为进程内缓存,单机部署可以完全没有Redis。采集侧连接失败只记日志并进入下一轮轮询,杜绝了“锁内阻塞重试拖垮Web响应”这类Java版遗留问题。
2.5 统一驱动框架
所有协议实现同一个 IDriver 抽象(connect/read/write),ByteTransform 统一处理数据类型(int16/uint16/int32/float/double/bool/text)与字节顺序(ABCD/CDAB/BADC/DCBA),注册表挂接通用采集循环与统一写入监听。倍数换算、实时缓存、历史入库、反控下发全链路复用,新协议只需实现一个驱动类并注册,前端字典加一项即可配置,工作量以小时计。
2.6 安全与兼容
登录校验沿用 shiro_md5 加盐算法,Java版用户表直接迁移;Cookie会话(SCADASESSID)超时可控;REST数据结构与Java版一致,第三方对接无需改造。数据库沿用SQLite语义脚本,历史数据可平移到新版。

图 2-1 配置查看:运行期生效参数集中展示,便于远程排障