09 Aug 2021

IP über UART mit PL2303

Klassischerweise verbindet man einen Computer mit einem Ethernetkabel oder per Funk mit dem Internet. Aber es auch andere Wege, die an die Anfangszeiten der Netzwerktechnik erinnern. Beispielsweise kann man über einen UART oder eine RS232-Schnittstelle Computer verbinden. Unter Linux benötigt das nur wenige Kommandos. RS232 sind die klassischen seriellen Schnittstellen, mit der Geräde mit dem Computer verbunden wurden, bevor es USB gab. UART steht für Universal Asynchronous Receiver Transmitter und ist Art der seriellen Übertragung, wie man sie in Computern oder zu Microcontrollern kennt. Warum man über UART eine Netzwerkverbindung herstellen sollte, ist einfach: Weil man gerade einen Computer mit kaputter Netzwerkkarte vor sich hat und keine USB-Netzwerkkarte zur Hand ist. Oder einfacher: Weil man es kann.

PL2303 Ich habe zwei USB-UART-Adapter mit dem PL2303-Chip, die es für wenige Euro auch auf dem deutschen Markt gibt. Ein Bild seht ihr rechts. Bei mir ist das einstellbar, ob sie auf 3,3 Volt oder auf 5 Volt arbeiten. Ich betreibe sie auf 5 V. Achtet darauf, dass beide auf demselben Niveu arbeiten um keine Beschädigung zu riskieren. Verbinden muss man hier mit Kabeln die GND der beiden Adapter miteinander und die TXD des einen mit dem RXD des anderen und andersherum. Die VCCIO können freibleiben, diese dienen zur Spannungsversorgung eines kleinen Gerätes, was wir hier nicht brauchen. Ein Adapter kommt in den einen Computer (im Weiteren host1) und der andere Adapter kommt in den Computer (im Weiteren host2), mit dem man host1 verbinden möchte. Bei mir meldet sich der Adapter jeweils als /dev/ttyUSB0, wenn es bei euch anders heißt, müsst ihr die folgenden Befehle anpassen.

Die eigentliche Verbindung entsteht mit der Software pppd aus dem Paket ppp folgenden Befehlen:

root@host1 $ pppd /dev/ttyUSB0 19200 noauth 192.168.255.0:192.168.255.1 local cdtrcts
root@host2 $ pppd /dev/ttyUSB0 19200 noauth local cdtrcts

Die IP-Adressen könnt ihr frei wählen, aber es sollten möglichst keine öffentlich genutzten sein, also nutzt am besten die sogenannten privaten IP-Adressen (oder bleibt beim Beispiel). Die erste IP-Adresse ist die IP von host1, die zweite ist die von host2, die IPs werden beim Verbindungsaufbau ausgetauscht und müssen deswegen nur einmal spezifiziert werden. Bei den vielen anderen seriellen Verbindungen, wie einer klassichen RS232-Verbidung, sind die Parameter local cdtrcts überflüssig. Da der PL2303 aber keine Steuerleitungen mitbringt, müssen diese Parameter ergänzt werden.

Mit den oben genannten Befehlen steht die TCP-Verbindung und host1 kann host2 anpingen:

user@host1 $ ping 192.168.255.1 -c 5
[...]
--- 192.168.255.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 33.742/35.378/39.716/2.211 ms

Die Zahl 19200 ist die sogenannte Baud-Rate, also wie viele Symbole pro Sekunde übertragen werden sollen. Diese ist prinzipell frei wählbar, auch wenn es einige Standardraten gibt, wobei 19200 eine davon ist. Allerdings kommt es manchmal zu Problemen, wenn man eine Nicht-Standard-Rate verwendet. Die Standardraten finden sich in der Wikipedia. Wichtig ist natürlich, dass beide Computer dieselbe Baudrate einstellen.

Die höchste Baudrate, mit der ich sinnvolle Ergebnisse erzielen konnte sind 3000000 Baud/s. Mit der Baudrate hatte ich eine mittlere Pingzeit von 3.657 ms zwischen den Hosts. Mit iperf habe ich eine Datenrate von 104 Mbits/s gemessen, was ungefähr Fast-Ethernet entspricht. (Zu iperf schreibe ich vermutlich nochmal was in einem anderen Post). Die Geschwindigkeit genügt mindestens dazu, Updates aus dem Internet zu laden und ist mindestens so schnell, wie das deutsche Endkunden-Internet an den meisten Orten.

Wo wir von Internet sprechen: Wenn ihr Internet oder andere Netzwerkdaten über die UART-Verbindung leiten wollt, könnt ihr bei host2 die Option defaultroute beim pppd-Aufruf ergänzen. Damit wird host1 als Standardgateway bei host2 einzutragen. Bei host1 müsst ihr natürlich IP-Forwarding aktivieren und dem Router im Netzwerk sagen, wo er die 192.168.255.1 erreicht, aber das ist ein Thema für einen anderen Beitrag.