通过modbus+socket+GPRS采集硬件数据
# !/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import os TESTCASE = os.path.dirname(os.path.abspath(__file__))
DIR = os.path.dirname(TESTCASE)
sys.path.append(DIR)
import logging
import socket
import struct
import binascii
import time, datetime
import re
import importlib
from common_util.mysql_conn_pool import MysqlConn importlib.reload(sys) class ServerSocket(object): def __init__(self, host, port):
self.host = host
self.port = port
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.s.bind((self.host, self.port))
self.s.listen(5)
self.conn, self.addr = self.s.accept()
logging.info('conn,addr------', self.conn, self.addr)
print('conn,addr------', self.conn, self.addr) # 接收数据
def recv_data(self):
try:
time.sleep(3)
data = self.conn.recv(2048)
data = binascii.b2a_hex(data)
logging.info('jieshoudaodiyicishuju', data)
if data:
data = str(data.decode('utf-8'))
print('decode', data)
logging.info('decode', data)
return data
except Exception as e:
print(e)
logging.info(e) # 发送数据
def send_data(self):
req = struct.pack('8B', int('01', 16), int('03', 16),
int('00', 16), int('00', 16), int('00', 16),
int('10', 16), int('44', 16), int('06', 16))
return self.conn.sendall(req) # 解析数据
def parse_data(self, modbus_param):
# modbus_param = b'010320001c7fff00fb012b028d0000005b000026f802737fff7fff7fff7fff7fff7fff5c5c'
# modbus_param = modbus_param.decode('utf-8')
a, b = modbus_param.split('010320')
st1 = re.findall(r'\w{4}', b)
logging.info(st1)
wind_speed = int(st1[0], 16) / 10 # 风速
temp = int(st1[2], 16) / 10 # 温度
petch = int(st1[3], 16) / 10 # 贴片,组件温度
humidity = int(st1[4], 16) / 10 # 湿度
total_radiation = int(st1[5], 16) # 总辐(当前辐射强度)
wind_direction = int(st1[6], 16) # 风向
sum_radiation = int(st1[7], 16) # 总累(辐射日累计)
pressure = int(st1[8], 16) # 气压
if len(str(pressure)) > 4:
pressure = pressure / 10 ** (len(str(pressure)) - 4)
else:
pass
carbon_dioxide = int(st1[9], 16) # 二氧化碳
param_list = [wind_speed, temp, petch, humidity, total_radiation,
wind_direction, sum_radiation, pressure,
carbon_dioxide]
logging.info('jiexideshuju:', param_list)
print('jiexideshuju:', param_list)
return param_list def insert_modbus_nums(self, param_list):
sql = '''INSERT INTO `bromake`.`pv_read_modbus` ( `wind_speed`, `temp`,
`petch`, `humidity`, `total_radiation`, `wind_direction`,
`sum_radiation`, `pressure`, `carbon_dioxide` )
VALUES
(%s,%s,%s,%s,%s,%s,%s,%s) '''.format(
param_list[0], param_list[1],
param_list[2], param_list[3],
param_list[4], param_list[5],
param_list[6], param_list[7],
param_list[8])
try:
conn = MysqlConn()
conn.insert_one(sql, )
conn.commit()
conn.close()
except Exception as e:
print(e) # 关闭连接
def close_conn(self):
return self.s.close() # host, port = '0.0.0.0', 12001 # socket = ServerSocket(host, port) def main(host, port):
socket = ServerSocket(host, port)
recv_data = socket.recv_data()
logging.info('zoudao recv_data', type(recv_data), recv_data)
print('zoudao recv_data', type(recv_data), recv_data)
# recv_data = recv_data.decode('utf-8')
recv_data1 = recv_data[0:4]
logging.info('recv_data1', recv_data1, type(recv_data1))
print('recv_data1', recv_data1, type(recv_data1))
if recv_data1 == '0103':
list_param = socket.parse_data(recv_data)
socket.insert_modbus_nums(list_param)
else:
socket.send_data()
recv_data = socket.recv_data()
# recv_data = recv_data.decode('utf-8')
recv_data1 = recv_data[0:4]
if recv_data1 == '0103':
list_param = socket.parse_data(recv_data)
socket.insert_modbus_nums(list_param)
else:
pass
socket.close_conn()
time.sleep(10) if __name__ == '__main__':
while True:
time1 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(time1)
time.sleep(60 * 5)
time2 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(time2)
main('0.0.0.0', 12001)
print('==========main==============')
logging.info('==========main==============')
通过modbus+socket+GPRS采集硬件数据的更多相关文章
- Django项目:CMDB(服务器硬件资产自动采集系统)--12--08CMDB采集硬件数据日志记录
#settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据
#settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--07--06CMDB测试Linux系统采集硬件数据的命令02
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--06--06CMDB测试Linux系统采集硬件数据的命令01
#base.py # ————————01CMDB获取服务器基本信息———————— from config import settings #配置文件 class BasePlugin(object ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--05--05CMDB采集硬件数据的插件
#__init__.py # ————————05CMDB采集硬件数据的插件———————— from config import settings import importlib # —————— ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--10--06CMDB测试Linux系统采集硬件数据的命令05
cd /py/AutoClient/bin python3 auto-client.py /usr/local/python3/bin/pip install requests python3 aut ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--09--06CMDB测试Linux系统采集硬件数据的命令04
root 123456 ip addr init 0 root 123456 ip addr root 123456 python3 yum -y install zlib-devel bzip2-d ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--08--06CMDB测试Linux系统采集硬件数据的命令03
https://www.virtualbox.org/wiki/Downloads https://mirrors.aliyun.com/centos/7/isos/x86_64/ http://ww ...
- Java后台创建Socket服务接收硬件终端发送的数据
最近项目中有遇到后台接收硬件终端发送的数据并解析存储的需求,代码总结如下(有时间再来一一讲解,最近比较忙): @Override public void start() { ExecutorServi ...
- 为一个支持GPRS的硬件设备搭建一台高并发服务器用什么开发比较容易?
高并发服务器开发,硬件socket发送数据至服务器,服务器对数据进行判断,需要实现心跳以保持长连接. 同时还要接收另外一台服务器的消支付成功消息,接收到消息后控制硬件执行操作. 查了一些资料,java ...
随机推荐
- 【根文件系统 】开发板通过nfs挂载ubuntu上的根文件系统
在此基础上制作可用的根文件系统:https://www.cnblogs.com/hengqiu/p/15908597.html 1.ubuntu搭建nfs服务器 sudo apt-get instal ...
- 问题记录_IDEA版本2021.2.3_debug时变量显示不全(只显示线程附近部分)
问题记录_IDEA版本2021.2.3_debug时变量显示不全(只显示线程附近部分) 起因 把IDEA的版本从2019升级到了2021.2.3,在debug的时候发现变量的值能看到的很少,并不像20 ...
- webpack的核心概念
一.entry 指定webpack从哪个文件开始入手打包,下面是单入口 多页面开发,每个页面都有自己的js文件,多个文件,所以需要多个入口 我们看看多入口,单出口bundle.js,我们在src仅仅多 ...
- 5.mysql的explain的分析
执行分析: 1.id 含义:表示查询的子句或者操作表的顺序 三种情况:id 相同,执行的顺序由上到下: id不同,id越大优先级越高,越先执行: id相同不相同同时存在: 2.select_type ...
- linux升级系统内核版导致死锁
如上图片,官方说明为linux内核版本过低,存在系统bug,具体说明如下: https://baijiahao.baidu.com/s?id=1652492237858209875&wfr=s ...
- php框架之odp-环境部署安装
一.安装配置 1.安装很简单,创建安装目录,然后在linux上使用wget命令从获取地址下载,然后解压,最后在安装目录下执行bin/odp_install即可. 例如:(只是举例,请安装最新的版本) ...
- 大道至简读后感以及JAVA伪代码
<大道至简>这本书引用<愚公移山>一文,生动完美的诠释了编程的整个过程.在两千年前的寓言中,愚公集项目组织者.团队经理.编程人员.技术分析师等众多角色于一身.首先是原始需求的产 ...
- 富文本编辑器转word
https://blog.csdn.net/qq_41532872/article/details/108644773
- Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:...
大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误"错误:Failed to download metadata for repo 'AppStr ...
- nacos原理
配置中心原理 1.Nacos 客户端使用长轮询请求客户端变更数据,并且设置30s超时,当配置发生变化响应会立即返回,否则一直等到29.5s之后再返回响应. 2.客户端的请求到达服务端后,服务端将该请求 ...