自动电源的开发配置

本文主要是配置 HENGAN网络电源是配置(自动电源)的 python代码。自动电源与电脑连接同一个交换机上,两者通过网络进行数据交互,进而通过python来控制自动电源的开关。

 

#!/usr/bin/python
# -*- coding:utf-8 -*-

import socket
import struct
import select
import time


class AutoPower(object):
    __dstIP = "172.16.0.2"
    __dstPort = 1200
    __srcIP = "172.16.0.100"
    __srcPort = 1200
    __socket = None
    __subtype = 1
    _sendOnData = []
    _sendOffData = []

    def __init__(self):
        pass

    @classmethod
    def createSocket(cls):
        """
        create socket
        :return:
        """
        print "create socket"
        cls.__socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    @classmethod
    def getSendData(cls, channel):
        """
        配置需要开启或关闭的接触点
        :param channel: 传输过来的电源通道
        :return:
        """
        if channel == "1":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00010000, 0x9216]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00010000, 0x9316]
        if channel == "2":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00020000, 0x9316]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00020000, 0x9416]
        if channel == "3":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00040000, 0x9516]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00040000, 0x9616]
        if channel == "4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00080000, 0x9916]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00080000, 0x9a16]
        if channel == "1,2":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00030000, 0x9416]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00030000, 0x9516]
        if channel == "1,3":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00050000, 0x9616]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00050000, 0x9716]
        if channel == "1,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00090000, 0x9a16]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00090000, 0x9b16]
        if channel == "2,3":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x00060000, 0x9716]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x00060000, 0x9816]
        if channel == "2,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x000a0000, 0x9b16]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x000a0000, 0x9c16]
        if channel == "3,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x000c0000, 0x9d16]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x000c0000, 0x9e16]
        if channel == "1,2,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x000b0000, 0x9c16]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x000b0000, 0x9d16]
        if channel == "1,3,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x000d0000, 0x9e16]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x000d0000, 0x9e16]
        if channel == "2,3,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x000f0000, 0xa016]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x000f0000, 0xa116]
        if channel == "1,2,3,4":
            cls._sendOnData = [0xffffffff, 0x14000001, 0x00000000, 0x81ff0000, 0x000f0000, 0xa016]
            cls._sendOffData = [0xffffffff, 0x14000001, 0x00000000, 0x81000000, 0x000f0000, 0xa116]

    @classmethod
    def sendPowerOnCommand(cls, channel):
        """
        send power on command
        :param channel:传输过来的通道
        :return:
        """
        # 源socket可写
        AutoPower.getSendData(channel)
        _sockList = [cls.__socket]
        _rs, _ws, _es = select.select([], _sockList, [])
        _Mes = struct.pack("!5IH", *(cls._sendOnData))

        while 1:
            try:
                _ws[0].sendto(_Mes, (cls.__dstIP, cls.__dstPort))
                data, addr = cls.__socket.recvfrom(100)
                if ord(data[4]) == 0x94 and ord(data[13]) == 0xff:
                    print "POWER ON"
                    break
                time.sleep(10)
            except socket.error, e:
                print 'socket:', _ws[0].getsockname(), 'SendHeartBeat', e
                return None
        return True

    @classmethod
    def sendPowerOffCommand(cls, channel):
        """
        send power on command
        :param channel:传输过来的通道
        :return:
        """
        _sockList = [cls.__socket]
        _rs, _ws, _es = select.select([], _sockList, [])
        AutoPower.getSendData(channel)
        _Mes = struct.pack("!5IH", *(cls._sendOffData))
        while 1:
            try:
                _ws[0].sendto(_Mes, (cls.__dstIP, cls.__dstPort))
                data, addr = cls.__socket.recvfrom(100)
                if ord(data[4]) == 0x94 and ord(data[13]) == 0x00:
                    print "POWER OFF"
                    break
                time.sleep(10)
            except socket.error, e:
                print 'socket:', _ws[0].getsockname(), 'SendHeartBeat', e
                return None
        return True

    @classmethod
    def closeSocket(self):
        """
        close socket
        :return:
        """
        self.__socket.close()


if __name__ == '__main__':
    AutoPower.createSocket()
    AutoPower.sendPowerOffCommand("1,2,3,4")
    while True:
        AutoPower.sendPowerOffCommand("1,2")
        time.sleep(5)
        AutoPower.sendPowerOnCommand("1,2")
        time.sleep(5)

 

posted on 2021-04-26 10:49  软饭攻城狮  阅读(68)  评论(0编辑  收藏  举报

导航