LTE Modul für den Raspberry Pi einrichten

Der Raspberry Pi ist aus dem Prototyping von IoT Projekten kaum noch wegzudenken. Aufgrund des kompakten Formfaktors und des niedrigen Energiebedarfs ist er perfekt für mobile Anwendungen geeignet.
Mit einem passenden LTE Modul ist dann auch die Kommunikation fernab von einem LAN kein Problem.

In diesem Beitrag gehe ich auf die notwendigen Schritte ein, die ich durchgeführt habe, um das Telit LTE Modem LE910C4-EU mit meinem Raspberry zu nutzen.

Telit LTE Modem LE910C4-EU mit Sixfab LTE Hat in Originalverpackung

Inhalt

Hardware

Montage

LTE Modul softwareseitig identifizieren 

Nachdem das Kit samt LTE Modul auf dem Raspberry montiert wurde, kann die USB-Verbindung zwischen HAT und Raspberry mit dem kleinen mitgelieferten Kabel erfolgen.

Im Terminal auf dem Raspberry prüfen wir mit nachfolgendem Befehl, ob das LTE Modem erkannt wurde. (Hierbei spielt es keine Rolle, ob wir ein lokales Terminal über die Raspberry Desktop GUI verwenden oder SSH nutzen).

# USB Geräte auflisten
lsusb

# USB Geräte mit geladenen Treibern auflisten
lsusb -t

LTE Modul konfigurieren

Im nächsten Schritt müssen wir das LTE Modem konfigurieren. Dazu zählt beispielsweise das Setzen der APN und des Arbeitsmodus (wie o.g. konfigurieren wir das Modul im ECM Modus).

Um die Konfiguration zu setzen, schreiben wir unsere gewünschten Einstellungen mit sog. AT Commands in das LTE Modul. Nach jedem AT Befehl bekommen wir vom Modem eine Antwort.
Dazu nutzen wir die serielle Schnittstelle (RS-232), welche uns das LTE Modul ebenfalls über USB bereitstellt. (vgl. Quelle 1, Kapitel 4.5.1.2. Standard ECM/RNDIS)

Serial Ports finden

Dazu müssen wir im ersten Schritt herausfinden, welche seriellen Ports uns das Modem anbietet. In Raspbian sind die seriellen Ports unter /dev/tty* zu finden.

Um nun herauszufinden, welche davon von unserem Modem registriert wurden, listen wir alle Ports auf; bevor und nachdem wir das Modul per USB angesteckt haben.

ls /dev/tty*
Auflistung zeigt alle verfügbaren seriellen Schnittstellen sowie die seriellen Ports zum Telit 910Cx LTE Modul
Auflistung zeigt alle verfügbaren seriellen Schnittstellen sowie die seriellen Ports zum Telit 910Cx LTE Modul

Daraus schließen wir, dass alle /dev/ttyUSB0 bis /dev/ttyUSB4 Ports zum Telit 910Cx LTE Modem gehören.
Gleiches bestätigt sich, wenn wir mittels dmesg die Kernel Logs sichten.

Raspberry Pi Kernel Logs (dmesg) zeigen serial Ports zum Telit 910Cx LTE Modem
Raspberry Kernel Logs (dmesg) zeigen serial Ports zum Telit LTE Modem

Serial Monitor installieren

Zu Beginn sollte geprüft werden, ob der ModemManager installiert ist. Für dieses Vorgehen hier, sollte das Tool jedoch entfernt werden, da es ansonsten zu Konflikten auf der Seriellen Schnittstelle kommen kann. ModemManager wird hier auch nicht benötigt, da wir das Modem im ECM Modus konfigurieren werden. (siehe Mittels AT-Commands die Konfiguration setzen)

sudo apt purge modemmanager -y

Um nun mit dem Modem kommunizieren zu können, müssen wir zuerst auf dem Raspberry einen Seriellen Monitor installieren. Ein beliebtes Tool ist atcom.

sudo apt install python3-pip
pip3 install atcom  # muss ggf. in einem eigenen virtual environment ausgeführt werden

Die Installation von 'atcom' via 'pip3' kann ggf. nicht auf allen Systemen erfolgreich angestoßen werden, da neuere Versionen von Raspbian/Raspberry Pi OS die systemweite Verwaltung von Paketen außerhalb von 'apt' ablehnt.
Sollte dies der Fall sein, dann sollte 'atcom' in einem eigenen 'virtualenv' installiert und verwendet werden.

Python Virtualenv für atcom einrichten (optional)

Dieser Schritt – das Anlegen eines Python virtualenv – ist optional, aber letztlich immer sinnvoll, um Python-Projekte und Paketinstallationen sauber zu trennen (und sich damit vor unerwünschten Nebeneffekten aufgrund von Paket-Inkompatibilität zu schützen). Hier im Schnelldurchlauf:

# Python-Virtualenv über apt installieren
sudo apt install python3-virtualenv

# virtualenv anlegen, im aktuellen Verzeichnis wird das virtualenv
# mit dem Namen 'atcomvenv' angelegt
python3 -m virtualenv atcomvenv

# virtualenv aktivieren
source atcomvenv/bin/activate

# atcom wie o.g. installieren
pip3 install atcom

# prüfen ob atcom nun verfügbar ist
which atcom

# virtualenv deaktivieren
deactivate

Mittels AT-Commands die Konfiguration setzen

Setzen der PDP Context ID – Gerätespezifisch, gibt an wie IP-Pakete über das Mobilfunknetz übertragen werden. PDP ist kurz für Packet Data Protocol. Wer die Hintergründe erfahren möchte, findet unter learn.microsoft.com einen interessanten Artikel zum Thema.
Wir können unterschiedliche Konfigurationen im Modul hinterlegen, diese werden über die PDP Context ID indexiert. Die aktuellen, hinterlegten Konfigurationen zeigt uns auch der AT Befehl AT+CGDCONT? (siehe nachfolgendes Listing) an. (vgl. Quelle 2, Kapitel 5.4.7.12. Define PDP Context - +CGDCONT)

Setzen des PDP Typs – Hier geben wir an, welches IP Protokoll wir nutzen wollen. Für die generelle Internetnutzung (wie z.B. IoT Cloud, VPN, etc.) nutzen wir IPv4 bzw. IPv6. Die meisten Dienstanbieter verlangen die Nutzung im IPv4/IPv6 Dual Stack Modus. (vgl. Quelle 2, Kapitel 5.4.7.12. Define PDP Context - +CGDCONT)

Setzen des APN (Access Point Name) – Zugangspunkt zum Mobilfunknetz. Der APN ist abhängig vom SIM Anbieter und kann beim Provider erfragt werden. Entweder liegt der SIM eine kleine Karte mit der Info bei, alternativ im Online-Portal des Anbieters schauen. (In meinem Fall einfach 'internet'). (vgl. Quelle 2, Kapitel 5.4.7.12. Define PDP Context - +CGDCONT)

Daraus ergibt sich nun folgender AT Befehl:

# AT+CGDCONT=[PDP Context ID],[PDP Typ],[APN]
# atcom Befehl:
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT+CGDCONT=1,\"IPV4V6\",\"internet\"

# prüfen, ob Einstellung angenommen wurde
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT+CGDCONT?

Hier muss der Pfad zu 'atcom' im Virtualenv explizit angegeben werden, da wir für das Öffnen der seriellen Schnittstelle auf dem Raspberry root-Rechte benötigen. Da 'sudo' im Virtualenv nicht funktioniert, nehmen wir den Pfad mit 'sudo' vorweg.

CGDCONT AT Befehl zum Setzen des APN und IP Protokoll am Telit 910C4-EU Modem
CGDCONT AT Befehl zum Setzen des APN und IP Protokoll am Telit 910C4-EU Modem
AT+CGDCONT=1,"IPV4V6","internet"
# Eigentlich würde so unser AT Command aussehen, die Symbole " und '
# müssen aber mit \ escaped werden, sodass folgender Befehl entsteht:
AT+CGDCONT=1,\"IPV4V6\",\"internet\"

Über --port /dev/ttyUSB2 können wir mit dem LTE Modul per AT Commands sprechen, die --baudrate 115200 (Symbolrate) wird ebenfalls vom Modem festgelegt.

Im nächsten Schritt stellen wir die Konfiguration des LTE Moduls auf ECM ein. Dies führt dazu, dass unser Raspberry am USB (an dem das LTE Modul angeschlossen ist) ein Ethernet Device mit dem Namen wwan0 findet. ECM steht für Ethernet Control Model und erlaubt die Emulation einer Ethernet Karte (nic) per USB. Das LTE Modul stellt uns im ECM Modus sogar einen DHCP Server bereit. (vgl. Quelle 1, Kapitel 4.5.1.2. Standard ECM/RNDIS)

