概要
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_relay_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("hqh ---------------------------")
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"))