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 配置查看:运行期生效参数集中展示,便于远程排障

results matching ""

    No results matching ""