Jeder Entwickler, der mit einem zellularen Modem arbeiten muss, wird irgendwann auf die so genannten „AT-Befehle“ zurückgreifen müssen. AT-Befehle sind im Wesentlichen Modembefehle. Ursprünglich vom Modemhersteller Hayes als Mittel zum Betrieb seiner Festnetzprodukte entwickelt, werden AT-Befehle – das ‚AT‘ steht für ‚come to ATtention‘ – heute von allen Modems, egal welchen Typs, verwendet.
AT-Befehle werden in erster Linie verwendet, um ein Modem zu konfigurieren und seine Netzverbindung herzustellen. Sie können auch verwendet werden, um Informationen über den Modem- und Verbindungsstatus zu erhalten, was bei der Fehlersuche in Anwendungen sehr hilfreich sein kann und um zu bestätigen, dass ein Modem korrekt funktioniert: Es ist mit dem richtigen Netz verbunden, verwendet die richtige Mobilfunktechnologie, hat Roaming aktiviert usw. Wir werden uns in Kürze einige nützliche Befehle für solche Aufgaben ansehen.
Senden von AT-Befehlen
AT-Befehle werden als Klartext über eine serielle (UART) Verbindung mit zwei Drähten, einem für den Empfang (RX) und einem für das Senden (TX), oder über USB an das Modem gesendet. In der Praxis verwaltet ein mobilfunkfähiges IoT-Gerät sein Modem, indem es ihm AT-Befehle sendet, aber während der Anwendungsentwicklung und des Debugging ist es nicht ungewöhnlich, die Verbindung des Modems anzuzapfen. Dies ermöglicht es Ihnen, ein Terminal zu starten und direkt mit dem Modem zu interagieren, indem Sie eigene AT-Befehle eingeben.
Wie man AT-Befehle formatiert
Die Befehle, die Sie senden, müssen der folgenden grundlegenden Syntax entsprechen:
AT<COMMAND><SUFFIX><DATA>
Dies wird als „Befehlszeile“ bezeichnet. Wie Sie sehen können, beginnt sie mit AT
, gefolgt von einem Befehl, einem Suffix, das den Befehlsmodus oder den „Typ“ angibt, und schließlich einigen Daten, obwohl dieses Feld nicht für alle Befehle erforderlich ist.
Diese Struktur wird als „Befehlszeile“ bezeichnet, und sie wird immer mit einem einfachen Wagenrücklauf abgeschlossen. Sie können mehrere Befehle in die Zeile aufnehmen, die jeweils durch ein Semikolon getrennt sind:
AT<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>
Jede Zeile, egal wie viele Befehle sie enthält, hat nur ein AT
am Anfang. Sie erhalten eine Fehlermeldung, wenn Sie AT
mehr als einmal in eine einzige Zeile einfügen. Die Befehle in Zeilen mit mehreren Befehlen werden der Reihe nach abgearbeitet. Die Zeilenlänge ist normalerweise auf 80 Zeichen begrenzt.
AT-Befehlszeilenfelder
Das Feld <COMMAND>
gibt an, was das Modem tun soll. Ältere, „einfache“ Befehle haben einstellige Namen; spätere Ergänzungen des Befehlssatzes, „erweiterte“ Befehle genannt, haben ein +
-Zeichen vorangestellt, wie z.B. AT+COPS
(nach Netzwerken suchen) und AT+CGMI
(Modemhersteller ermitteln). Einigen Befehlen ist das Präfix & vorangestellt, z. B. AT&F
, mit dem die Einstellungen des Modems zurückgesetzt werden. Alle zellularen Befehle sind erweiterte Befehle. Nach der AT-Befehlsspezifikation müssen die Befehle aus Großbuchstaben bestehen, aber viele Modems erlauben es, die Befehle auch in Kleinbuchstaben zu senden. Wir halten uns an den Standard.
Die Werte der Felder <DATA>
und <SUFFIX>
hängen vom Befehlstyp ab, von denen es vier gibt:
Typ | Suffix | Rolle |
---|---|---|
Lesen | ? |
Auslesen einer Modemkonfigurationseinstellung |
Setzen | = |
Setzen einer Modemkonfiguration setting |
Execute | None | Trigger a modem operation |
Test | =? |
Überprüfen Sie, ob ein Modem den genannten Befehl unterstützt – aber beachten Sie, dass AT+COPS=? etwas anders funktioniert, wie wir gleich sehen werden |
Wir werden gleich sehen, wie sich diese Typen auf die Verwendung von AT-Befehlen auswirken, aber zuerst wollen wir sehen, wie das Modem auf Befehle reagiert.
AT-Befehlsantwort
Wenn ein AT-Befehl erteilt wird, kann das Modem, je nach dem gesendeten Befehl, Daten zurückgeben oder nicht, d.h. eine so genannte „Informationsantwort“ geben. In jedem Fall endet der Befehlsvorgang damit, dass das Modem einen „Ergebniscode“ zurückgibt.
Angenommen, wir fragen mit dem folgenden Befehl nach dem Namen des Modemherstellers:
AT+CGMI
Dies erzeugt die folgende Antwort, wenn es auf einem u-blox-Modem aufgerufen wird:
u-bloxOK
Jede Einheit der Antwort – die Informationen (obere Zeile) und der Ergebniscode (untere Zeile) – werden durch Carriage Return- und Line Feed-Zeichen (Ascii-Codes 0x0D
bzw. 0x0A
) eingeklammert, daher die Leerzeile vor dem OK
.
OK
ist ein Return-Code; der andere ist ERROR
– Sie haben einen Fehler gemacht. Vielleicht reagiert das Modem nicht auf den von Ihnen gesendeten AT-Befehl, oder Sie haben ihn falsch eingegeben. Vielleicht haben Sie zu wenige oder zu viele Datenwerte oder Befehlsparameter angegeben. Standardmäßig bieten Modems nicht viel an Erklärungen. Glücklicherweise können einige von ihnen so eingestellt werden, dass sie erweiterte Fehlerinformationen zurückgeben; auch hier müssen Sie einen AT-Befehl senden, um diese Einstellung anzuwenden: AT+CMEE=2
.
Es ist wichtig zu verstehen, dass Sie auch ERROR
von einem vollkommen gültigen AT-Befehl erhalten können. Dies ist ein Hinweis darauf, dass sich das Modem in einem Zustand befindet, der mit dem Befehl nicht kompatibel ist. Wenn Sie zum Beispiel versuchen, den Zugangspunktnamen (APN) eines Modems zu ändern, während es aktiv ist, wird in der Regel ERROR
zurückgegeben. Die Abhilfe besteht darin, das Modem zu deaktivieren, die APN-Änderung vorzunehmen und es dann wieder zu aktivieren.
AT-Befehlstypen und Testen
Sie können das Problem, dass scheinbar korrekte Befehle Fehler auslösen, durch die Verwendung des Testbefehlssuffixes (=?
) entschärfen, das verwendet wird, um das Modem zu fragen, ob es den angegebenen Befehl unterstützt. Ist dies nicht der Fall, erhalten Sie einen ERROR
-Rückgabewert; Sie wissen dann, dass Sie diesen Befehl nicht ausführen sollten. Wenn das Modem den Befehl unterstützt, erhalten Sie eine Informationsantwort mit den Parametern des Befehls, falls es welche gibt, gefolgt von OK
.
Das obige Beispiel kann zur Demonstration der Befehlsprüfung verwendet werden. Wir können das Modem fragen, ob es den Befehl +CGMI
unterstützt:
AT+CGMI=?
und es wird OK antworten, da es diesen Befehl unterstützt. Da der Hersteller des Modems jedoch feststeht, führt der Versuch, ihn zu ändern, immer zu ERROR
. Wie hätten wir versuchen können, den Wert zu ändern? Mit einem Set-Befehlssuffix (=
):
AT+CGMI="Fintlewoodlewix"ERROR
Beachten Sie, wie die Zeichenkette in Anführungszeichen gesetzt wird – auch dies ist eine Anforderung des AT-Befehls.