Tout développeur qui doit travailler avec un modem cellulaire devra à un moment ou à un autre faire usage de ce qu’on appelle les ‘commandes AT’. Les commandes AT sont essentiellement des instructions de modem. Développées à l’origine par le fabricant de modems Hayes comme moyens de faire fonctionner leurs produits de ligne terrestre commutée, les commandes AT – le « AT » signifie « come to ATtention » – sont maintenant utilisées par tous les modems, de tous types.
Les commandes AT sont principalement utilisées pour configurer un modem et établir sa connexion au réseau. Elles peuvent également être utilisées pour obtenir des informations sur le modem et l’état de la connexion, ce qui peut être très utile pour déboguer des applications et pour confirmer qu’un modem fonctionne correctement : il s’est connecté au bon réseau, utilise la bonne technologie cellulaire, a l’itinérance activée, etc. Nous examinerons sous peu quelques commandes utiles pour des tâches de ce genre.
Comment envoyer des commandes AT
Les commandes AT sont envoyées au modem sous forme de texte brut via une connexion série (UART) comprenant deux fils, un pour la réception (RX) et un pour l’émission (TX), ou via USB. Sur le terrain, un dispositif IoT compatible avec le cellulaire gérera son modem en lui envoyant des commandes AT, mais pendant le développement et le débogage d’une application, il n’est pas rare d’exploiter la connexion du modem. Cela vous permet de lancer un terminal et d’interagir directement avec le modem en émettant vos propres commandes AT.
Comment formater les commandes AT
Les commandes que vous envoyez doivent obéir à la syntaxe de base suivante :
AT<COMMAND><SUFFIX><DATA>
C’est ce qu’on appelle une ‘ligne de commande’. Comme vous pouvez le voir, elle commence par AT
, suivie d’une commande, d’un suffixe pour indiquer le mode de commande ou le « type », et enfin de quelques données, bien que toutes les commandes n’aient pas besoin d’inclure ce champ.
Cette structure est appelée « ligne de commande » et elle est toujours terminée par un seul retour chariot. Vous pouvez inclure plusieurs commandes dans la ligne, chacune étant séparée par un point-virgule :
AT<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>
Chaque ligne, quel que soit le nombre de commandes qu’elle contient, ne comporte qu’un seul AT
, au début. Vous obtiendrez une erreur si vous incluez AT
plus d’une fois dans une même ligne. Les commandes dans les lignes multi-commandes sont traitées séquentiellement. La longueur de la ligne est généralement limitée à 80 caractères.
Champs de la ligne de commande AT
Le champ <COMMAND>
indique ce que vous voulez que le modem fasse. Les anciennes commandes « de base » ont des noms à un seul caractère ; les ajouts ultérieurs au jeu de commandes, appelés commandes « étendues », sont préfixés par un signe +
, comme AT+COPS
(recherche de réseaux) et AT+CGMI
(obtenir le fabricant du modem). Certaines commandes sont préfixées par & – par exemple, AT&F
, qui réinitialise les paramètres du modem. Toutes les commandes cellulaires sont des commandes étendues. Selon la spécification de la commande AT, les commandes doivent comporter des caractères majuscules, mais de nombreux modems permettent d’envoyer des commandes en minuscules également. Nous nous en tiendrons à la norme.
Les valeurs des champs <DATA>
et <SUFFIX>
dépendent du type de commande, qui sont au nombre de quatre :
Type | Suffixe | Rôle |
---|---|---|
Lecture | ? |
Recevoir un paramètre de configuration du modem |
Set | = |
Définir un paramètre de configuration du modem. setting |
Execute | None | Déclencher une opération du modem |
Test | =? |
Vérifier si un modem supporte la commande nommée – mais notez que AT+COPS=? fonctionne légèrement différemment, comme nous le verrons bientôt |
Nous verrons comment ces types affectent l’utilisation des commandes AT dans un moment, mais d’abord voyons comment le modem répond aux commandes.
Réponse aux commandes AT
Lorsqu’une commande AT est émise, selon la commande envoyée, le modem peut ou non retourner des données, c’est-à-dire faire ce qu’on appelle une « réponse d’information ». Dans tous les cas, l’opération de commande se termine toujours par le retour d’un ‘code de résultat’ par le modem.
Par exemple, supposons que nous demandions le nom du fabricant du modem en utilisant la commande suivante :
AT+CGMI
Cela générera la réponse suivante lorsqu’elle sera appelée sur un modem u-blox :
u-bloxOK
Chaque unité de la réponse – l’information (ligne supérieure) et le code de résultat (ligne inférieure) – est encadrée par des caractères de retour de chariot et de saut de ligne (codes Ascii 0x0D
et 0x0A
, respectivement), d’où la ligne vide avant le OK
.
OK
est un code de retour ; l’autre est ERROR
– vous avez fait une erreur. Peut-être que le modem ne répond pas à la commande AT que vous avez envoyée, ou que vous l’avez mal saisie. Vous avez peut-être fourni trop ou trop peu de valeurs de données ou de paramètres de commande. Par défaut, les modems peuvent ne pas fournir beaucoup d’explications. Heureusement, certains d’entre eux peuvent être configurés pour renvoyer des informations d’erreur étendues ; là encore, vous devrez envoyer une commande AT pour appliquer ce paramètre : AT+CMEE=2
.
Il est important de comprendre que vous pouvez également recevoir ERROR
d’une commande AT parfaitement valide. Lorsque cela se produit, c’est une indication que le modem est dans un état qui est incompatible avec la commande. Par exemple, si vous tentez de modifier le nom du point d’accès (APN) d’un modem alors qu’il est actif, cela renvoie généralement ERROR
. Le remède consiste à désactiver le modem, à effectuer le changement d’APN, puis à le réactiver.
Type de commande AT et test
Vous pouvez atténuer le problème des commandes apparemment correctes qui lancent des erreurs en faisant usage du suffixe de commande de test (=?
), qui est utilisé pour demander au modem s’il prend en charge la commande donnée. Si ce n’est pas le cas, vous recevrez un code de retour ERROR
; vous savez qu’il ne faut pas lancer cette commande. Si le modem supporte la commande, vous recevrez une réponse d’information indiquant les paramètres de la commande, si elle en a, suivie de OK
.
L’exemple ci-dessus peut être utilisé pour démontrer le test des commandes. Nous pouvons demander au modem s’il prend en charge la commande +CGMI
:
AT+CGMI=?
et il renverra OK car il prend en charge cette commande. Cependant, comme le fabricant du modem est fixe, toute tentative de le modifier aboutira toujours à ERROR
. Comment aurions-nous pu tenter de changer sa valeur ? Avec une commande de suffixe (=
):
AT+CGMI="Fintlewoodlewix"ERROR
Notez comment les données de la chaîne sont placées entre guillemets – c’est aussi une exigence de la commande AT.