Mit dem SIM800L-Modul ins Mobilfunknetz gehen

Schon vor einiger Zeit habe ich mir ein SIM800L GSM/GPRS Modul gekauft, als ich zufälligerweise darüber bei einem chinesischen Versender stolperte. Es war nicht teuer, das Thema sehr interessant, also habe ich es damals mitbestellt.

Seitdem fristete das Modul ein dunkles Dasein in einem kargen Karton, mit Edding beschriftet mit "Neuzugänge", darauf wartend, irgendwann an die Reihe zu kommen und ausprobiert zu werden. Und heute soll es soweit sein. Das Modul wurde aus seinem Kerkerdasein befreit, hat das Licht des Tages erblickt und darf endlich zum Leben erwachen.

Aber genug der blumigen Umschreibungen, zu den harten Fakten.

Das SIM800L-Modul - die Features

Die SIM800L-Platine ist eine nur 25 x 23.5 mm kleines Platine mit aufgelötetem Modul von SIMCom, um den Mobilfunkstandards gerecht zu werden und im Mobilfunknetz zu funken. Oder kurz und vereinfacht gesagt: Das Modul kann so viel ein kleines, altes Handy vor der Smartphone-Zeit. Mit ihm kann man Sprache und Daten übermitteln wie Anrufe, SMS oder GPRS-Internet.

Die Features-Liste liest sich wie folgt:

Das SIM800L-Modul - die Hardware



Auf der Vorderseite des Modules ist die eigentliche integrierte Schaltung in einem kleinen Blechkästchen, ein paar passive Bauteile und eine LED. Auf der Rückseite befindet sich nur der SIM-Karten-Slot und die Beschriftungen für die Header.

Mit der Rückseite nach oben sind die Header wie folgt beschriftet (von oben nach unten): Hier sehen wir bei den rechten Pin-Anschlüssen "RXD" und "TXD", was darauf schließen lässt, dass das Modul über die serielle Schnittstelle angeschlossen wird. Außerdem gibt es hier GND für Masse und VCC zur Stromversorgung. Außerdem "NET" - "ANT" fände ich treffender, denn hier kann man die mitgelieferte Spiralantenne anlöten.

Mit dem Antennen-Pin ist auch der kleine über die Vorderseite zugängliche Antennen-Anschluss verbunden, in den man eine externe Antenne stecken kann. Ich habe man eine einfache externe, auf einer Platine aufgebrachte mitbestellt und werde diese verwenden, weil ich mir davon einen besseren Empfang verspreche.

Voraussetzungen

Wie wir in den Specs lesen können, kann das SIM800L-Modul nur im 2G-Netz kommunizieren. Das ist das alte Handynetzwerk zu Zeiten, als Nokia noch Marktführer bei Handys war und Smartphones noch nicht erfunden war.

Stellt sich die grundlegende Frage zur Zeiten, wo 5G in aller Munde ist, ob das seit 20 Jahren existierende 2G-Netz in Deutschland überhaupt noch aktiv ist. Die Antwort lautet: Ja, es ist. Und es soll es wohl noch eine Weile bleiben. Während die Schweizer Swisscom sich 2021 von 2G verabschiedet hat, wollen die deutschen Netzbetreiber weiterhin am 2G-Netz festhalten (1).

Und das finde ich auch gut so. GSM und 2G stellt eine solide Grundversorgung dar und ist auf Empfangbarkeit und nicht auf Geschwindigkeit getrimmt. So hat man auch im Wald noch Empfang, wo es kein LTE oder 5G gibt. Das ist ein klein wenig so wie beim Radio: das gute alte UKW (oder sogar Mittelwelle und Langwelle) kann man mit einfachen elektronischen Schaltungen empfangen. Der Empfang mag nicht so glasklar sein wie bei dem neuen digitalen Radio DAB, aber dafür hat man im Notfall wenigstens einen, wenn vielleicht auch verrauscht. Bei DAB hört man unter schlechten Bedingungen gar nichts mehr.

2G funktioniert die nächsten Zeit also noch. Um das Mobilfunknetz zu nutzen, braucht man aber natürlich noch eine SIM-Karte. Ich habe mir zu dem Zweck eine extra Prepaid-Karte besorgt. Nur für den Fall, das etwas schiefgeht. Da möchte ich im Zweifelsfall nicht meine richtige SIM-Karte braten.

Warum ich Prepaid gewählt habe, liegt auf der Hand: man stelle sich einen Programmier-Fehler vor, der eine Endlosschleife erzeugt und aus Versehen zig tausend mal die gleiche SM verschickt. Das wird mit Vertrag teuer. Bei Prepaid sind dann eben einfach nach ein paar SMs versendet, und das Guthaben auf der Karte leer und stoppt den Faux-pas.

Für den Betrieb brauchen wir noch eine serielle Schnittstelle und eine Stromversorgung von 3.4V bis 4.4V.

Für die serielle Schnittstellt können wir das Teil mit einem FTDI-Adapter am PC anschließen oder auch am Raspi, so wie ich das in meinem Artikel Den Raspi mit 3.5 Zoll RPi Display TFT Touchscreen als Serial Monitor verwenden gemacht und beschrieben habe.

Den FTDI-Adapter kann ich auf 3.3V oder 5V einstellen. Dummerweise beides außerhalb der geforderten 3.4V bis 4.4V; die hören sich eher nach Lithium-Ionen-Akku (ca. 2.7V wenn leer bis 4.2 V wenn voll geladen) an.

Erster Test mit nur 3.3V

Da es so schön bequem wäre, und 3.3V schon nah an den geforderten 3.4V dran ist, will ich aber mal einen Versuch starten und jumpere den FTDI-Adapter auf 3.3V und schließe das SIM800L-Modul an. Wenn ich davon ausgehe, dass mein USB-Port 1A kann, wären das bei 3.3 Volt 3.3 Watt, also mehr als die schätzungsweise angenommenen 2.2 Watt im D-Netz oder 1.2 Watt im E-Netz.

Da meine SIM-Karte von O2 und damit im E-Netz ist, sollte die maximale Sendeleitung 1W sein, was bei 3.3V ca 300 mA ausmacht. Dazu vielleicht noch 100 bis 200 mA für die Rechenleistung des Moduls, macht zusammen weniger als 500 mA, so dass ich hier auf jeden Fall genug Strom aus meinem USB-Port am PC bekommen werde. Ist nur die Frage, ob sich das SIM800L-Modul mit nur 3.3V zufrieden gibt.

Machen wir die Probe auf Exempel. Was soll schon schiefgehen? 5V, also zuviel Spannung auf dem FTDI-Adapter zu jumpern würde ich mich nicht trauen, aber 0.1V zu wenig. Ich denke, außer nicht zu funktionieren oder nicht richtig zu funktionieren kann da nicht viel passieren.

Leider stellt sich heraus, dass die 3.3V vom FTDI-Adapter dann doch zu wenig sind. Es tut sich nichts.

Also schließe ich das SIM800L-Modul an mein Labornetzteil an und schaue, ab welcher Spannung es reagiert. Ergebnis: Ab 3.4V, eher 3.5V erwacht es zu Leben und die LED fängt an zu blinken. So richtig stabil scheint es aber erst ab so 3.7V zu werden.

Die einfache Lösung fällt also flach.

Außerdem stolpere ich noch über folgenden Absatz im Hardware-Datasheet zum SIM800L (dem Modul im Blechgehäuse, nicht dem ganzen Modul mit den Lötanschlüssen):
The power supply range of SIM800L is from 3.4V to 4.4V. Recommended voltage is 4.0V. The transmitting burst will cause voltage drop and the power supply must be able to provide sufficient current up to 2A. For the VBAT input, a bypass capacitor (low ESR) such as a 100 µF is strongly recommended.
Der Kondensator ist wohl bereits auf der Platine. Das fette Teil mit der Aufschrift 107A ist ein 100 µF 10V SMD Tantal Kondensator.

Desweiteren finde ich den Hinweis im Datenblatt, dass der serielle Port (also RXD und TXD) eigentlich nur maximal 2.8V haben möchten. Ich schätze mal, 3.3V vom FTDI-Adapter wird das Modul nicht gleich killen, aber 5V am FTDI Adapter scheidet damit komplett aus. Und das wäre ja auch für die Versorgungsspannung des Moduls zu viel.

Lösung mit einem 18650 Li-Ion-Akku

Also brauchen wir eine eigene Spannungsversorgung mit am besten um die 4 Volt, die auch Spannungsspitzen von 2 Ampere standhalten kann. Die 4V gehen dann nur an das Sim800L-Modul, nicht an den FTDI-Adapter. Nichtsdestotrotz brauchen wir ein Common Ground, also eine gemeinsame Masse, damit die seriellen Kommunikation klappt.

Zuerst habe ich natürlich mein Labornetzteil angeschlossen, ganz einfach, weil ich da die Spannung einstellen kann, den Stromverbrauch leicht ablesen und weil es 3A und mehr lieferen kann. Außerdem ist es einfach eine zuverlässige Stromquelle, bei der ich auch den maximalen Strom begrenzen kann.

Als das geklappt hat, habe ich das Ganze auf einen Lithium-Ionen-Akku umgestellt. Der Einfachheit halber mit einem 18650-Akku und entsprechendem Batteriehalter. Wieder der Einfachheit halber habe ich das Ganze mit Wago-Klemmen verbunden. Damit kann ich den Stromkreis schnell unterbrechen und wiederherstellen. Ein Aufbau auf einem Breadboard hätte es natürlich auch getan, aber so ist halt noch bequemer.

Natürlich müsste man eigentlich noch eine Schutzschaltung einbauen, um den Akku nicht tiefzuentladen. Wie das und mehr geht, könnt ihr in meinem Artikel Wissen rund um Schaltungen und Module für 18650 Li-Ion-Akkus nachlesen.

Nur soviel: Ein 18650-Akku liefert komplett voll geladen 4.2V und liefert dann verlässlich Strom, wobei mit sinkender Ladung auch die Spannung sinkt. So etwa bei 2.7 Volt sollte man den Akku nicht weiter entladen, weil er sonst Schaden nehmen kann. Da bei unserem Anwendungsfall aber schon bei 3.4V Schluss ist und das SIM-Modul nicht mehr funktioniert, reicht es, darauf zu achten, wenn die LED des Moduls nicht mehr leuchtet und dann den Akku in einem Ladegerät wieder zu laden.

Die Verdrahtung der dann funktionierenden Schaltung sieht wie folgt aus:



18650-Akku WAGO-Plus WAGO-Minus FTDI-Adapter SIM-800L-Modul Kabelfarbe Bedeutung Pluspol Plus VCC rot 4V Minuspol Minus GND GND schwarz Common Ground RX TX grün ser. Kommunikation TX RX gelb ser. Kommunikation

SIM-Karte rein und los



Jetzt fehlt nur noch die SIM-Karte, damit das Modul auch Verbindung mit der Außenwelt aufnehmen kann. Dazu muss man für das Modul die Größe "Micro-SIM" herausbrechen, das ist in etwa die Größe einer Micro-SD-Karte. Oder anders gesagt: die beiden inneren Segmente müssen zusammenhängend bleiben.

Danach wir die SIM ein wenig seltsam in den SIM-Slot auf der Rückseite des SIM800L-Moduls eingeschoben, und zwar so, wie auf dem Foto gezeigt: rechtsbündig mit den blanken Kontaktflächen zur Platine hin und mit dem abgeschnittenen Eck nach oben links. Das kann sich allerdings gegebenenfalls in einer neuen Version auch ändern. Wichtig ist, dass die Mitten der blanken Kontaktflächen auf den kleinen Nippeln im Halter zum liegen kommen, denn da wird der Kontakt hergestellt.

Die Antenne eingesteckt (bzw. angelötet), den Akku verbunden, den FTDI-Adapter in einen USB-Port des PC gesteckt und wir sind hardwaretechnisch bereit. Das zeigt sich auch dadurch, das die LED auf dem SIM-Modul ca. 1 mal in der Sekunde aufblitzt.

Willkommen in der Welt der AT-Befehle

Softwareseitig brauchen wir noch ein Terminalprogramm. Das kann so etwas rudimentäres wie PuTTY sein, oder ein Terminalprogramm wie etwa Tera Term oder HTerm, je nachdem, was einem eher gefällt.

Im Terminalprogramm stellen wir den COM-Port ein, den uns der FTDI-Adapter bescherrt und erst einmal zur Sicherheit eine eher geringe Übertragungsrate von 9600 bps. Damit können wir später noch hochgehen, wenn wir sicher sind, dass alles klappt. Die Kommunikationsparameter sind die üblichen: 8-N-1.

Um das Modem zu steuern, gibt es sogenannte AT-Commands. "AT" steht für "Attention" und sagt dem angeschlossenen Gerät in etwa "Achtung, jetzt kommt ein Befehl". Als ehemaliger Sysop und Mailbox-Betreiber, der versucht hat, Anfang der Neunziger das letzte bisschen Geschwindigkeit aus seinem 14.4 HST-Modem von USRobotics herauszuholen, kenne ich mich mit dem Konzept natürlich bestens aus.

Und das SIM800L-Modul wird gar nicht anders angesprochen als ein Modem. Es gibt eine normale Datenübertragung (Texte, Dateien), aus der man mit einer bestimmte Escape-Sequenz herausbrechen kann (damals beim Modem war das dreimal hintereinander das +-Zeichen, wenn ich mich recht erinnere), um dann Konfigurationsbefehle abzusetzen.

Die Befehle beginnen immer mit einem "AT". Beim Einschalten eines Modems befindet es sich bereits im Befehlsmodus. Dann wird gewöhnlich mit "ATD..." eine Nummer gewählt, die Gegenseite nimmt ab und nach ein wenig fröhlichem Herumgepiepe und Gefiepse steht die Verbindung ("Carrier detect") und das Modem schaltet automatisch in den Datenmodus. Genauso auch das SIM800L-Modul.

Geben wir im Terminalprogramm einfach mal "AT" ein, Groß/Kleinschreibung ist damit normalerweise egal. Es sollte erscheinen:
at OK
Das eingegebene AT erscheint bei uns beim ersten mal nicht auf dem Bildschirm, es sei denn, wir haben das "lokale Echo" im Terminalprogramm eingeschaltet, was eigentlich standard ist. Nach dem Drücken von Return sollte ein "OK" von der Gegenseite kommen. Kommt kein "OK", stimmt noch etwas mit der Verbindung nicht.

Nachdem dieser erste Befehl durch ist, werden alle Zeichen, die wir nachfolgend eingeben, von der Gegenseite wieder zurückgesendet und dann bei uns im Terminalfenster doppelt dargestellt, das das lokale Echo ja noch an ist. Jetzt können wir das "lokale Echo" in den Einstellungen des Terminalprogramms ausschalten oder aber wir sagen dem Modul, dass es mit dem Papagei-Nachplapper-Modus aufhören darf. Der entsprechende Befehl heißt ATE0 und heißt soviel wie "Stell dein Echo aus"

aattee00 (eingegeben: ate0) OK
Mit "AT&W" kann man diese Einstellung auch speichern, so dass man das ATE0 nicht jedes mal neu eingeben muss nach jeden Neustart des Moduls. Aber Vorsicht mit AT&W, nicht dass man damit falsch eingestellte Parameter für die Ewigkeiten festnagelt. Doch auch das ist kein Beinbruch. Ein "AT&F" stellt alles wieder auf Werkseinstellung.

Als nächste geben wir "ATI" ein, um eine Info über das Modul zu erhalten:
ati SIM800 R14.18 OK
Mehr als Modell und Versionsnummer spuckt das Teil nicht aus. Bei einem Modem kann man normalerweise mit ATI0, ATI1, ATI2 usw. noch mehr Details abfragen, aber unser SIM-Modul ist wohl eher von der schweigsamen Art diesbezüglich.

Werfen wir doch einmal einen Blick in das zweite Datasheet namens "SIM800 Series AT Command Manual", was auf 381 Seiten alle möglichen AT-Befehle aufführt. Das nenne ich mal eine Menge. Je nachdem, was wir machen wollen, sind andere Befehle interessant.

Wollen wir nur eine SMS empfangen oder versenden? Oder einen Anruf tätigen? Einen entgegennehmen? Ins Internet gehen und eine Datei übertragen?

Bis Anfang 2023 hätte man auch noch ein Fax verschicken können oder leitungsvermittelt ins Internet gehen können (GSM/CSD mit 9600 bps). Diese Dienste sind inzwischen überall in den deutschen Netzten abgeschaltet (2,3). Da das SIM800L-Modul nur 2G (also CSD und GPRS) kann, fällt Fax leider flach, Internet geht nur noch über GPRS. SMS und Telefonie gehen aber noch in den heutigen Netzen.

Als diese Funktionen werden mit AT-Befehlen gesteuert.

Es liegt auf der Hand, dass es zu weit ginge, hier alle AT-Befehle erklären zu wollen, darum picke ich nur mal die interessantesten heraus und welche für den Anwendungsfall SMS versenden, der wahrscheinlich am häufigsten vorkommt. Eine SMS zu versenden dürfte im Gegensatz zu einem Fax auch einfach zu machen sein.

Allgemeine AT-Befehle (ohne Netzwerk-Login / PIN)

Eine weitere Info können wir doch noch aus dem Modul herauskitzeln, nämlich mit "AT+CGMI" für "Manufacturer Identification". Der liefert den Hersteller des Mobilfunkgerätes, sprich unseres SIM800L-Moduls. Außerdem kann mit "AT+CGMM" noch die "Model Identification" abgefragt werden.
at+cgmi SIMCOM_Ltd OK at+cgmm SIMCOM_SIM800L OK
Okay, das hatten wir auch so schon gewusst. Es gibt aber noch andere, nützliche Befehle. Vielleicht ist ja noch die genaue Unter-Revision der Software des Moduls interessant?
at+cgmr Revision:1418B02SIM800L24 OK
Diese Infos bekommen wir in einem Rutsch auch mit "AT+GSV":
AT+GSV SIMCOM_Ltd SIMCOM_SIM800L Revision:1418B02SIM800L24 OK
Vielleicht interessiert euch die IMEI (International mobile equipment identity) des Moduls? Obwohl: die steht ja auch direkt drauf... Und bei anderen Handys / Smartphones bekommt man die mit *#06# über die Telefon-Tastatur.
at+cgsn 86xxxxxxxxxxxxx OK
Oder die Kartennummer der SIM-Karte? Die steht aber auch auf der SIM-Karte selbst bzw. auf der umgebenden Plastikkarte. Außerdem brauchte ich sie zur Freischaltung der PrePaid-Karte.
at+ccid 89xxxxxxxxxxxxxxxxxx OK
Schon im Hardware-Datasheet wird auf den äußerst praktischen Befehl AT+CBC hingewiesen, der uns über den Ladezustand des Akkus Auskunft gibt. Die Funktion ist, wo jetzt ein 18650-Akku angeschlossen ist, sogar richtig sinnvoll.
at+cbc +CBC: 0,91,4131 OK
"CBC" steht für "Command Battery Charge". Die Antwort heißt soviel wie "Der Akku ist zu 91% geladen, die Spannung des Akkus beträgt 4.131 Volt". Die "0" am Anfang steht für "Akku wird gerade nicht geladen" (im Gegensatz zu 1 = wird geladen). Cool. Damit wäre dann schon mal der Akku-Balken, den jedes Handy haben sollte, abgehakt.

Kommen wir zum nächsten wichtigen Punkt, was jedes Handy hat: eine Anzeige der Signalsstärke. Na, da bin ich doch einmal gespannt, was die Platinen-Antenne in House so bietet. Der Befehl dazu heißt CSQ für "Command Signal Quality".
AT+CSQ +CSQ: 5,0 OK at+csq=? +CSQ: (0-31,99),(0-7,99) OK
"5,0" bedeutet in etwa: "schlechter Empfang". Die "5" reiht sich ein in den Bereich 2...30 für -110 bis -54 dBm. Eine "0" wäre gar kein Empfang (-115 dBm und schlechter), "1" stände für -111 dBm und "31" stände für perfekten Empfang (-52 dBm und besser). "99" wäre unbekannt oder nicht messbar. Die zweite Zahl, die "0" kann im Bereich 0...7 liegen und steht für die RXQUAL (Receive Quality, Empfangsqualität) nach GSM-Standard.

"5,0" ist schon ziemlich übel. Nachdem ich das Modul und Antenne ein wenig höher gestellt habe, sieht der Empfang schon ein wenig besser aus:
at+csq +CSQ: 15,0 OK
Anstatt beim Antenne ausrichten immer wieder "at+csq" einzugeben, kann man mit "a/" auch den letzten Befehl wiederholen. Das macht die Sache weniger tippintensiv.

AT-Befehle nach Netzwerk-Login / PIN-Eingabe

Wie bei einem normalen Handy bekomme ich keinen Netzwerkzugang, solange ich keine PIN eingegeben habe. Erst dann funktionieren die hier aufgeführten, weiteren Befehle.
at+cpin? +CPIN: SIM PIN OK
"AT+CPIN?" gibt in diesem Fall "SIM PIN", was bedeutet, dass auf die Eingabe der PIN gewartet wird. Stände dort "READY", wäre das Modul durch PIN schon freigegeben. Wäre die PIN dreimal falsch eingegeben, wäre die PUK fällig.

Wie oft die PIN schon falsch eingegeben wurde bzw. wieviele Versuche noch frei sind, zeigt der Befehl "AT+SPIC" an:
at+spic +SPIC: 3,3,10,10 OK
Die beiden Dreien stehen für PIN1 und PIN2 und die beiden Zehnen für PUK1 und PUK2. Geben wir also als nächstes die PIN an, um das Modul ins Mobilfunknetz einzubuchen:
at+cpin="0000" OK +CPIN: READY Call Ready SMS Ready
Die Eingabe erfolgt wie oben gezeigt und zwar inklusive der Anführungszeichen. War die PIN richtig, erhalten wir ein "+CPIN: READY". Ist auch der Empfang gut gehört, um sich ins Netz einzubuchen, erhalten wir zudem ein "Call Ready" und ein "SMS Ready".

Außerdem blinkt die LED auf dem Modul jetzt nur noch etwa alle drei Sekunden.

Ob ich im Netz bin und einen Anruf absetzen kann, kann ich später auch mit "AT+CCALR?" abfragen. Erhalte ich als Antwort eine "1", dann bedeutet das soviel wie "Call Ready".

Jetzt, wo wir ins Netz eingebucht sind, können wir auch abfragen, welches Netz das ist. Das geht mit "AT+COPS?" und ruft nicht, wie man vielleicht meinen könnte, die Polizei ;)
at+cops? +COPS: 0,0,"E-Plus" OK
Mit "ATCREG?" wiederum können wir nochmals überprüfen, ob wir im Netz eingeloggt sind.
at+creg? +CREG: 0,1 OK
Die zweite Zahl bedeutet bei "1" "registriert im Heimnetzwerk", "2" wäre "nicht registriert", "3" würde "Registrierung verweigert" bedeuten, "4" stünde für einen unbekannten Status und bei "5" wird es teuer, denn dann ist man in einem Roaming-Netzwerk registriert.

Während das Netzwerk D1, D2 oder E-Plus ist, gibt der Provider Auskunft darüber, bei wem man seinen Mobilfunkvertrag hat. Den erfährt man über "AT+CSPN?"
at+cspn? +CSPN: "",0 OK
Eigentlich hätte ich hier ein "O2" zwischen den Anführungszeichen erwartet, aber das ist bei mir leer.

Weitere Infos

Die Mobil-Mailbox-Vorwahl kann man so abfragen:
AT+CCVM? +CCVM: "491793000333","" OK
In welchem Netzwerk man sich befindet und welche möglich sind, erfährt man mit
AT+CBAND=? +CBAND: (EGSM_MODE,DCS_MODE,GSM850_MODE,PCS_MODE,EGSM_DCS_MODE,GSM850_PCS_MODE,EGSM_PCS_MODE,ALL_BAND) OK AT+CBAND? +CBAND: EGSM_MODE,ALL_BAND OK
Die interne Uhr des Moduls kann man mit "AT+CCLK=..." setzen, das Format erfährt man mit "AT+CLTS=?". Danach läuft die interne Uhr weiter und kann mit "AT+CCLK?" abgefragt werden.
AT+CLTS=? +CLTS: "yy/MM/dd,hh:mm:ss+/-zz" AT+CCLK="23/05/18,08:13:00+08" OK AT+CCLK? +CCLK: "23/05/18,08:15:22+08"
Wird der Strom getrennt, ist allerdings auch die Zeit weg und muss dann wieder neu gesetzt werden.

Alle AT-Commands kann man mit "AT+CLIST=?" anzeigen lassen. Das zeigt die Kategorien. Mit "AT+CLIST=[kat]" werden nachfolgend die zugehörigen AT-Befehle angezeigt, zum Beispiel:
AT+CLIST=? +CLIST: OTHERS PROD DEBUG EMAIL SSL SAT NTP CALL_EXT ECALL NETWORK_EXT HTTP FTP PB_EXT SMS_EXT MMS SIMCARD_EXT TCPIP PING ALARM NETLIGHT GSMLOC LBS AUDIO_EXT DDET RECORD ABM_EXT RF_EXT FM JD PPP_EXT ANTENNA FS SIMCOM_ALL PLATFORM OK AT+CLIST=SMS_EXT +CLIST: 001: CMGDA 002: SCLASS0 003: CMGHEX 004: CCODE 005: CDSCB 006: CCONCINDEX 007: CRIURCMODE 008: SRSPT OK
Ich empfehle aber die Dokumentation über die AT-Befehle, die ist übersichtlicher.

Strom sparen

Möchte man Energie sparen, kann man das Modul in den Schlafmodus schalten. Das geschieht mit "ATCSCLK=2". Mit "ATCSCLK=0" kann man das Modul dann ganz leicht wieder aufwecken. Eventuell zweimal schicken, wenn es beim ersten Mal nicht klappt.
at+csclk=2 OK at+csclk=0 OK
Es gibt auch noch den hardwarelastigen Modus "ATCSCLK=1". Zeitgleich sollte man DTR auf LOW ziehen. Aus diesem Schlafmodus wird das Modul hardwaretechnisch aufgeweckt, indem man DTR wieder auf HIGH zieht bzw. schaltet man den am besten so, dass ein 10 KΩ-Pullup-Widerstand den auf HIGH hält und ihn ein Schalter für die Ruhezeit mit GND verbindet.

Mit "AT+CPOWD=1" kann man das Modul auch komplett ausschalten. Das währt allerdings nur ein paar Sekunden, dann startet es wieder neu und blinkt wieder schnell, das heißt, man muss sich wieder einloggen.
AT+CPOWD=1 NORMAL POWER DOWN
Der Zweck ist wohl eher ein gesichertes Herunterfahren, nachdem man dann die Stromversorgung kappen kann. Tut man das nicht, wirkt es eher wie ein verzögerter Reset.

SMS: Empfangene SMs anzeigen

Doch nun mal zu einem praktischen Beispiel: dem Lesen und Schreiben von Kurznachrichten (SMS, Small Message Service).

Zuerst bringen wir das Modul in den SMS-Text-Modus mit
at+cmgf=1 OK
Dann erhalten wir die Nachrichten als Text und nicht als Hex-Code. Da tut man sich einfacher mit dem Lesen als Mensch ;)

Dann schicken wir uns mit unserem Haupt-Handy eine SMS. Nach kurzer Zeit sollte im Terminalprogramm folgendes aufpoppen:
+CMTI: "SM",1
Das zeigt uns an, dass wir eine neue SM (Small Message, Kurznachricht) haben. Mit AT+CMGL="[Typ]" können wir uns dann die SMs anzeigen lassen, wobei der Typ sein kann: "REC UNREAD" für "empfangen und ungelesen", "REG READ" für "empfangen und gelesen", "STO UNSENT" für "gespeichert und ungesendet", "STO SENT" für "gespeichert und gesendet" und "ALL" für alle Nachrichten. Lassen wir uns alle SMs anzeigen:

AT+CMGL="all" +CMGL: 1,"REC READ","+49176xxxxxxxx","","23/05/18,08:51:41+08" Hier eine kleine Test Nachricht via SMS OK
Die "+08" am Ende bedeuten übrigens nicht "UTC+08", also Koordinierte Weltzeit plus 8 Stunden, sondern Weltzeit plus 8 Viertelstunden. So umgeht das Modul eventuelle Kommazahlen, weil es gibt ja auch halbe Stunden Differenz. Also nicht wundern.

Die serielle Schnittstelle kann man natürlich auch mit Serial-Kommandos über einen Arduino oder ESP8266 bedienen und damit SMS absetzen und so eine Schaltung über Mobilfunk fernsteuern, einfach indem man ein SIM800L-Modul anschließt, die eingegangenen SMs liest und auswertet und dann reagiert. Die Mobilfunknummer des Sendenden überprüfen nicht vergessen, um sicherzugehen, dass sich da keiner so leicht einhacken kann.

Normalerweise macht man solche Fernsteuerungen ja übers WLAN, in dem der ESP8266 oder ESP32 eingeloggt ist und dann übers Internet. Aber falls man an dem betreffenden Ort kein Festnetz-Internet und WLAN hat, dann ist Mobilfunk eine gute Alternative. Und gerade Kurznachrichten lassen sich einfach auswerten und haben den Vorteil, auch später zugestellt zu werden, wenn gerade kein Empfang möglich ist. Liegt die etwas abgelegte Waldhütte gerade im Nebel und es ist kein Empfang möglich, wird die SM halt zugestellt, wenn das Wetter wieder klar ist.

