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

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

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

Пусто.

Путём гугления был найден виновник, им оказалась библиотека 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 (formerly Feiya Technology Corp.) : Flash Drive (090c:1000)

 - busid 1-1.4 (1a86:7523)
   QinHeng Electronics : HL-340 USB-Serial adapter (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
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
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, в котором предлагается скачать с дропбокса патченый в 2014 году драйвер. При попытке запустить его под Windows 10 и подключиться к нашему устройству получаем ошибку:

c:\Utils\usbip>usbip -a 192.168.31.203 1-1.4
usbip for windows ($Id$)

*** ERROR: cannot find device

Связано это с тем, что клиент не работает с сервером, собранным под ядро старше версии 3.14.
Сервер usbip под OpenWRT 19.07.3 собран на ядре 4.14.180.

Продолжая поиски, натыкаюсь на актуальную разработку виндового клиента на 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
Винда говорит, что всё ок. Снова перезагружаемся, и видим в правом нижнем углу надпись 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 <ip вашего роутера>

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

c:\Utils\usbip>usbip.exe list -r 192.168.31.203
usbip: error: failed to open usb id database
Exportable USB devices
======================
 - 192.168.31.203
      1-1.4: unknown vendor : unknown product (1a86:7523)
           : /sys/devices/ssb0:1/ehci-platform.0/usb1/1-1/1-1.4
           : unknown class / unknown subclass / unknown protocol (ff/00/00)

на ошибку usbip: error: failed to open usb id database не обращаем внимания, на работу не влияет.

Теперь биндим устройство:

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

Всё, винда обнаружила новое устройство, теперь с ним можно работать так, как будто оно физически подключено к ноутбуку.

С китайским гравёром пришлось немного помучаться, так как при попытке установить его драйвер CH341SER через прилагавшийся к гравёру инсталлятор (да, гравёр на Ардуино), USB/IP VHCI ронял винду в BSOD. Однако установка драйвера CH341SER до подключения устройства через usbip.exe решала проблему.

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

Использованные источники:

https://openwrt.org/docs/guide-user/services/usb.iptunnel
https://github.com/cezanne/usbip-win
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 26

    +10

    Если правильно помню, то ch341 — это usb-uart конвертер. Если так, то не проще на роутере поднять туннель сокатом serial-to-tcp, а на пк обратное преобразование — TCP в виртуальный com-порт и натравить программу на него?

      0
      Не знаю как под виндоус, на линуксе, конечно, проще. На одном устройстве у меня были проблемы с сокат, выручил nc:
      nc -l 2000 > /dev/ttyUSB0 < /dev/ttyUSB0
      Только нужно в бесконечный цикл обернуть, чтоб nc не прекращал работу после разрыва соединения.
        0
        А зачем бесконечный цикл? Думаю, что так можно обойтись и без него:
        nc -k -l 2000 > /dev/ttyUSB0 < /dev/ttyUSB0
      +6

      Недавно настроил удаленное сканирование и удалённую печать через virtualhere Linux USB Server, на nexx 3020 скачал бинарник, на Винду ехешник. Всё. На одно устройство хватит и триала — он бесплатен. Ничего настраивать и городить не надо. Бинарники есть для множества архитектур. Тоже сначала пытался через костыли сделать, один добрый человек упомянул решение, попробуйте и вы.

        0

        Только GUI у него пока по Wayland не работает (Fedora 30+), есть консольная утилита конечно, но осадочек остался.

          0

          Да и цена 49$, но удобство перевесило. В Synology есть в менеджере приложений из коробки.

            0
            Как я уже говорил
            «На одно устройство хватит и триала — он бесплатен.»

            The trial version of the server will allow you to share 1 device without time restrictions using one of the Generic builds below. To share more devices, resell VirtualHere on your own device, or use a CPU optimized build of VirtualHere please purchase a license

            Мне для печати и сканирования хватит и nexx за три рубля, synology мне для этого не нужен.
              0
              Мне для печати и сканирования хватит и nexx за три рубля, synology мне для этого не нужен.

              Ну я в целом для интересующихся. У меня в сетапе был synology, и потом я узнал про virtualhere, получился простой способ шарить старый usb-принтер на много рабочих станций.

                0
                Тогда может есть смысл и указать нужный пункт, чтобы люди знали в какую сторону рыть?
            0
            Там чрезвычайно оперативно отвечает суппорт, попробуйте им написать. Мне вот ответили что если после сканирования печать не работает (висит в очереди) надо добавить в конфиг вот такой параметр
            AutoAttachToKernel=1

            Вот отсюда отвечали — [email protected]
            0
            Можно чуть детальнее про установку на nexx 3020?
              0
              Качаете www.virtualhere.com/sites/default/files/usbserver/vhusbdmipsel

              Кладете в /opt/home/

              создаете стартовый скрипт
              /etc/rc.d/S99vhusbd
              #!/bin/sh /etc/rc.common
              # Copyright © 2008 OpenWrt.org

              START=99

              PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin

              HOME=/opt/home

              NAME=vhusbdmipsel

              DAEMON=$HOME/$NAME

              vhusbd_status ()
              {
              [ `pidof $NAME` ]
              }

              start()
              {
              chmod 755 $DAEMON
              # find $HOME -type f -name «vhusbdmipsel.log» -delete
              # $DAEMON -b -c $HOME/config.ini -r $HOME/vhusbdmipsel.log
              $DAEMON -b -c $HOME/config.ini
              }

              stop()
              {
              kill -9 `pidof $NAME`
              }
              case "$1" in
              start)
              if vhusbd_status
              then
              echo virtualhere already running
              else
              start
              fi
              ;;
              stop)
              if vhusbd_status
              then
              stop
              else
              echo virtualhere is not running
              fi
              ;;
              status)
              if vhusbd_status
              then
              echo virtualhere already running
              else
              echo virtualhere is not running
              fi
              ;;
              restart)
              stop
              sleep 3
              start
              ;;
              *)
              echo «Usage: $0 {start|stop|restart|status}»
              ;;
              esac


              не забудьте дать права на исполнение бинарнику и скрипту
              ну а клиента качаете тут www.virtualhere.com/sites/default/files/usbclient/vhui64.exe

              Вроде ничего не перепутал
                +2

                неприличное название бинарника =/
                кому нить будешь объяснять, не правильно поймут =)

                  0
                  Есть такое) Но лишь бы работал)
            +4
            Я в свое время писал нечто подобное на STM32F407. Там тоже были две платы, одна в режиме USB host, другая в Slave. Host получала от подключённого девайса все дескрипторы, конфигурации и конечные точки и весь этот профиль отправлялся по сети второму устройству, которое приняв все это, прикидывалось этим устройством и просто принимало буферы конечных точек и события. Все работало довольно шустро (ограничиваясь только пропускной способностью сети). Были и проблемы, конечно, но большинство потребностей оно покрывало. К сожалению, проект был коммерческим.
              +1

              HS или FS?
              Флешку на какой скорости прокидывает?

              0
              Итак, сначала просят установить сертификат, притом дважды. Ок, помещаем его в Trusted Root Certification Authority и Trusted Publishers.
              Я так понимаю эти сертификаты не пригодились в итоге?)
                0
                Я неверно выразился: драйвер не совсем неподписанный, он подписан самоподписанным сертификатом) Ниже в комментариях заметили, что официальны EV code signing стоит ~400$
                  0

                  Но я так понял смысла в этой установке сертификатов никакого не было? Ведь все равно надо переводить винду в тестовый режим.

                +1
                Зачем так сложно? Все эти граверы и прочие детские CNC управляются GRBL через уарт. А раз так, на ESP-01 можно собрать WiFi-uart, драйвер для винды есть. Работает нормально.
                  +1
                  Спасибо, попробую
                  –4
                  Мне вот интересно. А пожар вы тоже будете удалённо тушить?
                    0
                    Далее необходимо перевести операционную систему в тестовый режим.


                    Bидимо разработчики не смогли купить EV code signing сертификат за ~400$. Сталкивался с этой проблемой. Очень много гемора. Даже если есть деньги, то бюрократия отталкивает еще сильнее.
                      +2
                      Зачем столько сложностей и гемороя именно с USBoIP и страданиями с сертификатами для win?
                      У вас CH341 который просто предоставляет виртуальный com порт. Тут есть куча вариантов с Serial-over-IP (SoIP).
                      Есть и другой вариант, отфигачиваете на дуине чип CH341, и подпаиваете MAX3232 RS232 готовый от китайцев, стоит, да ничего не стоит. Дальше прокидываете обычный кабель до компа и утыкаете в 232 порт(или переходник usb).
                        0
                        Даже отфигачивать не надо. Просто цепляемся на пины, между CH341 и атмегой резисторы как раз на такой случай. Не сгорит.
                        –2

                        Кто-нибудь уже сказал про проброс uart?

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое