jueves, 7 de abril de 2011

Enviar un Mensaje de Texto (SMS) usando Comandos AT+ (desde un Pc)

Objetivo

Enviar un mensaje de texto desde un computador con un teléfono con una línea GSM activa.

Propósito

Muchas aplicaciones de hoy en día necesitan de conectividad aérea, o inalámbrica (wireless), aunque hay muchos equipos que pueden enviar mensajes de texto (como un Gateway SMS) no hay tanta información disponible para saber cómo comunicarse con un Modem para enviar un mensaje de texto desde el PC.

Las aplicaciones derivadas son muchas y variadas. En este documento me enfocaré en enviar UN mensaje de texto, para enviar mensajes masivos se requiere un Gateway SMS, pero para el propósito educativo de este documento solo enviaremos un mensaje desde el computador con un teléfono GSM.

Los Comandos AT+ y los teléfonos capaces de procesarlos

No todos los teléfonos soportan los comandos AT+, algunos solo soportan un subconjunto limitado de comandos AT, básicos para hacer llamadas y recibir datos.  Los comandos AT+ permiten a un computador conectado al modem la capacidad de enviar y recibir datos con funciones avanzadas, entre ellas el envío de mensajes de texto.

mas información aquí:
http://es.wikipedia.org/wiki/Conjunto_de_comandos_Hayes

El teléfono conectado al PC

No todos los teléfonos pueden conectarse al PC a modo de Modem. Una cosa muy distinta y que no se debe confundir es conectar un teléfono al PC para cargar la bateria, o para transferirle archivos o para verlo como un pendrive y otra muy distinta es conectarse al teléfono a modo de Modem. En el manual de especificaciones del teléfono suele indicarlo. Normalmente se puede usar cómo modem cuando el vendedor nos indica que: "el teléfono puede usarse para conectarlo al computador para navegar en internet desde éste.".  
No le pregunte al vendedor acerca de cosas cómo "modem" o "comandos At", no tendrá remota idea de lo que le está preguntando y solo logrará hacerlo enojar.
Si el teléfono puede conectarse al PC y puede ser usado como módem, entonces ahora solo hay que comprobar que sea capaz de procesar comandos AT+ y que sea capaz de dar las funciones de envío y recepción de mensajes de texto.
Un modelo Sony Ericcson K510 es muy económico y permite hacer todo esto. 
Cómo comprobar que se puedan usar comandos At+ en el teléfono:

Asumiré que tiene conocimientos básicos en el uso de un Modem, de su configuración, instalación y verificación:

Enviar al módem los comandos:

AT+CMGF=0  
AT+CSMS=0
debe retornar un valor de respuesta distinto de error, por ejemplo: "1,1,1"

Si devuelve por ejemplo "1,1,1" quiere decir que el teléfono es capaz de entrar al modo "PDU" y que es capaz de procesar mensajes SMS.  (Sino deberá comprar otro teléfono....si, otro, y quizá otro mas..)

Algoritmo para enviar un mensaje de texto.

Este algoritmo muestra los pasos a seguir para codificar una trama de datos capaz de ser recibida por un teléfono GSM capaz de procesar comandos At extendidos (At+)
Los siguientes pasos son avanzados, y está orientado a programadores con conocimiento en transmisión de datos a puertos, por tanto obviaré escribir para un lenguaje específico, en cambio lo haré a modo de pseudo-algoritmo.
mensaje_a_enviar = "hola como estas"
mpdu = convertir_a_pdu(mensaje_a_enviar)  // devuelve por ejemplo: C8273308823EA7496AB0
El código fuente para convertir un texto a formato PDU es un algoritmo estándar y está disponible aquí: pduconv.h  y  pduconv.cpp
octetos = contar_octetos_de_mensaje_pdu(mpdu)
//ejemplo: octetos = 10 -> 1-C8 2-27 3-33 ....08 82 3E A7 49 6A 10-B0
hoctetos = convertir_a_hexadecimal(octetos)
// hoctetos = 0A, que significa 10 en decimal, debe mantenerse como un valor "String", ya que luego se encadenará a una trama de datos

// dar formato al telefono:
telefono = 0416991199  (el numero de destino, puse cualquier cosa..)
gtelefono = 58416991199  (numero en formato GSM, es el que usaremos)
// si numero es IMPAR se le agrega una 'F' al final., sino no.
gtelefonoAdaptado = esImpar(gtelefono) ? si: agregarF , no: dejarIgual
// en este caso 58416991199 tiene 11 digitos, es impar, agregar una F
// el valor de "gtelefonoAdaptado" quedaría así:  58416991199F

// dar vuelta --los octetos-- de 58416991199F
rev_telefono = 8514961991F9   (58 pasa a ser 85...41->14 etc...)

// contar los digitos del numero GSM
contador = contarDigitos(rev_telefono)  // 12 digitos 8514961991F9
// contador es: 12, y llevarlo a Hexadecimal,
hcontador = 0C  (0c es 12 en decimal)

// armar cadena de texto con el mensaje PDU y demás datos como indico aquí:

00 11 00 0C 91 8514961991F9 00 00 AA 0A C8273308823EA7496AB0
         X1    X2__________          X3 X4__________________
DONDE:
X1 = hcontador
X2 = rev_telefono
X3 = hoctetos
X4 = mpdu

//  así quedaría la trama de datos del mensaje de texto a enviar:
PDU_STRING=0011000C918514962555200000AA0AC8273308823EA7496AB0

// contar el numero de octetos de la cadena generada, sin contar el primero 00
// 11 00 0C 91 85 14 96 25 55 20 00 00 AA 0A C8 27 33 08 82 3E A7 49 6A B0
// tiene 24 octetos
NPDUSTRING = 24


// finalmente enviar al modem el mensaje de texto:
AT+CMGF=0
AT+CSMS=0
AT+CMGS=NPDUSTRING
>PDU_STRING <AGREGAR CARACTER DE ESCAPE:  CONTROL+Z>



Suerte.

Código creado y probado en C++ con un Sony Ericcson k510
por:  Christian Salazar, diciembre de 2008.

"Todo conocimiento es fácil de ser entendido por todos, luego que otro lo descubre primero, el truco está en descubrirlo"  (Isaac Netwon, científico inglés, nacido en 1642)

1 comentario: