通过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==============')