概述
前言
1.声明:
- 我司保留所有HEGateway系列产品中自主开发相关的软、硬件技术资料的知识产权,未经我司同意,用户不得将它们在网络上散发,或者通过截取、修改等方式来篡改它们的著作权
- 由于产品版本升级或其他原因,本手册内容有可能变更,本公司在手册编辑过程中,尽最大努力保证提供的信息完整性、可靠性
- 在使用HEGateway系列产品时请核验配置的准确性,本公司不承担由于不正常使用或不恰当使用本产品造成的财产或人身伤害
2.HE Gateway能做什么:
- 工控协议的数据采集+为映射数据的协议从站
- 任务计划+告警配置
- 丰富的数据转发:HTTP/数据库/MQTT
3.产品特点:
- HE Gateway网关为工业级产品,运行稳定可靠,满足工业场合的应用需求
- 产品已在各种大中型工控系统中稳定运行,且可长时间无故障运行
- 提供电脑端的配置工具软件,实现快速配置
- HE Gateway配置软件的运行环境为Windows 7 sp1及以上操作系统,无需额外安装任何组件包
4.技术支持
- zhangmw@stoutool.com
- 官网:http://www.stoutool.com/
5.保修实现
- 1.我司承诺,对HEGateway 系列产品提供自售出之日起壹年的保修服务。若用户在使用HEGateway系列产品期间,由于该产品的质量问题而出现故障,可在保修期内凭购买单据与销售商或我司联系,我司负责为您维修或更换新机。
- 为以下情况之一的产品,不提供免费保修:
- 易碎标签撕毁的
- 超过保修服务期的
- 无有效购买单据的
- 进液、受潮或发霉
- 由于购买后跌落、强烈震动或擅自改造、误操作等非产品质量原因引起的故障和损坏
- 因为不可抗力造成损坏的
产品的一些使用细节
1.关于初始值
采集标签的初始状态为null,在首次读取后,初始状态变更为ok/no
2.关于组包读取
在某些协议中,按组读取时,如果组中有部分标签错误,会导致整组读取失败,用户需要再配置采集标签时对错误采集项进行剔除
3.串口使用问题:
推荐单个串口,使用单个协议且通讯参数固定的采集,如需在单串口上运行多协议的采集,请合理分配采集数量,并对可能的出错进行调试
如:增加出错重试次数,增加超时,增加组前间隔时间
4.4G使用问题
请在网关上电前插入4G卡,在运行期间插入4G卡,请耐心等待一段时间,直至4G通讯成功
5.配置文件的管理
用户需要自行保存配置文件,由于配置文件泄露而导致其中秘钥泄露的问题,我司概不负责
HE系列配置软件使用步骤
- 请将配置软件解压至英文路径运行,并右键以管理员权限运行
初次使用
1.界面介绍
窗体主要分为5部分布局:
- 菜单栏:能够载入/保存配置文件,连接网关,开启监控模式
- 工具栏:提供了便捷的图标,用于各类常规操作
- 配置模式:窗体左侧视图的小部分空白区域,负责提供用户创建/修改驱动信息
- 监控模式:窗体左侧视图的小部分空白区域,负责提供监控树节点的信息展示
- 表格视图:窗体右侧的大部分空白区域,负责展示具体的详细信息
2.工程管理
2.1新建工程
新建工程
- 选择与硬件相匹配的型号
- 发布人、版本、更新日志、描述为用户自定义的备注信息(可选)
全局设置
- 任务日志存储位置:仅在需要查看任务执行信息时勾选
HTTP写接口:默认不开放此接口,用户在确认内网环境安全可靠时,可将此接口放开(此接口无权限校验)
- 此接口允许通过HTTP的方式对采集标签设置值
超出空间期限,关闭驱动的设置:避免网络层的数据采集操作因为休眠周期过长,连接被网络链路中关闭,导致下次采集必定失败的问题
断电保持&周期:不推荐打开此选项,仅在用户希望网关下次重新启动时,首次推送的数据不为null时勾选此选项,建议周期300s
- 过短的掉电保持周期可能会降低网关的存储寿命,以及干扰采集的更新
调试日志:默认无日志,有以下级别供用户选择:
- NULL:运行期间将不产生日志,以达到最快的采集
- ERR:网关内部运行出错的日志,需要将此日志保存发送给服务商
- USER:用户配置过程的信息,仅在配置调试时打开,在生产环境长期运行时不建议打开
2.2.保存工程
- 请确认保存路径合法以及该用户是否有相关的保存权限
- 工程配置文件的备份管理,由用户自行负责,本软件不负责工程配置文件的版本管理
3.配置采集
2.1在采集端空白处右键单击,然后选择"新建协议"
2.2选择要采集的协议,并点击确定
2.3.右键刚才创建的节点,选择"新建采集端驱动"
2.4.在弹出窗口配置具体的"驱动信息"
- 串口号:选择网关连接仪表的 com 口;
- 串口参数:与被采集仪表保持一致;采集默认参数为:波特率:2400,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
- 轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
2.5.右键刚才创建的节点,选择"新建设备"
2.6.在弹出的界面,配置具体的"设备属性"
- 启用此设备:未启用的点不参与读取,但算入上限(此时该设备下的标签可在任务端视为只写不读)
2.7.右键刚才创建的节点,选择"新建组"
2.8.在弹出的界面,配置具体的组属性
读端执行周期:以轮为单位,可以实现在"驱动层已确定周期的情况下,调节不同组的采集周期"
- 根据实际现场,对采集标签的优先级进行"轮次"的调整,可以大幅降低对被采集端的资源占用
读取异常限制:
- 无限制:该组下的标签即便出错,下次也继续尝试采集
- 次数限制:该组下所有标签,在达到出错次数限制后,将停止数据采集
- 读取异常限定次数:配合读取异常限制选项,设定该组下采集标签允许的"出错次数"
- 读取出错重试次数:允许出错后,再次执行一次出错标签的采集操作;未启用此选项时,默认操作是执行下一个标签的采集
- 每日出错重置:允许指定某个整点的小时,重置已出错的计次,将允许因为出错次数达到上限的采集点,再次尝试采集操作
- 组前执行间隔时间:在执行该组前的延迟等待间隔,单位毫秒
- 组间执行间隔时间:该组内部,执行1个最小采集单元后,切换到下一个最小采集单元的延迟等待间隔,单位毫秒
2.9.右键刚才创建的节点,选择"新建采集标签"
2.10.采集标签配置,并点击确定
- 最大值/最小值:仅对数值类型有效,请勿超出数据类型的上限/下限
2.11.批量修改
选中多条标签,右键选择"批量修改"
在下图弹出的界面中,确定要修改的内容
4.采表标签的excel导入导出
- 已支持模版导入的协议,不支持excel导入导出
- 对导出excel修改时,如无参考示例,请预先配置相关类型的采集标签后,再进行导出修改
5.配置从站端
此端功能允许将网关作为"协议从站",允许网络中其他机器主动读取其数据
5.1.单击左侧下拉列表,选择"从站配置",并配置具体的从站属性
- 在确认设置后,请务必点击"检测并保存"按钮,将信息更新至内部缓存中
- RTU设置:用户连接网关的COM口和网关进行通讯
- TCP设置:用户连接网关的指定端口和网关进行通讯
- DTU设置:网关连接的指定的DTU云平台,用户通过云平台和网关进行通讯
5.2.选择要映射的寄存器类型,并右键"新增映射点"
5.3.在弹出的界面中,选择具体需要映射的点,并点击确定
6.配置数据转发
此端允许将网关的数据,转发到特定的通道上
6.1.单击左侧下拉列表,选择"转发端",并选择需要转发的端,右键对其设置
6.2.在弹出的界面,配置具体的转发端属性,并点击确定
6.3.继续右键刚才的节点,选择"新建上传点"
6.4.在弹出的界面,选择要上传的点,并点击确定
6.5.完成后效果如下图
7.MQTT配置
此端功能和转发端类似,不过底层实现是MQTT协议
7.1.单击左侧下拉列表,选择"MQTT配置",并选择具体的栏目,右键"新建设备"
72.在弹出的界面中,完成具体的设置并点击确定
7.3.右键刚才创建的节点,选择"新建组"
7.4.在弹出的界面完成组设置,并点击确定
7.5.右键刚才创建的节点,选择"新建MQTT上传点"
7.6.在弹出的界面中,勾选要上传的点,并点击确定
7.7.配置完成后的效果图:
8.配置网关
8.1.配置远程网关界面的打开
通过菜单栏→配置→搜索匹配网关,打开下图界面
- 网关默认IP:192.168.1.230,默认密码:123456,
- 请务必对初始密码进行修改,由于未修改初始密码而造成的任何损失,我司不承担由此引起的相关责任
上传至远程:将本地的配置文件,传输给网关,以运行的配置文件
- 执行此操作后,新旧配置文件中相同采集标签的含义可能发生变化,通过接口返回ID信息,其时间有效性是从当前时间开始的
下载到本地:获取网关中当前运行配置文件的版本
- 网络配置:允许对网关的网络进行配置及测试
- 密码变更:对网关的密码进行修改,网关初始密码为123456
- 网关启停:查看/控制网关的运行
- 网关信息:当前运行配置文件中的一些只读信息
- 获取监控:开启监控前,用户需手工获取监控模版
- 时间配置:允许用户对网关当前时间进行查看/更改
8.2.网络配置
在8.1图界面,单击"网络配置",弹出下图窗口,允许用户配置网关的网口信息
- 请核验DNS配置,此项会影响使用域名解析的功能
- 更改控制器IP后,如需执行重启操作,请等待5秒以上,否则可能因为网卡配置尚未保存,导致控制器IP丢失而无法连接
查看4G,无信号时,输出结果如下图
查看4G,有信号时,输出结果如下图
- 启用4G通讯时,4G路由将作为系统的主路由,此时Lan口不支持跨网段访问
- 请在网关未上电前插入SIM卡,请勿在网关已上电时进行SIM卡的更换
允许查看网关是否能够与指定IP通讯,能够与指定端口通讯
8.3时间配置
在8.1的图中单击"时间配置"或通过菜单栏→配置→NTP时间服务器配置,打开下图界面
- 请先获取网关时间,网关时间与当前电脑时间落差超过30分钟时,会导致密码校验失败
在调试环境,推荐使用"同步本机时间",初步设置网关时间,此时会关闭NTP服务的运行
- 对生产环境的网关修改时间,可能会导致干扰任务端等其他程序的正常执行,请谨慎执行此操作
在生产环境,建议指定稳定的NTP服务器,实现同步
9.监控网关
9.1.采集监控
通过菜单栏→配置→搜索匹配网关,打开下图界面,并如下图中进行操作
选中监控数据,右键进行下图操作
- 监控模式的启动仅和"数据采集"栏有关
9.2.转发端监控
请按照下图流程,检查转发端的运行情况
9.3.任务端监控
请按照下图流程,查看任务的执行概况
9.4.告警端监控
请按照下图流程,查看告警记录
数据采集
CJ/T188
此协议适用于读取RS485接口的设备采集,如需 接入M-Bus水表时需要借助M-Bus转RS485转换器与仪表进行通讯
- 支持但不限于以下厂商:
- 艾美科
- 京冠
- 山东智泉
- 宁波牌水表
- 兴源仪表
- 正泰水表
- 富牛水表
- 连利
- 天罡
- 丹佛斯
- 爱家
- 海德瑞
- 嘉洁能
- 威盛
- 海林
- 沈阳佳德
1.1.驱动配置
- 串口号:选择网关连接仪表的 com 口
串口参数:与被采集仪表保持一致;采集默认参数为:波特率:2400,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
1.2.设备属性设置
仪表类型:
仪表 | 代码 |
---|---|
冷水水表 | 10H |
热水表/生活热水水表 | 11H |
直饮水水表 | 12H |
中水水表 | 13H |
热量表(计热表) | 20H |
热量表(计冷表) | 21H |
燃气表 | 30H |
电度表 | 40H |
设备ID:14位的表盘ID,一般由厂商ID+表盘地址组成,不足14位时,在表盘地址前补0
- 请预先和仪表供应商确认,部分厂商的表盘ID是由14位表盘组成
超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 前导符FE个数:默认4
- 终止符FC个数:默认0,部分热表可能需要终止符数量,请与热表厂商核实
1.3.采集标签配置
寄存器类型:主要分为"水表","冷热表","热表"三类
- "水表:写阀门"寄存器是只写寄存器,其结果需要通过配置"水表:读计量数据:阀门状态"采集标签得知
数据标识项:和寄存器类型相匹配,允许在采集时,颠倒"字节序",如"901F"变更为"1F90"
数据长度:只读参数,供用户核验采集项是否和设备设备相匹配
(发)控制码:做数据采集时,此控制码默认为01,请勿进行修改;当寄存器类型为"水表:写阀门"时,控制码推荐2A或04
数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
数据类型:该协议默认存储数据类型为Double(8BYTE)
1.4.补充知识
1.如何填写设备ID
以下仅供参考,具体的方式请参阅设备文档,或咨询设备供应商
下图设备的设备ID:20211039861031
下图设备表地址是后面8位,厂商代码是000000,设备ID:00000010263431
2.默认的通讯参数
传统的MBUS接口的通讯参数是2400,8,E,1
Modbus接口的通讯参数为9600,8,E,1,请勿使用9600,8,N,1通讯,可能会导致通讯失败
DLT645 1997
1.1.驱动设置
- 串口号:选择网关连接仪表的 com 口;
串口参数:与被采集仪表保持一致;采集默认参数为:波特率:1200,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
1.2.设备属性设置
- 设备ID:12位的电表地址:请通过表盘观察,或使用设备厂商提供的软件测试得知
- 999999999999为广播地址,在采集串口中仅有1个设备时使用
- 超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 更多设置:此协议暂不支持此选项
1.3.采集标签配置
此协议配置允许通过右键一次性装载模版,无需用户单独配置采集项
采集标签设置如下图
寄存器类型:97规约常见的采集项
- 如需添加额外的监控项,请联系开发者,我们将在后续的版本中进行补充
- 此协议不支持组包,请适量配置监控项数量,过多的监控项会导致串口链路采集变慢
数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:该协议默认存储数据类型为Double(8BYTEs)
1.4.补充知识
1.部分电表采集不稳定怎么处理:
原因:部分电表在首次读取时,存在唤醒失败的情况
- 增加设备连接超时为1999
- 设置"读取出错重试次数"至少为1:
DLT645 2007
1.1.驱动设置
- 串口号:选择网关连接仪表的 com 口;
串口参数:与被采集仪表保持一致;采集默认参数为:波特率:2400,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
1.2.设备属性设置
- 设备ID:12位的电表地址:请通过表盘观察,或使用设备厂商提供的软件测试得知
- 999999999999为广播地址,在采集串口中仅有1个设备时使用
- 超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 前导符个数:0-4可选,默认4
- 操作者代码:07规约开合闸所需,由8位字符组成,默认00000000
- 密码:07规约开合闸所需,由6位字符组成,默认000000
1.3.采集标签配置
此协议配置允许通过右键一次性装载模版,无需用户单独配置采集项
采集标签设置如下图
寄存器类型:07规约常见的采集项
- 阀门控制,寄存器类型为"读/写"
- 如需添加额外的监控项,请联系开发者,我们将在后续的版本中进行补充
- 此协议不支持组包,请适量配置监控项数量,过多的监控项会导致串口链路采集变慢
数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:该协议默认存储数据类型为Double(8BYTE)
DLT698.45
1.1.驱动设置
- 串口号:选择网关连接仪表的 com 口;
串口参数:与被采集仪表保持一致;采集默认参数为:波特率:9600,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
1.2.设备属性设置
- 设备ID:12位的电表地址:请通过表盘观察,或使用设备厂商提供的软件测试得知
- 999999999999为广播地址,在采集串口中仅有1个设备时使用
- 超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 读取方式
- 普通读取:仅支持读取电能量
- 安全读取:支持读取电流、电压等变量
- 安全读取_组包:允许批量读取
- 组包数量:仅在读取方式为"安全读取_组包"时有效,推荐值20
1.3.采集标签配置
此协议配置允许通过右键一次性装载模版,无需用户单独配置采集项
采集标签设置如下图
寄存器类型:698规约常见的采集项,暂不支持"需量"类型的采集;
- 如需添加额外的监控项,请联系开发者,我们将在后续的版本中进行补充
- 寄存器类型为"自定义采集"时,用户可以根据协议手册对采集项进行"微调"
对象标识OI:表示具体的采集项
- 属性:表示采集的是属性值第几项
- 索引:当读取内容为数组时,表示读取的是第几项
- 换算:由DLT698规约文档定义,决定取值运算方式
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:该协议默认存储数据类型为Double(8BYTE)
IEC 101 balanced
1.1.驱动设置
- 串口号:选择网关连接仪表的 com 口;
- 串口参数:与被采集仪表保持一致;采集默认参数为:波特率:1200,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
- 总召周期:对所有在节点下的设备发起总召的周期,101平衡模式推荐值300秒
- (本机)链路地址:网关作为主站进行数据采集时的链路地址,不和被采集端设备重合即可
- (从站)链路地址:被采集设备的链路地址
- 链路地址字节数长度:默认2
- 传送原因字节数:默认1
- ASDU地址字节数:也称为公共地址字节数,默认2
- 信息体字节数:默认2
- 使用单字节ACK:默认不启用
1.2.设备属性设置
- 设备ID:主站的更改地址,范围1-65535,其中65535是广播地址
- 写请求类型:
- 直接执行:速度更快
- 选择执行:速度略慢,安全性更高
1.3采集标签配置
- 寄存器类型:IEC104寄存器类型
- 遥信(单点):M_SP_NA_1、M_SP_TA_1、M_SP_TB_1
- 遥信(双点):M_DP_NA_1、M_DP_TA_1、M_DP_TB_1
- 遥测(归一化):M_ME_NA_1、M_ME_TA_1、M_ME_ND_1、M_ME_TD_1
- 遥测(标度化):M_ME_NB_1、M_ME_TB_1、M_ME_TE_1
- 遥测(短浮点):M_ME_NC_1、M_ME_TC_1、M_ME_TF_1
- 遥控(单点):C_SC_NA_1
- 遥控(双点):C_DC_NA_1
- 遥调(归一化):C_SE_NA_1
- 遥调(标度化):C_SE_NB_1
- 遥调(短浮点):C_SE_NC_1
- 遥脉(电度):M_IT_NA_1、M_IT_TA_1、M_IT_TB_1
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:该协议默认存储数据类型为Float(4BYTE)
- 地址:在104中称为信息体地址,即要采集的标签地址
IEC101协议中信息对象类型和网关中寄存器类型的关系:
IEC101协议中信息对象类型 | 说明 | (配置软件)寄存器类型 | 是否响应总召 |
---|---|---|---|
M_SP_NA_1 | 单点信息 | 遥信(单点) | √ |
M_SP_TA_1 | 带时标的单点信息 | 遥信(单点) | × |
M_SP_TB_1 | 带CP56Time2a时标的单点信息 | 遥信(单点) | × |
M_DP_NA_1 | 双点信息 | 遥信(双点) | √ |
M_DP_TA_1 | 带CP24Time2a时标的双点信息 | 遥信(双点) | × |
M_DP_TB_1 | 带CP56Time2a时标的双点信息 | 遥信(双点) | × |
M_ME_NA_1 | 测量值,归一化值 | 遥测(归一化) | √ |
M_ME_TA_1 | 测量值,带时标的归一化值 | 遥测(归一化) | × |
M_ME_ND_1 | 测量值,不带品质描述词的归一化值 | 遥测(归一化) | × |
M_ME_TD_1 | 带CP56Timc2a时标的测量值,归一化值 | 遥测(归一化) | × |
M_ME_NB_1 | 测量值,标度化值 | 遥测(标度化) | √ |
M_ME_TB_1 | 测量值,带时标的标度化值 | 遥测(标度化) | × |
M_ME_TD_1 | 带CP56Timc2a时标的测量值,归一化值 | 遥测(标度化) | × |
M_ME_NC_1 | 测量值,短浮点数 | 遥测(短浮点) | √ |
M_ME_TC_1 | 测量值,带时标的短浮点数 | 遥测(短浮点) | × |
M_ME_TF_1 | 带CP56Time2a时标的测量值,短浮点数 | 遥测(短浮点) | × |
C_SC_NA_1 | 单点命令 | 遥控(单点) | × |
C_DC_NA_1 | 双点命令 | 遥控(双点) | × |
C_SE_NA_1 | 设定值命令,归一化值 | 遥调(归一化) | × |
C_SE_NB_1 | 设定值命令,标度化值 | 遥调(标度化) | × |
C_SE_NC_1 | 设定值命令,短浮点数 | 遥调(短浮点) | × |
M_IT_NA_1 | 累计量 | 遥脉(电度) | √ |
M_IT_TA_1 | 带时标的累计量 | 遥脉(电度) | × |
M_IT_TB_1 | 带CP56Time2a时标的累计量 | 遥脉(电度) | × |
IEC101默认参考寄存器范围:
注:如果系统中“信息体地址”是从0开始,请自行参考下标,换算出真实的起始地址
类别 | 97版 | 02版 |
---|---|---|
遥信(单点、双点) | 1H~400H(1~1024) | 1H~4000H(1~16384) |
遥测(归一化、标度化、短浮点) | 701H~900H(1793~2304) | 4001H~5000H(16385~20480) |
遥控(单点、双点) | B01H~B80H(2817~2944) | 6001H~6100H(24577~24832)) |
遥调(归一化、标度化、短浮点) | B81H~C00H(2945~3072) | 6201H~6400H(25089~25600) |
遥脉(电度) | C01H~C80H(3073~3200) | 6401H~6600H(25601~26112) |
注:设备对象中大多数值都是受保护的,并不支持直接修改,可以考虑通过遥控的方式,对映射的值进行修改
IEC 101 unbalanced
1.1.驱动设置
- 串口号:选择网关连接仪表的 com 口;
- 串口参数:与被采集仪表保持一致;采集默认参数为:波特率:1200,8,E,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
- 总召周期:对所有在节点下的设备发起总召的周期,101平衡模式推荐值300秒
- (从站)链路地址:被采集设备的链路地址(如需采集多个从站,请创建多个此驱动)
- 链路地址字节数长度:默认2
- 传送原因字节数:默认1
- ASDU地址字节数:也称为公共地址字节数,默认2
- 信息体字节数:默认2
1.2.设备属性设置
- 设备ID:主站的更改地址,范围1-65535,其中65535是广播地址
- 写请求类型:
- 直接执行:速度更快
- 选择执行:速度略慢,安全性更高
1.3.采集标签配置
- 寄存器类型:IEC104寄存器类型
- 遥信(单点):M_SP_NA_1、M_SP_TA_1、M_SP_TB_1
- 遥信(双点):M_DP_NA_1、M_DP_TA_1、M_DP_TB_1
- 遥测(归一化):M_ME_NA_1、M_ME_TA_1、M_ME_ND_1、M_ME_TD_1
- 遥测(标度化):M_ME_NB_1、M_ME_TB_1、M_ME_TE_1
- 遥测(短浮点):M_ME_NC_1、M_ME_TC_1、M_ME_TF_1
- 遥控(单点):C_SC_NA_1
- 遥控(双点):C_DC_NA_1
- 遥调(归一化):C_SE_NA_1
- 遥调(标度化):C_SE_NB_1
- 遥调(短浮点):C_SE_NC_1
- 遥脉(电度):M_IT_NA_1、M_IT_TA_1、M_IT_TB_1
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:该协议默认存储数据类型为Float(4BYTE)
- 地址:在104中称为信息体地址,即要采集的标签地址
IEC101协议中信息对象类型和网关中寄存器类型的关系:
IEC101协议中信息对象类型 | 说明 | (配置软件)寄存器类型 | 是否响应总召 |
---|---|---|---|
M_SP_NA_1 | 单点信息 | 遥信(单点) | √ |
M_SP_TA_1 | 带时标的单点信息 | 遥信(单点) | × |
M_SP_TB_1 | 带CP56Time2a时标的单点信息 | 遥信(单点) | × |
M_DP_NA_1 | 双点信息 | 遥信(双点) | √ |
M_DP_TA_1 | 带CP24Time2a时标的双点信息 | 遥信(双点) | × |
M_DP_TB_1 | 带CP56Time2a时标的双点信息 | 遥信(双点) | × |
M_ME_NA_1 | 测量值,归一化值 | 遥测(归一化) | √ |
M_ME_TA_1 | 测量值,带时标的归一化值 | 遥测(归一化) | × |
M_ME_ND_1 | 测量值,不带品质描述词的归一化值 | 遥测(归一化) | × |
M_ME_TD_1 | 带CP56Timc2a时标的测量值,归一化值 | 遥测(归一化) | × |
M_ME_NB_1 | 测量值,标度化值 | 遥测(标度化) | √ |
M_ME_TB_1 | 测量值,带时标的标度化值 | 遥测(标度化) | × |
M_ME_TD_1 | 带CP56Timc2a时标的测量值,归一化值 | 遥测(标度化) | × |
M_ME_NC_1 | 测量值,短浮点数 | 遥测(短浮点) | √ |
M_ME_TC_1 | 测量值,带时标的短浮点数 | 遥测(短浮点) | × |
M_ME_TF_1 | 带CP56Time2a时标的测量值,短浮点数 | 遥测(短浮点) | × |
C_SC_NA_1 | 单点命令 | 遥控(单点) | × |
C_DC_NA_1 | 双点命令 | 遥控(双点) | × |
C_SE_NA_1 | 设定值命令,归一化值 | 遥调(归一化) | × |
C_SE_NB_1 | 设定值命令,标度化值 | 遥调(标度化) | × |
C_SE_NC_1 | 设定值命令,短浮点数 | 遥调(短浮点) | × |
M_IT_NA_1 | 累计量 | 遥脉(电度) | √ |
M_IT_TA_1 | 带时标的累计量 | 遥脉(电度) | × |
M_IT_TB_1 | 带CP56Time2a时标的累计量 | 遥脉(电度) | × |
IEC101默认参考寄存器范围:
注:如果系统中“信息体地址”是从0开始,请自行参考下标,换算出真实的起始地址
类别 | 97版 | 02版 |
---|---|---|
遥信(单点、双点) | 1H~400H(1~1024) | 1H~4000H(1~16384) |
遥测(归一化、标度化、短浮点) | 701H~900H(1793~2304) | 4001H~5000H(16385~20480) |
遥控(单点、双点) | B01H~B80H(2817~2944) | 6001H~6100H(24577~24832)) |
遥调(归一化、标度化、短浮点) | B81H~C00H(2945~3072) | 6201H~6400H(25089~25600) |
遥脉(电度) | C01H~C80H(3073~3200) | 6401H~6600H(25601~26112) |
注:设备对象中大多数值都是受保护的,并不支持直接修改,可以考虑通过遥控的方式,对映射的值进行修改
IEC104
1.1.驱动设置
- IP地址:要采集设备的IP地址
- 端口号:要采集设备的端口号,默认2404
- 总召周期:多长时间发起总召,收集从站端的数据
- 遥控、遥调不响应总召,该2类寄存器,仅在被设置后,采集值才有意义
- 带时间戳的遥信、遥测、遥脉不响应总召
- 不响应总召的寄存器类型,仅在其值发生了更改后,才能够采集到其最新值
- 链路超时(链路稳定性有关,需要与被采集设备相匹配,如无必要请勿设置)
- K:未确认的最大发送帧数
- W:收到w个报文后,要给从站发送确认帧
- t0:连接超时时间,单位秒
- t1:I帧U帧等待确认时间,单位秒
- t2:I帧发送确认帧时间,单位秒
- t3:发送链路测试帧时间,单位秒
- 传输原因字节数:默认2,其他值:1
- ASDU地址字节数:默认2,其他值:1
- 信息体字节数:默认3,其他值:1或2
1.2.设备属性设置
设备ID:主站的更改地址,范围1-65535,其中65535是广播地址
写请求类型:
- 直接执行:速度更快
- 选择执行:速度略慢,安全性更高
1.3.采集标签配置
- 寄存器类型:IEC104寄存器类型
- 遥信(单点):M_SP_NA_1、M_SP_TA_1、M_SP_TB_1
- 遥信(双点):M_DP_NA_1、M_DP_TA_1、M_DP_TB_1
- 遥测(归一化):M_ME_NA_1、M_ME_TA_1、M_ME_ND_1、M_ME_TD_1
- 遥测(标度化):M_ME_NB_1、M_ME_TB_1、M_ME_TE_1
- 遥测(短浮点):M_ME_NC_1、M_ME_TC_1、M_ME_TF_1
- 遥控(单点):C_SC_NA_1
- 遥控(双点):C_DC_NA_1
- 遥调(归一化):C_SE_NA_1
- 遥调(标度化):C_SE_NB_1
- 遥调(短浮点):C_SE_NC_1
- 遥脉(电度):M_IT_NA_1、M_IT_TA_1、M_IT_TB_1
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:该协议默认存储数据类型为Float(4BYTE)
- 地址:在104中称为信息体地址,即要采集的标签地址
IEC104协议中信息对象类型和网关中寄存器类型的关系:
IEC104协议中信息对象类型 | 说明 | (配置软件)寄存器类型 | 是否响应总召 |
---|---|---|---|
M_SP_NA_1 | 单点信息 | 遥信(单点) | √ |
M_SP_TA_1 | 带时标的单点信息 | 遥信(单点) | × |
M_SP_TB_1 | 带CP56Time2a时标的单点信息 | 遥信(单点) | × |
M_DP_NA_1 | 双点信息 | 遥信(双点) | √ |
M_DP_TA_1 | 带CP24Time2a时标的双点信息 | 遥信(双点) | × |
M_DP_TB_1 | 带CP56Time2a时标的双点信息 | 遥信(双点) | × |
M_ME_NA_1 | 测量值,归一化值 | 遥测(归一化) | √ |
M_ME_TA_1 | 测量值,带时标的归一化值 | 遥测(归一化) | × |
M_ME_ND_1 | 测量值,不带品质描述词的归一化值 | 遥测(归一化) | × |
M_ME_TD_1 | 带CP56Timc2a时标的测量值,归一化值 | 遥测(归一化) | × |
M_ME_NB_1 | 测量值,标度化值 | 遥测(标度化) | √ |
M_ME_TB_1 | 测量值,带时标的标度化值 | 遥测(标度化) | × |
M_ME_TD_1 | 带CP56Timc2a时标的测量值,归一化值 | 遥测(标度化) | × |
M_ME_NC_1 | 测量值,短浮点数 | 遥测(短浮点) | √ |
M_ME_TC_1 | 测量值,带时标的短浮点数 | 遥测(短浮点) | × |
M_ME_TF_1 | 带CP56Time2a时标的测量值,短浮点数 | 遥测(短浮点) | × |
C_SC_NA_1 | 单点命令 | 遥控(单点) | × |
C_DC_NA_1 | 双点命令 | 遥控(双点) | × |
C_SE_NA_1 | 设定值命令,归一化值 | 遥调(归一化) | × |
C_SE_NB_1 | 设定值命令,标度化值 | 遥调(标度化) | × |
C_SE_NC_1 | 设定值命令,短浮点数 | 遥调(短浮点) | × |
M_IT_NA_1 | 累计量 | 遥脉(电度) | √ |
M_IT_TA_1 | 带时标的累计量 | 遥脉(电度) | × |
M_IT_TB_1 | 带CP56Time2a时标的累计量 | 遥脉(电度) | × |
IEC104默认参考寄存器范围:
注:如果系统中“信息体地址”是从0开始,请自行参考下标,换算出真实的起始地址
类别 | 97版 | 02版 |
---|---|---|
遥信(单点、双点) | 1H~400H(1~1024) | 1H~4000H(1~16384) |
遥测(归一化、标度化、短浮点) | 701H~900H(1793~2304) | 4001H~5000H(16385~20480) |
遥控(单点、双点) | B01H~B80H(2817~2944) | 6001H~6100H(24577~24832)) |
遥调(归一化、标度化、短浮点) | B81H~C00H(2945~3072) | 6201H~6400H(25089~25600) |
遥脉(电度) | C01H~C80H(3073~3200) | 6401H~6600H(25601~26112) |
注:设备对象中大多数值都是受保护的,并不支持直接修改,可以考虑通过遥控的方式,对映射的值进行修改
IEC 61850 MMS_Client
此协议适用于读取智能变电站中的IED设备
1.1.驱动设置
- IP地址:要采集设备的IP地址
- 端口号:要采集设备的端口号,默认102
- 轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
- 密码:如果对端开启密码认证,则填入此参数
- (控制)同期检查:此选项仅针对数据类型为"Direct Control"或"Select Control"
- (控制)互斥检查:此选项仅针对数据类型为"Direct Control"或"Select Control"
- (控制)测试模式:此选项仅针对数据类型为"Direct Control"或"Select Control"
- (控制)验证读取ST更新状态:此选项仅针对数据类型为"Direct Control"或"Select Control"
1.2.设备属性设置
- 超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 读取方式:单读和组包,推荐使用组包
1.3.采集标签配置
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:请根据提供的表格自适应匹配寄存器类型
- 地址:地址格式LDName/LNName$FC$DataObjectName$DataAttrName,如PRS778PROT/TCTR13$CF$ARtg$maxVal$f,允许多层DataObjectName
配置软件中数据类型和实际IEC61850中数据类型的关联:
(配置软件)数据类型 | 实际匹配的数据类型 |
---|---|
Boolean(BOOL 0/1) | BOOLEAN |
Integer(4BYTE -2147483648~+2147483647) | INTEGER |
Unsigned Integer(4BYTE 0~4294967295) | UNSIGNED |
Float(4BYTE) | FLOAT |
Double(8BYTE) | FLOAT |
Binary_Time(Unsigned Inter) | BINARY_TIME |
Binary_Time(String) | BINARY_TIME |
UTC_Time(Unsigned Inter) | UTC_TIME |
UTC_Time(String) | UTC_TIME |
String | VISIBLE_STRING |
Bit String | BIT_STRING |
Octet String | OCTET_STRING |
String UTF-8 | STRING |
Direct Control(Enhanced Security) | 安全的直接控制 |
Select Control(Enhanced Security) | 安全的选择控制 |
常见函数约束(FC)参考
函数约束 | 说明 |
---|---|
ST | 状态信息(遥信) |
MX | 测量值(模拟值,遥测) |
CO | 控制(遥控) |
SP | 设点(遥调) |
SV | 取代 |
CF | 配置 |
DC | 描述 |
SG | 定值组 |
SE | 可编辑定值组 |
EX | 扩展定义 |
BR | 缓存报告块 |
RP | 非缓存报告块 |
LG | 日志 |
GO | GOOSE控制块 |
MS | 多路广播采样值控制 |
US | 点对点广播采样值控制 |
注:不支持对函数约束"GS"的采集,SR,OR,BL为非常用函数约束,此处不进行说明
ModbusRTU
1.1.驱动设置
该协议支持标准的modbus在串口链路上的采集
- 串口号:选择网关连接仪表的 com 口;
串口参数:与被采集仪表保持一致;采集默认参数为:波特率:9600,8,N,1
- 校验位:NONE表示无效验,EVEN表示偶效验,ODD表示奇效验
轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
1.2.设备属性设置
- 设备ID:modbus的设备ID,范围1-254
- 超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 读端组包:启用后,网关将自动对要采集的数据,做最优化的组包采集
- 数字量组包长度:针对DI/DO类型,在地址连续时,一次性至多读取的数量
- 模拟量组包长度:针对AI/AO类型,在地址连续时,一次性至多读取的数量
1.3.采集标签配置
- 寄存器类型:modbus寄存器类型
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:modbus默认数据类型为2BYTE,也支持int,float,double等数据类型的采集
- 寄存器地址:范围0-65535
- 当数据类型为2BYTE时,请保持地址间隔为1,如:1,2,3,4,5
- 当数据类型为4BYTE时,请保持地址间隔为2,如:1,3,5,7,9
- 当数据类型为8BYTE时,请保持地址间隔为4,如:1,5,9,13
- 字节顺序:允许颠倒大小端,需要和被采集的设备的字节顺序类型一致
ModbusTCP
1.1.驱动设置
该协议支持标准的modbus在网络链路上的采集
- IP地址:要采集设备的IP地址
- 端口号:要采集设备的端口号,默认502
- 轮询周期:对所有在节点下的采集点,如果实际采集时间超过预设值,则该周期设定将失效
- 连接操作:首次与采集设备建立TCP驱动链接时的连接超时,非采集超时
1.2.设备属性设置
- 设备ID:modbus的设备ID,范围1-254
- 超时时间:默认999,单位毫秒,如果部分设备响应过慢,可设置为2000
- 读端组包:启用后,网关将自动对要采集的数据,做最优化的组包采集
- 数字量组包长度:针对DI/DO类型,在地址连续时,一次性至多读取的数量
- 模拟量组包长度:针对AI/AO类型,在地址连续时,一次性至多读取的数量
1.3.采集标签配置
- 寄存器类型:modbus寄存器类型
- 数值转换倍率:允许对原值进行浮点数的运算,默认值1不修改原值
- 数据类型:modbus默认数据类型为2BYTE,也支持int,float,double等数据类型的采集
- 寄存器地址:范围0-65535
- 当数据类型为2BYTE时,请保持地址间隔为1,如:1,2,3,4,5
- 当数据类型为4BYTE时,请保持地址间隔为2,如:1,3,5,7,9
- 当数据类型为8BYTE时,请保持地址间隔为4,如:1,5,9,13
- 字节顺序:允许颠倒大小端,需要和被采集的设备的字节顺序类型一致
从站
Modbus从站
1.从站属性设置
此服务允许将网关作为"modbus slave",用户通过modbus主站来进行访问,支持3种模式:RTU/TCP/DTU
RTU设置:
- 启用:是否在串口链路上启用RTU从站
- 串口:侦听哪个串口,并做出想要的响应,此时该COM口不能被配置采集标签
- 写接口:是否允许对端设备通过此接口来进行"modbus的写操作"
TCP设置:
- 启用:是否在网络链路上启用TCP从站
- 写接口:是否允许对端设备通过此接口来进行"modbus的写操作"
- 端口号:将占用网关内部哪个端口,作为侦听modbus从站
- 端口8080-8099,为系统预置端口范围,请勿和该范围端口冲突
DTU设置:
- 启用与否:是否在网络链路上启用DTU功能
- 写接口:是否允许对端设备通过此接口来进行"modbus的写操作"
- 协议类型:在建立DTU通讯过程中,通讯双方约定的报文类型
- 服务器IP:DTU服务器的远程ID,支持域名格式
- 服务器端口:DTU服务器的端口号
- 超时:首次与DTU模式建立连接的超时
- 注册帧:在首次建立连接时,发送给DTU服务器的信息,长度至多300个英文字符
- 注册帧格式:ASCII/HEX,当注册帧格式为HEX,请保持格式为12 34 56 78,即12表示12H
- 心跳帧:在保持和服务器连接过程中,周期性保活的心跳报文
- 心跳帧格式:ASCII/HEX,当注册帧格式为HEX,请保持格式为12 34 56 78,即12表示12H
- 心跳周期:0表示禁用,推荐60,单位秒
2.从站标签配置
在指定区域,选择导入的标签,右键选择"批量修改"
在弹出的界面,进行如下操作
3.对接ThingsCloud云平台
以下文档适用于DTU模式连接ThingsCloud云平台
也可以参考ThingsCloud的官方文档:https://www.thingscloud.xyz/docs/tutorials/modbus-config/modbus-cloud-config-common.html
1.通过下图流程,创建设备
- 设备→设备类型→创建设备类型
2.查看连接信息
- 设备→所有设备→连接→设备端TCP接入点
2.添加属性
- 设备→设备类型→功能定义
属性类型
- 设备上报:网关只能向云端上传数据,云端无法下发数据给网关
- 云端下发:网关无法向云端上传数据,但云端可以下发数据给网关
- 设备云端共享:网关可以向云端上传数据,云端也可以下发数据给网关
以此添加4个如下图的属性
3.配置modbus属性
- 设备→设备类型→Modbus配置
4.创建任务,实现云端能够采集底层数据
- 设备→设备类型→任务
5.返回概览处查看数据
- 设备→所有设备→概览
数据转发
HTTP客户端
- 网关名:请务必确保每个网关中,该名称是全局唯一的
1.1.实时数据配置
- 启用与否:是否启用HTTP实时数据上传功能
- 接口类型:POST/GET
- 超时:HTTP请求的超时时间
- 变值更新:仅在数据值发生变化时,才进行上传操作
- 推荐此选项,降低网络传输开销
- 周期:向实时接口推送数据的周期
- 定时发送:多长时间发送一次全部数据,无论值是否发生变更
- 实时URL:接收网关推送数据的接口地址
- 需要上传的数据点,请用户在完成上述配置后,再自行配置
1.2.控制接口配置
- 启用与否:是否启用HTTP控制接口的功能
- 接口类型:POST/GET
- 超时:HTTP请求的超时时间
- 执行间隔:如果下发内容包含多个时,设置下一个子对象前的休眠
- 执行记录:经过控制接口成功执行的操作,是否记录在本地
- 在控制频繁的场景下,不推荐开启此选项
- 控制URL:接收网关的询问请求,以及回复结果的接口
- 此端控制点无需配置,只需要下发的控制ID在网关内存在即可
1.3.接口的数据格式
GET/POST方式,Body数据格式:
[
{
"gateway": "gw1",
"id": "Group1_Tag1",
"rinfo": "读取成功",
"rvalue": "17.230000",
"rstatus": "ok",
"rtime": 1739931138
},
{
"gateway": "gw1",
"id": "Group1_Tag2",
"rinfo": "读取成功",
"rvalue": "0.000000",
"rstatus": "ok",
"rtime": 1739931138
}
]
控制接口
下发内容
[
{
"Id":"Group1_Tag1",
"Type":"write",
"Setv":"999"
},
{
"Id":"Group1_Tag2",
"Type":"write",
"Setv":"334"
}
]
正确回复:
[
{
"gateway":"gw1",
"id": "Group5_CTag_49",
"wstatus": "ok",
"wtime": 1739936081,
"err": ""
},
{
"gateway": "gw1",
"id": "Group8_CTag_49",
"wstatus": "ok",
"wtime": 1739936083,
"err": ""
}
]
错误回复:
[
{
"gateway": "gw1",
"id": "group9_A0",
"wstatus": "no",
"wtime": 1739935416,
"err": "此协议不支持写操作"
},
{
"gateway": "gw1",
"id": "group1_A2",
"wstatus": "no",
"wtime": 1739935416,
"err": "请求ID不存在内部对象表中"
}
]
1.4.测试工具
- 在官网下载"HTTP-服务端模拟工具",或者使用下述代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'D:\WinPyQt5.9-32bit-3.5.3.1\ecric6pwd\gateway\tools\http_server.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread,pyqtSignal
from PyQt5.QtWidgets import QMessageBox
import http.server
class MyHandler(http.server.BaseHTTPRequestHandler):
qthread_http=None
ctl_value=None
real=None
ctl=None
def my_init(qthread_http):
MyHandler.qthread_http=qthread_http
#统一错误时的回复
def error_response(self):
self.send_response(400)#状态码
self.wfile.write(b'{"status":"error"}')#返回消息
#尝试从http请求中,提取出"附带的数据"
def get_post_data(self):
if('Content-Length' not in self.headers):
return None
content_length = int(self.headers['Content-Length'])
if(content_length!=0):
post_data = self.rfile.read(content_length).decode('utf8')
#parsed_data = urllib.parse.parse_qs(post_data)#一般示例中,有以下"代码",不适用
return post_data
else:
return None
def return_data(self,type_str,data):
send_data={}
send_data["type"]=type_str
send_data["data"]=data
MyHandler.qthread_http._signal.emit(send_data)
#对路径进行预先判断
def operator_path(self):
if MyHandler.real !=None:
real_path='/'+ MyHandler.real
else:
real_path='/'
if MyHandler.ctl != None:
ctl_path = '/' + MyHandler.ctl
else:
ctl_path = '/'
return real_path,ctl_path
def read_ok_heads(self):
self.send_response(200)#状态码
self.send_header('Content-type', 'text/plain; charset=utf-8')
self.end_headers()
def do_GET(self):
real_path,ctl_path=self.operator_path()
print("real_path:",real_path)
print("ctl_path:",ctl_path)
if self.path == real_path:
print("GET-访问实时接口路径:",real_path)
post_data=self.get_post_data()
if(post_data==None):
print("REAL请求非法,推出");
return
print("post_data:",post_data)
self.return_data("real",post_data)
self.read_ok_heads()
elif self.path == ctl_path:
print("GET-访问控制接口路径:",ctl_path)
post_data=self.get_post_data()#获取对端请求的数据
print("post_data:",post_data)
if(post_data==None):
return
if MyHandler.ctl_value==None:#如果ui没有设置下方数据,则退出
return
self.send_response(200)#状态码
self.send_header('Content-type', 'text/plain; charset=utf-8')
self.end_headers()
if "gain_control" in post_data:#请求,下方控制内容
self.wfile.write(MyHandler.ctl_value.encode('utf-8'))#必须是字节格式
else:
self.return_data("ctl",post_data)
else:
self.error_response()
def do_POST(self):
real_path,ctl_path=self.operator_path()
print("real_path:",real_path)
print("ctl_path:",ctl_path)
#取出对方post数据的方法
if self.path == real_path:
#取出对方post数据的方法
print("POST-访问实时接口路径:",real_path)
post_data=self.get_post_data()
self.return_data("real",post_data)
self.read_ok_heads()
elif self.path == ctl_path:
print("POST-访问控制接口路径:",ctl_path)
post_data=self.get_post_data()#获取对端请求的数据
print("post_data:",post_data)
if(post_data==None):
return
if MyHandler.ctl_value==None:#如果ui没有设置下方数据,则退出
return
self.read_ok_heads()
if "gain_control" in post_data:#请求,下方控制内容
self.wfile.write(MyHandler.ctl_value.encode('utf-8'))#必须是字节格式
else:
self.return_data("ctl",post_data)
class Http_Server_Thread(QtCore.QThread):
_signal=pyqtSignal(dict)#对接接口线程的信号
def __init__(self,http_server_ui):
super().__init__()
self.http_server_ui=http_server_ui
self._signal.connect(self.http_server_ui.show_thread_view)
self.start_stop_mark="stop"
self.server_port=80
self.httpd=None
def run(self):
print("http_server thread 运行")
server_address = ('', self.server_port)
self.httpd = http.server.HTTPServer(server_address,MyHandler)
#更新回调类中的参数
MyHandler.my_init(self)
while True:
print("while循环中");
self.httpd.handle_request()
print("退出循环")
def thread_recv(self,data):
if(data["type"]=="start_stop"):
self.server_port=int(data["port"])#更新下次启动的端口
if data["ctl"]=="start":#更新启停标记
self.start_stop_mark="start"
#self.run()
self.start()
else:
self.start_stop_mark="stop"
self.httpd.server_close()
self.terminate()
self.wait()
elif data["type"]=="set_ctl_value":
print("更新下发数据")
MyHandler.ctl_value=data["ctl_value"]
print("展示主线程的数据:",data)
class Ui_Http_server(QtWidgets.QDialog):
_signal=pyqtSignal(dict)#对接接口线程的信号
def __init__(self):
super().__init__()
self.setupUi()
self.signal_connect()
self.child_thread_create()
self.qthread_http_status="no"
#子线程创建相关
def child_thread_create(self):
self.qthread_http=Http_Server_Thread(self)#创建线程对象
self.qthread_http._signal.connect(self.show_thread_view)#接受"历史线程返回的数据",进行状态提示
self.qthread_http.finished.connect(self.show_thread_stop)
self._signal.connect(self.qthread_http.thread_recv)
def signal_connect(self):
self.start_stop_pushButton.clicked.connect(self.start_stop_http)
self.send_ctl_pushButton.clicked.connect(self.set_ctl_send_data)
def setupUi(self):
self.setObjectName("Form")
self.resize(1348, 877)
self.gridLayoutWidget = QtWidgets.QWidget(self)
self.gridLayoutWidget.setGeometry(QtCore.QRect(20, 30, 1291, 811))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.server_port_label = QtWidgets.QLabel(self.gridLayoutWidget)#服务器端口的label
self.server_port_label.setObjectName("server_port_label")
self.gridLayout.addWidget(self.server_port_label, 0, 0, 1, 1)
self.server_port_lineEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)#服务器端口
self.server_port_lineEdit.setObjectName("server_port_lineEdit")
self.gridLayout.addWidget(self.server_port_lineEdit, 0, 1, 1, 1)
self.start_stop_label = QtWidgets.QLabel(self.gridLayoutWidget)#停启服务器的label
self.start_stop_label.setObjectName("start_stop_label")
self.gridLayout.addWidget(self.start_stop_label, 0, 2, 1, 1)
self.start_stop_pushButton = QtWidgets.QPushButton(self.gridLayoutWidget)#停启服务器
self.start_stop_pushButton.setObjectName("start_stop_pushButton")
self.gridLayout.addWidget(self.start_stop_pushButton, 0, 3, 1, 1)
self.upload_url_label = QtWidgets.QLabel(self.gridLayoutWidget)#上传主题是否启用
self.upload_url_label.setObjectName("upload_url_label")
self.gridLayout.addWidget(self.upload_url_label, 1, 0, 1, 1)
self.upload_lineEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)#上传主题
self.upload_lineEdit.setObjectName("upload_lineEdit")
self.gridLayout.addWidget(self.upload_lineEdit, 1, 1, 1, 1)
self.ctl_url_label = QtWidgets.QLabel(self.gridLayoutWidget)#控制主题的label
self.ctl_url_label.setObjectName("ctl_url_label")
self.gridLayout.addWidget(self.ctl_url_label, 1, 2, 1, 1)
self.ctl_url_lineEdit = QtWidgets.QLineEdit(self.gridLayoutWidget)#控制主题
self.ctl_url_lineEdit.setObjectName("ctl_url_lineEdit")
self.gridLayout.addWidget(self.ctl_url_lineEdit, 1, 3, 1, 1)
self.send_ctl_pushButton = QtWidgets.QPushButton(self.gridLayoutWidget)#下发控制主题的按钮
self.send_ctl_pushButton.setObjectName("send_ctl_pushButton")
self.gridLayout.addWidget(self.send_ctl_pushButton, 2, 0, 1, 1)
self.send_ctl_plainTextEdit = QtWidgets.QPlainTextEdit(self.gridLayoutWidget)#显示下发内容的text
self.send_ctl_plainTextEdit.setObjectName("send_ctl_plainTextEdit")
self.gridLayout.addWidget(self.send_ctl_plainTextEdit, 2, 1, 1, 1)
self.real_recv_label = QtWidgets.QLabel(self.gridLayoutWidget)#接收内容的label
self.real_recv_label.setObjectName("real_recv_label")
self.gridLayout.addWidget(self.real_recv_label, 2, 2, 2, 1)
self.real_recv_plainTextEdit = QtWidgets.QPlainTextEdit(self.gridLayoutWidget)#显示接收内容的text
self.real_recv_plainTextEdit.setObjectName("real_recv_plainTextEdit")
self.gridLayout.addWidget(self.real_recv_plainTextEdit, 2, 3, 2, 1)
self.ctl_reply_label = QtWidgets.QLabel(self.gridLayoutWidget)#显示控制回复的label
self.ctl_reply_label.setObjectName("ctl_reply_label")
self.gridLayout.addWidget(self.ctl_reply_label, 3, 0, 1, 1)
self.ctl_reply_plainTextEdit = QtWidgets.QPlainTextEdit(self.gridLayoutWidget)#显示控制回复的text
self.ctl_reply_plainTextEdit.setObjectName("ctl_reply_plainTextEdit")
self.gridLayout.addWidget(self.ctl_reply_plainTextEdit, 3, 1, 1, 1)
self.retranslateUi()
#QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self):
_translate = QtCore.QCoreApplication.translate
self.setWindowTitle(_translate("Ui_Http_server", "HTTP服务器模拟工具"))
self.upload_url_label.setText(_translate("Ui_Http_server", "上传主题"))
self.server_port_label.setText(_translate("Ui_Http_server", "服务器端口"))
self.ctl_reply_label.setText(_translate("Ui_Http_server", "下发回复"))
self.real_recv_label.setText(_translate("Ui_Http_server", "实时数据展示"))
self.send_ctl_pushButton.setText(_translate("Ui_Http_server", "设置下发数据"))
self.ctl_url_label.setText(_translate("Ui_Http_server", "控制主题"))
self.start_stop_pushButton.setText(_translate("Ui_Http_server", "停启"))
self.start_stop_label.setText(_translate("Ui_Http_server", "停启服务器"))
def start_stop_http(self):
print("停启服务器")
#1.提示
if(self.qthread_http_status=="no"):
change=QMessageBox.information(self,"提示","是否要启动服务器",QMessageBox.Yes|QMessageBox.No)
else:
change=QMessageBox.information(self,"提示","是否要停止服务器服务器",QMessageBox.Yes|QMessageBox.No)
if change==QMessageBox.No:
return
#2.1.输入内容合理性检查
if self.server_port_lineEdit.text()=="":
QMessageBox.information(self,"提示","端口未配置",QMessageBox.Yes)
return
#2.2.检测接口路径是否输入:
if self.upload_lineEdit.text() =="" and self.ctl_url_lineEdit.text()=="":
QMessageBox.information(self,"提示","至少设置实时、控制主题中任一个",QMessageBox.Yes)
return
#4.接口路径,直接通过类变量进行更新
if self.upload_lineEdit.text() != "":
MyHandler.real=self.upload_lineEdit.text()
if self.ctl_url_lineEdit.text()!="":
MyHandler.ctl=self.ctl_url_lineEdit.text()
#4.发送数据至线程,并更新状态字
send_data={}
send_data["type"]="start_stop"
send_data["port"]=self.server_port_lineEdit.text()#启停的端口
if(self.qthread_http_status=="no"):
self.qthread_http_status="ok"
send_data["ctl"]="start"
else:
self.qthread_http_status="no"
send_data["ctl"]="stop"
self._signal.emit(send_data)
def set_ctl_send_data(self):
print("设置控制接口回复内容")
send_data={}
send_data["type"]="set_ctl_value"#设置控制下发的值
send_data["ctl_value"]=self.send_ctl_plainTextEdit.toPlainText()
self._signal.emit(send_data)
def show_thread_view(self,data):
print("展示线程中发来的数据:",data)
if data["type"]=="real":
self.real_recv_plainTextEdit.setPlainText(data["data"])
elif data["type"]=="ctl":
self.ctl_reply_plainTextEdit.setPlainText(data["data"])
def show_thread_stop(self):
print("线程已停止")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ui = Ui_Http_server()
ui.show()
sys.exit(app.exec_())
- 确保已安装python环境,推荐python版本3.10
- 安装依赖包:pip install pyqt5
- 上述脚本,仅用于测试,请勿在生产环境中使用
1.5.可能报错
1.Server returned nothing (no headers, no data)
http服务器未按约定进行响应
MYSQL、SQLServer、PostgreSQL
允许网关将实时、历史、告警、执行日志推动给数据库,或接收数据库端的控制请求
注:MYSQL端也等同"达梦数据库";PostgreSQL端也等同"Greenplum数据库"
1.数据库基础配置
- 启用:是否启用该端推送
网关名:表名中有指定列,内容固定为此值
- 请务必确保每个网关中,该名称是全局唯一的
IP地址:远程数据库的数据库地址
- 端口:远程数据库的端口
- 用户名:访问数据库的用户,需要开启远程访问权限
- 密码:和用户名想匹配的密码
- 数据库名称:具体操作的数据库名称,需要预先创建
2.实时表配置
- 实时表名:接收实时数据的表名,需要预先以指定格式创建
- 实时表周期:将数据更新至实时表的周期,单位秒,推荐值:30
- 变值更新:仅在数据值发生变化时,才进行上传操作;推荐此选项,降低网络传输开销
- 定时发送:多长时间发送一次全部数据,无论值是否发生变更
- 需要上传的数据点,请用户在完成上述配置后,再自行配置
实时表数据示例(mysql中):
- gateway_v:网关名,由用户自行配置
- id_v:采集标签的ID
- vtype_v:值的类型,num或str
- rvalue_v:具体读到的值
- rstatus_v:读取状态:ok、no、null
- rinfo_v:对读取状态的补充信息
- rTime_v:读取该记录的unix时间戳
3.历史表配置
- 历史表名:接收历史数据的表名,需要预先以指定格式创建
- 历史表周期:将数据更新至历史表的周期,单位秒,推荐值:60
- 用户表占用磁盘空间会随着时间累积增长,请用户设立的设置周期,并对不需要旧数据进行清理
- 变值更新:仅在数据值发生变化时,才进行上传操作;
- 强烈推荐此选项,降低网络传输开销,以及降低数据库存储空间的占用
定时发送:多长时间发送一次全部数据,无论值是否发生变更
- 历史表中不推荐开启此选项
需要上传的数据点,请用户在完成上述配置后,再自行配置
历史表数据示例(mysql中):
- gateway_v:网关名,由用户自行配置
- id_v:采集标签的ID
- vtype_v:值的类型,num或str
- rvalue_v:具体读到的值
- rstatus_v:读取状态:ok、no、null
- rinfo_v:对读取状态的补充信息
- rTime_v:读取该记录的unix时间戳
4.告警表配置
- 告警表名:接收告警数据的表名,需要预先以指定格式创建
- 用户需要预先在告警端配置告警点的检查,仅在有告警时,会将告警信息,以指定格式推送至告警表
- 告警表周期:检测是否有告警数据的周期,单位秒,推荐值:30
告警表数据示例(mysql中):
- gateway_v:网关名,由用户自行配置
- id_v:采集标签的ID
- type_v:指明该记录是告警还是恢复,值范围:alarm或recovery
- state_v:触发/恢复的是哪类告警,可选值:max_limit,min_limit,read_limit
- level_v:触发/恢复的告警的等级
- limit_v:该等级的阈值
- data_v:触发/恢复时,采集标签的值
- time_v:触发/恢复时对应的unix时间戳
- time_str_v:触发/恢复时对应的时间字符串
- user_data_v:用户自定义的字段内容
- rinfo_v:仅在告警类型是read_limit时有意义,补充说明读取失败的原因
5.控制表配置
5.1.控制表的配置
- 控制表名:实现数据库端对网关功能的表名,需要预先以指定格式创建
- 控制表周期:网关间隔多久,查询一次控制表是否有"新的控制需求"
- 单个命令执行间隔:如果设置内容包含多个时,设置下一个子对象前的休眠
- 定时保持:
- 不开启此选项时,满足控制表逻辑时,无论成功与否,仅执行一次
- 开启此选项后,将周期执行"满足控制表逻辑的点"
执行记录:经过控制接口成功执行的操作,是否记录在本地
- 在控制频繁的场景下,不推荐开启此选项
此端控制点无需配置,只需要下发的控制ID在网关内存在即可
5.2.控制表使用的方法:
- 插入一条数据,设置"id_v","setv_v","runtime_v"列
- 首次插入示例SQL:insert into control_table (gateway_v,id_v,setv_v,runtime_v) values ('gw1','group9_A0','333','1688622627');
- 后续更新语句:update control_table set setv_v = '32',runtime_v='1688635980' where id_v ='group9_A0';
5.2.控制表的执行逻辑:
- "gateway_v"列是当前网关,且当前时间已超过"runtime_v",且"runtime_v"不为0时,将执行该点
- 当"runtime_v"变更,或"setv_v"与"oldv_v"列值不相等时,执行该点
控制表数据示例(mysql中):
- gateway_v:网关名,由用户自行配置
- id_v:采集标签的ID
- set_v:下发的控制值
- old_v:上次设定的控制值,此列由网关更新维护
- runtime_v:该标签的执行时间,仅在当前时间大于该时间,此标签才会执行
- exe_time_v:真实执行的时间
- exe_status_v:执行的状态:ok、no
- exe_err_v:执行失败的原因
6.日志表配置
- 启用与否:是否启用将其他端的"执行日志"推送至数据库中
- 日志表名:接收执行日志数据的表名,需要预先以指定格式创建
- 日志表周期固定为30秒,当前版本暂不支持更改
日志表数据示例(mysql中):
gateway_v:网关名,由用户自行配置
exe_time_v:该记录发生的unix时间
log_msg_v:具体的日志信息,json格式,有2类格式
格式1:转发端控制接口触发产生
- src:由网关中哪一个程序触发,可选值httpclient,mysql,postgresql,sqlserver,redis
- id:采集标签的ID
- setv:具体设定的值
- exe_status:执行状态
- reason:失败时的补充原因
- time:该记录发生的unix时间
- time_str:该记录发生的时间字符串
格式2:任务端触发产生(请参考数据接口→HTTP日志查询)
- time:该记录发生的时间
- plan:用户配置的任务名
- act:用户配置的动作名
- cond_type:条件类型,有以下可选值
- single:单一条件
- null:无条件
- check_id:条件检测的ID
- cond_status_type:是否启用读取状态的检测
- null:未启用
- success:启用了读取成功次数检测
- fail:启用了读取失败次数检测
- cond_status_judge:读取状态的比较类型
- equal:等于
- greater_than:大于
- greater_than_or_equal:大于等于
- less_than:小于
- less_than_or_equal:小于等于
- cond_val_type:是否启用读值的检测
- null:未启用
- readv:启用了读值大小的检测
- sub_str:启用了包含子串的检测
- str:启用了字串相等的检测
- cond_val_type:读值的比较类型
- equal:等于
- greater_than:大于
- greater_than_or_equal:大于等于
- less_than:小于
- less_than_or_equal:小于等于
- contain_substring:包含子串,仅在cond_val_type值为sub_str时出现
- no_contain_substring:不包含子串,仅在cond_val_type值为sub_str时出现
- equal_str:等于字串,仅在cond_val_type值为str时出现
- no_equal_str:不等于字串,仅在cond_val_type值为str时出现
- cond_val_setv:值条件时的设定值
- cur_val_v:检测时,条件点的值
- cond_time_en:条件是否启用持续时间
- enabled:启用
- disabled:未启用
- cond_time_judge:持续时间的判断条件
- equal:等于
- greater_than:大于
- greater_than_or_equal:大于等于
- less_than:小于
- less_than_or_equal:小于等于
- cond_time:设置的持续时间
- cur_time:实际的时间
- exe_type:执行点类型
- point:单点
- null:无执行点
- exe_id:执行点的名称
- exe_val:执行点的设置值
- exe_status:执行点的主题
- exe_msg:执行失败时的补充原因
7.MYSQL的创表语句
实时表:(实时表需要设置复合主键)
CREATE TABLE IF NOT EXISTS `real_table`(
`gateway_v` VARCHAR(31),
`id_v` VARCHAR(129),
`vtype_v` VARCHAR(5),
`rvalue_v` VARCHAR(513),
`rstatus_v` VARCHAR(5),
`rinfo_v` VARCHAR(129) ,
`rTime_v` BIGINT,
PRIMARY KEY (gateway_v, id_v)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
历史表:
CREATE TABLE IF NOT EXISTS `history_table`(
`gateway_v` VARCHAR(31),
`id_v` VARCHAR(129),
`vtype_v` VARCHAR(48),
`rvalue_v` VARCHAR(513),
`rstatus_v` VARCHAR(5),
`rinfo_v` VARCHAR(129) ,
`rtime_V` BIGINT
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
告警表:
CREATE TABLE IF NOT EXISTS `alarm_table`(
`gateway_v` VARCHAR(31) NOT NULL,
`id_v` VARCHAR(129) NOT NULL,
`type_v` VARCHAR(12) NOT NULL,
`state_v` VARCHAR(12) NOT NULL,
`level_v` VARCHAR(12) NOT NULL,
`limit_v` VARCHAR(64) NOT NULL,
`data_v` VARCHAR(64) NOT NULL,
`time_v`int NOT NULL,
`time_str_v` VARCHAR(32) NOT NULL,
`user_data_v` VARCHAR(257)NOT NULL,
`rinfo_v` VARCHAR(129)NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
控制表:
CREATE TABLE IF NOT EXISTS `control_table`(
`gateway_v` VARCHAR(31),
`id_v` VARCHAR(129) ,
`setv_v` VARCHAR(513) ,
`oldv_v` VARCHAR(513) ,
`runtime_v` int ,
`exe_time_v` int ,
`exe_status_v` VARCHAR(5) ,
`exe_err_v` VARCHAR(257)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
日志表:
CREATE TABLE IF NOT EXISTS `log_table`(
`gateway_v` VARCHAR(31) ,
`exe_time_v` int,
`log_msg_v` VARCHAR(1024)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
8.SQLServer的创表语句
实时表:
gateway_v nchar(31) 主键
id_v nchar(129) 主键
vtype_v nchar(5)
rvalue_v nchar(513)
rstatus_v nchar(5)
rinfo_v nchar(129)
rtime_v numeric(18, 0)
历史表:
gateway_v nchar(31)
id_v nchar(129)
vtype_v nchar(5)
rvalue_v nchar(513)
rstatus_v nchar(5)
rinfo_v nchar(129)
rtime_v numeric(18, 0)
告警表:
gateway_v nchar(31)
id_v nchar(129)
type_v nchar(12)
state_v nchar(12)
level_v nchar(12)
limit_v nchar(64)
data_v nchar(64)
time_v nchar(101)
time_str_v nchar(32)
user_data_v nchar(257)
rinfo_v nchar(129)
控制表:
gateway_v varchar(31)
id_v varchar(129)
setv_v varchar(513)
oldv_v varchar(513)
runtime_v int
exe_time_v int
exe_status_v varchar(5)
exe_err_v varchar(257)
日志表:
gateway_v nchar(31)
exe_time int
log_message nchar(1024)
9.PostgreSQL创表语句
- 相同的配置,也支持连接Greenplum数据库
实时表:
create table real_table(
gateway_v varchar(31),
id_v varchar(129),
vtype_v varchar(12),
rvalue_v varchar(513),
rstatus_v varchar(5),
rinfo_v varchar(129),
rtime_v int,PRIMARY KEY (gateway_v,id_v)
);
历史表:
create table history_table(
gateway_v varchar(31),
id_v varchar(129),
vtype_v varchar(12),
rvalue_v varchar(513),
rstatus_v varchar(5),
rinfo_v varchar(129),
rtime_v int
);
控制表:
create table control_table(
gateway_v varchar(31),
id_v varchar(129),
setv_v varchar(513),
oldv_v varchar(513),
runtime_v int,
exe_time_v int,
exe_status_v varchar(5),
exe_err_v varchar(257)
);
告警表:
create table alarm_table(
gateway_v varchar(31),
id_v varchar(129),
type_v varchar(12),
state_v varchar(12),
level_v varchar(12),
limit_v varchar(64),
data_v varchar(64),
time_v int,
time_str_v varchar(32),
user_data_v varchar(257),
rinfo_v varchar(129)
);
日志表:
create table log_table(
gateway_v varchar(31),
exe_time_v int,
log_msg_v varchar(1024)
);
Redis
1.Redis基础配置
- 数据库:是否启用该端
网关名:数据中有指定字段,内容固定为此值
- 请务必确保每个网关中,该名称是全局唯一的
IP地址:Redis的服务器的地址
- 端口:Redis的端口号,默认6379
- 数据库号:Redis的数据库编号,默认0,范围0-15
密码:仅当Redis端开启密码时,使用此选项;
- 请勿在Redis端未开启密码时,勾选此选项,导致网关连接Redis失败
在redis端如果有乱码,请在CMD控制台输入chcp 65001,然后再使用如下命令启动redis-cli --raw
2.Redis实时数据配置
- 实时数据库:是否将实时数据推送至Redis端
- 实时表周期:将数据更新至实时表的周期,单位秒,推荐值:30
- 变值更新:仅在数据值发生变化时,才进行上传操作;推荐此选项,降低网络传输开销
- 定时发送:多长时间发送一次全部数据,无论值是否发生变更
实时接口数据格式:
- hash数据类型,使用hmset进行设置,使用hmget进行查询
- 键值:hash对象的键值,由“网关名_组名_点名”组成
- 如:网关名是gw1,组名是Group1,点名是Tag1,产生Id字段的值是gw1_Group1_Tag
- rvalue字段:具体读到子
- vtype字段:数据类型(str或num)
- r_status字段:是否读取成功
- rinfo:在读取出错时,补充的错误信息
- r_time:该标签的unix时间
- 需要上传的数据点,请用户在完成上述配置后,再自行配置
查询redis中的实时数据:
- 示例:hgetall 键值
实时hash对象数据示例:
3.Redis控制接口配置
- 控制数据库:是否启用控制接口
- 控制表周期:网关间隔多久,查询一次是否有"新的控制需求"
- 单个命令执行间隔:如果设置内容包含多个时,设置下一个子对象前的休眠
- 定时保持:
- 不开启此选项时,满足控制表逻辑时,无论成功与否,仅执行一次
- 开启此选项后,将周期执行"满足控制表逻辑的点"
执行记录:经过控制接口成功执行的操作,是否记录在本地
- 在控制频繁的场景下,不推荐开启此选项
需要控制的数据点,请用户在完成上述配置后,再自行配置
控制接口数据格式:
hash数据类型,使用hmset进行设置,使用hmget进行查询
键值:hash对象的键值,由“网关名_组名_点名”组成
如:网关名是gw1,组名是Group1,点名是Tag1,产生Id字段的值是gw1_Group1_Tag
如果要被设置值的标签仅在控制接口中勾选,用户需要在hash对象中创建该键值
setv字段:由用户更新此字段,即要设置的值
oldv字段:由网关负责更新此字段的值
runtime字段:由用户进行更新
exe_time字段:此标签的执行时间
exe_status字段:执行成功与否
exe_err字段:执行失败的错误原因
控制接口使用的方法:
- 插入一条数据: hmset gw1_group9_A1 setv 123 runtime 1698221430
- 查询结果:hmgetall gw1_group9_A1
控制接口的执行逻辑:
- 当前时间已超过"runtime_v",且"runtime_v"不为0时,将执行该点
- 当"runtime_v"变更,或"setv_v"与"oldv_v"列值不相等时,执行该点
4.Redis告警接口配置
- 告警上传:是否将告警信息推送至Redis端
- 轮询周期:测是否有告警数据的周期,单位秒,推荐值:30
- 告警发生的unix时间作为集合的"分数"
网关将告警信息推送到Redis的zset集合中
- 集合名:由网关名_alarm组成,如网关名是gw1,集合名是gw1_alarm
- 查询所有告警:zrange 集合名 0 -1
告警zrange对象数据示例:
5.Redis的执行日志接口配置
- 日志表名:是否启用将其他端的"执行日志"推送至Redis端
- 日志发生的unix时间作为集合的"分数"
网关将执行日志信息推送到Redis的zset集合中
- 集合名:由网关名_log组成,如网关名是gw1,集合名是gw1_log
- 查询所有执行记录:zrange 集合名 0 -1
日志zrange对象数据示例:
6.常见问题
1.LOADING Redis is loading the dataset in memory
- redis中内存已满,请修改redis配置以及考虑增加服务器内存
SQLite3
此服务用于实现"历史数据"的查看,仅在监控模式,右键选择时进行查看
- 启用与否:是否启用本地历史记录的功能
- 存储位置:当前版本固定为"控制器内部"
- 变值更新:仅在数据值发生变化时,才进行上传操作;推荐此选项,避免频繁写操作导致存储损坏
- 存储周期:长期运行推荐300,单位秒
IOT
ALink
1.ALink基础连接配置
- 启用与否:是否启用与阿里云物联网平台的通讯
- 站点url:阿里云物联网平台的地址
- 目标端口:阿里云物联网平台的端口
- product_key:连接信息的三元组之一,请从阿里云物联网平台中获取
- device_name:连接信息的三元组之一,请从阿里云物联网平台中获取
- device_secret:连接信息的三元组之一,请从阿里云物联网平台中获取
- 轮询周期:实时数据推送的轮询时间
- 定时发送:多长时间发送一次全部数据,无论值是否发生变更
- 远程设置:是否接收阿里云物联网平台下发的控制请求
- 执行记录:经过控制接口成功执行的操作,是否记录在本地
- 在控制频繁的场景下,不推荐开启此选项
2.逻辑组配置
- 启用与否:是否上传该逻辑组下的数据点
- 名称:逻辑组名称,仅用于显示
- 变值更新:仅在数据值发生变化时,才进行上传操作;推荐此选项,降低网络传输开销
3.上传点配置
选择刚才创建的组节点,右键单击"新建MQTT上传点",请保证标识符和阿里云物联网平台中标签名一致即可
4.ALink平台连接示例
4.1 注册-开通-开通公共实例
4.1.1.在阿里云搜索"物联网平台",在下图界面中,点击"管理控制台"
4.1.2.点击"立即开通"
4.1.3.开通后,成功界面如下图:
4.1.4.点击"管理控制台",进入下图界面
4.1.5.点击"开通公共实例",并选择"确认开通"
4.1.6.开通后,如下图
4.1.7.查看连接信息
详细参考官方文档:https://help.aliyun.com/zh/iot/user-guide/manage-the-endpoint-of-an-instance
新版查看方式:
点击"实例详情",并单击"查看开发配置"
在弹出的界面,填入连接信息所需的"站点url"和"目标端口"
旧版查看方式:
URL组成方式:YourProductKey.iot-as-mqtt.YourRegionId.aliyuncs.com
其中YourRegionId可选值:
华北 2(北京):cn-beijing
华东 2(上海):cn-shanghai
华南 1(深圳):cn-shenzhen
新加坡 (新加坡):ap-southeast-1
日本(东京):ap-northeast-1
美国(硅谷):us-west-1
美国(弗吉尼亚):us-east-1
德国(法兰克福):eu-central-1
4.2 新建产品
按图中步骤,创建产品
4.3 添加设备
4.4.查看连接三元组信息
4.5.添加自定义功能-属性
通过下图流程添加
- 自定义功能(属性):设备管理-->产品-->(已创建的产品)查看-->功能定义-->编辑草稿-->添加自定义功能(属性)(图4-1)-->发布上线。
4.6.添加自定义功能-服务
通过下图流程添加
- 自定义功能(服务):设备管理-->产品-->(已创建的产品)查看-->功能定义-->编辑草稿-->添加自定义功能(服务)-->发布上线。
输入参数:
输出参数:
4.7 在线调试
1.属性的在线调试
2.服务的在线调试:
- 在弹出的界面下面指定数据的设置
示例格式,请保持大小匹配
{"Id":"Group1_Tag1","Val":"419"}
MQTT
适用于标准的MQTT协议
1.MQTT基础连接配置
- 启用与否:是否启用MQTT端
- Client Id:mqtt网络的中的唯一ID
- IP地址:MQTT服务器的地址
- Port:MQTT服务器的端口,需区分是否是SSL/TLS的端口
- Keep Alive:MQTT客户端的保活周期,推荐值60,单位秒
- 协议版本:需要与MQTT网络中运行的协议版本一致
- Clean Session:会话是否保留设置,在客户端断线后,服务器是否会在连接列表中清除客户端的名称
- 轮询周期:实时数据推送的轮询时间
- 定时发送:多长时间发送一次全部数据,无论值是否发生变更
- 用户名:连接MQTT服务器的用户名
- 密码:连接MQTT服务器的密码
- 验证方式:是否启用SSL/TLS验证,请与MQTT服务器配置文件中一致
- TLS协议版本:请与MQTT服务器配置文件中一致
- CA File:CA文件,请选择并上传
- Cert File:Cert文件,请选择并上传
- Key File:Key文件,请选择并上传
- 遗嘱主题:MQTT客户端断开时,接受遗嘱信息的主题
- Qos:遗嘱消息的消息级别
- Retained:是否在该主题中,保留最此消息
- 遗嘱内容:具体发送到主题中的消息,标识着网关已离线
2.MQTT实时数据主题
- 启用与否:是否启用该主题下的数据推送
主题:接受MQTT实时数据主题
- 请勿将同一个标签配置在多个主题中,可能会造成占用超过限制,影响网关的正常运行
变值更新:仅在数据值发生变化时,才进行上传操作
- 推荐此选项,降低网络传输开销
数据压缩:推荐开启此选项,一次性上传多条实时数据
- 压缩数量:一次性至多上传多少条实时数据
- 此主题的reatined:是否在主题中保留该主题下的最后一条数据
实时主题未开启压缩数据格式:
{
"cli_id": "gw1",
"id": "Group1_Tag4",
"vtype": "num",
"rval": "65523.000000",
"rstatus": "ok",
"rinfo": "读取成功",
"rtime": 1740720444
}
实时主题开启压缩数据格式:
[
{
"cli_id": "gw1",
"id": "Group1_Tag1",
"vtype": "num",
"rval": "4.000000",
"rstatus": "ok",
"rinfo": "读取成功",
"rtime": 1740720587
}
]
3.MQTT连接主题
如果启用连接主题,那么在网关首次连接到MQTT网络时,会向连接主题中,递送一次指定的信息内容
- 连接主题(上传):接收网关上线时,首次推送的"连续信息"
- Qos:消息级别
- retained:是否在主题中,保留最后一条接收的消息
- 连接推送信息:向连接主题中推送的具体信息内容,至多4096个英文字符,数据格式以用户设定的为准
4.MQTT离线主题
当网关与MQTT网络通讯断开30秒后,在此期间内需要上传的实时数据,会存储在本地,等待下次通讯恢复时再重新上传
- 离线数据的主题(上传):接收网关上传离线数据的主题
- 一次性发送消息的个数:推荐值500
- 不建议过小的设置值,离线数据如果无法在短期内上传完毕,期间网络连接又断开,重复上传离线数据
- Qos:消息级别
- retained:是否在主题中,保留最后一条接收的消息
- 发送消息的间隔:除非要做额外做处理,否则建议设置0
离线主题数据上传格式:
[
{
"timev": 1740721195,
"message": {
"cli_id": "gw1",
"id": "Group1_Tag1",
"vtype": "num",
"rval": "4.000000",
"rstatus": "ok",
"rinfo": "读取成功",
"rtime": 1740721195
}
}
]
5.MQTT控制主题
- 控制主题(接收):接收MQTT网络中发布的控制信息
- 控制主题(回复):接收网关执行返回信息的主题
执行记录:经过控制接口成功执行的操作,是否记录在本地
- 在控制频繁的场景下,不推荐开启此选项
Qos:消息级别
- retained:是否在主题中,保留最后一条接收的消息
下发数据格式:
[
{
"Cli_ID": "gw1",
"Id": "Group1_Tag1",
"Setv": "1234"
}
]
回复数据格式:
[
{
"cli_id": "gw1",
"id": "Group1_Tag1",
"status": "ok",
"w_time": 1740713859,
"err": ""
}
]
6.MQTT事件主题
- 事件上传的主题:用户需要预先在告警端配置告警点的检查,仅在有告警时,会将告警信息,以指定格式推送至此主题
- 周期:检测是否有告警数据的周期,单位秒,推荐值:30
- Qos:消息级别
- retained:是否在主题中,保留最后一条接收的消息
事件主题上传数据格式:(包含告警和恢复信息)
[
{
"client": "gw1",
"id": "Group1_Tag2",
"type": "alarm",
"state": "max_limit",
"level": "1",
"limitv": "11.000000",
"val": "41.000000",
"time_v": 1740720435,
"time_s": "2025/02/28 13:27:16",
"user_data": "",
"rinfo": ""
},{
"client": "gw1",
"id": "Group1_Tag3",
"type": "recovery",
"state": "max_limit",
"level": "1",
"limitv": "111.000000",
"val": "110.000000",
"time_v": 1740722000,
"time_s": "2025/02/28 13:53:21",
"user_data": "",
"rinfo": ""
}
]
7.MQTT日志主题
- 日志上传的主题:是否启用将其他端的"执行日志"推送此主题中
- Qos:消息级别
- retained:是否在主题中,保留最后一条接收的消息
日志主题上传数据格式
{
"cli_id": "gw1",
"log": {
"src": "general_mqtt",
"id": "Group1_Tag1",
"setv": "3",
"exe_status": "ok",
"reason": "",
"time": 1740720195,
"time_str": "2025/02/28 13:23:15"
}
}
8.MQTT重启主题
- 重启订阅:网关侦听MQTT网络中,重新信息的主题
- 重启响应:接收网关在重启之前,向MQTT网络回复的信息
- Qos:消息级别
- retained:是否在主题中,保留最后一条接收的消息
重启主题下发数据格式:
{
"cli_id": "gw1",
"type": "reboot"
}
重启主题回复数据格式:
{
"cli_id": "gw1",
"reply": "ok"
}
任务端
1.任务计划配置
- 启用与否:是否启用该任务
- 名称:任务名称,将在任务日志中出现此字段的值
- 描述:仅用于显示
- 每日出错重置(小时):允许指定某个整点的小时,重置已出错的计次,将允许出错停止的动作,再次尝试动作
- 起始日期限制:限制运行的起始年月日,当前时间必须大于设置日期才能运行
- 终止日期限制:限制运行的终止年月日,当前时间大于设置日期时,将停止运行
- 星期:以星期为设置,指定该天是否要运行,需要点击并进入设置当天的时间表
2.时间表配置
- 如果需要无论何时都运行,则分别单击"设置全天",“将当前设置作用于所有天"即可
3.动作配置
- 启用与否:是否启用该动作
- 名称:该动作的名称,用户需要自行保证名称唯一
- 描述信息:仅用于显示
条件
- 无条件:即只要上层任务的时间满足,就执行动作
- 条件:仅当条件满足时,才值动作
值:需要设置给动作点的值
- 值类型:需要和动作点实际"数据类型"一致
动作点:
- 无动作点:将不执行任何操作,但在条件满足时,会产生一条日志
- 任意点:在条件满足时,将设置值下发给此点,该点必须可写
执行间隔:执行完此动作后,执行下一个动作前的休眠,单位毫秒
保持的间隔:
- 未勾选此选项时,在条件首次满足(包含无条件),仅将执行一次动作,无论失败与否
- 勾选此选项,在条件满足期间,会周期将设置值下发给动作点
- 执行错误次数限制:某个动作在条件满足后,对动作点下发设置值,至多允许的失败次数
- 执行错误间隔:某个地址在条件满足后,对动作点下发设置值失败后,将使用此周期,避免频繁的触发超时
4.条件配置
读取状态条件:二选一
- 读取失败次数:用于检测条件点的当前采集状态是否可信
- 读取成功次数:用于检测条件点的当前采集状态是否可信
读值条件:三选一
- 读值:数字类型的判断
- 子串:条件点和该子串的判断
- 字串:条件点和该字串的判断
持续时间:满足上述条件,且时间满足,该条件才满足
- 单点:上述条件所检查的点
5.任务示例
配置1个每天定时开关的灯的操作
创建2个任务,一个作为开灯,一个作为关灯
5.1.创建1个开灯任务,开灯时刻如下配置,并点击"将当前设置作用于所有天"
5.2.开灯动作如下配置,无需配置条件
5.3.创建1个关灯任务,关灯时刻如下配置,并点击"将当前设置作用于所有天"
5.4.关灯动作如下配置,无需配置条件
告警端
1.告警组配置
- 启用与否:是否启用告警组的检查
- 名称:告警组的名称,仅做显示
- 周期:告警组的检查周期
- 描述:仅做显示
2.告警点配置
告警类别:上限告警,下限告警,读失
- 上限告警,采集值大于等于设定值,即触发告警
触发阈值:触发告警的临界值
- 死区:避免告警反复触发/恢复的缓冲值
- 告警文本:在告警文本中,user_data字段中,将附带该值
邮箱配置
- 启用告警发送邮件功能:用户需要预先在告警端配置告警点的检查,仅在有告警时,会将告警信息,以指定格式通过邮箱进行推送
- SSL是否开启:部分smtp服务商强制要求开启SSL,比如smtp.qq
- 周期:邮箱端多长时间检测一次,是否有新的告警信息需要发送
- 网关名:此字段包含在发送内容中的正文中
- 发送邮箱服务器:smtp服务商的地址
- 发送端邮箱地址:发件人
- 发送端授权密码:需要预先申请的授权码,请注意申请的授权期限
- 接收地址1:接收告警信息的邮箱地址
- 接收地址2:接收告警信息的邮箱地址
- 接收地址3:接收告警信息的邮箱地址
- 是否固定邮件的告警主题:允许用户自定义告警邮件的主题
- 是否固件邮件的恢复主题:允许用户自定义恢复邮件的主题
邮箱告警上传数据格式:
[
{
"gateway": "gw1",
"id": "Group1_Tag3",
"type": "alarm",
"specific": "min_limit",
"level": "1",
"limit": "88.000000",
"value": "88.000000",
"time_v": "1740723340",
"time_str": "2025/02/28 14:15:41",
"user_data": ""
}
]
OTA操作
在菜单栏右键,进行以下操作
在弹出界面中,进行如下图操作
- 请从官网下载最新版本的固件包,请勿对固件包名称进行任何形式的修改
- 请先停止网关的运行,再进行OTA操作,否则可能会因为运行内存不足而到OTA操作失败
数据接口
1.HTTP读服务
1.获取某个组的实时数据
示例路径:
http://192.168.11.241:8080/API/V1/GROUP_DATA
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"GET_GROUP_REAL_DATA","group_name":"AO"}' http://192.168.11.242:8080/API/V1/GROUP_DATA
输出结果:
[
{
"Id": "AO_Tag1",
"val": "0.000000",
"stat": "no",
"info": "Connection timed out",
"count": 0,
"rtime": 1737527500,
"key": "#item#98900"
}
]
错误返回:
[
{
"error": "网关中无此组名相关信息"
}
]
2.获取单个采集标签的历史数据"
需要预期在SQLITE3端配置该标签
示例路径:
http://192.168.11.242:8080/API/V1/HISTORY_DATA
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"GET_POINT_HISTORY","id":"AO_Tag3","start_time":1734019200,"end_time":1734102000,"format":"long"}' http://192.168.11.242:8080/API/V1/HISTORY_DATA
正常输出结果:
[{
"stat": "ok",
"val": "0.000000",
"rtime": 1734019245,
"info": "读取成功"
}, {
"stat": "ok",
"val": "0.000000",
"rtime": 1734055991,
"info": "读取成功"
}]
错误输出:
[
{
"error": "所选点无历史数据"
}
]
- start_time:查询的起始时间,unix时间值
- end_time:查询的起始时间,unix时间值
- format:
- short:更加紧凑的JSON数据格式
- long:适合阅读的JSON数据格式
3.获取所有的信息
示例路径:
http://192.168.11.242:8080/API/V1/ALL_DATA
测试命令:
curl -k -H "Content-Type: application/json" -X GET -d '{"type":"GET_GROUP_REAL_DATA","format":"long"}' http://192.168.11.242:8080/API/V1/ALL_DATA
正确返回:
[
{
"Id": "_Tag1",
"val": "0.000000",
"stat": "no",
"info": "对端无响应:Connection timed out",
"count": 0,
"rtime": 1740036216,
"key": "#item#98649"
},
{
"Id": "_Tag2",
"val": "0.000000",
"stat": "no",
"info": "对端无响应:Connection timed out",
"count": 0,
"rtime": 1740036216,
"key": "#item#98650"
}
]
错误返回:
[
{
"error": "具体的错误原因"
}
]
format:
- short:更加紧凑的JSON数据格式
- long:适合阅读的JSON数据格式
2.HTTP写服务
接口路径:
http://192.168.11.242:8082/API/V1/WRITE
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"Type":"write","Id":"Group1_A3","Setv":"1"}' http://192.168.11.242:8082/API/V1/WRITE
正确返回:
[
{
"status": "ok"
}
]
错误返回:
[
{
"status": "no",
"error": "请求ID不存在内部对象表中"
}
]
- 默认不开放HTTP写接口,用户在确认内网环境安全可靠时,可将此接口放开(此接口无权限校验)
- Id字段:由"组名_点名"组成,如组名是Group1,点名是Tag1,下发时Id字段的值是Group1_Tag
3.HTTP日志查询
1.查询所有日志
- 任务端的执行日志
- 其他端的执行记录
接口路径:
http://192.168.11.242:8083/API/V1/ALL_LOG
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"start_time":"1736784000","end_time":"1736866800","format":"short"}' http://192.168.11.242:8083/API/V1/ALL_LOG
正确返回:
[
{
"time": "2025/01/14 10:22:24",
"plan": "Plan1",
"act": "动作3",
"cond_type": "single",
"check_id": "WR(short)_Tag4",
"cond_status_type": "null",
"cond_val_type": "readv",
"cond_val_judge": "less_than_or_equal",
"cond_val_setv": "3000.000000",
"cur_val_v": "66.000000",
"cond_time_en": "disabled",
"exe_type": "point",
"exe_id": "WR(short)_Tag8",
"exe_val": "8881",
"exe_status": "ok",
"exe_msg": ""
},
{
"src": "ALink",
"id": "Group1_Tag1",
"setv": "888.000000",
"exe_status": "ok",
"reason": "",
"time": 1736859600,
"time_str": "2025/01/14 21:00:00"
}
]
错误返回:
[
{
"status": "no",
"error": "查询起始和终止时间跨度超过24小时"
}
]
2.仅查询告警日志
接口路径:
http://192.168.11.242:8083/API/V1/GET_ALARM
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"start_time":"1736784000","end_time":"1736866800","format":"short"}' http://192.168.11.242:8083/API/V1/GET_ALARM
正确返回:
[
{
"id": "WR(integer)_Tag58",
"type": "alarm",
"specific": "max_limit",
"level": "3",
"limitv": "7000.000000",
"val": "9999.000000",
"time_str": "2025/01/14 10:22:21",
"status_info": ""
},
{
"id": "WR(integer)_Tag59",
"type": "alarm",
"specific": "max_limit",
"level": "3",
"limitv": "7000.000000",
"val": "9999.000000",
"time_str": "2025/01/14 10:22:21",
"status_info": ""
}
]
错误返回:
[
{
"status": "no",
"error": "查询起始和终止时间跨度超过24小时"
}
]
3.获取任务端执行日志
接口路径:
http://192.168.11.242:8083/API/V1/GET_PLAN
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"start_time":"1736784000","end_time":"1736866800","format":"short"}' http://192.168.11.242:8083/API/V1/GET_PLAN
正确返回:
[
{
"time": "2025/01/14 10:22:24",
"plan": "Plan3",
"act": "动作1",
"cond_type": "single",
"check_id": "HR(short)_Tag1",
"cond_status_type": "success",
"cond_status_judge": "greater_than",
"cond_status_setv": "5",
"cur_status_v": "31",
"cond_val_type": "readv",
"cond_val_judge": "equal",
"cond_val_setv": "123.000000",
"cur_val_v": "123.000000",
"cond_time_en": "disabled",
"exe_type": "point",
"exe_id": "HR(short)_Tag2",
"exe_val": "7777",
"exe_status": "ok",
"exe_msg": ""
}
]
错误返回:
[
{
"status": "no",
"error": "缺少字段:end_time"
}
]
4.HTTP状态接口
1.查询转发端应用的状态
接口路径:
http://192.168.11.242:8084/status_monitor
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"get_trans_status","app":"http_client"}' http://192.168.11.242:8084/status_monitor
正确返回:
{
"result": "ok",
"drive_status": "no",
"real_status": "no",
"return_exe_status": "no",
"query_exe_status": "no"
}
错误返回:
{
"result": "app字段值:不符合约定"
}
- app字段有以下可选值:
- http_client
- mysql
- sqlserver
- postgresql
- redis
- history
- MQTT_Client
- ALink
2.查看转发端日志
接口路径:
http://192.168.11.242:8084/status_monitor
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"get_trans_log","app":"http_client"}' http://192.168.11.242:8084/status_monitor
正确返回:
[
"2025/02/18/12:30:05|HTTP_exec|警告,将错误信息返回给远程HTTP服务器失败,code:7,err:Couldn't connect to server",
"2025/02/18/12:32:05|HTTP_exec|警告,(控制接口)GET获取对端数据失败,code:7,err:Couldn't connect to server",
]
错误返回:
{
"result": "app字段值:不符合约定"
}
app字段有以下可选值:
- http_client
- mysql
- sqlserver
- postgresql
- redis
- history
- MQTT_Client
- ALink
3.查询采集端日志
接口路径:
http://192.168.11.242:8084/status_monitor
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"collcet_monitor_log","app":"CJT/188-2004"}' http://192.168.11.242:8084/status_monitor
正确返回:
[
"2025/01/12/13:54:12|CJT188|程序启动成功"
]
错误返回:
{
"result": "app字段值:不符合约定"
}
- app字段有以下可选值:
- CJT/188-2004
- DLT 645/1997
- DLT 645/2007
- DLT 698.45/2017
- Modbus TCP
- Modbus RTU
4.查看告警、任务、邮件端、从站的运行日志
接口路径:
http://192.168.11.242:8084/status_monitor
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"other_monitor_log","app":"plan"}' http://192.168.11.242:8084/status_monitor
正确返回:
[
"2025/01/12/13:54:35|plan|程序启动成功"
]
错误返回:
{
"result": "app字段值:不符合约定"
}
- app字段有以下可选值:
- plan
- Modbus Slave
- alarm
5.控制接口
1.网关硬件在线匹配
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_mate_ip"}' http://192.168.11.242:8084/user_api
正确返回:
{
"result": "yes,isme"
}
错误返回:
{
"result": "type字段值:不符合约定"
}
2.设置网关时间
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_set_time","date":"2024-11-11","time":"11:11:11"}' http://192.168.11.242:8084/user_api
正确返回:
{
"result": "同步完成"
}
错误返回:
{
"result": "命令管道打开失败或获取管道结果失败:No child processes"
}
3.查看NTP设置
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_get_ntpdate_set"}' http://192.168.11.242:8084/user_api
正确返回:
{
"result": "ok",
"ntp": "time.windows.com",
"cycle": "1"
}
错误返回:
{
"result": "type字段值:不符合约定"
}
4.设置NTP服务
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_set_ntpdate","ntp":"xxxx","cycle":30}' http://192.168.11.242:8084/user_api
正确返回:
{
"result": "ntp set ok"
}
错误返回:
{
"result": "cycle字段值:不符合约定"
}
5.查看NTP服务运行状态
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_get_ntpdate_status"}' http://192.168.11.242:8084/user_api
正确返回:
6.获取有线网口的配置
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_get_wired_net","data":"eth0"}' http://192.168.11.242:8084/user_api
正确返回:
{
"result": "ok",
"ip": "192.168.11.242",
"mask": "255.255.255.0",
"gateway": "192.168.11.1",
"dns1": "114.114.114.114",
"dns2": "114.114.115.115",
"mac": "64:52:77:38:00:81"
}
错误返回:
{
"result": "网卡编号不符合约定"
}
7.获取4G信息
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_get_4g_net"}' http://192.168.11.242:8084/user_api
8.调用ping测试
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_ping_test","ip":"192.168.11.241"}' http://192.168.11.242:8084/user_api
9.调用端口可达测试
接口路径:
http://192.168.11.242:8084/user_api
测试命令:
curl -k -H "Content-Type: application/json" -X POST -d '{"type":"user_telnet_test","ip":"192.168.11.241","port":"9999"}' http://192.168.11.242:8084/user_api
正确返回:
{
"result": "端口可达"
}
FAQ
1.使用相关
1.网关密码匹配验证失败
- 请核验密码是否正确,再核验网关和PC电脑端的时间落差是否超过30分钟
3.配置文件正常上传,但是有蜂鸣器告警
- 请不要在配置文件上传完毕之前,重复进行上传操作
- 网络波动导致配置文件缺失,请再次尝试上传配置文件
3.蜂鸣声有什么含义
- 上传错误的配置文件导致启动失败时,蜂鸣器会每隔20秒,长鸣一声
- 在运行期间,用户配置的程序在执行期间异常crash,且拉取失败时,蜂鸣器会每隔30秒,长鸣二声
4.我如何将网关重置为初始状态
- 在运行过程中,长按网关尾部的FUN键不放,3 秒后,SYS 指示灯会闪烁三下,同时板载蜂鸣器会响三声,此时系统 eth0 的 IP 会临时改成 192.168.1.230,用户可以对网关IP进行设定,否则系统重启后,IP会恢复成原先设置的IP
- 此时网关会将所有配置信息清空,包括不限以下内容:告警,日志,历史,配置文件等
- 网关密码会重置为123456
5.打开配置软件报错了
Failed to execute script 'pyiboot01_bootstrap' due to unhandled
- win7版本需要为SP1,且安装"KB2533623"补丁
无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-11-1-0.dll
- 请安装Visual C++ 2015软件包
6.查询NTP服务时有以下报错
Exiting, name server cannot be used: Temporary failure in name resolution (-3)20 Dec 02:41:04 ntpdate3863: name server cannot be used: Temporary failure in name resolution (-3)
- DNS配置错误导致NTP服务无法正常运行,请打开工具栏→配置→搜索匹配网关→网络配置,进行DNS的配置
2.采集相关
1.数据采集不稳定怎么办
- 适当增加超时时间
- 打开组选项:出错重试次数
- 设置组选项:组前间隔
2.我该如何合理的设置读取超时时间
- 如果采集项已开启组包,请根据读取的数量,自行调整设置的超时时间,建议超时至少为999ms
- 对于波特率9600以上的设备推荐设置500ms以下的超时,对于波特率2400以下的设备,请推荐设置999ms以上的超时
- 如果某些设备在串口链路中经常采集失败,则考虑增加超时以及开启“出错重试"来增加准确率
- 更推荐的方式是尝试更换被采集的设备,避免这些不稳定的产品出现在现场链路采集中,影响生产环境的稳定性0
3.为什么我开启变值更新后,数据的采集时间未发生变化
- 开启变值更新选项后,仅当采集值、采集状态发生变化时,才进行数据更新;上述现象是正常的
- 可以开启定时发送,周期强制刷新一次采集时间,推荐值300,单位秒
4.我能否配置两个地址相同的标签
- 可以,但是不推荐这样的操作,一般上述操作仅出现在调配过程中
5.LAN口能够跨网段访问
- 如果网关没有配置4G,LAN将作为唯一路由,可以通过配置路由器端口转发设置来达到跨网段访问
- 当网关已配置4G且4G网络正常运行时,LAN口将仅允许同网段的设备之间的访问和连接
6.我如何知道4G是否正常通讯,以及是否在传输数据
- 当4G网络未连接正常时,指示灯会慢闪(200ms亮、1800ms灭)
- 当4G网络已连接成功时,在进行数据传输时,指示灯会快闪(125ms亮、125ms灭)
- 当4G网络已连接成功,在传输完毕后进入待机状态时,指示灯会慢闪(1800ms、200ms灭)
7.我的网关断网了,但是期间产生了告警,在恢复网络后,告警是否会继续发送
- 在断网期间产生告警数据,这些告警会在网络恢复后进行发送
- 但是如果断网期间产生的告警数量超过数量限制,则会存在告警丢失问题,且本地无法查询这部分被丢失的告警
- 如果断网期间产生告警,且在恢复网络前,网关进行了重启操作,则此期间的告警不会被发送到远程(但是本地可以进行查询)
8.采集标签有段时间采集失败了,这个时候,配置软件端获取单个图表是如何表示的?
- 展示图表时,将不展示失败信息
- 展示表格时,展示具体的失败信息
8.为什么我将数据库端周期设置为0秒,但是实际数据更新周期为10秒或者更长?
转发端提供了实时,历史,告警,日志,控制,用户需要合理的配置各端的周期,通常建议以下设置:
- 按需启用所需的功能,而不是全部启用
- 如无必须,请勿将周期置为0;如果置为0,请勿同时将多个端置为0。用户需要知道当某个功能的周期置为0,可能会导致其他端的优先级降低