概要
USB relay是在github参考链接如下: https://github.com/pavel-a/usb-relay-hid,可下载发布的二进制文件进一步封装。
在linux下使用 USB relay
可以用sudo apt-get install usbrelay,或下载发布bin直接执行文件。
在window下控制
想要usb relay实现开关控制的继电器现在分类成一个python调用库,r以下:需要发布dll文件保存在同级目录下到lib文件夹下,
# vim relay.py #!/usr/bin/env python # -*- coding:utf-8 -*- import os import sys import time from ctypes import Structure,WinDLL,c_char_p,POINTER,pointer,cdll from platform import system cdll_names = { 'Darwin' : 'libc.dylib', 'Linux' : 'libc.so.6', 'Windows': 'msvcrt.dll' } clib = WinDLL(cdll_names[system()]) class Usb_relay_device_type(Structure): USB_RELAY_DEVICE_ONE_CHANNEL = 1 USB_RELAY_DEVICE_TWO_CHANNEL = 2 USB_RELAY_DEVICE_FOUR_CHANNEL = 4 USB_RELAY_DEVICE_EIGHT_CHANNEL = 8 class Usb_relay_device_info(Structure): pass Usb_relay_device_info._fields_ = [("serial_number",c_char_p), ("device_path",c_char_p), ("type",Usb_relay_device_type), ("next",POINTER(Usb_relay_device_info))] usb_relay_device_info_p = pointer(Usb_relay_device_info()) class Relay(): def __init__(self): self.filepath64 = os.path.dirname(os.path.abspath(__file__)) os.sep "lib" os.sep "USB_RELAY_DEVICE_64n.dll" self.filepath32 = os.path.dirname(os.path.abspath(__file__)) os.sep "lib" os.sep "USB_RELAY_DEVICE_32n.dll" # print(self.filepath64) # print(self.filepath32) self.usb_relay_device_info = pointer(Usb_relay_device_info()) self.load_usb_relay_device_dll() self.usb_relay_device_enumerate = self.usb_relay_device_enumerate() self.m_hCurDevice = self.usb_relay_device_open() print(self.m_hCurDevice) print("------------------") def __del__(self): print("close relay") self.usb_relay_device_close() def load_usb_relay_device_dll(self): if os.path.isfile(self.filepath32) and os.path.isfile(self.filepath64): try: self.filepath = self.filepath32 self.usb_relay_device_dll = cdll.LoadLibrary(self.filepath) except: self.filepath = self.filepath64 self.usb_relay_device_dll = cdll.LoadLibrary(self.filepath) else: assert False, "Can not find %s"%self.filepath if self.usb_relay_device_dll is not None: print ("Load %s successfully"%os.path.basename(self.filepath)) def usb_relay_init(self): self.usb_relay_device_dll.usb_relay_init() # 判断它是否存在USB relay, def usb_relay_exit(self): if self.m_hCurDevice > 0: return True else: return False def usb_relay_device_enumerate(self): self.usb_relay_device_dll.usb_relay_device_enumerate.args = POINTER(Usb_relay_device_info) self.usb_relay_device_dll.usb_relay_device_enumerate.restype = POINTER(Usb_relay_device_info) return self.usb_relay_device_dll.usb_relay_device_enumerate() def usb_relay_device_open(self): return self.usb_relay_device_dll.usb_relay_device_open(self.usb_relay_device_enumerate) def usb_relay_device_close(self): self.usb_relay_device_dll.usb_relay_device_close(self.m_hCurDevice) # 打开指定通道 def usb_relay_device_open_one_relay_channel(self,index): self.usb_relay_device_dll.usb_relay_device_open_one_relay_channel(self.m_hCurDevice, index) # 打开所有通道 def usb_relay_device_open_all_relay_channel(self): self.usb_relay_device_dll.usb_relay_device_open_all_relay_channel(self.m_hCurDevice) #关闭指定通道 def usb_relay_device_close_one_relay_channel(self, index): self.usb_relay_device_dll.usb_relay_device_close_one_relay_channel(self.m_hCurDevice, index) 关闭所有通道 def usb_relay_device_close_all_relay_channel(self,): self.usb_relay_device_dll.usb_relay_device_close_all_relay_channel(self.m_hCurDevice) def usb_relay_device_get_status(self, status): self.usb_relay_device_dll.usb_relay_device_get_status(self.m_hCurDevice, status) # 获取 usb relay回到各种通道状态,形式如{1:open”, 2:“close”,} def UsbRelayDeviceStatus(self): num = self.usb_relay_device_dll.usb_relay_device_get_status_bitmap(self.m_hCurDevice) relay_num = self.usb_relay_device_dll.usb_elay_device_get_num_relays(self.m_hCurDevice)
DeviceStatus = {}
for i in range(1,relay_num+1):
DeviceStatus[i] = "close"
for i in range(1,relay_num+1):
if num%2 == 1:
num=num/2
DeviceStatus[i]="open"
else:
num=num/2
DeviceStatus[i]="close"
return DeviceStatus
def UsbRelayDeviceNum(self):
return self.usb_relay_device_dll.usb_relay_device_get_num_relays(self.m_hCurDevice)
if __name__ == "__main__":
r = Relay() #实例化Relay(),然后就可以调用里面到各个方法了。
print(" ---------------------------")
print(r.UsbRelayDeviceStatus())
print(r.UsbRelayDeviceNum())
r.usb_relay_device_open_one_relay_channel(2)
time.sleep(1)
r.usb_relay_device_close_all_relay_channel()
print(r.usb_relay_device_get_status("1"))