Hace un tiempo desarrollé un gateway sms/mail/sms donde además del software, la pieza clave era esta:
El gateway esta dado de baja (tuvo demasiado éxito), sin embargo el móvil que aparece en la imágen lo sigo usando en algunos de mis proyectos (pronto sabreis por qué estoy escribiendo artículos sobre aparatos). Se trata de un siemens m35i que en su día me cargué la pantalla y lo destiné como modem gsm para poder enviar y recibir sms. Este se comunica con un cable de datos por el puerto serie con el ordenador. Como el cable tiene que usar el mismo compartimento que la fuente de alimentación del móvil y necesitaba tener los dos al mismo tiempo, conecté los pines donde se conecta la batería del móvil a un pequeño circuito con un L7805C y dos condensadores, funcionando todo ello con una fuente de alimentación de 12 voltios.
En este caso el móvil al ser un modem gsm (como la inmensa mayoría) se puede manejar con comandos AT, aunque algunos son característicos de los móviles (como el de mandar sms).
Para trabajar con el, en mi caso, tengo que abrir el puerto serie a 19200 baudios, 8 bits, ninguna paridad y un bit de stop.
En mi caso, siempre me interesa usarlo como transmisor/receptor de sms, por lo que leyendo un poco la documentación del móvil veo que para enviar sms se usa el comando AT+CMGS. Sin embargo mi móvil no permite mensajes de texto de forma directa, sino que necesita enviarlos en formato estandar PDU (también cuando muestra los recibidos). Buscando por ahí no he encontrado mucho código fuente (en java smstools) por lo que me hice una rutina en C para pasar de texto a PDU y viceversa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/* Transforma un texto normal (pchOriginal) en PDU (pchTransformado) devolviendo pchTransformado*/ char *formatoMensaje(char *pchOriginal, char *pchTransformado) { char pchTablaHex[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; unsigned char chrCaracter; int intContador; int intIndice; int intTamano; int intMascara; int intDesplaza; intTamano = strlen(pchOriginal); intMascara = 1; intContador = 0; intIndice = 2; strcpy(pchTransformado,"00"); intDesplaza = 7; while(intContador < intTamano) { chrCaracter = ((*(pchOriginal + intContador + 1) & intMascara) << intDesplaza) + (*(pchOriginal + intContador) >> (7 - intDesplaza)); pchTransformado[intIndice] = pchTablaHex[(chrCaracter & 0xF0) >> 4]; intIndice++; pchTransformado[intIndice] = pchTablaHex[chrCaracter & 0x0F]; intIndice++; intContador++; intMascara <<= 1; intMascara++ ; intDesplaza--; if(intDesplaza == -1) { intMascara = 1; intDesplaza = 7; intIndice -= 2; } } pchTransformado[intIndice] = ''; chrCaracter=(char)intTamano; pchTransformado[0] = pchTablaHex[(chrCaracter & 0xF0) >> 4]; pchTransformado[1] = pchTablaHex[chrCaracter & 0x0F]; return pchTransformado; } /* Transforma un texto PDU (pchOriginal) en texto normal (pchTransformado) devolviendo pchTransformado*/ char *decodificaMensaje(char *pchOriginal, char *pchTransformado) { char pchLetras[5]; unsigned char chrCaracter; int intTamano; int intContador; int intArrastre; int intDesplaza; int intIndice; int intMascara; intMascara = 128; intIndice = intContador = intArrastre = intDesplaza = 0; strcpy(pchLetras, "0x"); strncat(pchLetras, pchOriginal + intIndice, 2); sscanf(pchLetras, "%x", &intTamano); intIndice += 2; while(intContador < intTamano) { strcpy(pchLetras, "0x"); strncat(pchLetras, pchOriginal + intIndice, 2); sscanf(pchLetras, "%x", &chrCaracter); pchTransformado[intContador] = ((chrCaracter & ~intMascara) << intDesplaza) + intArrastre; intArrastre=(chrCaracter & intMascara) >> (7 - intDesplaza); intIndice += 2; intMascara >>= 1; intMascara += 128; intDesplaza++; if(intMascara == 255) { intContador++; pchTransformado[intContador] = chrCaracter >> 1; intMascara = 128; intDesplaza = intArrastre = 0; } ++intContador; } pchTransformado[intContador] = ''; return pchTransformado; } |
No se como contactar contigo para que me ayudes con una cosa, mandame un mail a xxxxx y te cuento mi duda, vale? GRACIAS!
Muy buenos tus post sobre las cosillas que haces. Una machine.
Haz probado con AT+CMGF=1. Esto cambia de modo PDU a modo texto.
Pues si, pero en mi movil al menos no me lo permite, puesto que lanza un mensaje de ERROR. Es por ello que como el formato PDU es un estandar para todos los móviles lo use en el código.
actualmente me encuentro probando con un celular sony ericcson t226.
yo le mando los comandos at del hiper terminal y no me contesta nada. puede ser que lo tenga que mandar en pdu? como lo hago?
mi mail es ignacio.gming@gmail.com
saludos ignacio
buenas tardes, estoy intentando capturar un sms de un movil motorola desde una aplicación en C# y convertirlo a texto pero no s ehacerlo, pueden ayudarme?
gracias un saludo, Ramiro
mi mail es capueroorelha@gmail.com
Perdona Pinda, no había leido tu mensaje. ¿Es posible que no hayas abierto el puerto serie correctamente?. En mi caso (y en muchos) debes abrirlo a 19200 8N1.
Ramiro, ¿podrías ser más específico?, ¿Que es lo que no llegas a hacer?
ola a todos tengo un problema al comunicarme con un sonyericsson t230 consigo comunicarme mediante hyperterminal pero el movil entra en un bucle intentando chequear algo que desconozco y no para quieto para poder asi introducir los comandos at.
sabe alguien algo al respecto?
HOLA
yo lo e estado intentando con un panasonic vs3 y no me acepta los comandos para mandar sms
de hecho nisiquiera me reconoce algunos de los comandos que listas
tienes alguna idea de por que razon sea
mi correo es ciberbuster59@yahoo.com.mx
Muy buenas, necesito hacer un programa en gcc para el envio de sms a traves de un movil conectado a un servidor.Alguien podria enviarme scripts o ayuda a mi dire?? malavida22@hotmail.com
Muchisimas gracias de antemano.
Puedes descargarte las sms server tools las cuales incluyen el código fuente para linux/unix.
Muchas gracias por tu ayuda,pero la verdad es k no esty muy fino en linux.
Me podrias facilitar alguna direccion donde descargarlo??
Me seria de muchisima ayuda.Gracias
http://smstools.meinemullemaus.de/
Muchisimas gracias pero yo lo k kiero es poder programar el puerto serie y luegio configurarlo para que envie un sms desde un movi conectado a este.
Gracias.
Hola, estoy intentando enviar un sms a un puerto diferente del que esta por defecto en el telefono receptor, la idea es levantar una aplicacion midlet (j2me) y no encuentro la forma de hacerlo con los comandos at, Les agradeceria muchisimo su ayuda
Este es mi mail ajuarez@wondersoft.com.ar
Sos un groso, muy bueno esto. Pero mira yo tengo un problemita, yo quiero con comandos AT enviar un sms a un midlet que escucha en un puerto, como especifico el puerto con los comandos AT o como puedo solucionar esto? hace dias que estoy y no me doy cuenta…
El midlet esta dormido y se despierta con en mensaje,esta metido en la push registry.
mi mail: ema_kuroas@hotmail.com
mi nombre: Emmanuel Kurpas
Hola a todos, me gustaría saber si con estas herramientas puedo recibir sms mediante un módem gsm para depués cargar los datos recibidos en un archivo .csv o interpetarlos y publicarlos en una web, no tengo mucha idea de esto, alguien me puede decir qué es lo que necesitaría?
Mi email es rafa5ma@hotmail.com por si alguien puede mandarme algo q me sirva.
Saludos y gracias.
JAJAJ SOS UN CAPO MAN BIE SUERTE
Solo queria avisar que mi nuevo mail es alejandradaquino@yahoo.com.ar para que si tienen alguna info me manden! gracias
hola, tengo problemas con la comunicacion entre el celular y la pc, ya intene hacerlo con un sonyericcion t610 y t226 y no logro enviar nada al teerminal virtual, porfavor si me pudieran ayudar
Lionel.
Dos cosas: ¿Usas un cable compatiblñe con esos modelos? ¿A que velocidad serie te conectas?
Interesantísimo tu artículo. Yo estoy intentando crear un sistema web que permita, al suceder un evento, que despache un sms de texto al usuario. Por eso me interesó tu post. ¿Me puedes aclarar un par de preguntas por favor?
1.- Si la energía la metes directo a los pines de la batería ¿para que los 2 condesadores?. ¿Hay riesgo de pasar corriente al servidor?, ¿no puedo simplemente conectar los cables de adaptador de corriente directamente a los pines?
2.- Si es necesario hacer el circuito, ¿que características debe tener?. No soy entendido en electricidad.
3.- Naturalmente esta es una solución de prueba, pero luego de ello deseo programar el cron para que efectúe el despacho de SMS a varios usuarios. En ese caso ¿cuál es según tu la solución de hardware?
4.- Finalmente, ¿es posible enviar una imagen?
Muchas gracias por tu ayuda
Hola, tengo una aplicacion en visualbasic 6 para enviar y recibir sms pormedio de un movil siemens c61, pero este modelo de movil solo admite formato PDU, y no se manejar este formato. Me encontre con tu web donde tienes en C, un codigo para hacer la convercion pdu a texto y viceversa. Mi solicitud de ayuda va en que si puedas tener un codigo en visual basic 6 para convertir texto a PDU y viceversa. Espero me puedas ayudar, Gracias de antemano
Creo que esto te vendrá como anillo al dedo.
http://stalinpedro.spaces.live.com/blog/cns!BFE9DDDE49766229!218.entry
Hola, sistemasorp me podria ayudar con un problema automatizacion de un proceso manual, este es el proceso: verificacion de saldo, en una base celular avio se marca *105# send, se espera y carga un menu donde hay que ingresar el numero de usuario se preciona send, carga menu denuevo pidiendo la clave y le da el saldo.
como puedo hacer para controlar este proceso de executar esta peticion y como recibir la peticion del menu en el programa… si se pudiera comunicarse al correo cell_will@hotmail.com
Hola que tal, como esta.
Yo soy aficionado a la programacion de microcontrolador arduino, relativamente nuevo en esto. y por eso pido tu ayuda o colaboracion.
tengo un arduino y un mobil siemens C66, y lo que quiero hacer es, prender un led y apagarlo cuando reciba un SMS (ON, OFF).
yo le envio al mobil un SMS con la palaba : hola
despues me voy al hiperterminal y ejecuto el comado AT+CMGL=1
y me responde :
0791751330510003040A81137024043100009011620161320A04E8373B0C
La verdad soy neofito, tu disculpa.
Lo que quiero hacer es que desde el Arduino yo armar un texto y mandarlo en formato PDU a un mobil, y poder leer desde arduino un mensaje SMS y poderlo interpretar que es lo que me dicen.
El siemens C66 solo maneja PDU.
agradeciendote tu colaboracion
atte jorge castellar
Por favor ¿puedes borrar el priumer comentario mio? ya no me interesa que siga para evitar que los bots indexen mi correo. Gracias
Hola Hugone
Te he quitado el correo del comentario para que te pase más.