jueves, septiembre 16, 2010

Franky cambia de telefono

Puede que esta afirmación parezca trivial, pero nada más lejos de la realidad, el cambio de teléfono ha resultado casi una pesadilla.

El teléfono de Franky durante dos años ha sido un viejísimo Nokia 6100. Hacía uso de scripts y del programa gnokii para interrogarlo cada 3 segundos a través de un cable USB-RS232 y así poder comandar el servidor con llamadas perdidas y SMSs. Por desgracia el móvil perdía sincronía alrededor de una vez al mes y esto provocaba la perdida total de control con el móvil, y no había forma de arreglarlo hasta no desconectar físicamente el cable y volverlo a conectar. Algo difícil de hacer cuando uno está de vacaciones a 1.000km de distancia.

Hace un año le pedí a mi hermana su recién jubilado móvil Motorola V3. Pensé que el cambio sería trivial, desconectar uno, cambiar la configuración del programa gnokii y conectar el nuevo. Sin embargo esto no funcionó, había algunas cosas que el programa gnokii no era capaz de manejar en un Motorola, algo que sorpresivamente el programa gammu si conseguía (creo que es un fork del gnokii). El problema con gammu es que tarda unos 20 segundos en interrogar al móvil (gnokii tardaba 1 segundo), eso significa que necesitaría hacer perdidas de al menos 20 segundos a Franky para poder controlarlo. Algo totalmente inviable.


Franky cambia de móvil
El móvil nuevo (en negro) y el móvil recientemente jubilado.

Así que aplacé de forma indeterminada el cambio de móvil hasta hace apenas un mes, el viejo Nokia comenzó a fallar más a menudo hasta el punto de llegar a fallar una vez al día, se apagaba sin previo aviso, ni siquiera se reiniciaba. Comprar un recambio en Internet era la solución fácil y bastante barata (por debajo de los 20€), pero eso no resolvería el comportamiento errático impredecible de una vez al mes, comprar un módem GSM para controlarlos por comandos AT también estaba descartado por su elevado valor.

¿Qué hacer? Pues reconstruir a Franky desde cero.

Franky estaba construido en base a scripts bash, al principio resultó una solución efectiva y rápida de desarrollo, sin embargo a medida que el proyecto iba creciendo los scripts se volvían demasiado complejos y cada cambio era una pesadilla. Gracias a la experiencia que he ido adquiriendo con la programación de la sonda NS1 en C bajo Linux, me he animado a intentar construir a Franky desde cero pero esta vez en lenguaje C.

Las principales problemáticas han sido los procesos multihilo y la comunicación AT con el móvil puesto que es bastante difícil encontrar documentos medianamente decentes acerca de los comandos AT en Motorola.

Después de semana y media de desarrollo, Franky estrena móvil, es capaz de detectar quién le hace una llamada perdida, responder con llamadas perdidas, enviar SMS ante fallos o alarmas, tan solo le falta aprender a leer comandos enviados por SMS, algo que tiene prioridad prácticamente cero, sobretodo ahora que tengo un Android siempre conmigo que me permite conectarme a él con ssh en cualquier momento de emergencia y encima es más barato. De todas formas la simplicidad de un SMS no la gana nadie así que cuando lleguen tiempos más tranquilos probablemente le pegaré un buen repaso.

Para controlar el móvil lo hago por comandos AT que son relativamente estándares, pero como cada cocinero tiene su receta, Motorola no iba a ser menos. Cuando utilizaba el programa gnokii, él mismo se encargaba de las comunicaciones y a mi me daba los resultados. Usando gnokii, cada 3 segundos se producía un intercambio de datos enorme entre Franky y el móvil, ahora sin embargo tras encender el programa y enviar los comandos AT de inicialización, todos descansan y es el móvil el que avisa cuando llega una llamada. El tráfico AT se reduce casi un 100%. Para entender el ejemplo con un símil sencillo, se podría decir que ahora se espera a escuchar la llamada del móvil para mirar quien llama, cuando antes lo que se hacía era mirar la pantalla cada 3 segundos para ver si alguien llamaba.

Eso sí, costo del cambio 0€ y semana y media de trabajo :-D

Y ahora paso la receta que uso para controlar el móvil, tal vez alguno le encuentre alguna utilidad porque a mi me ha costado horrores encontrar esto:

Configuración de la conexión:

  • Puerto: /dev/ttyACM0
  • Baudios: 115200
  • Paridad etc: 8N1

Comandos de inicialización: (todos acaban por el byte \r)

  • AT\r : Para comprobar que el móvil está vivo.
  • AT+CGMI\r : Para recibir quien ha construido el móvil
  • AT+CGMM\r : Para recibir el modelo del móvil
  • AT+MODE=2\r : Para poner al móvil en el modo en el cual podemos controlar sus llamadas y demás.
  • AT+CLIP=1\r : Para activar el reconocimiento de llamada, es decir, en vez de enviar un "RING" el móvil también añadirá el número de quién llama.

Comandos de uso normal: (todos acaban por el byte \r)

  • AT+CBC\r : Para recibir el estado de la batería y porcentaje de carga.
  • ATD+0123456789\r : Para llamar al número +0123456789
  • ATH\r : Para colgar una llamada
  • AT+CPAS\r : Para ver si el que está llamando ha colgado ya o no.

Para enviar un sms: (Cuidado NO todos acaban por el byte \r)

  • AT+CMGF=1\r : Para activar la opción de envío de SMS.
  • AT+CMGS="+0123456789"\r : Para indicar que queremos enviar un mensaje a +0123456789
  • Esto es un mensaje \x1A : El mensaje debe ser acabado con el byte número 0x1A que equivale a Ctrl+D.

Normalmente después del Ctrl+D añado un \r a lo que el móvil me responde con error pero el mensaje se envía correctamente. Además después vuelvo a enviar un 0x1A y un \r, supongo que tengo que afinarlo mejor porque me da errores pero los mensajes se envian sin problemas.

5 comentarios:

dragonfly dijo...

Impresionante! a mi la mayoría de cosas me suenan a chino, pero el sistema de vigilancia que te montaste me encantó y poder manejarlo a través del móvil con sms y perdidas ...

Y gracias a ti descubri los eeepcs y ahora escribo desde un asus de 9"

Saludos

Rever dijo...

Que bueno!!!
Podrias publicar el codigo que escribiste para ver como lo hiciste??

saludos

Julio dijo...

¡Eres un fenómeno! sigo con interés cada avance con Franky.

Bultza dijo...

Dragonfly, espero que el eeepc te haya salido bueno, yo he usado 4 ya y ninguno ha fallado todavía, (1 el mío para viajar, 2 franky, 3 la sonda NS1, 4 drakul del cual no he hablado pero es un franky que vive en la peninsula).

Rever, el código es largo porque hay muuuchas cosas sobretodo que no tienen que ver con el móvil. De todas formas he pasado la receta de comandos AT, con eso y siguiendo algun ejemplo de como usar puertos serie en linux te vale para construir tu programa de forma hipersencilla.

Quiero publicar el código de franky pero tengo que arreglar muchas cosas que de momento son "parches" para acabar el prototipo.

Gracias Julio, por cierto, viste lo que le hice al G1? ;)

Por cierto, tal vez he sido demasiado técnico y muy poco claro desccribiendo el problema de franky, me disculpo sobretodo para familiares y amigos ;)

frames dijo...

Eres un fiera.

Pero eso ya lo sabes. Y te lo he dicho muchas veces.

Un abrazo, amigo!