信创环境下智慧档案馆建设:环境监控平台对接恒温恒湿一体机实战
智慧档案馆信创适配:环境监控平台与恒温恒湿设备对接方案
关键词
:信创适配、智慧档案馆、环境监控平台、恒温恒湿设备、国产操作系统、国产数据库、Modbus TCP、BACnet/IP、南向对接、北向集成、协议栈替换、等保合规
标签
:#物联网 #Modbus #TCP/IP #POE供电 #InfluxDB #以太网温湿度传感器 #网口温湿度变送器 #机房监控 #边缘计算 #信创 #国产数据库 #等保合规
一、场景界定:信创适配到底改什么
信创不是把 x86 换成 ARM、把 CentOS 换成统信就完事。档案馆环境监控系统的适配,本质是在国产软硬件栈上,重建一条从感知到平台到处置的可用链路,并保证交付后运维动作不变形。
先分清适配边界,避免把精力花错地方:
- 基础设施层:服务器(飞腾/鲲鹏/海光/兆芯)、操作系统(统信 UOS、麒麟 Kylin V10)、虚拟化/容器运行时(kubelet、containerd 或 podman)、消息中间件。
- 数据层:时序库替换(InfluxDB 原生包在部分国产架构下缺 arm64/rpm,或许可协议不合规)、关系库(达梦、人大金仓 KingbaseES、OceanBase)、缓存(Redis 国产替代或原栈移植)。
- 采集层:边缘网关国产化、Python 解释器/PyModbus 依赖、Cgo 依赖库、交叉编译产物。
- 对接层:恒温恒湿机组南向协议(Modbus TCP / BACnet/IP / 厂家私有 SDK),北向与 BA、消防、门禁、视频平台集成。
- 合规层:等保三级备案、商用密码应用、日志审计、漏洞加固基线。
核心目标:原系统功能等价迁移 + 南向设备对接不回退 + 运维工具链可用。
二、总体架构与适配分层
┌──────────────────────────────────────────────────────────────────┐
│ 北向集成层(信创平台内) │
│ Web控制台 / Grafana替代(国产BI或自研前端) / 告警通知 / 工单 │
│ REST API + WebSocket + MQ │
└──────────────────────┬───────────────────────────────────────────┘
│ 内部数据总线(Kafka/NATS/Redis Stream,信创验证)
┌──────────────────────▼───────────────────────────────────────────┐
│ 平台服务层(国产OS+国产库) │
│ 采集网关管理 · 设备模型 · 点表映射 · 联动规则引擎 · 审计日志 │
└──────────────────────┬───────────────────────────────────────────┘
│ 北向协议代理 / EdgeAgent
┌──────────────────────▼───────────────────────────────────────────┐
│ 边缘层(信创边缘节点或工控机) │
│ 协议转换 · 缓存 · 本地自治 · 断网续传 │
└──────────────────────┬───────────────────────────────────────────┘
│ Modbus TCP / BACnet/IP / MQTT
┌──────────────────────▼───────────────────────────────────────────┐
│ 设备层 │
│ 网口温湿度变送器 · DDC/PLC · 恒温恒湿机组控制器 · 水阀/风阀执行器 │
└──────────────────────────────────────────────────────────────────┘
复制
适配时坚持三条原则:
- 协议面不动,软件栈动:南向机组通信协议、寄存器表、BACnet 对象表保持不变,适配的是运行这些协议的进程和依赖。
- 接口契约不动,实现替换:设备模型、点表映射表、北向 API schema 保持稳定,后端可换国产库、国产中间件。
- 降级路径保留:国产栈出问题时,边缘侧仍能本地闭环,平台侧可回退到旁路监控。
三、平台侧信创迁移
3.1 操作系统与运行时
- OS 验证矩阵:统信 UOS Server 20、麒麟 V10 SP3,确认内核版本、systemd、SELinux/kysec 策略、软件源。
- 容器化部署:优先容器化,降低环境耦合。确认 containerd/podman 在目标架构可用,镜像多架构构建(buildx 或交叉编译)。
- 非容器化部署:systemd unit 托管,chroot/venv 隔离,别直接污染系统 Python。
- 架构差异:x86_64 → aarch64(鲲鹏、飞腾 FT-2000+/S2500)或 x86_64 国产CPU(海光、兆芯)。PyModbus、asyncio 无碍;C 扩展(orjson、cryptography、InfluxDB client 底层)需确认 wheel 或源码编译。
3.2 Python 依赖与构建
- 锁定依赖清单,离线 wheelhouse:在目标 OS+架构下 pip download / pip install --target,别现场编译。
- 关键依赖核查:
- pymodbus 3.x:纯 Python + asyncio,跨平台 OK,注意异常码、事务ID处理。
- bacpypes3(BACnet/IP):纯 Python,aarch64 无问题;性能敏感时评估多设备轮询开销。
- influxdb-client:HTTP 写,无 C 依赖;若替换国产时序库,改写入适配层。
- redis / pika / confluent-kafka:Kafka 客户端纯 Python 可选 kafka-python;librdkafka 绑定需编译。
- 构建产物进制品库,CI 中加架构标签,部署时按 nodeSelector/亲和性下发。
3.3 数据层替换
原栈 InfluxDB+TSDB,信创场景常见两种路径:
- 保留 InfluxDB OSS:确认 v2.x 在 aarch64 有官方二进制或容器镜像;无则自行构建,评估维护成本。许可证与内网分发合规。
- 替换为国产/兼容栈:
- 时序数据:TDengine(国产,arm64 支持好)、IoTDB(清华开源,Java 生态,信创友好)。
- 关系/配置/审计:达梦 DM8、KingbaseES V8,ORM 或原生驱动适配。
- 迁移策略:双写过渡期,校验后切读;历史数据回灌脚本化。
适配层建议抽象存储接口,避免业务代码散落多库方言:
# store_backend.py - 存储适配层参考
from abc import ABC, abstractmethod
class MetricSink(ABC):
@abstractmethod
async def write_point(self, measurement, tags, fields, ts):
...
class InfluxSink(MetricSink):
def __init__(self, client): self.c = client
async def write_point(self, m, tags, fields, ts):
from influxdb_client import Point
p = Point(m).time(ts)
for k,v in tags.items(): p = p.tag(k,v)
for k,v in fields.items(): p = p.field(k,v)
self.c.write_api().write(record=p)
class TDEngineSink(MetricSink):
def __init__(self, conn): self.conn = conn # taosrest 或 taospy
async def write_point(self, m, tags, fields, ts):
cols = ",".join(list(tags.keys())+list(fields.keys()))
vals = ",".join([f"'{v}'" if isinstance(v,str) else str(v)
for v in list(tags.values())+list(fields.values())])
sql = f"INSERT INTO {m} ({cols}) VALUES ({vals})"
await self.conn.execute(sql)
复制
北向查询接口同样抽象,前端/报表不改 SQL 细节。
3.4 北向集成
- REST/WebSocket 网关:FastAPI/Sanago 国产栈运行无碍,注意 uvicorn/gunicorn 多 worker 下共享状态。
- 与既有 BA/IBMS 对接:OPC-UA、BACnet/WS、MQTT Sparkplug B,或厂家 API 代理。
- 国密改造:TLS 替换国密套件(TLCP),或前置国密网关;证书签发接入政务 CA/内网 PKI。
- 等保:操作审计、登录双因子、最小化端口、日志集中采集。
四、南向设备对接适配
4.1 恒温恒湿机组接口清点
交付前拿到的对接物料,信创环境下不变:
- 通信卡型号、固件版本、协议类型、端口(502/TCP,47808/UDP)。
- Modbus 寄存器表(0-based offset、数据类型、缩放、线圈/保持寄存器区分)。
- BACnet 对象表(device-id、object-list、present-value 可读写性、priority-array)。
- 写操作语义:设定值下发、启停、模式切换、故障复位;是否需 DDC 中间层。
4.2 边缘网关适配
- 边缘 Agent 容器化下发,配置外置 ConfigMap/文件挂载。
- 多协议采集分片:Modbus TCP 连接池,BACnet Who-Is/Read-Property 缓存。
- 协议栈在国产 OS 上的网络行为验证:BACnet/IP 广播发现跨 VLAN 时 BBMD;iptables/nftables 规则、SELinux/kysec 放行。
- 本地自治:平台失联时,DDC/边缘侧维持闭环,恢复后增量续传。续传缓冲别无限增长,环形缓冲+时标去重。
4.3 点表映射与版本化
- 统一设备模型:device → subsystem=hvac → points[],绑定固件版本、点表版本。
- 映射配置 YAML/JSON,热加载,变更留审计。
- 写回路径:平台下发目标带/设定值 → 边缘代理校验限幅 → DDC 执行 → 回读确认。
- 多厂商异构:抽象成标准点(setpoint_temp、setpoint_hum、run_state、fault_word、ret_temp、ret_hum、valve_pos),下游适配插件化。
4.4 参考实现:信创边缘采集代理
"""
edge_agent.py - 信创边缘侧采集与北向上行(精简参考)
- 读配置,连南向设备,归一化后写本地缓冲+北向MQTT
- 接收北向下发,写回设备;失败退避,状态回报
"""
import asyncio, json, logging, signal
from typing import Dict, Any
from pymodbus.client import AsyncModbusTcpClient
logging.basicConfig(level=logging.INFO)
class EdgeAgent:
def __init__(self, cfg: Dict[str, Any]):
self.cfg = cfg
self.clients: Dict[str, AsyncModbusTcpClient] = {}
self.local_buf = [] # 断网续传缓冲
self.uplink_ok = False
self._stop = False
async def modbus_read(self, dev):
host = dev["host"]; unit = dev["unit"]
c = self.clients.get(host)
if c is None or not c.connected:
c = AsyncModbusTcpClient(host, port=dev.get("port",502))
await c.connect()
self.clients[host] = c
rr = await c.read_holding_registers(0, 4, slave=unit)
if rr.isError():
return None
regs = rr.registers
# 示例:ret_temp, ret_hum, setpoint_temp, setpoint_hum
return {
"ret_temp": regs[0]/10.0, "ret_hum": regs[1]/10.0,
"setpoint_temp": regs[2]/10.0, "setpoint_hum": regs[3]/10.0,
}
async def modbus_write_setpoint(self, dev, sp_t, sp_h):
c = self.clients.get(dev["host"])
if c is None or not c.connected:
return False
# 写保持寄存器 2,3(0-based offset),缩放回原值
await c.write_registers(2, [int(sp_t*10), int(sp_h*10)], slave=dev["unit"])
# 回读确认
rr = await c.read_holding_registers(2, 2, slave=dev["unit"])
if rr.isError():
return False
got_t, got_h = rr.registers[0]/10.0, rr.registers[1]/10.0
return abs(got_t-sp_t) < 0.2 and abs(got_h-sp_h) < 0.5
async def poll_loop(self):
while not self._stop:
for dev in self.cfg["devices"]:
try:
state = await self.modbus_read(dev)
if state:
msg = {"device": dev["id"], "ts": asyncio.get_event_loop().time(), "state": state}
# 北向上行(MQTT示意,实际接信创消息总线)
await self.publish(msg)
self.local_buf.append(msg)
except Exception as e:
logging.warning("poll %s: %s", dev["id"], e)
await asyncio.sleep(self.cfg.get("poll", 5.0))
async def publish(self, msg):
# 占位:NATS/Kafka/MQTT over TLS/国密网关
self.uplink_ok = True
async def control_handler(self, cmd):
dev = next(d for d in self.cfg["devices"] if d["id"]==cmd["device"])
ok = await self.modbus_write_setpoint(dev, cmd["sp_t"], cmd["sp_h"])
return {"ack": ok, "device": cmd["device"]}
def stop(self):
self._stop = True
async def main():
cfg = json.load(open("/etc/edge_agent/config.json"))
agent = EdgeAgent(cfg)
loop = asyncio.get_event_loop()
for s in (signal.SIGTERM, signal.SIGINT):
loop.add_signal_handler(s, agent.stop)
await agent.poll_loop()
if __name__ == "__main__":
asyncio.run(main())
复制
落地时注意:生产环境把配置加载、指标暴露(Prometheus exporter)、健康探针、优雅退出、日志轮转补上;国密/TLS 在消息总线侧终结,别在采集进程内硬绑。
五、联调与验证
5.1 迁移前后功能对齐
- 数据面:采样频率、时标、单位、质量位与原系统一致。
- 控制面:下发设定值、启停、模式切换,DDC 跟随行为一致。
- 告警面:规则触发、通知路由、抑制窗、升级通知等价。
- 审计面:操作日志、联动 trace、配置变更留痕。
5.2 协议联调
# Modbus TCP 抓包
tcpdump -i any -nn 'host 10.20.1.11 and port 502' -w /tmp/mb.pcap
# BACnet/IP
tcpdump -i any -nn 'port 47808' -w /tmp/bac.pcap
# 国产OS上确认监听与连通
ss -tlnp | grep 502
nc -zv 10.20.1.11 502
复制
Wireshark 过滤
modbus
、
bacnet
;验证事务ID匹配、异常响应码、广播分发。BACnet 跨网段配 BBMD 或静态绑定,确认 I-Am/Read-Property/Write-Property。
5.3 故障注入
- 平台服务宕机:边缘侧维持本地闭环,恢复后增量同步。
- 国产库主备切换:写入不丢、读取最终一致。
- 网络分区:边缘缓冲水位监控,避免磁盘撑满。
- 固件升级后点表变化:映射版本不匹配时降级到只读并告警,不停写错寄存器。
- 国密网关证书过期:回退通道+告警,别阻断控制面。
六、合规与安全
- 等保三级:边界防护、访问控制、审计、恶意代码防范;信创环境别默认放行,收敛端口。
- 商用密码:存储加密、传输国密套件、密钥生命周期管理。
- 漏洞管理:国产 OS 补丁源、依赖扫描,容器镜像入仓前扫描。
- 供应链:国产组件 BOM、许可证合规(InfluxDB 商用场景确认 OSS 许可边界,避免违规分发)。
- 审计留痕:配置变更、控制下发、告警处置全链路可追溯,日志留存≥6个月。
七、交付与运维
- 交付物:适配清单(BOM+架构+OS版本)、部署手册、回滚手册、点表/对象表版本库、容器镜像仓库、离线依赖包。
- 回滚:保留原 x86 环境并行运行一段时间,灰度切流;异常时切回,数据以原系统为准或双向同步。
- 运维工具链:国产 OS 下日志查看、服务启停、配置热加载、缓冲清理、备件更换 SOP。
- 培训:现场人员会重启服务、会查日志、会切旁路、会触发恢复 SOP,别依赖原厂远程。
八、常见坑
- 国产 OS 上 pip 装不上 pymodbus3/bacpypes3,源里是旧版——建离线 wheelhouse,CI 中预编译。
- InfluxDB 镜像无 arm64,现场编译耗时且不稳定——早做存储抽象,TDengine/IoTDB 备选。
- SELinux/kysec 拦截采集进程绑端口、写缓冲——策略模块或放通域,别直接关安全模块。
- 国密 TLS 与原有 MQTT 客户端不兼容——终结在前置网关,应用侧明文/内网 TLS。
- DDC 写回权限未确认,平台以为下发成功——联调时回读校验,控制面测试覆盖。
- 多架构镜像标签混乱,边缘节点拉错——部署时校验 arch,kubelet/nodeSelector 或手动锁定。
- 等保测评时暴露审计日志缺失——上线前接集中日志,别事后补。
- 双写过渡期数据不一致,切读后曲线断层——校验脚本+回灌,切流前冻结配置。
九、小结
信创适配不是协议重做,是运行栈迁移前提下的对接保全:南向机组接口契约不变,边缘代理与平台服务在国产 OS+国产库上重建;重点投入在依赖构建、存储抽象、北向集成、合规加固和回滚预案。交付完成度看三件事——采样等价、控制可回读、故障下边缘自治。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)