[LUG.ro] Contestador telefonico
Pablito
lugro@lugro.org.ar
Thu, 03 Jul 2003 14:02:00 -0300
Hola!
Estaba buscando un contestador..lo encontre.. tal vez a alguien le interese.
saludos
>
> Proyecto del contestador telefónico customizado
>
> *Introducción:*
>
> Una alternativa divertida para crear un contestador telefónico
> con voice mail es utilizar un programa creado por Niccolo Rigacci
> llamado voice (
> http://metalab.unc.edu//pub/Linux/apps/serialcomm/modem/
> <http://metalab.unc.edu/pub/Linux/apps/serialcomm/modem/> o
> http://sunsite.unc.edu/).
> A diferencia del mgetty y otros tantos programas este tiene la
> ventaja de estar desarrollado casi íntegramente en el lenguaje del
> shell bash. Lo que el autor hizo fue crear un programa en C llamado
> vmcp (Voice Módem Control Program) que se utiliza para comunicarse con
> el módem. Por medio de ese programa uno puede enviar comandos AT y
> esperar resultados del módem. Más importante aun es que ese programa
> se encarga de manejar todo el tema de los famosos códigos de escape
> DLE que utilizan los modems voice.
> Para quienes no sepan en que consisten estos códigos haremos
> una pausa para explicarlos.
> */Códigos de escape DLE:/*
> Cuando uno pone al módem en modo voice y atiende una
> llamada son varias las cosas que se pueden recibir del módem:
> - los tonos DTMF de números discados en el otro lado
> del teléfono,
> - la agradable voz de alguna persona,
> - tono de fax o
> - un silencio indicativo de que podrían estar llamando
> con una computadora y esperan recibir tono de módem.
>
> En la tabla de caracteres ASCII el código 10 hexa corresponde a
> un carácter de control llamado */DLE./* Los modems de voice mail
> acostumbran enviar este código para informar de estos distintos
> eventos. (también depende mucho de la configuración del módem en ese
> momento). Cuando reciben códigos */DTMF /*envían un carácter */DLE/* y
> luego el código */DTMF/* recibido. Cuando están programados para
> grabar sonidos también reciben un código */DLE/* acompañado de todos
> los datos del sampleado asegurándose de que el código 10 hexa
> (*/DLE/*) sea "escapado" del sample para no provocar problemas. De
> similar manera uno puede enviar al módem datos para que reproduzca un
> mensaje y debe asegurarse de controlar correctamente los DLE.
> Muchos de estos eventos pueden suceder en modo simultaneo, es
> decir que uno podría estar reproduciendo un mensaje mientras graba
> otro y a la vez analiza posibles tonos */DTMF/* de la persona que esta
> hablando en el otro lado. Bien, para manejar un módem voice hay que
> conocer unos cuantos comandos AT dado que hay que setear varias cosas.
> Antes de grabar un mensaje uno debe configurar la fuente de
> grabación (línea telefónica, teléfono conectado al módem o entrada de
> line-in del módem por ejemplos). También algunos modems disponen de
> varias configuraciones para compresión de datos o velocidades de
> sampleo, también se configura el volumen de grabación para detectar
> silencios. En caso de líneas un poco ruidosas esto ultimo podría ser
> importante para que la maquina no confunda un ruido de la línea y lo
> grabe cuando la persona en realidad no quiso dejar mensaje. Lo bueno
> del sistema de Niccolo es que sus programas están muy comentarizados y
> el código es muy fácil de entender lo cual nos permite hacerle
> numerosas adaptaciones......
>
> Adaptación 1:
>
> Soporte de CALLER-ID :
> Hacer tal cosa es bástente fácil. Para ello les diré que el
> comando a enviar para habilitar la recepción del caller-id por
> parte del módem es: */AT#CID=1/*
> Habiendo habilitado esto en el módem luego de recibir el primer
> ring se reportaran varios renglones de información que suenan
> mas o menos así: */DATE=la fecha TIME=la hora NMBR=el número
> telefónico./*
> El programa de shell que hay que modificar se llama */ans/* y el
> código que le agregue es el que sigue a continuación (antes les
> diré que yo no soy tan prolijo como Niccolo y mi código es
> bastante mejorable)
>
> # Aca sistema de obtencion de datos de lo del CALLER-ID
> $VMCP -c"AT#CID=1" -wOK $VMCP -l$LOCK -wRING -t0 > /tmp/caller-id.txt
> $VMCP -o /tmp/caller-id.txt -wRING -t10
> cat /tmp/caller-id.txt >> /usr/adm/caller-id.log
> CALLERID=`grep -e NMBR < /tmp/caller-id.txt | (read a a b ; echo $b)`
> rm /tmp/caller-id.txt
> echo '**************** Caller ID : $CALLERID'
> /usr/local/bin/reportar.sh $CALLERID &
> #-----------------------------------
>
>
> Todo este código lo puse en reemplazo de la línea que decía:
> */$VMCP -l$LOCK -wRING -t0 /*y que estaba en la rutina
> */wait_rings()/*casi al principio luego de donde dice reset_modem.
> Como podrán observar uso el programa */vmcp/* para capturar los
> datos del caller-id a un archivo temporal y luego extraigo el
> número telefónico para ejecutar un programa mío llamado
> reportar.sh.
> Les diré que mi programa reportar.sh lo que hace es comparar el
> número telefónico con algunos que tengo almacenados y luego por
> una voz sintetizada reproduce algún mensaje especial o
> sencillamente dicta el número en la placa de sonido.
> En cualquier momento mejoro el sistema incorporando la guía
> telefónica completa en mi servidor SQL o algo por el estilo. Se
> imaginaran que el tema da para mas así que quedara para otro
> momento. Bueno el número telefónico lo dejo en la variable
> CALLERID porque nos será útil en otras posibles adaptaciones del
> programa...
>
> Adaptación 2.
>
> Convertir los mensajes grabados en mails. Dado que mi esposa
> contesta la mensajería de un sitio que mantenemos en Internet
> (http://www.manes.com.ar/) ella chequea el mail todos los días y
> el ideal para nuestro caso seria que los mensajes del
> contestador telefónico estuvieran allí también como mails. Para
> eso se necesitan algunos programas mas y pueden ser necesarias
> adaptaciones de acuerdo al módem que uno tenga. Cuando uno usa
> el programa de Niccolo no es demasiado importante el formato que
> utilice el módem para samplear las grabaciones dado que los
> mensajes se graban y reproducen con el mismo módem. En mi caso
> tenia a mi disposición un módem de UsRobotics y me las tuve que
> ingeniar un poco. Encontré que en los fuentes del mgetty
> (disponible en Sunsite y en varios CDs de Linux) en el
> subdirectorio pvftools del subdirectorio voice hay un programa
> que transforma los samples de modems */Voice UsRobotics/* en un
> formato de sonido compactado llamado */gsm/*. Observando los
> fuentes vi que el formato de UsRobotics debería tener una
> cabecera de varios bytes que el programa por suerte no emplea.
> Como el programa */vmcp/* no genera esa cabecera dado que toma
> los datos como vienen del módem hay que inventarla o tocar los
> fuentes del programa conversor (*/usrgsm.c/*).
> Aun debemos convertir de ese formato a algo mas conocido y
> para eso hay que utilizar un utilitario llamado */tcat/* que
> vienen en un paquete llamado gsm (también se consigue en Sunsite
> o en los CD en un subdirectorio utils/compress ).
> Como este ultimo programa solo lo descomprime falta darle el
> toque final para que quede en algún formato conocido y esto
> ultimo lo hago con el */sox /*( Sunsite o los CDs). Para generar
> el mail atachandole el archivo de sonido utilizo un programa
> llamado */mpack/* que hace lo propio y se consigue en Sunsite o
> los CDs.
> Como ya he terminado les mando el código que agregue:
>
> if [ -e $FNAME ]
> then
> DAT=$($DATE +'mensaje del %d/%m/%y a las %H:%M:%S TEL '+$CALLERID)
> WAV=/tmp/jnewmsg$$.au
> (echo 1234567890123456789012345678903 ; cat $FNAME) | usrgsm |
> tcat | sox -t ul -r 8000 - -t au - > $WAV
> mpack -s "$DAT" $WAV $MAILTO
> rm $WAV
> fi
>
>
> Esto lo puse en la rutina voice_call luego del CASE que
> discrimina llamadas Voice, fax y data. No se dejen engañar
> porque a una de mis variables la llame WAV pues el formato del
> archivo que genero es .au que a mí me gusta mas. Prestar
> atención a que los programas estén en el path. Si se deciden a
> poner el programa 'ans' en el archivo /etc/inittab con una línea
> como:
> */a1:1235:respawn:/usr/local/bin/ans >/dev/null 2>/dev/null/*
> puede suceder que algún programa que resida en /usr/local/bin no
> se encuentre en el path de ese proceso . Por esa razón yo
> agregue la línea: */PATH=$PATH:/usr/local/bin /*en el programa
> */ans/* al comienzo . En un primer momento había intentado poner
> los paths completos cuando referenció a los ejecutables pero eso
> no funciono por la siguiente razón:
> Algunos programas tienen la costumbre de realizar varias
> funciones de acuerdo a cual sea el nombre de su propio
> ejecutable. En los unixes con el comando link uno puede
> fácilmente darle varios nombres al mismo archivo y en algunas
> ocasiones los programas testean su propio nombre para saber que
> es lo que deben hacer. Si el testeo no esta muy bien hecho al
> dar el path completo del ejecutable el programa ya no quiere
> andar.
>
> Otras adaptaciones:
> Ya pueden imaginarse que con el soporte de caller-id y
> al tener el número de origen almacenado en una variable surgen
> numerosas posibilidades...
>
> Sin necesidad de armar un programa reportar.sh como el mío con
> síntesis de voz no es mala idea grabar algunos mensajes customizados
> para distintos posibles llamadores y mandarlos a reproducir con un
> case que testee esos números telefónicos. También se puede programar
> que si la llamada proviene de ciertos números telefónicos la maquina
> de directamente tono de datos o de fax o ejecute programas especiales.
> Yo a veces me siento tentado a desconectar la campanilla del teléfono
> y dejar que la computadora me avise y me filtre los llamados.
>
>
> Autor: Jorge Luis Chamorro
> Fecha: Diciembre de 1998
>
>