USB over IP в домашни условия

Понякога възниква желание да работя с устройство, свързано чрез USB, без да го държа на масата до лаптопа. Такова устройство за мен е китайски лазерен гравьор с мощност 500 мВт, доста неприятно при близък контакт. Освен непосредствената опасност за очите, по време на работа с лазера се отделят токсични горивни продукти, затова устройството трябва да бъде в добре проветрено помещение и предпочително изолирано от хора. А как да управляваме такова устройство? Отговорът на този въпрос случайно намерих, докато преглеждах репозитория OpenWRT в надеждата да намеря подходящо приложение за стария си рутер D-Link DIR-320 A2. За свързване реших да използвам описаното по-рано на Хабра USB over IP тунел, но всички инструкции за неговото инсталиране вече бяха остарели, затова пиша своя.

OpenWRT е операционна система, която не се нуждае от представяне, затова няма да описвам инсталацията ѝ. За своя рутер взех последната стабилна версия OpenWrt 19.07.3 и я свързах към основната точка за достъп по Wi-Fi като клиент, избирателно режим lan, за да не натоварвам защитната стена.

Серверна част

Действайте според официалните инструкции. След свързване по ssh инсталирайте необходимите пакети.

root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install kmod-usb-ohci usbip-server usbip-client

След това свързваме устройството ни към USB порта на рутера (в моя случай устройства: USB хъб, флашка, на която е монтирана файловата система на рутера (поради недостиг на място на вътрешното хранилище) и, съответно, гравьора).

Опитваме да изведем списък на свързаните устройства:

root@OpenWrt:~# usbip list -l

Празно.

Чрез търсене в Google открих проблемния елемент - библиотеката libudev-fbsd.
Изтегляме ръчно последната работеща версия от репозитория libudev_3.2-1 от версия OpenWRT 17.01.7 за своята архитектура, в моя случай това е libudev_3.2-1_mipsel_mips32.ipk. С помощта на wget/scp я качваме в паметта на рутера и я преинсталираме

root@OpenWrt:~# opkg remove --force-depends libudev-fbsd
root@OpenWrt:~# opkg install libudev_3.2-1_mipsel_mips32.ipk

Проверяваме:

root@OpenWrt:~# usbip list -l
 - busid 1-1.1 (090c:1000)
   Silicon Motion, Inc. - Taiwan (преди Feiya Technology Corp.) : Флашка (090c:1000)

 - busid 1-1.4 (1a86:7523)
   QinHeng Electronics : HL-340 USB-Serial адаптер (1a86:7523)

Китаецът, свързан в USB хъба, получи bsuid 1-1.4. Запомнихме.

Сега стартираме демона:

root@OpenWrt:~# usbipd -D

и свързваме китайца

root@OpenWrt:~# usbip bind -b 1-1.4
usbip: info: bind device on busid 1-1.4: complete

Проверяваме дали всичко работи:

root@OpenWrt:/home# netstat -alpt
Активни интернет връзки (сървъри и установени)
Протокол Recv-Q Send-Q Локален адрес           Отдалечен адрес         Състояние       PID/Име на програмата
tcp        0      0 0.0.0.0:3240            0.0.0.0:*               LISTEN      1884/usbipd

За да свържем устройството автоматично по-нататък, ще направим промени /etc/rc.local, добавяйки преди exit 0 следното:

usbipd -D &
sleep 1
usbip bind -b 1-1.4

Клиентска част

Ще се опитаме да свържем устройството с Windows 10, използвайки споменатата по-горе инструкция от openwrt.org. Веднага ще кажа: начинанието е обречено на провал. Първо, разглежда се само Windows 7 x64. Второ, дадена е връзка към тема на sourceforge.net, в която се предлага да се изтегли от Dropbox патчнат през 2014 година драйвер. При опит за стартиране под Windows 10 и свързване с нашето устройство получаваме грешка:

c:Utilsusbip>usbip -a 192.168.31.203 1-1.4
usbip за Windows ($Id$)

*** ГРЕШКА: не може да се намери устройството

Това е свързано с факта, че клиентът не работи със сървър, компилиран под ядро по-стара от версия 3.14.
Сървърът usbip под OpenWRT 19.07.3 е компилиран на ядро 4.14.180.

Продължавайки търсенията, попадам на актуална разработка на клиент за Windows github. Ок, обявена е поддръжка за Windows 10 x64, но клиентът е изключително тестов, така че присъства редица ограничения.

И така, първо искат да инсталираме сертификат, при това два пъти. Ок, поставяме го в Trusted Root Certification Authority и Trusted Publishers.

След това е необходимо да се преведе операционната система в тестов режим. Това става с командата

bcdedit.exe /set TESTSIGNING ON

От първият път не успях, не ми позволи secure boot. За да го изключите, е необходимо да се рестартирате в UEFI и да зададете secure boot — disable. На някои модели лаптопи може да е необходимо задаване на supervisor password.

След това се зареждаме в Windows и правим bcdedit.exe /set TESTSIGNING ON
Windows казва, че всичко е ок. Отново се рестартираме и виждаме в долния десен ъгъл надпис Test Mode, версия и номера на билд ОС.

За какво са всички тези манипулации? За инсталиране на неподписан драйвер USB/IP VHCI. Предлага се да направите това, като изтеглите файловете usbip.exe, usbip_vhci.sys, usbip_vhci.inf, usbip_vhci.cer, usbip_vhci.cat и изпълните с права на администратор

usbip.exe install

или втори начин, инсталация на Legacy Hardware в ръчен режим. Избрах втория вариант, получих предупреждение за инсталиране на неподписан драйвер и се съгласих с него.

След това проверяваме, че имаме възможност да се свържем с отдалечено USB устройство, изпълнявайки командата:

usbip.exe list -r

получаваме списък с устройства:

c:Utilsusbip>usbip.exe list -r 192.168.31.203
usbip: грешка: неуспешно отворен usb id база данни
Изнесливи USB устройства
======================
 - 192.168.31.203
      1-1.4: непознат производител : непознат продукт (1a86:7523)
           : /sys/devices/ssb0:1/ehci-platform.0/usb1/1-1/1-1.4
           : непозната класа / непозната подкласа / непознат протокол (ff/00/00)

за грешка usbip: грешка: неуспешно отворен usb id база данни не му обръщайте внимание, не влияе на работата.

Сега свързваме устройството:

c:Utilsusbip>usbip.exe attach -r 192.168.31.203 -b 1-1.4

Всичко, Windows откри ново устройство, сега може да се работи с него, сякаш е физически свързано към лаптопа.

С китайския гравьор се наложи да се поровя малко, тъй като при опит да инсталирам драйвера CH341SER чрез приложеното с гравьора инсталатор (да, гравьорът е на Arduino), USB/IP VHCI падна на Windows в BSOD. Въпреки това, инсталацията на драйвера CH341SER до на свързването на устройството чрез usbip.exe решаваше проблема.

Резултат: гравьорът шумоли и дими в кухнята при отворен прозорец и затворена врата, наблюдавам процеса на изгаряне от друга стая чрез родния софтуер, който не подозира нищо.

Използвани източници:

https://openwrt.org/docs/guide-user/services/usb.iptunnel
https://github.com/cezanne/usbip-win

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster