Я работаю над проектом, который будет читать QR-код. Я купил небольшой USB-сканер штрих-кода QR-кода и подключил его к своей системе, и я могу сканировать QR-код, и он отправит его в мое приложение, которое я пишу, но я должен знать имя /dev/устройства/порта, потому что каждый раз, когда он отключается и снова подключается, он может изменить назначенное имя /dev/устройства/порта.
Я пытался использовать pyusb, но он возвращает только информацию об устройстве. Я не вижу никаких подробностей о том, как /dev/ он представлен.
используя PySerial:
import serial
from serial.tools import list_ports
for port in serial.tools.list_ports.comports():
if port.vid is not None and port.pid is not None:
# It's a USB port on a platform that supports the extended info
# Do something with it.
print("Port={},VID={:#06x},PID={:#06x}".format(port.device, port.vid, port.pid))
но он не видит считыватель штрих-кода, подключенный к /dev/ttys002, что странно, поскольку PyUSB его видит. На самом деле он видит только два других устройства (входящий порт Bluetooth и мои беспроводные аэродромы), но не печатает их, потому что port.vid и port.pid для обоих равны «нет».
с помощью PyUSB:
import usb
import usb.backend.libusb1 as libusb1
import libusb1 as libusb
# find our device
dev = usb.core.find(idVendor=0xad93, idProduct=0x4002, backend=libusb1.get_backend())
print (dev)
вывод:
DEVICE ID ad93:4002 on Bus 020 Address 038 =================
bLength : 0x12 (18 bytes)
bDescriptorType : 0x1 Device
bcdUSB : 0x110 USB 1.1
bDeviceClass : 0x0 Specified at interface
bDeviceSubClass : 0x0
bDeviceProtocol : 0x0
bMaxPacketSize0 : 0x40 (64 bytes)
idVendor : 0xad93
idProduct : 0x4002
bcdDevice : 0x100 Device 1.0
iManufacturer : 0x1 YK
iProduct : 0x2 YK-2D PRODUCT HID KBW
iSerialNumber : 0x3 APP-000000000
bNumConfigurations : 0x1
CONFIGURATION 1: 200 mA ==================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x2 Configuration
wTotalLength : 0x22 (34 bytes)
bNumInterfaces : 0x1
bConfigurationValue : 0x1
iConfiguration : 0x0
bmAttributes : 0x80 Bus Powered
bMaxPower : 0x64 (200 mA)
INTERFACE 0: Human Interface Device ====================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x0
bAlternateSetting : 0x0
bNumEndpoints : 0x1
bInterfaceClass : 0x3 Human Interface Device
bInterfaceSubClass : 0x1
bInterfaceProtocol : 0x1
iInterface : 0x0
ENDPOINT 0x81: Interrupt IN ==========================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x81 IN
bmAttributes : 0x3 Interrupt
wMaxPacketSize : 0x8 (8 bytes)
bInterval : 0x1
Все, что я хочу сделать, это передать идентификатор поставщика и идентификатор устройства в функцию и заставить ее вернуть порт /dev/tty, к которому она подключена, чтобы я мог настроить поток для чтения/захвата QR-кода при его сканировании.
Я пытался решить эту проблему уже два дня, и у меня не осталось волос, которые можно было бы вырвать!
О, и я использую Mac OS Mojave 10.14.6 с Python 3.7.4.
РЕДАКТИРОВАТЬ:
Я могу прочитать QR-код, используя этот код.
f=open("/dev/ttys002")
print (f.read())
Второе ОБНОВЛЕНИЕ: я обнаружил, что сканер штрих-кода представляет себя как HID-устройство (клавиатуру). Я просматриваю pyhid и libusb/hdiapi, и я могу найти это устройство, но я не знаю, как его прочитать в python. Вот код, который я использую:
import hid
# get list of HID devices connected to this computer
h=hid.enumerate()
print ("HID info=", h,"\n")
# get path of first item
item=0
path=h[item]['path']
vid=h[item]['vendor_id']
pid=h[item]['product_id']
print ("Path=%s Vid=%s Pid=%s" % (path, vid, pid) + "/n")
# open the device
try:
# using path works on raw, not non-raw
# d=hid.Device(path=path)
# print "Opened device=", path
d=hid.Device(vid=vid, pid=pid)
print ("Opened device=", vid, pid, "\n")
# -- TBD
#r=d.get_feature_report(1, 1024)
#print "Report=", r
# loop rading the keyboard....
done=0
while(done==0):
r=d.read(10)
for c in r:
x=ord(c)
print ("read=",x,"\n")
except Exception as e:
print ("Exception, e=", e)
print ("Done!")
Я также добавляю к этому теги macos и hid, если смогу, так что, возможно, кто-то еще, кто может помочь, увидит это.
subprocess
иlsusb
илиdmesg
. Мне не ясно, сильно ли помогает знание устройства. Я думаю, вы должны выяснить, как слушать нажатия клавиш. Ознакомьтесь с этим ответом, чтобы начать. Удачи. - person bfris   schedule 27.08.2019