Проброс USB-порта по сети


Постановка задачи

Необходимо подключить устройство, управляемое через USB-порт, к компьютеру, который отдалён от этого устройства. Или другими словами: “необходимо установить и запустить сервер USB-портов”.

На стороне сервера необходимо установить ПО, которое будет предоставлять доступ к USB-порту по локальной сети. На стороне клиента, следовательно, должно быть установлено ПО, которое способно будет соединиться с сервером и вернуть своей операционной системе виртуальный USB-порт, к которому, в свою очередь, любая из требуемых программ сможет свободно подключаться как к самому настоящему USB-порту.


Установка ПО

В качестве подходящего ПО для решения задачи выбран проект usbip (http://sourceforge.net/projects/usbip/). Для серверной части необходима Linux-машина. Пример установки серверной части (ArchLinux):

[orca@blizzard ~]$ sudo pacman -S usbip

Клиентская часть под MS Windows здесь: http://sourceforge.net/projects/usbip/files/usbip_windows. С ней иногда возникают проблемы, поэтому рекомендуется загрузить и альтернативный вариант сборки (http://files.p1m.nl/usbip/).


Эксперимент

Вначале необходимо подключить требуемое устройство к серверу (например, веб-камеру) и убедиться, что оно работает нормально:

[orca@blizzard ~]$ dmesg
...
[161152.910976] usb 1-1.1: new high-speed USB device number 5 using ehci-pci
[161153.266348] media: Linux media interface: v0.10
[161153.281732] Linux video capture interface: v2.00
[161153.304130] uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0102)
[161153.311185] input: USB2.0 Camera as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/input/input12
[161153.311298] usbcore: registered new interface driver uvcvideo
[161153.311300] USB Video Class driver (1.1.1)
[orca@blizzard ~]$ sudo usbip list -l
 - busid 3-1.1 (1e4e:0102)
   Cubeternet : GL-UPC822 UVC WebCam (1e4e:0102)
         3-1.1:1.0 -> uvcvideo
         3-1.1:1.1 -> uvcvideo

Загрузить необходимые модули, запустить демон “usbip” и привязать к нему устройство из предыдущего списка:

[orca@blizzard ~]$ sudo modprobe usbip-core
[orca@blizzard ~]$ sudo modprobe usbip-host
[orca@blizzard ~]$ sudo usbipd -D
[orca@blizzard ~]$ sudo usbip bind --busid=3-1.1
bind device on busid 3-1.1: complete
Замечание На начальном этапе рекомендуется запустить демон в режиме отладки: “sudo usbipd -d”

Опросить демон “usbip”:

[orca@blizzard ~]$ usbip list -r 10.0.0.14
Exportable USB devices
======================
 - 10.0.0.14
    3-1.1: Cubeternet : GL-UPC822 UVC WebCam (1e4e:0102)
         : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.1
         : Miscellaneous Device / ? / Interface Association (ef/02/01)
         :  0 - Video / Video Control / unknown protocol (0e/01/00)
         :  1 - Video / Video Streaming / unknown protocol (0e/02/00)
Замечание Здесь и далее, в примерах, адрес 10.0.0.14 это адрес сервера с запущенным демоном “usbip”

Перейти на сторону клиента. Проверить связь программой “telnet” подключением к порту 3240.

Распаковать архив (usbip_windows_v0.2.0.0_signed.zip). Установить драйвер устройства “USB/IP Enumerator”:

  1. Control Panel → Add Hardware → Next
  2. Yes, I have already connected the hardware → Next
  3. Add a new hardware device → Next
  4. Install the hardware that I manually select from a list(Advanced) → Next
  5. System Devices → Next
  6. Have Disk → Browse → выбрать директорию с распакованным архивом → OK
  7. USB/IP Enumerator → Next
  8. The wizard is ready to install your hardware → Next → Finish

Открыть командную строку, перейти в директорию с распакованным архивом, выполнить команды:

D:\Install\usbip_win>usbip.exe -l 10.0.0.14
usbip for windows ($Id$)

- 10.0.0.14
   3-1.1: unknown vendor : unknown product (1e4e:0102)
        : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.1
        : unknown class / unknown subclass / unknown protocol (ef/02/01)
        :  0 - unknown class / unknown subclass / unknown protocol (0e/01/00)
        :  1 - unknown class / unknown subclass / unknown protocol (0e/02/00)

D:\Install\usbip_win>usbip.exe -a 10.0.0.14 3-1.1
new usb device attached to usbvbus port 1
Важно Если программа usbip.exe вернёт ошибку, то попробовать с альтернативными вариантами её сборки (http://files.p1m.nl/usbip/), например, с usbip_windows_selfbuild_201.zip. Драйвер устройства “USB/IP Enumerator” из официальной сборки заменять не нужно.

Признаком того, что всё работает правильно является появление нового устройства в диспетчере устройств (USB Video Device).

Далее остаётся только проверить работу этого устройства. Для приведённого примера (веб-камера), использовался видео проигрыватель VLC (переносная версия):

  1. Запустить VLCPortable
  2. Медиа → Открыть устройство захвата… → Название видео-устройства: USB Video Device → [Воспроизвести]
  3. В окне проигрывателя VLC должно появиться изображение с прикреплённой по сети веб-камеры

Система поддерживает подключение нескольких устройств.

На стороне сервера подключить ещё одно USB-устройство (например Flash-диск), опросить демон “usbip” локально, прикрепить устройство, проверить список предоставляемых по сети USB-устройств:

[orca@blizzard ~]$ usbip list -r 10.0.0.14              <1>
Exportable USB devices
======================
 - 10.0.0.14
    3-1.1: Cubeternet : GL-UPC822 UVC WebCam (1e4e:0102)
         : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.1
         : Miscellaneous Device / ? / Interface Association (ef/02/01)
         :  0 - Video / Video Control / unknown protocol (0e/01/00)
         :  1 - Video / Video Streaming / unknown protocol (0e/02/00)

[orca@blizzard ~]$ usbip list -l                        <2>
...
 - busid 3-1.2 (13fe:3600)
   Kingston Technology Company Inc. : unknown product (13fe:3600)
         3-1.2:1.0 -> usbip-host

[orca@blizzard ~]$ sudo usbip bind --busid=3-1.2        <3>

[orca@blizzard ~]$ usbip list -r 10.0.0.14              <4>
Exportable USB devices
======================
 - 10.0.0.14
      3-1.1: Cubeternet : GL-UPC822 UVC WebCam (1e4e:0102)
           : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.1
           : Miscellaneous Device / ? / Interface Association (ef/02/01)
           :  0 - Video / Video Control / unknown protocol (0e/01/00)
           :  1 - Video / Video Streaming / unknown protocol (0e/02/00)

      3-1.2: Kingston Technology Company Inc. : unknown product (13fe:3600)
           : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.2
           : (Defined at Interface level) (00/00/00)
           :  0 - Mass Storage / SCSI / Bulk-Only (08/06/50)
  1. Контрольный опрос предоставляемых по сети USB-устройств (пока что только одна веб-камера)
  2. Локальный опрос; запомнить адрес подключенного Flash-диска
  3. Прикрепление Flash-диска
  4. Список предоставляемых по сети USB-устройств изменился

Перейти на сторону клиента. Открыть новое окно командной строки, перейти в директорию с программой usbip.exe:

D:\Install\usbip_win>usbip.exe -p                       <1>
max used port:1
port 1: used

D:\Install\usbip_win>usbip.exe -l 10.0.0.14             <2>
- 10.0.0.14
   3-1.1: unknown vendor : unknown product (1e4e:0102)
        : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.1
        : Miscellaneous Device / ? / Interface Association (ef/02/01)
        :  0 - Video / Video Control / unknown protocol (0e/01/00)
        :  1 - Video / Video Streaming / unknown protocol (0e/02/00)

   3-1.2: Kingston Technology Company Inc. : unknown product (13fe:3600)
        : /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.2
        : (Defined at Interface level) (00/00/00)
        :  0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50)

D:\Install\usbip_win>usbip.exe -a 10.0.0.14 3-1.2       <3>
new usb device attached to usbvbus port 2

D:\Install\usbip_win>usbip.exe -p                       <4>
max used port:2
port 1: used
port 2: used
  1. Опрос действующих соединений. Порт №1 используется веб-камерой
  2. Опрос доступных устройств
  3. Подключение устройства
  4. Повторный опрос действующих соединений (в новом окне командной строки)