USB over IP met een Raspberry Pi – usb verlengen via wifi of ethernet

Noud van Kruysbergen
0

Wil je een usb-apparaat zo ver weg zetten dat een usb-kabel geen optie is? Met een Raspberry Pi en USB over IP kun je usb-apparaten aansluiten via wifi of een ethernetkabel. Dat is goedkoper dan speciale ethernet-usb-adapters maar kost wat inspanning.

Lees verder voor speciale software die je voor dit ‘usb verlengen’ kunt gebruiken en hoe je die toevoegt.

Het usb-apparaat wordt dus op een Raspberry Pi aangesloten en via het netwerk aan een ander systeem gekoppeld. De basis berust op functies die al bijna tien jaar in de Linux-kernel zitten, namelijk het oorspronkelijk door Takahiro Hirofuchi ontwikkelde USB/IP-project.

Daarmee kan een systeem in het netwerk (de ‘server’) aan een ander systeem (de ‘client’) een usb-apparaat ter beschikking stellen, alsof dat lokaal op die client aange­sloten is. Met USB over IP maak je een ‘rechtstreekse’ verbinding, de techniek is niet bedoeld om apparaten te delen met anderen.

USB over IP met een Raspberry Pi - usb verlengen via wifi of ethernet

Voorbeelden van toepassingen voor USB over IP

Je kunt hiermee bijvoorbeeld

  • op een plek met een goed bereik een Zigbee-dongle plaatsen,
  • een geheugenstick zonder traplopen aansluiten op de server in de kelder,
  • een usb-printer op een plaats zetten waar je geen last hebt van het geluid of de uitstoot.

Aangepaste software voor USB over IP

Op de server is niet veel nodigde behalve de kernelmodules voor ­USB/IP, namelijk usbip_host en usbip_core. Bovendien moet die een daemon draaien (usbipd), die verbindingen aanneemt van de client die een usb-apparaat wil benaderen. De client heeft de mo­dule vhci_hcd nodig, maar geen daemon.

De bijbehorende commando’s met busip breien de boel aan elkaar maar gebruiken daarbij de bus-id’s van usb-apparaten en er zitten andere haken en ogen aan. Daarom hebben we eigen systemd-units geschreven, die de afhandeling van de ‘genetwerkte’ usb-apparaten verlichten omdat ze in plaats van bus-id’s de fabrikant- en apparaat-id gebruiken. Daardoor werkt het vrijgeven ongeacht op welke poort het apparaat zit.

Aangepaste software installeren

Het op Github gepubliceerde archief met de bestanden voor de systemd-units en de udev-rules bevat een client- en een servermap.

Kopieer de bestanden naar de betreffende systemen. De systemd-units registreer je dan zowel op de server als op de client met systemctl daemon-reload.

Je hoeft met deze units geen bus-id’s en poorten te kennen, maar wat ze daarom niet (kunnen) ondersteunen, is het gelijktijdig delen van meerdere identieke apparaten op een server.

Gebruik sudo bij alle opdrachten.

Usb-apparaat delen op de server

Op de server zet je de op het netwerk te delen apparaten met fabrikant- en apparaat-id, zoals bijvoorbeeld lsusb die laat zien, in het bestand /etc/udev/rules.d/90-usbip.rules. Je vindt in het bestand een paar uitgecommentarieerde voorbeelden.

Vervolgens laat je op de server udev de nieuwe rules tot zich nemen: udevadm control –reload -­rules && udevadm trigger.

Als je dan met system­ctl | grep usbip alle actieve units met usbip in de naam laat weergeven, moet je in de output zowel de usbipd-service zien die de daemon start, als voor ieder gedeeld apparaat een usbip@-service.

De ­usbip@-services krijgen als parameter en naamtoevoeging het usb-poortnummer waaraan de via udev-rules opgegeven apparaten hangen. De unit achterhaalt dat aan de hand van de fabrikant- en apparaat-id automatisch.

usb apparaat via netwerk aansluiten op ander apparaat met USB over IP

