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

 

posted @ 2022-06-30 10:17  hello_Ms_w  阅读(145)  评论(0)    收藏  举报