【逗老师带你学IT】PRTG监控通过Python+TCP Modbus获取温湿度传感器数据

浪尽此生 提交于 2020-11-12 08:56:15

本文介绍,Python如何通过TCP Modbus协议获取温湿度传感器数据。并在PRTG监控系统中呈现。
本文主要涉及知识点:

1、Python的ModbusTCP客户端实现
2、常见温湿度传感器中,温度和湿度寄存器的位置

在这里插入图片描述
@TOC

一、关于TCP Modbus协议

1、协议介绍

Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口、以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业电子设备之间的互联。
Modbus Poll和Modbus Slave是两款非常流行的Modbus设备仿真软件,支持Modbus RTU/ASCII和Modbus TCP/IP协议 ,经常用于测试和调试Modbus设备,观察Modbus通信过程中的各种报文。
当用于支持Modbus RTU/ASCII协议时,ModbusPoll作为一个主站设备, ModbusSlave作为一个从站设备,从站设备接收主站设备的命令并返回数据。而当用于支持Modbus TCP/IP时,ModbusSlave作为一个服务器, ModbusPoll作为一个客户端,服务器接收客户端的命令并返回数据。客户端需要填写指定连接的远程服务器IP地址和端口号。

2、TCP Modbus的数据包格式

2.1:请求包:

在这里插入图片描述

本次请求:00 4b 00 00 00 06 01 03 00 00 00 02

00 4b为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文;

00 00表示协议标识符,00 00为modbus协议;

00 06为数据长度,用来指示接下来数据的长度,单位字节;

01为设备地址,一般指从站站号,用以标识连接在串行线或者网络上的远程服务端的地址。以上七个字节也被称为modbus报文头

03为功能码,此时代码03为读取保持寄存器数据;

00 00为起始地址,指从第0个寄存器开始读数据

00 02为寄存器数量,指从上面说的寄存器,开始读取2个寄存器的数据
关于功能码,常见的功能码如下:

在这里插入图片描述

2.2:请求包:

在这里插入图片描述
本次响应:00 4b 00 00 00 07 01 03 04 01 b6 01 00
00 4b为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;

00 00为协议标识符,与先前对应的请求保持一致;

00 07为数据长度,用来指示接下来数据的长度,单位字节

01为设备地址,应答报文要求与先前对应的请求保持一致

03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;

04指示接下来数据的字节长度;

01 b6 01 00为被读取的保持寄存器中的数据值,本例中同时读取了温湿度两个寄存器数据,此处返回4个字节,每2个字节一组数据。
翻译过来就是:01b6=438,湿度43.8%。0100=256,湿度25.6℃

二、Python的Modbus TCP客户端

1、Python modbus_tk第三方库

Python中提供了支持Modbus协议的第三方库——modbus_tk,简单的通过pip install modbus_tk即可安装
如下例子实现了一个简单的,读取0000和0001两个寄存器的数据
如下所示:

import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md

# 远程连接到服务器端
master = mt.TcpMaster("192.168.1.10", port=502)
master.set_timeout(1.0)

# @slave=1 : identifier of the slave. from 1 to 247.  0为广播所有的站号
# @function_code=READ_HOLDING_REGISTERS:功能码
# @starting_address=1:开始地址
# @quantity_of_x=3:寄存器/线圈的数量
# @output_value:一个整数或可迭代的值:1/[1,1,1,0,0,1]/xrange(12)
# @data_format
# @expected_length
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=1, output_value=5)

print(Hold_value)  # 取到的寄存器的值格式为元组(456, 288)

2、确认温度传感器寄存器地址

对于你购买的支持TCP Modbus协议的温湿度传感器,请查阅说明书确认温度、湿度两个数据的寄存器地址。
比如,我这个温度传感器,很简单的就是第1、2两个寄存器内存储着湿度、温度。
在这里插入图片描述

三、数据整合展示到PRTG监控系统

import modbus_tk
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
import json

def print_json(value_list):
    try:
        data={
            "prtg": {
            "result": []
            }
            }
        result_data=[]
        for i in value_list:
            Temperature_data={
                "Channel": "%s Temperature"%i,
                "Unit": "Temperature",
                "Mode":"Absolute",
                "DecimalMode":"All",
                "Float":1,
                "LimitMode":1,
                "LimitMaxWarning":35,
                "LimitMinWarning":18,
                "Value":int(value_list[i][1])/10
            }
            Humidity_data={
                "Channel": "%s Humidity"%i,
                "Unit": "Percent",
                "Mode":"Absolute",
                "DecimalMode":"All",
                "Float":1,
                "LimitMode":1,
                "LimitMaxWarning":70,
                "LimitMinWarning":10,
                "Value":int(value_list[i][0])/10
            }
            data['prtg']['result'].append(Temperature_data)
            data['prtg']['result'].append(Humidity_data)

        print (json.dumps(data, sort_keys=True, indent=2))
    except Exception as err:
        raise err

def get_value(host_ip):
    try:
        master = mt.TcpMaster(host=host_ip,port=2000)
        master.set_timeout(1.0)
        Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=2, output_value=5)
    except Exception as err:
        return(0,0)
    else:
        return Hold_value

if __name__ == "__main__":
    try:
        host_list=["10.0.0.213","10.0.0.214"]
        # 多个传感器在这里依次填入IP地址
        value_list={}
        for host_ip in host_list:
            value_list[host_ip]=get_value(host_ip)
        print_json(value_list)

    except Exception as err:
        data={
          "prtg": {
           "error": 1,
           "text": str(err)
          }
         }
        print (json.dumps(data, sort_keys=True, indent=2))

运行后给出的符合PRTG要求的json结构格式数据

{
  "prtg": {
    "result": [
      {
        "Channel": "10.0.0.213 Temperature",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 35,
        "LimitMinWarning": 18,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Temperature",
        "Value": 24.3
      },
      {
        "Channel": "10.0.0.213 Humidity",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 70,
        "LimitMinWarning": 10,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Percent",
        "Value": 39.7
      },
      {
        "Channel": "10.0.0.214 Temperature",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 35,
        "LimitMinWarning": 18,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Temperature",
        "Value": 24.5
      },
      {
        "Channel": "10.0.0.214 Humidity",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 70,
        "LimitMinWarning": 10,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Percent",
        "Value": 41.2
      }
    ]
  }
}
Program ended with exit code: 0

在这里插入图片描述
往期回顾:
【逗老师带你学IT】HUAWEI华为防火墙自动化运维Python ssh管理网络设备
【逗老师带你学IT】PRTG获取HUAWEI FusionServer iBMC传感器状态
【逗老师带你学IT】PRTG自定义脚本ssh登录网络设备获负载均衡链路状态
【逗老师带你学IT】Django+IIS+Python构建微软AD域控API管理中心
【逗老师带你学IT】通过企业微信推送AD域密码即将到期提醒
【逗老师带你学IT】AD域控 Dsquery 查询命令实例汇总
【逗老师带你学IT】Google Admin服务账号+API管理G suit内所有网域用户
【逗老师带你学IT】PRTG监控系统通过企业微信推送图文混排告警消息
【逗老师带你学IT】PRTG HTTP API获取指定传感器流量图表图片
【逗老师带你学IT】PRTG监控系统合并多个传感器通道数据
【逗老师带你学IT】PRTG监控系统通过企业微信推送告警消息
【逗老师带你学IT】PRTG监控系统配合树莓派采集企业内部无线网络质量
【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动
【逗老师带你学IT】Kiwi Syslog Server安装和配置教程
【逗老师带你学IT】Kiwi Syslog Web Access与Active Directory集成认证
【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动
【逗老师带你学IT】Windows Server Network Policy Service(NPS)记账与审计
【逗老师带你学IT】Windows Server NPS服务构建基于AD域控的radius认证
【逗老师带你学IT】AD域控和freeradius集成认证环境,PAP,MSCHAPV2
【逗老师带你学IT】深信服SSL远程接入与深信服行为审计同步登陆用户信息




















易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!