Es gibt auch noch ein AT-Kommando "AT+CMGR=[index]", um einzelne Nachrichten lesen zu können, das ist aber gar nicht nötig, weil schon in der Liste der komplette Text angezeigt wird. Gegebenenfalls empfiehlt es sich, mit AT+CMGL="rec unread" auf nur neue Nachrichten zu überprüfen, wenn die Liste zu lang ist.
AT+CMGL="all" +CMGL: 1,"REC READ","+49176xxxxxxxx","","23/05/18,08:51:41+08" Hier eine kleine Test Nachricht via SMS +CMGL: 2,"REC READ","+49176xxxxxxxx","","23/05/18,09:05:33+08" Stimmt jetzt die Zeitzone? +CMGL: 3,"REC READ","+49176xxxxxxxx","","23/05/18,09:07:45+08" Hallo? +CMGL: 4,"REC UNREAD","+49176xxxxxxxx","","23/05/18,09:22:39+08" Diese Nachricht ist eine längere Kurznachricht, welche die einhundert sechzig Zeichen ausnutzt, um zu sehen, ob dies komplett in der Liste angezeigt wird. 54321
Die SMs werden übrigens auf der SIM-Karte gespeichert. Damit werden die 10 Speicherplätze schnell voll sein und man sollte dann die alten SMs löschen, sonst kann man keine neuen mehr empfangen. Das geht mit AT+CMGD=[index] für einzelne SMs alle gelesenen SMs und AT+CMGDA="DEL ALL" für komplett alle.

Man kann das SIM-Modul übrigens auch so einstellen, dass Kurznachrichten direkt ohne weitere Nachfrage im Terminalprogramm angezeigt (bzw. über die serielle Schnittstelle übertragen) werden. Das geht mit der Einstellung AT+CNMI=1,2:
AT+CNMI=1,2 OK +CMT: "+49176xxxxxxxx","","23/05/18,10:48:18+08" Ach, wie ist das schön: eine weitere SM
+CMT zeigt direkt an, dass eine SM eingegangen ist, dann folgt auch gleich deren Inhalt. Die Direktanzeige speichert die SM auch nicht nicht im Speicher. Das hat den Vorteil, dass dieser nicht überlaufen kann. Und den Nachteil, dass man aufpassen muss, keine SM zu verpassen.

Mit AT+CNMI=2,1 kann man das wieder zurückstellen und die SMs werden wieder gespeichert und können wieder mehrmals gelistet bzw. angezeigt werden:
AT+CNMI=2,1 OK +CMTI: "ME",11 AT+CMGL="all" +CMGL: 11,"REC UNREAD","+49176xxxxxxxx","","23/05/18,10:55:09+08" Eine neue Nachricht OK

SMS: Eine SMs senden

Während das Empfangen von Kurznachrichten normalerweise kostenlos ist, ist das Senden von SMs kostenpflichtig. Mit einer Prepaid-Karte kostet das so um die 9 Cent pro SM. Aber auch wenn man nur empfängt, muss man hin und wieder (bei mir alle 6 Monate) einen bestimmten Betrag auf die Prepaid-Karte überweisen, sonst wird sie vom Provider gesperrt. Also dran denken oder einen Dauerauftrag einrichten.

Zum Senden einer Kurznachricht gehen wir zuerst wieder in den SMS-Text-Modus mit AT+CMGF=1. Danach sagen wir dem Modul mit AT+CMGS="+49176xxxxxxxx", an welche Mobilnummer wir eine Nachricht senden wollen. Die "+49" steht dabei für Deutschland, bei der "0176" für O2 lassen wir die führende Null weg und der Rest ist die sieben oder achtstellige Rufnummer. Das Ganze nennt sich internationales Format und muss so angegeben werden.

Daraufhin bekommen wir ein ">" als Zeichen, dass wir jetzt etwas eingeben können. Dann tippen wir munter drauf los (maximal 160 Zeichen) und wenn unser Text fertig ist, schicken wir noch STRG+Z (ASCII 26) als Endekennzeichen:
AT+CMGF=1 OK AT+CMGS="+49176xxxxxxxx" > dies ist eine Antwort-SM, die ich mit STRG+Z abschließen muss. +CMGS: 1 OK
Daraufhin wird die SM gesendet, die dann auch bald auf meinem Haupthandy rauskommt, komplett mit korrekten Umlauten. Dabei wird die SM nicht automatisch auf der SIM des Moduls gespeichert.

Möchte man SM auf der SIM speichern, so tut man das als eine Art Vorlage und mit dem Befehl AT+CMGW="+49..." statt AT+CMGS="+49...". Dann landet die SM im Speicher unter "STO UNSENT" und kann später gesendet werden.

SMS zu senden kann so einige sinnvolle Anwendungsfälle haben, zum Beispiel könnte das SIM800L-Modul zusammen mit einem GPS-Modul betrieben werden und regelmäßig die Geokoordinaten nach Hause funken. Oder es meldet aufs Handy, wenn zuhause eine Tür geöffnet wird und womöglich eingebrochen wird. Oder man kann auch einfach nur eine kleine Schaltung mit einem großen roten Button dran entwerfen, den Oma drückt, wenn es ihr nicht gut geht, damit man schnell zur Hilfe eilen kann.

SMS Besonderheiten