Zelfs een (smarthome-)applicatie in een VM kun je koppelen met een usb-apparaat aan een Pi elders.

Usb-apparaat koppelen op de client

Na het succesvol registreren van de systemd-units op de server en client en het delen van de usb-apparaten op de server kun je de client met een usb-apparaat verbinden.

Daarvoor activeer en start je een systemd-unit als volgt:

systemctl enable usbip@srv:0403:6001
systemctl start usbip@srv:0403:6001

Daarbij staat srv voor de naam van de server die het usb-apparaat met de fabrikant- en apparaat-id 0403:6001 deelt.

Je kunt in plaats van de naam ook het ip-adres van de server opgeven (IPv4 of IPv6, de unit accepteert beide). De door de usbip@-services getriggerde usbipd-service start op de client geen ­daemon, maar laadt alleen de benodigde kernel­modules.

Nadelen bij USB over IP?

In tegenstelling tot veel projecten op internet doen onze units geen moeite om ontspoorde usb-appa­raten en -verbindingen weer op de rails te krijgen. Enerzijds draaiden via het netwerk toegankelijk gemaakte usb-apparaten wekenlang stabiel.

Anderzijds zal bijvoorbeeld een Zigbee-stick die in het onge­rede raakt, ook de betreffende software onderuit halen en kun je beter de hele stack opnieuw starten (behalve de server met de usb-share ook eventuele serverdiensten op de client of het voor Zigbee verantwoordelijke onderdeel).

Houd er verder rekening mee dat het netwerkverkeer tussen de server (de Rasperry Pi) en de client niet versleuteld is.


Ontvang gratis informatie en tips voor de Raspberry Pi, schrijf je in voor de nieuwsbrief:


Extra opmerkingen bij USB over IP

Bij de experimenten voor dit artikel ontdekten deden we veel praktische ervaring op. Hieronder vind je informatie die misschien van pas kan komen:

  • Op Debian-systemen (en dus ook op de Raspberry Pi met Pi OS) lukt het automatiseren pas met Bullseye goed, oudere versies gaven problemen.
  • Seriële toepassingen zoals Zigbee-adapters en Arduino’s met LaCrosse-firmware draaiden wekenlang stabiel, maar bij complexere adapters die isochrone communicatie verwachten (zoals camera’s en audio-­apparaten) kun je beter voor een directe usb-aansluiting gaan.
  • Usb-hubs gelden voor USB over IP niet als apparaat en het lukte niet ze als hub in het netwerk te delen.
  • Een kritische factor bleek het type netwerk: ethernet heeft de voorkeur boven wifi, maar dat geldt algemeen bij de Raspberry Pi. Probeer anders de ontvangstsituatie te verbeteren of de energiebesparende functies van de wifi-adapter uit te schakelen.

Belangrijk is ook om op zoveel mogelijk actuele kernels en USB/IP-pakketten te gebruiken en niet verschillende versies te mengen. We hebben dat zowel bij Pi OS als bij Debian gezien, daar moet je de Bullseye-versie van gebruiken. Op dezelfde manier werkte Linux Mint als client pas mee nadat hij was bijgewerkt naar de laatste versie.

Je hebt voor dit project in principe al genoeg aan een Raspberry Pi Zero W of een ouder model. Die kun je ook voor andere projecten inzetten:

(Deze informatie is afkomstig uit het artikel in c’t 8-9, 2022, pagina 74, van Peter Siering en Noud van Kruysbergen)

 

Meer over Rasperry Pi projecten lees je in c't magazine 11/2022

Meer over

NetwerkenUSB

Deel dit artikel

Lees ook

Energie meten met Raspberry Pi: snel en overzichtelijk je verbruik zien

Als er bij jou thuis een slimme meter geïnstalleerd is, heb je met een Raspberry Pi een simpele mogelijkheid om het verbruik aan gas en stroom realtim...

Software installeren op ChromeOS Flex

Eerder hebben wij geschreven over hoe het is om ChromeOS Flex te gebruiken als besturingssysteem en hoe je dit besturingssysteem moet installeren. In ...

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er