Запись данных, полученных из Wireshark, в конечную точку 0 с использованием PyUSB - PullRequest
0 голосов
/ 09 января 2019

У меня есть веб-камера Logitech PTZ Pro 2, я хочу использовать ее в качестве веб-камеры на Raspberry Pi, но я также хочу использовать ее элементы управления панорамированием, наклоном и масштабированием.

К сожалению, uvcdynctrl не поддерживает мою камеру должным образом, и я не смог найти ничего, кроме официального приложения Logitech для Windows для ее правильного управления и Logitech SRK (Software Reference Kit). SRK - это демонстрационная версия C ++, позволяющая отлично управлять функциями PTZ в Linux, но я не являюсь разработчиком C ++ (или C) и очень не в себе.

Я запустил демонстрацию SRK, использовал ее, чтобы переместить камеру влево на один «блок», и запечатлел ее в Wireshark, что дает мне это.

Wireshark USB capture

Из некоторых возни с lsusb у камеры нет конечных точек USB OUT, а конечной точки 0x00 (0), которая показана на снимке, нет. Я знаю, что конечная точка 0 является особенной и используется для описания устройства или чего-то в этом роде, но я действительно запутался тогда, почему Wireshark ясно показывает, что мне нужно выполнить передачу управления в конечную точку 0 с этой 32-байтовой строкой, которая также была перехвачена - которая должна двигаться камера ушла.

Я пробовал это

import usb.core
import usb.util
dev = usb.core.find(idVendor=0x046d, idProduct=0x085f)
cfg = dev.get_active_configuration()
ep = usb.util.find_descriptor(cfg, bInterfaceClass=0x03)
buf = bytes([0x0b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
dev.write(0x00, buf) 

Но я просто получаю

ValueError: Invalid endpoint address 0x0

Я тоже попробовал это, взяв значения из захвата Wireshark

dev.ctrl_transfer(0x21, 9, 0x020b, 2, buf)

Но это встречается с

USBError: [Errno 16] Resource busy

Я понимаю, что не выгружал драйвер ядра для него (с dev.detach_kernel_driver(interface)), но если я это сделаю, он не сможет быть использован как веб-камера.

Я могу только предположить, что неправильно переводю запрос из Wireshark в PyUSB, потому что вижу, что он работает в Wireshark с программным обеспечением Logitech, и камера движется.

На случай, если это поможет, полный lsusb -v для устройства доступен здесь: https://pastebin.com/QbTTgwK0

...