时间 |
内容 |
章节 |
2025.4.23 |
支持的协议增加智能电表DLT645,S7和OPC-UA基础功能实现 |
3.4 |
目录
网关程序以C++实现,使用utf-8字符集,平台必须使用utf-8字符集。设备采用的字符集与网关和平台无关,设备通道数据为字符串的,可以通过参数配置指定传输方式或自动转换字符集。
支持Modbus和透传,支持MQTT和MQTTS。
日志文件和数据文件大小受限,确保不出现磁盘满故障。
数据即时存盘,确保断电不丢失。
数据序号和确认机制保证网关到平台不存在数据丢失。
断网存储能力取决于数据量,网关支持数据压缩。
序号 |
系统 |
支持状态 |
说明 |
1 |
Linux/Arm64 |
优先支持,全部功能 |
精简版Linux,依赖的库需要自行编译 |
2 |
Linux/Arm |
完成基本测试,能运行,能上报modbus_tcp数据 |
完整Linux,可以直接安装所需的包 |
3 |
|
|
|
序号 |
协议名称 |
支持状态 |
说明 |
1 |
MQTT |
已经:MQTT 已经:MQTTS |
|
2 |
HTTP |
计划: |
依赖平台 |
序号 |
平台名称 |
支持的功能 |
说明 |
1 |
演示平台 |
全部指令 |
即配套的管理工具 |
2 |
|
|
|
序号 |
协议名称 |
支持状态 |
说明 |
1 |
Modbus |
已经:TCP、RTU、RTU_TCP 不确定:ASCII |
目前使用的协议库不支持Modbus-ASCII,用得很少 |
2 |
透明传输 |
已经:TCP、串口 |
上报接收到的任何数据 通过平台下发任何数据 定时发送指令 |
3 |
智能电表 |
已经:DLT645-1997、DLT645-2007 |
|
4 |
西门子S7 |
即将 |
基础功能模块已并入,尚未实现配置部分 |
3 |
OPCUA |
即将 |
基础功能模块已并入,尚未实现配置部分 |
4 |
定制 |
计划 |
可随意定制 |
序号 |
名称 |
支持状态 |
说明 |
1 |
周期上报 |
已经 |
每隔设定时间上报一次 |
2 |
变化上报 |
已经 |
以设定的周期(毫秒,低于每次采集时间则等同于循环采集) |
3 |
依赖上报 |
已经 |
当依赖的通道上报时上报(通常依赖的通道是变化上报类型) |
4 |
变化时重新采集全部 |
已经 |
|
支持直接导入昆仑通态触摸屏的导出文件,目前直接根据deviceCode对应的csv文件导入,自动进行本地编码到UTF-8的转换(不要提前转换编码)。
通道采集频次原始值通常是1,表示不特别设定(跟随设备的周期设定)。修改为以下范围实现特定功能:
l 1XX代表差异上传,其中XX代表百分比。100代表不同即上传。
l 2XX代表差异时上传全部。
l 5XXXX代表依赖上传,XXXX代表依赖的通道序号。
目前以通道序号为channelNo和paramCode。
支持数据压缩,以便减少数据流量。默认未启用压缩。使用zlib压缩。
通过加密防止不安全的传输过程。默认不对注册、心跳和上报数据加密。使用AES256-CBC加密或国密sm4加密
网关以设定最小周期激活+事件触发方式运行,时间控制单位为毫秒,符合实时要求。
下发操作以事件触发方式接收、在下一轮扫描时优先运行,最大延迟=网络传输时间+一轮扫描时间。
一轮扫描时间大约=通道数*15毫秒(此为实测结果,185个通道不到3秒,保持寄存器每次读取大约15毫秒,绝大部分耗时确实在读取操作本身)。
支持连续地址读取优化。连续地址一次性采集,可显著缩短采集时间。
程序对设备数量和通道数量无限制,仅受硬件接口限制。
支持数据压缩。
实测185个通道的上报数据大约10K。按照通常的每分钟一次的采集频率,一天=60*24*10K=14M,一个月=420M。
此类数据一般压缩比比较高,可以减少80-90%。
实测大约10K的一条数据压缩率90%,使用base64编码后85%(base64编码会增大三分之一),小于200字节的数据压缩无意义(程序可以根据实际效果选择传输方式,需要平台支持)。
系统文件由硬件提供,不同网关有所不同。
以下为某一个硬件的情形:
序号 |
文件名称 |
功能 |
说明 |
1 |
/home/sn.txt |
型号 序列号 |
静态文件 |
2 |
/home/sysInfo.txt |
SIM卡号 信号强度 |
动态文件 |
3 |
/home/run/start.sh |
启动脚本 |
系统启动时执行(内容由应用系统提供) |
4 |
/home/run/publish.tar.bz2 |
原始程序 |
正常程序运行失败会自动运行原始程序 |
5 |
/home/backup/ led_gpio.txt |
|
Led操作说明 |
程序自身的所有文件基于单一目录“/home/root/publish”。
序号 |
文件名称 |
功能 |
说明 |
1 |
gwmian.exe |
主程序 |
-auto 网关自启动脚本使用,禁止交互输入 -test 启动内置modbusTCP测试服务(可供默认设备采集) |
2 |
appConfig.json |
应用配置 |
文件大小限制等 |
3 |
northConfig.json |
平台配置(北向配置) |
平台连接参数 |
4 |
defaultNorthConfig.json |
默认配置 |
|
5 |
DeviceConfig.json |
设备配置(南向配置) |
数据采集配置 |
6 |
gwmain.log gwmain.log.log gwmain.log.log.bz2 |
日志文件 |
文件总大小不超过应用配置的限制 gwmain.log.log会被压缩成gwmain.log.log.bz2 |
7 |
data.dat data2.dat |
数据文件 |
文件总大小不超过应用配置的限制 |
8 |
SSL/ |
证书文件 |
用于MQTTS的证书文件,每个平台一个子目录 |
为了使未知IP地址的设备可以被发现,设备周期性向端口9999发送UDP广播(物理网络和所有配置的网段,具体效果与网络管理设备有关)。
网线直连的PC可以通过抓包工具看到源信息从而发现设备。目前的手段依赖第三方库的安装。
计划:PC端配置程序实现。
某款硬件具有9个LED灯,全部为绿色,功能如下:
系统使用 |
设备2连接状态 |
设备5连接状态 |
系统使用 |
设备1连接状态 |
设备4连接状态 |
系统使用 |
平台连接状态 |
设备3连接状态 |
左侧三个由系统使用,其余六个由程序使用。
状态表:
|
常灭 |
常亮 |
闪烁 |
平台 |
未连接 |
注册成功 |
已连接,未注册 |
设备 |
所在接口未连接 |
设备读到数据 |
设备未读到数据(接口已连接) |
闪烁为亮灭各持续一秒,不停循环。
厂家尚未完成。
计划提供恢复北向配置和恢复出厂设置两个功能。
数据序列号标识一条数据,1开始递增。网关记录已确认的序列号、下一个序列号和已发送的序列号。
数据序列号是实现数据不丢失的基础。
数据先存盘、后发送,这样可以保证断电不丢失数据。
由于网关和平台中间的MQTT是不保存数据,没有订阅者直接丢弃,MQTT也无法确保断电不丢失数据,所以网关通过平台确认消息来确认平台接收了数据。平台无需每条数据即时确认,只需在网关存储写满前确认即可。
网关收到平台确认后方可清理已确认的数据。网关上存在的历史数据平台可以重新获取。
如果网关存储写满,后果是不确定的。网关可能停止写入新数据,也可能删除旧数据。
启动脚本将程序文件复制到临时存储空间(此空间不是存储,掉电丢失),因此程序可以文件可以复制。
保存一份原始文件,以免升级失败变砖(由于大文件被拆分传送,升级失败概率似乎挺高)。
目前升级是手动的,选择文件上传到网关,然后发送重启命令生效。
本程序用多种机制防止硬件挂死。建议硬件自身有看门狗机制。
软件层面有以下几层保护:
1, 启动脚本,程序失败运行出厂配置,保证设备不失联
2, 主程序双进程,一个监控一个工作,监控进程根据工作进程的状态决定如何处理
3, 超时未能连接到平台重启网关
4, 超时没有收到平台任何消息重启网关
5, 存储写入出错删除旧日志文件