自动电源的开发配置
本文主要是配置 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)