Почему мой сканер штрих-кода не указан как устройство /dev/?

Я работаю над проектом, который будет читать 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, если смогу, так что, возможно, кто-то еще, кто может помочь, увидит это.


person SouthernYankee65    schedule 26.08.2019    source источник
comment
Я думаю, что ваш читатель представляет себя клавиатурой. Это обычное дело для читателей. Если да, то он будет в /dev/input. Чтобы найти его, вы можете использовать subprocess и lsusb или dmesg. Мне не ясно, сильно ли помогает знание устройства. Я думаю, вы должны выяснить, как слушать нажатия клавиш. Ознакомьтесь с этим ответом, чтобы начать. Удачи.   -  person bfris    schedule 27.08.2019
comment
пожалуйста, посмотрите мое редактирование   -  person SouthernYankee65    schedule 27.08.2019


Ответы (1)


Если ваше устройство /dev/ttys002, возможно, оно будет отображаться в PySerial.

import serial.tools.list_ports

for LPI in serial.tools.list_ports.comports():
    print()
    print('device: %s' % LPI.device)
    print('name: %s' % LPI.name)
    print('description: %s' % LPI.description)
    print('hwid: %s' % LPI.hwid)
    print('vid: %s' % LPI.vid)
    print('pid: %s' % LPI.pid)
    print('serial_number: %s' % LPI.serial_number)
    print('location: %s' % LPI.location)
    print('manufacturer: %s' % LPI.manufacturer)
    print('product: %s' % LPI.product)
    print('interface: %s' % LPI.interface)
person bfris    schedule 26.08.2019
comment
Я попробовал это, и вот что он показывает: device: /dev/cu.Bluetooth-Incoming-Port name: None description: n/a hwid: n/a vid: None pid: None serial_number: None location: None manufacturer: None product: None interface: None device: /dev/cu.TomsAirPods-Wireless name: None description: n/a hwid: n/a vid: None pid: None serial_number: None location: None manufacturer: None product: None interface: None (извините, я не знаю, как отформатировать мини-уценку в комментариях) - person SouthernYankee65; 27.08.2019
comment
Можно ли запустить lsusb или dmesg в MacOS из терминала? Если это так, вы можете найти свое устройство таким образом. dmesg даст вам ТОННУ информации. Но вы можете выгрузить его в файл и поискать в файле /dev/ttys002: dmsg > dmsg.txt. - person bfris; 27.08.2019
comment
В Mac OS нет lsusb, но я запускал dmesg. Мне пришлось запустить его как sudo. Ничего полезного для меня не показал. Ничего о считывателе штрих-кода или tty-устройствах. - person SouthernYankee65; 27.08.2019