Das proprietäre Pendant dazu kommt von Microsoft und heißt RNDIS (Remote Network Driver Interface Specification), dieses Protokoll setzt ebenfalls auf USB auf.

# ECM Modus aktivieren
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT#USBCFG=4

# prüfen, ob Einstellung angenommen wurde
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT#USBCFG?

# anschließend das Modem durchbooten
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT#REBOOT

Im letzten Schritt motivieren wir das LTE Modul die Internetverbindung im ECM Modus aufzubauen. Dazu nutzen wir nachfolgenden AT Command. Die PDP Context ID bezieht sich auf die oben bereits hinterlegte Konfiguration bzw. dessen Index.
Die Device ID ist 0, da wir am virtuellen LAN des LTE Moduls nur ein Device (unseren Raspberry) haben – mehr als ein Device wird vom LTE Modul auch nicht unterstützt. (vgl. Quelle 2, Kapitel 5.2.1. USB Composition Configuration - #USBCFG, vgl. Quelle 2, Kapitel 5.6.5.27. Ethernet Control Model setup - #ECM)

# AT#ECM=[PDP Context ID],[Device ID]
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT#ECM=1,0

ECM Device im Raspberry konfigurieren

Nachdem wir das Modem konfiguriert und nach jedem Befehl auch geprüft haben, ob die Einstellungen übernommen wurden, kommen wir nun zur Konfiguration des Ethernet Devices im Raspberry bzw. im Linux / Raspbian / Raspberry Pi OS.

Wir prüfen als erstes mit dem Befehl sudo ifconfig , ob wir ein Device namens wwan0 finden. Dies wird im ersten Anlauf wahrscheinlich nicht der Fall sein.

Daher fahren wir mit ip addr fort und werden fündig, wwan0 ist verfügbar.

wwan0 Interface am Raspberry Linux registriert
wwan0 Interface am Raspberry Linux registriert

Um nun wwan0 nutzen zu können, rufen wir eine lokale IP Adresse vom DHCP Server für das Interface ab. Dies ist möglich, da uns das LTE Modul im ECM Modus einen DHCP Server bereitstellt. (vgl. Quelle 1, Kapitel 4.5.1.2. Standard ECM/RNDIS)

sudo dhclient -v wwan0 # -v für verbose, um zu sehen, was passiert

# nun taucht auch das neue Interface wwan0 im ifconfig auf
sudo ifconfig
sudo ifconfig nachdem wwan0 mit dhclient eine IP Adresse vom LTE Modem bezogen hat
sudo ifconfig nachdem wwan0 mit dhclient eine IP Adresse vom LTE Modem bezogen hat

Nun können wir bereits mit ping die Verbindung prüfen.

# ping soll bewusst das Interface wwan0 nutzen
ping -I wwan0 -c 8 google.com
Screenshot vom Terminal mit Ausgabe von ping -I wwan0 -c 8 google.com
Screenshot vom Terminal mit Ausgabe von ping -I wwan0 -c 8 google.com

Interface Priorität konfigurieren (optional)

Je nach Einsatzort des Raspberry möchte man ggf. nicht dauerhaft die Internetverbindung über LTE nutzen, sondern möchte ggf. temporär auf WLAN oder Ethernet zurückgreifen.
Um die Prioritäten der verfügbaren Interfaces zu steuern müssen wir deren Metric anpassen. Dabei gilt: je niedriger die Metric desto höher die Priorität des Interfaces.

# metric aller interfaces prüfen
# zeige die Routing-Tabelle
route
Terminal mit 'route' zeigt die Rountingtabelle samt Interface Metric an – wlan0 hat höhere Priorität als wwan0
Terminal mit 'route' zeigt die Rountingtabelle samt Interface Metric an – wlan0 hat höhere Priorität als wwan0

Um die Metric "auf die Schnelle" anzupassen helfen wir uns hier mit dem Befehl ifmetric weiter.

Es gibt noch andere Möglichkeiten, gerade wenn ein Network Manager genutzt wird, sollte die Anpassung der Metric bevorzugt darüber erfolgen.

In diesem Fall hat wlan0 eine höhere Priorität (Metric kleiner) als wwan0. Für die generelle Internetverbindung möchten wir jedoch das LTE Modul (an wwan0) nutzen, ohne wlan0 zu deaktivieren, da wir wlan0 für den SSH Zugang benötigen.
Wir setzen die Metric von wwan0 herab, sodass diese kleiner ist als wlan0. (vgl. Quelle 6)

# ifmetric installieren
sudo apt install ifmetric

# interface metric "auf die Schnelle" anpassen
# Beispiel: sudo ifmetric [Interface] [neue Metric]

# wwan0 metric herabsetzen
sudo ifmetric wwan0 502

Einstellung nach Neustart automatisch laden (optional)

Wie unter Mittels AT-Commands die Konfiguration setzen schon beschrieben, müssen wir das LTE Modul nach jedem Start motivieren, die Internetverbindung aufzubauen. Anschließend muss unser Raspberry vom LTE Modul per DHCP eine IP Adresse beziehen und den Internet-Traffic über LTE abwickeln. Dazu benötigen wir nachfolgende Befehle (wie bereits oben beschrieben):

# Modem motivieren eine Verbindung aufzubauen
sudo ./atcomvenv/bin/atcom --port /dev/ttyUSB2 --baudrate 115200 AT#ECM=1,0

# IP Adresse beziehen
sudo dhclient -v wwan0

# Metric der Verbindung setzen
sudo ifmetric wwan0 502

Damit dies nach jedem Neustart geschieht packen wir die Befehle in ein Skript, welches wir nach jedem Neustart automatisch ausführen lassen. Das Skript speichern wir unter /opt/modemscripts/wwan0_modem_connect_internet.sh.
Den Cronjob richten wir mit sudo crontab -e ein.

Modem nach Boot automatisch zum Verbindungsaufbau motivieren und IP Adresse beziehen
Modem nach Boot automatisch zum Verbindungsaufbau motivieren und IP Adresse beziehen
Cronjob um das Modem und die zugehörigen Einstellungen nach jedem Reboot zu laden
Cronjob um das Modem und die zugehörigen Einstellungen nach jedem Reboot zu laden

Somit führt der Raspberry das Skript nach jedem (Re)boot einmal aus, er aktiviert das Modem und setzt die Metric so, dass wwan0 (das LTE Modem) als Interface mit höchster Priorität genommen wird. Der gesamte Traffic wird also über das Mobilfunknetz geroutet.

Fazit

Der Artikel zeigt exemplarisch die Vorgehensweise und notwendigen Schritte, die erforderlich sind, um mit überschaubarem Aufwand den Raspberry Pi um ein Mobilfunkmodul zu erweitern, sodass er anschließend in mobilen Anwendungen genutzt werden kann.

Wir haben das LTE Modul im ECM Modus konfiguriert und als virtuelles NIC im Linux installiert, sodass der gesamte Traffic über das Mobilfunknetz geroutet wird. Das Modem wird nach jedem Neustart aktiviert und baut so direkt die Verbindung ins Internet auf.

In diesem Zusammenhang möchte ich ausdrücklich darauf hinweisen, dass wir in diesem Artikel exemplarisch die Vorgehensweise beschrieben haben. Inwiefern die gleiche/ähnliche Vorgehensweise auf andere Projekte übertragen werden kann, muss im Einzelfall projektspezifisch geprüft werden.

Hinzu kommen Herausforderungen im Bereich IT-Sicherheit, welche in diesem Artikel nur angeschnitten wurden. Risiken und Lösungen im Bereich IT-Security müssen ebenfalls projektspezifisch evaluiert und projektiert werden.

Mehr Content...

Wenn euch unsere Beiträge gefallen, dann meldet euch gerne für die Siincos News an (kein Spam, keine Werbung – versprochen!) und ihr erhaltet zu jedem neuen Beitrag direkt eine Benachrichtigung per Mail.

Habt ihr selbst Projekte in den Bereichen Embedded Linux Development / Raspberry Pi / etc. und benötigt eure eigenen Lösungen oder Unterstützung? Dann schreibt uns eine Mail mit eurem Anliegen und wir melden uns bei euch zurück.

Quellenangabe

Stand 03.01.2024

  1. Telit LE910Cx Software User Guide
  2. Telit LE910Cx AT-Command Reference
  3. https://www.wevolver.com/article/add-cellular-connectivity-to-your-raspberry-pi
  4. https://docs.sixfab.com/docs/getting-started-with-base-hat-and-telit-le910c1-module
  5. https://docs.sixfab.com/page/cellular-internet-connection-in-ecm-mode
  6. https://www.jeffgeerling.com/blog/2022/network-interface-routing-priority-on-raspberry-pi