Определите состояние коммутатора, подключенного к USB, с помощью python

Я хотел бы спросить, есть ли способ определить состояние переключателя, подключенного через usb. Переключатель имеет 2 состояния, включено и выключено. Возможно с Python, на Windows.

Или я могу реализовать сценарий, который будет рассматривать переключатель как расширение клавиатуры.

Заранее спасибо!

ИЗМЕНИТЬ

#import usb.core
#import usb.util
import usb

# find our device
#dev = usb.core.find(find_all=True)
busses = usb.busses()
# was it found?
#if dev is None:
#    raise ValueError('Device not found')


for bus in busses:
    devices = bus.devices
    for dev in devices:
        try:
            _name = usb.util.get_string(dev.dev, 19, 1)
        except:
            continue
        #dev.set_configuration()
        #cfg = dev.get_active_configuration()
        #interface_number = cfg[(0,0)].bInterfaceNumber
        #5alternate_settting = usb.control.get_interface(interface_number)
        print "Device name:",_name
        print "Device:", dev.filename
        print "  idVendor:",hex(dev.idVendor)
        print "  idProduct:",hex(dev.idProduct)
        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
        print

person Rincer    schedule 06.03.2012    source источник


Ответы (2)


Вы смотрели на PyUSB? См. http://pyusb.sourceforge.net/docs/1.0/tutorial.html для учебника по использованию PyUSB. Исходный код этой библиотеки поможет вам, если вы захотите реализовать что-то более близкое к аппаратному обеспечению.

http://libhid.alioth.debian.org/ выглядит как еще одна приличная библиотека, написанная на C с помощью Python привязки.

Редактировать

В ответ на вашу попытку кода похоже, что вы используете устаревший интерфейс PyUSB. Если вы напечатаете (dev), вы либо обнаружите, что оно отображается как <usb.legacy.Device object at 0x1dac210>, либо вы обнаружите, что используете более старую версию библиотеки (<usb.Device object at 0x13e6810>). Убедитесь, что у вас установлена ​​версия 1.0, и убедитесь, что вы используете более новые методы доступа к устройствам. Это будет что-то вроде <usb.core.Device object at 0x1e0c3d0> Например, usb.core.find() вернет вам устройство, у которого действительно есть set_configuration(). Попробуйте снова пройти обучение.

person gfortune    schedule 06.03.2012
comment
хорошо, сейчас я пробую pyusb, и я могу видеть имя, idVendor и idProduct подключенных устройств ... однако я получаю сообщение об ошибке при попытке for bus in busses: devices = bus.devices for dev in devices: try: _name = usb.util.get_string(dev.dev, 19, 1) except: continue dev.set_configuration() # здесь я получаю объект «Устройство» не имеет атрибута «set_configuration» - person Rincer; 06.03.2012
comment
Код указывает, что объект Device действительно имеет метод set_configuration. Необходим полный код и полная трассировка. Вы можете просто отредактировать исходный вопрос и добавить эту информацию. - person gfortune; 06.03.2012
comment
хорошо, я отредактировал исходный вопрос и добавил источник - person Rincer; 06.03.2012
comment
да... я сделал то, что вы сказали, это было именно так... прежде чем использовать старую версию, я использовал более новую, но у меня есть ошибка... теперь она исправлена, хорошо... она работает ... например... Я установил set_configuration() для своей мыши (USB), и она перестала работать: D, хорошо. Я предполагаю, что мы кое-чего достигли... теперь... переключатель работает в один клик, и я полагаю, что у него не будет драйверов... так что... как мне определить, когда он нажат...? Есть идеи...? Я много искал, но... пока ничего - person Rincer; 07.03.2012
comment
Вам нужно будет начать с определения фактического устройства, которое является вашим коммутатором, а затем выбрать конечную точку для чтения. Я думаю, что я бы, вероятно, прочитал что-то из того, что было предложено в разделе «Поговори со мной, дорогая» этого руководства о вкусах переводов, и пошел бы оттуда. Определение правильной конечной точки кажется важным шагом. Боюсь, это, вероятно, тем больше указаний, которые я смогу дать. - person gfortune; 07.03.2012
comment
хорошо... Я снова просмотрел примеры, я прочитал кое-что о USB... и я думаю, что сделал это... Я имею в виду... Я могу читать данные с моей USB-мыши, но для переключателя , может совсем по другому, но все же...работает - person Rincer; 07.03.2012
comment
одна вещь, которая меня беспокоит, - это функция usb.core.find ... Я имею в виду, что я знаю вызов, скажем, мыши, но для переключателя я этого не знаю. Я читал, что для физических устройств это 5 ... но считается ли коммутатор физическим устройством. - person Rincer; 07.03.2012

Хорошо, у меня есть решение сейчас, я его опубликую, но у меня есть вопрос... когда я запускаю код, иногда он говорит, что устройство занято, и он выдает ошибку, а когда он работает... он будет дождитесь прерывания, однако, если вы переместите мышь, она останется неподвижной на экране, но вызовет прерывание. То же самое можно сказать и о нажатии кнопки, оно вызовет прерывание, но мышь останется статичной, и чтобы использовать ее снова, вам нужно вынуть ее из USB и снова вставить.

import usb.core
import usb.util
#import usb

# find our device
dev = usb.core.find(find_all=True)


#the second device it finds is my mouse
device = dev[2]

#print device
#physical device call: 5
#usb HID call: 3

_name = usb.util.get_string(device, 19, 1)
print _name

#we take the first configuration of the device

device.set_configuration()
print "Config set..."

#we access the configuration we've found
cfg = device.get_active_configuration()

#we access the intherface with number 0 and alternate setting with number 0
interface_number = cfg[(0,0)].bInterfaceNumber
alternate_setting = usb.control.get_interface(device,interface_number)

#we find the alterng settings for interface_number and altering_setting
intf = usb.util.find_descriptor(cfg, bInterfaceNumber = interface_number,\   
bAlternateSetting = alternate_setting)

#Finds the first IN endpoint
ep = usb.util.find_descriptor(
intf,
# match the first IN endpoint
custom_match = \
lambda e: \
    usb.util.endpoint_direction(e.bEndpointAddress) == \
   usb.util.ENDPOINT_IN
)

#inorder for you to detect a state from the device, it has to be(for mouse, moved,    
#clicked)
#otherwise it generates error

#make use of the error, if the mouse isn't pushed, do nothing and wait, if pushed...     
#print the state
#and exit from the loop

print "Waiting for signal..."


#device.detach_kernel_driver(0)


#click of the scroll button has array('B', [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
#0, 0]) signal

while True:
    try:
       print ep.read(16)
       print "Received!"
       break
    except:
        continue

#assert ep is not 0

#_name=device.ctrl_transfer(bmRequestType=33, bRequest=11, wValue=0x0300)
#print _name

Так что я предполагаю, что он сначала удаляет драйверы мыши, затем общается с устройством, затем прерывание производится нажатием кнопки, затем... как я могу сказать, снова используйте ваши драйверы и завершайте программу... потому что это неудобно каждый раз заново вводить мышь usb.

person Rincer    schedule 08.03.2012