Получить дескриптор строки с помощью PyUSB usb.util.get_string () - PullRequest
4 голосов
/ 10 мая 2011

У меня проблемы с получением строкового дескриптора устройства USB. То, что я ищу, - это дружелюбные названия производителя и продукта. Я использую libusb-1.0 в качестве бэкэнда и могу получить имя производителя с помощью предоставленной тестовой программы libusb, поэтому я знаю, что она существует.

Файл справки PyUSB говорит, что вы можете получить доступ к usb_get_string_simple (из бэкэнда libusb), используя:

get_string (dev, длина, индекс, langid = None)

   Retrieve a string descriptor from the device.
   dev is the Device object to which the request will be sent to.

   length is the length of string in number of characters.

   index is the string descriptor index and langid is the Language
   ID of the descriptor. If langid is omitted, the string descriptor
   of the first Language ID will be returned.

   The return value is the unicode string present in the descriptor.
import usb
#help(usb.core) 
busses = usb.busses()
for bus in busses:
  devices = bus.devices
  for dev in devices:
    _name = usb.util.get_string(dev.dev,256,0)  #This is where I'm having trouble
    print "device name=",_name
    print "Device:", dev.filename
    print "  Device class:",dev.deviceClass
    print "  Device sub class:",dev.deviceSubClass
    print "  Device protocol:",dev.deviceProtocol
    print "  Max packet size:",dev.maxPacketSize
    print "  idVendor:",hex(dev.idVendor)
    print "  idProduct:",hex(dev.idProduct)
    print "  Device Version:",dev.deviceVersion
    for config in dev.configurations:
      print "  Configuration:", config.value
      print "    Total length:", config.totalLength 
      print "    selfPowered:", config.selfPowered
      print "    remoteWakeup:", config.remoteWakeup
      print "    maxPower:", config.maxPower
      for intf in config.interfaces:
        print "    Interface:",intf[0].interfaceNumber
        for alt in intf:
          print "    Alternate Setting:",alt.alternateSetting
          print "      Interface class:",alt.interfaceClass
          print "      Interface sub class:",alt.interfaceSubClass
          print "      Interface protocol:",alt.interfaceProtocol
          for ep in alt.endpoints:
            print "      Endpoint:",hex(ep.address)
            print "        Type:",ep.type
            print "        Max packet size:",ep.maxPacketSize
            print "        Interval:",ep.interval

Любая помощь будет оценена.

Ответы [ 4 ]

5 голосов
/ 12 июня 2012

( Обновление за июль 2019 года: См. Ниже в ответе Теодора-Богдана Барбиеру четкое описание того, почему на самом деле не следует индексировать жесткие коды!)

( Второе обновление, июль 2019 г .: См. Ниже комментарий gog для ссылки на спецификацию USB, содержащую таблицу, в которой перечислены все поля дескриптора устройства.)

Следующая строка в вашем коде:

usb.util.get_string(dev.dev,256,0)

действительно проблема. Я не совсем уверен, что говорится в спецификации USB, но в моем текущем аппаратном проекте для выбора индекса я получаю следующее:

  • index = 0 (ваш выбор) возвращает один символ Unicode
  • index = 1 отправляет производителю
  • index = 2 отправляет описание устройства
  • index = 3 отправляет серийный номер устройства

Итак, попробуйте:

usb.util.get_string(dev.dev, 256, 2)

Удачи!

3 голосов
/ 30 августа 2014

Не стоит кодировать индекс жестко.

Я бы порекомендовал использовать что-то вроде этого:

usb.util.get_string(dev, 256, dev.iSerialNumber)
usb.util.get_string(dev, 256, dev.iManufacturer)

Как вы увидите ниже, индекс отличается от устройства кdevice.

Вывод lsusb -v:

device 1:            #index #string_descriptor
      iManufacturer  3 Linux 3.8.13 musb-hcd
      iProduct       2 MUSB HDRC host driver
      iSerial        1 musb-hdrc.1.auto

device 2:
      iManufacturer  2 E-boda
      iProduct       3 SUNNY V35
      iSerial        4 0123456789ABCDEF
0 голосов
/ 09 мая 2017

изменить на usb.util.get_string(dev, dev.iSerialNumber)

0 голосов
/ 04 ноября 2014

При этом будут получены строки с устройства:

dev = usb.core.find(idVendor=0x077d, idProduct=0x0410) # fill in your own device, of course
if dev is None:
    print 'Our device is not connected'
else:
    if dev._manufacturer is None:
        dev._manufacturer = usb.util.get_string(dev, dev.iManufacturer)
    print str(dev._manufacturer)
    if dev._product is None:
        dev._product = usb.util.get_string(dev, dev.iProduct)
    print str(dev._product)
...