Cualquier desarrollador que deba trabajar con un módem celular tendrá que hacer uso de lo que se llama ‘comandos AT’ en algún momento. Los comandos AT son esencialmente instrucciones del módem. Desarrollados originalmente por el fabricante de módems Hayes como medio para hacer funcionar sus productos de telefonía fija, los comandos AT – el «AT» significa «come to ATtention» – son utilizados ahora por todos los módems, de todos los tipos.
Los comandos AT se utilizan principalmente para configurar un módem y establecer su conexión de red. También se pueden utilizar para obtener información sobre el estado del módem y de la conexión, y esto puede ser muy útil para depurar aplicaciones y para confirmar que un módem funciona correctamente: se ha conectado a la red adecuada, está utilizando la tecnología celular correcta, tiene el roaming activado, etc. En breve veremos algunos comandos útiles para estas tareas.
Cómo enviar comandos AT
Los comandos AT se envían al módem como texto plano a través de una conexión serie (UART) que consta de dos cables, uno para recibir (RX) y otro para transmitir (TX), o a través de USB. En el campo, un dispositivo IoT habilitado para celular gestionará su módem enviándole comandos AT, pero durante el desarrollo y la depuración de aplicaciones, no es raro intervenir la conexión del módem. Esto le permite encender un terminal e interactuar con el módem directamente emitiendo sus propios comandos AT.
Cómo formatear los comandos AT
Los comandos que envíe deben obedecer a la siguiente sintaxis básica:
AT<COMMAND><SUFFIX><DATA>
Esto se denomina «línea de comando». Como puede ver, comienza con AT
, seguido de un comando, un sufijo para indicar el modo o «tipo» de comando y, finalmente, algunos datos, aunque no todos los comandos necesitan que se incluya este campo.
Esta estructura se denomina «línea de comando» y siempre termina con un único retorno de carro. Puede incluir varios comandos en la línea, cada uno separado por un punto y coma:
AT<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>
Cada línea, no importa cuántos comandos contenga, sólo tiene un AT
, al principio. Obtendrá un error si incluye AT
más de una vez en una sola línea. Los comandos de las líneas de varios comandos se procesan secuencialmente. La longitud de la línea suele estar limitada a 80 caracteres.
Campos de la línea de comandos de AT
El campo <COMMAND>
indica lo que quiere que haga el módem. Los comandos «básicos» más antiguos tienen nombres de un solo carácter; las adiciones posteriores al conjunto de comandos, denominadas comandos «extendidos», llevan el prefijo +
, como AT+COPS
(buscar redes) y AT+CGMI
(obtener el fabricante del módem). Algunos comandos llevan el prefijo & – por ejemplo, AT&F
, que restablece la configuración del módem. Todos los comandos celulares son comandos extendidos. Según la especificación de los comandos AT, los comandos deben incluir caracteres en mayúsculas, pero muchos módems permiten enviarlos también en minúsculas. Nos quedaremos con el estándar.
Los valores de los campos <DATA>
y <SUFFIX>
dependen del tipo de comando, de los cuales hay cuatro:
Tipo | Suffix | Role |
---|---|---|
Leer | ? |
Obtener un ajuste de configuración del módem |
Set | = |
Establecer una configuración del módem setting |
Ejecutar | Nada | Ejecutar una operación de módem |
Probar | =? |
Comprobar si un módem soporta el comando nombrado – pero tenga en cuenta que AT+COPS=? funciona de forma ligeramente diferente, como veremos en breve |
Veremos cómo estos tipos afectan al uso de los comandos AT en un momento, pero primero veamos cómo responde el módem a los comandos.
Respuesta del comando AT
Cuando se emite un comando AT, dependiendo del comando enviado, el módem puede o no devolver datos, es decir, hacer lo que se llama una «respuesta de información». De cualquier manera, la operación de comando siempre termina con el módem devolviendo un ‘código de resultado’.
Por ejemplo, supongamos que pedimos el nombre del fabricante del módem utilizando el siguiente comando:
AT+CGMI
Esto generará la siguiente respuesta cuando se llame a un módem u-blox:
u-bloxOK
Cada unidad de la respuesta – la información (línea superior) y el código de resultado (línea inferior) – están entre corchetes con caracteres de Retorno de carro y Avance de línea (códigos Ascii 0x0D
y 0x0A
, respectivamente), de ahí la línea vacía antes del OK
.
OK
es un código de retorno; el otro es ERROR
– te has equivocado. Tal vez el módem no responde al comando AT que enviaste, o lo escribiste mal. Tal vez proporcionaste muy pocos o demasiados valores de datos o parámetros de comando. Por defecto, los módems no ofrecen muchas explicaciones. Afortunadamente, algunos de ellos pueden configurarse para que devuelvan información de error ampliada; de nuevo, tendrás que enviar un comando AT para aplicar esta configuración: AT+CMEE=2
.
Es importante entender que también puede recibir ERROR
de un comando AT perfectamente válido. Cuando esto ocurre, es una indicación de que el módem está en un estado incompatible con el comando. Por ejemplo, si intentas cambiar el nombre del punto de acceso (APN) de un módem mientras está activo, esto suele devolver ERROR
. El remedio es desactivar el módem, hacer el cambio de APN, y luego reactivarlo.
Tipos de comandos AT y pruebas
Puedes mitigar el problema de los comandos aparentemente correctos que arrojan errores haciendo uso del sufijo de comando de prueba (=?
), que se utiliza para preguntar al módem si soporta el comando dado. Si no lo hace, recibirás un código de retorno ERROR
; ya sabes que no debes emitir este comando. Si el módem sí admite el comando, recibirá una respuesta de información que indica los parámetros del comando, si tiene alguno, seguida de OK
.
El ejemplo anterior puede utilizarse para demostrar la prueba de comandos. Podemos preguntar al módem si soporta el comando +CGMI
:
AT+CGMI=?
y devolverá OK porque sí soporta este comando. Sin embargo, como el fabricante del módem es fijo, al intentar cambiarlo siempre dará como resultado ERROR
. ¿Cómo podríamos haber intentado cambiar su valor? Con un sufijo del comando set (=
):
AT+CGMI="Fintlewoodlewix"ERROR
Nota cómo los datos de la cadena se colocan entre comillas dobles – esto también es un requisito del comando AT.