Mit AT+CPMS? kann man sich anzeigen lassen, wieviel Speicher auf der SIM noch frei ist. Bei mir ist mit 5 SM bereits die Hälfte belegt:
AT+CPMS? +CPMS: "SM_P",5,10,"SM_P",5,10,"SM_P",5,10
"SM" steht hier übrigens für SIM. Man kann aber auch ändern, wo gespeichert wird. Möglich ist, was bei AT+CPMS=? angezeigt wird
AT+CPMS=? +CPMS: ("SM","ME","SM_P","ME_P","MT"),("SM","ME","SM_P","ME_P","MT"),("SM","ME","SM_P","ME_P","MT")
Die Werte in der ersten Klammern stehen für den Lesespeicher, die zweite Klammer für den Schreibspeicher und die dritte für den Empfangsspeicher. Als Speicherart sind möglich: SM = SIM, ME = Modul Speicher, _P = bevorzugt, MT = SM bevorzugt.

Mit AT+CPMS="ME","ME","ME" stellt man auf den internen Speicher des Moduls um. Damit lassen sich dann auch 50 Nachrichten speichern und nicht nur 10.
AT+CPMS="ME","ME","ME" +CPMS: 0,50,0,50,0,50 OK AT+CMGL="all" OK
Wie man sieht, sieht man nach AT+CMGL="all" nichts, oder genauer gesagt, nicht mehr die Nachrichten aus dem SIM-Speicher, sondern jetzt den leeren ME-Speicher. Erst, wenn wir zurück schalten, sehen wir die Nachrichten im SIM-Speicher wieder. Wem der größere Speicher gefällt, der speichert die Einstellung mit AT&W permanent.

Mit AT+CSCA? kann man sich übrigens die Nummer des SM-Service Center anzeigen lassen. Nur in wenigen Sonderfällen muss diese geändert werden.
AT+CSCA? +CSCA: "+491760000443",145

Entwickler-Infos zur Funkzelle abrufen

Mit "AT+CENG..." kann man im Idle oder Telefonie-Modus Entwicklerinformationen abfragen. Das ist etwas komplexer und für Leute etwas, die gerne mit so etwas herumspielen. Aber hier werden unter anderem die CellId (in hexadezimal) der Zelle angezeigt, in die man eingeloggt ist inklusive der Nachbarzellen, die man noch empfängt, in die man aber nicht eingebucht ist, weil sie einen schlechteren Empfang haben.

Die Empfangsstärke steht auch dabei. Damit könnte man so Pi mal Daumen errechnen, wo man ungefähr ist, wenn man die Standorte der Funkmasten kennt und die Empfangsstärke mit der Entfernung in Relation setzt und dann trianguliert. Wobei Empfangsstärke natürlich nicht immer unbedingt gleich Entfernung ist, es kommt auch auf die topologischen Eigenschaften der Umgebung (Wald, Häuser), die Antennenausrichtung usw. an.

Eventuell findet man auch eine Karte, in der die Zelle direkt mit Nummer eingetragen ist und hat dann gleich das entsprechende Gebiet. Eine Sache, die Funkamateuren sicher Spaß machen könnte. Da man aber ein bisschen Hintergrundwissen dazu braucht, behandele ich das hier nicht weiter und verweise auf das Datenblatt.

In diesem Zusammenhang sicher auch nützlich ist der AT-Befehl "AT+CNETSCAN", der alle Zellen in der näheren Umgebung anzeigt; und zwar nicht nur die des Providers, bei dem man gerade eingebucht ist, sondern alle.

Das ist vielleicht hilfreich, wenn man schauen will, welcher Mobilfunk-Provider die meisten Funkmasten und damit wohl die besten Empfangsbedingungen am Standort hat. Dabei aber bedenken: "E-Plus" funkt nur mit einem Watt, "D1" und "Vodafone" mit zwei Watt. Je höher die Leistung, desto weiter kommt man.

Als Beispiel: Bei meinem Test wurden 7 "E-Plus" (also O2), 4 "D1" (also Telekom) und 2 "Vodafone" (D2-Netz) aufgeführt. Dabei hat allerdings eine D1-Zelle die höchsten Empfangsstärke ("Rxlev") von 20, O2 geht nur bis max. 13 und D2 nur bis max. 12.

Da auch bei "AT+CNETSCAN" die CellIDs und Empfangstärken angezeigt werden, ist dieser vielleicht noch besser geeignet, den eigenen Standort zu ermitteln als "AT+CENG...".

Ähnliche Werte liefert auch "AT+CELLIST", das man vorher mit "AT+CELLIST=1" eingeschaltet haben muss. "AT+CELLIST" hat aber keinen Mehrwert gegenüber "AT+CNETSCAN", es ist nur schlechter lesbar; dafür spart es ein paar Bytes, sollte man das viel protokollieren wollen.

Quellen, Literaturverweise und weiterführende Links

(1) Golem vom 14.04.2021: Deutsche Netzbetreiber halten am 2G-Netz fest
(2) teltarif.de vom 06.03.2023: Telekom stellt alten Fax- und Datendienst im Handy-Netz ein
(3) teltarif.de: Das war CSD: Leitungsvermitteltes mobiles Internet