Introduktion til AT-kommandoer

Alle udviklere, der skal arbejde med et mobilmodem, bliver på et tidspunkt nødt til at bruge det, der kaldes “AT-kommandoer”. AT-kommandoer er i bund og grund modeminstruktioner. Oprindeligt blev de udviklet af modemproducenten Hayes som et middel til at betjene deres opkaldsprodukter til fastnettet, men AT-kommandoer – “AT” står for “come to ATtention” – bruges nu af alle modemmer af alle typer.

AT-kommandoer bruges primært til at konfigurere et modem og etablere dets netværksforbindelse. De kan også bruges til at få modem- og forbindelsesstatusoplysninger, og det kan være meget nyttigt til fejlfinding af programmer og til at bekræfte, at et modem fungerer korrekt: det har oprettet forbindelse til det rigtige netværk, bruger den rigtige mobilteknologi, har roaming aktiveret osv. Vi vil se på nogle nyttige kommandoer til opgaver som disse om lidt.

Sådan sender du AT-kommandoer

AT-kommandoer sendes til modemmet som ren tekst over en seriel (UART) forbindelse, der består af to ledninger, en til modtagelse (RX) og en til transmission (TX), eller via USB. I marken vil en mobilaktiveret IoT-enhed styre sit modem ved at sende det AT-kommandoer, men under applikationsudvikling og debugging er det ikke ualmindeligt at aflytte modemmets forbindelse. Dette giver dig mulighed for at starte en terminal og interagere direkte med modemmet ved at udsende dine egne AT-kommandoer.

Sådan formaterer du AT-kommandoer

De kommandoer, du sender, skal overholde følgende grundlæggende syntaks:

AT<COMMAND><SUFFIX><DATA>

Dette kaldes en “kommandolinje”. Som du kan se, starter den med AT, efterfulgt af en kommando, et suffiks til angivelse af kommandomodus eller ‘type’ og til sidst nogle data, selv om ikke alle kommandoer behøver at have dette felt med.

Denne struktur kaldes en ‘kommandolinje’, og den afsluttes altid med et enkelt vognrumsretur. Du kan inkludere flere kommandoer i linjen, hver adskilt af et semikolon:

AT<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>

Alle linjer, uanset hvor mange kommandoer de indeholder, har kun ét AT, i starten. Du får en fejl, hvis du inkluderer AT mere end én gang i en enkelt linje. Kommandoerne i linjer med flere kommandoer behandles i rækkefølge. Linjelængden er normalt begrænset til 80 tegn.

AT-kommandolinjefelter

Feltet <COMMAND> angiver, hvad du ønsker, at modemet skal gøre. Ældre, “grundlæggende” kommandoer har navne med et enkelt tegn; senere tilføjelser til kommandosættet, kaldet “udvidede” kommandoer, har et +-tegn foran, f.eks. AT+COPS (scan efter netværk) og AT+CGMI (hent modemproducent). Nogle kommandoer har præfikset & – f.eks. AT&F, som nulstiller modemmets indstillinger. Alle mobilkommandoer er udvidede kommandoer. I henhold til AT-kommandospecifikationen skal kommandoer bestå af store bogstaver, men mange modemmer tillader også, at kommandoer sendes med små bogstaver. Vi holder os til standarden.

Værdierne i felterne <DATA> og <SUFFIX> afhænger af kommandotypen, som der er fire af:

Type Suffix Rolle
Læse ? Hent en modemkonfigurationsindstilling
Sæt = Sæt en modemkonfiguration setting
Execute None Trigger en modemoperation
Test =? Kontroller, om et modem understøtter den nævnte kommando – men bemærk, at AT+COPS=? fungerer lidt anderledes, som vi vil se om lidt

Vi vil se, hvordan disse typer påvirker brugen af AT-kommandoer om et øjeblik, men lad os først se, hvordan modemet reagerer på kommandoer.

AT-kommandosvar

Når der udstedes en AT-kommando, kan modemet, afhængigt af den sendte kommando, returnere data eller ej, dvs. lave det, der kaldes et “informationssvar”. Under alle omstændigheder slutter kommandooperationen altid med, at modemet returnerer en “resultatkode”.

Så lad os f.eks. antage, at vi spørger efter navnet på modemets producent ved hjælp af følgende kommando:

AT+CGMI

Dette vil generere følgende svar, når det kaldes på et u-blox-modem:

u-bloxOK

Hver enhed i svaret – oplysningerne (øverste linje) og resultatkoden (nederste linje) – er sat i parentes med Carriage Return- og Line Feed-tegn (henholdsvis Ascii-koder 0x0D og 0x0A), derfor den tomme linje før OK.

OK er den ene returkode; den anden er ERROR – du har begået en fejl. Måske reagerer modemmet ikke på den AT-kommando, du sendte, eller du har skrevet den forkert. Måske har du angivet for få eller for mange dataværdier eller kommandoparametre. Som standard giver modemer måske ikke meget forklaring. Heldigvis kan nogle af dem indstilles til at returnere udvidede fejloplysninger; igen skal du sende en AT-kommando for at anvende denne indstilling: AT+CMEE=2.

Det er vigtigt at forstå, at du også kan modtage ERROR fra en helt gyldig AT-kommando. Når dette sker, er det en indikation af, at modemmet er i en tilstand, der er uforenelig med kommandoen. Hvis du f.eks. forsøger at ændre et modem’s Access Point Name (APN), mens det er aktivt, vil dette typisk returnere ERROR. Løsningen er at deaktivere modemmet, foretage APN-ændringen og derefter genaktivere det.

AT-kommandotyper og testning

Du kan afhjælpe problemet med tilsyneladende korrekte kommandoer, der giver fejl, ved at gøre brug af testkommandosuffikset (=?), som bruges til at spørge modemmet, om det understøtter den givne kommando. Hvis det ikke gør det, vil du få en ERROR returkode; du ved, at du ikke skal bruge denne kommando. Hvis modemet understøtter kommandoen, vil du modtage et informationssvar, der angiver kommandoens parametre, hvis den har nogen, efterfulgt af OK.

Eksemplet ovenfor kan bruges til at demonstrere test af kommandoer. Vi kan spørge modemet, om det understøtter kommandoen +CGMI:

AT+CGMI=?

og det vil svare OK, fordi det understøtter denne kommando. Men da modemmets producent er fastlåst, vil et forsøg på at ændre den altid resultere i ERROR. Hvordan kunne vi have forsøgt at ændre dens værdi? Med et sæt kommandosuffiks (=):

AT+CGMI="Fintlewoodlewix"ERROR

Bemærk, hvordan stringdataene er placeret inden for dobbelte anførselstegn – dette er også et krav til AT-kommandoen.

Skriv en kommentar