Elke ontwikkelaar die met een cellulaire modem moet werken, zal op enig moment gebruik moeten maken van zogenaamde ‘AT-opdrachten’. AT-opdrachten zijn in wezen modeminstructies. Oorspronkelijk ontwikkeld door modemfabrikant Hayes als middel om hun inbelproducten voor de vaste lijn te bedienen, worden AT-opdrachten – de ‘AT’ staat voor ‘come to ATtention’ – nu gebruikt door alle modems, van alle typen.
AT-opdrachten worden in de eerste plaats gebruikt om een modem te configureren en de netwerkverbinding tot stand te brengen. Ze kunnen ook worden gebruikt om informatie over de modem- en verbindingsstatus te verkrijgen, en dit kan zeer nuttig zijn bij het debuggen van toepassingen en om te bevestigen dat een modem correct werkt: hij heeft verbinding met het juiste netwerk, gebruikt de juiste cellulaire technologie, heeft roaming ingeschakeld, enz. We zullen binnenkort enkele nuttige opdrachten voor dergelijke taken bekijken.
Hoe AT-opdrachten te verzenden
AT-opdrachten worden als platte tekst naar de modem gezonden via een seriële (UART) verbinding die bestaat uit twee draden, een voor ontvangen (RX) en een voor zenden (TX), of via USB. In het veld zal een IoT-apparaat met een mobiele telefoon zijn modem beheren door het AT-opdrachten te sturen, maar tijdens de ontwikkeling van toepassingen en debugging is het niet ongebruikelijk om de modemverbinding af te tappen. Hierdoor kunt u een terminal opstarten en rechtstreeks met de modem communiceren door zelf AT-opdrachten uit te geven.
Hoe u AT-opdrachten moet formatteren
De opdrachten die u verzendt, moeten aan de volgende basissyntaxis voldoen:
AT<COMMAND><SUFFIX><DATA>
Dit wordt een ‘opdrachtregel’ genoemd. Zoals u kunt zien, begint deze met AT
, gevolgd door een commando, een achtervoegsel om de commandomodus of het ’type’ aan te geven, en tenslotte wat gegevens, hoewel niet alle commando’s dit veld nodig hebben om te worden opgenomen.
Deze structuur wordt een ‘commandoregel’ genoemd en wordt altijd afgesloten door een enkele carriage return. U kunt meerdere commando’s in de regel opnemen, elk gescheiden door een puntkomma:
AT<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>
Elke regel, ongeacht het aantal commando’s dat hij bevat, heeft slechts één AT
, aan het begin. U krijgt een foutmelding als u AT
meer dan één keer in een regel opneemt. De commando’s in multi-commandoregels worden opeenvolgend verwerkt. De regellengte is gewoonlijk beperkt tot 80 tekens.
AT-opdrachtregelvelden
Het veld <COMMAND>
geeft aan wat u wilt dat de modem doet. Oudere, ‘basis’-opdrachten hebben namen van één teken; latere toevoegingen aan de opdrachtenverzameling, ‘uitgebreide’ opdrachten genoemd, worden voorafgegaan door een +
-teken, zoals AT+COPS
(scan voor netwerken) en AT+CGMI
(modemfabrikant ophalen). Sommige opdrachten hebben als voorvoegsel & – bijvoorbeeld AT&F
, waarmee de instellingen van de modem worden gereset. Alle cellulaire commando’s zijn uitgebreide commando’s. Volgens de AT-opdrachtspecificatie moeten commando’s bestaan uit hoofdletters, maar veel modems staan toe dat commando’s ook in kleine letters worden verzonden. We houden het bij de standaard.
De waarden van de <DATA>
en <SUFFIX>
velden hangen af van het commandotype, waarvan er vier zijn:
Type | Suffix | Role |
---|---|---|
Read | ? |
Een modemconfiguratie-instelling |
Set | = |
Een modemconfiguratie-instelling instelling |
Uitvoeren | Neen | Trigger een modembewerking |
Test | =? |
Controleer of een modem de genoemde opdracht ondersteunt – maar merk op dat AT+COPS=? iets anders werkt, zoals we zo zullen zien |
We zullen zo meteen zien hoe deze typen het gebruik van AT-opdrachten beïnvloeden, maar laten we eerst eens kijken hoe het modem op opdrachten reageert.
AT command response
Als een AT-opdracht wordt gegeven, kan de modem, afhankelijk van de verzonden opdracht, al dan niet gegevens terugsturen, d.w.z. wat een ‘informatie-antwoord’ wordt genoemd. Hoe dan ook, de opdracht eindigt altijd met de modem die een ‘resultaatcode’ terugzendt.
Voorstellen we bijvoorbeeld dat we de naam van de fabrikant van de modem vragen met het volgende commando:
AT+CGMI
Dit zal het volgende antwoord opleveren wanneer het op een u-blox modem wordt opgeroepen:
u-bloxOK
Elke eenheid van het antwoord – de informatie (bovenste regel) en de resultaatcode (onderste regel) – wordt geflankeerd door Carriage Return- en Line Feed-tekens (Ascii-codes 0x0D
en 0x0A
, respectievelijk), vandaar de lege regel vóór de OK
.
OK
is de ene return code; de andere is ERROR
– u heeft een fout gemaakt. Misschien reageert de modem niet op het AT commando dat je stuurde, of heb je het verkeerd getypt. Misschien hebt u te weinig of te veel gegevenswaarden of opdrachtparameters opgegeven. Modems geven standaard niet veel uitleg. Gelukkig kunnen sommige modems zo worden ingesteld dat ze uitgebreide foutinformatie terugzenden; ook hiervoor moet u een AT-opdracht verzenden om deze instelling toe te passen: AT+CMEE=2
.
Het is belangrijk te begrijpen dat u ook ERROR
kunt ontvangen van een perfect geldig AT commando. Wanneer dit gebeurt, is dit een indicatie dat de modem zich in een toestand bevindt die niet compatibel is met de opdracht. Als u bijvoorbeeld probeert de Access Point Name (APN) van een modem te wijzigen terwijl deze actief is, zal dit gewoonlijk ERROR
teruggeven. De oplossing is om de modem uit te schakelen, de APN te wijzigen en hem dan weer in te schakelen.
AT-opdrachttypen en testen
U kunt het probleem van schijnbaar correcte opdrachten die fouten opleveren beperken door gebruik te maken van het achtervoegsel testopdracht (=?
), dat wordt gebruikt om de modem te vragen of hij de gegeven opdracht ondersteunt. Als dit niet het geval is, krijgt u een ERROR
-retourcode; u weet dan dat u deze opdracht niet moet geven. Indien de modem de opdracht wel ondersteunt, ontvangt u een informatief antwoord waarin de parameters van de opdracht worden aangegeven, indien deze aanwezig zijn, gevolgd door OK
.
Het bovenstaande voorbeeld kan worden gebruikt om het testen van opdrachten te demonstreren. We kunnen het modem vragen of het de opdracht +CGMI
ondersteunt:
AT+CGMI=?
en het zal OK terugzenden omdat het deze opdracht ondersteunt. Omdat de fabrikant van de modem echter vastligt, zal een poging om deze te wijzigen altijd ERROR
opleveren. Hoe kunnen we geprobeerd hebben de waarde te veranderen? Met een set-commando achtervoegsel (=
):
AT+CGMI="Fintlewoodlewix"ERROR
Merk op hoe de string-gegevens tussen dubbele aanhalingstekens zijn geplaatst – ook dit is een AT-commando vereiste.