Skip to main content.

Archive for the ‘Howto’ Category

Provisionamiento Linksys SPA9XX

Miércoles, Enero 16th, 2008

Hace poco he necesitado hacer un poco de mass-deployment de teléfonos Linksys SPA922. La verdad es que son terminales que me gustan mucho. He probado los Thompson,los Grandstream y Snom de gama baja/media y la verdad es que para terminales comunes, no de operadora, me quedo con los Linksys: son bonitos y fiables.

El problema me llega cuando busco en Google ficheros de ejemplo sobre el provisionamiento de Linksys. No encuentro ningún ejemplo y tampoco explicaciones claras sobre cómo hacerlo. Bien, esto me pasa por no leerme completito el manual de administrador de los terminales donde en un párrafo se explica bien claro. El motivo de este post es que otro no pierda el tiempo que he perdido yo buscando en google algo tan sencillo.

Un fichero de provisionamiento de Linksys SPA9XX no es más que un fichero XML y es bastante sencillo de hacer. Voy a poner el ejemplo de un SPA922 pero es bastante generalizable a toda la gama.

Lo primero es saber que toda la configuración va en un fichero al que llamaremos spa922.cfg. El fichero admite todas las opciones que vemos normalmente en el interfaz web del terminal sin más que respetar algunas convenciones:

  • Los espacios en las opciones se sustituyen por guiones bajos
  • Las opciones asociadas a una línea han de llevar _X_ al final del nombre de la opción. X hace referncia al número de línea.
  • El fichero empieza y termina con las etiquetas <flat-profile></flat-profile>.

Pongo aquí un ejemplo de fichero. En realidad de dos porque las opciones comunes a todos los teléfonos se ponen en un único fichero y después las opciones particulares, tales como los datos de acceso, se ponen en ficheros individuales para cada teléfono. El genérico es el antes mencionado “spa922.cfg” y el particular es “spa922-${MAC}.cfg”

  1.  
  2. <flat-profile>
  3.  
  4.   <!– PROVISIONING –>
  5.   <resync_periodic>10</resync_periodic>
  6.   <resync_error_retry_delay>20</resync_error_retry_delay>
  7. <profile_rule>/spa922-MAC/spa922-$MA.cfg</profile_rule>
  8.  
  9.   <!– SYSTEM –>
  10.   <enable_web_server>yes</enable_web_server>
  11.   <enable_web_admin_access>yes</enable_web_admin_access>
  12.   <dhcp>yes</dhcp>
  13. <primary_ntp_server>10.10.10.1</primary_ntp_server>
  14.   <enable_vlan>no</enable_vlan>
  15.   <enable_cdp>no</enable_cdp>
  16.  
  17.   <!– SIP –>
  18.   <max_forward>70</max_forward>
  19.   <max_redirection>5</max_redirection>
  20.   <max_auth>2</max_auth>
  21.   <sip_user_agent_name>$VERSION</sip_user_agent_name>
  22.   <sip_reg_user_agent_name>$VERSION</sip_reg_user_agent_name>
  23. <dtmf_relay_mime_type>application/dtmf-relay</dtmf_relay_mime_type>
  24.   <use_compact_header>no</use_compact_header>
  25.   <rtp_port_min>8000</rtp_port_min>
  26.   <rtp_port_max>11000</rtp_port_max>
  27.   <symmetric_rtp>yes</symmetric_rtp>
  28.   <stun_enable>no</stun_enable>
  29.  
  30.   <!– REGIONAL –>
  31.   <time_zone>GMT+01:00</time_zone>
  32.  
  33.   <!– PHONE –>
  34.   <voice_mail_number>451</voice_mail_number>
  35.   <text_logo>Irontec%0ai::voz</text_logo>
  36.   <extension_1_>1</extension_1_>
  37.   <share_call_appearance_1_>private</share_call_appearance_1_>
  38.  
  39.   <!– EXT 1 –>
  40. <line_enable_1_>yes</line_enable_1_>
  41.   <subscription_expires_1_>3600</subscription_expires_1_>
  42.   <sip_port_1_>5060</sip_port_1_>
  43. <proxy_1_>10.10.10.1</proxy_1_>
  44.   <use_outbound_proxy_1_>no</use_outbound_proxy_1_>
  45.   <register_1_>yes</register_1_>
  46.   <make_call_without_reg_1_>no</make_call_without_reg_1_>
  47.   <register_expires_1_>3600</register_expires_1_>
  48.   <use_dns_srv_1_>no</use_dns_srv_1_>
  49.   <use_auth_id_1_>No</use_auth_id_1_>
  50. <preferred_codec_1_>G711a</preferred_codec_1_>
  51.   <use_pref_codec_only_1_>no</use_pref_codec_only_1_>
  52.   <g729a_enable_1_>yes</g729a_enable_1_>
  53.   <g723_enable_1_>no</g723_enable_1_>
  54.   <g726-16_enable_1_>no</g726-16_enable_1_>
  55.   <g726-24_enable_1_>no</g726-24_enable_1_>
  56.   <g726-32_enable_1_>no</g726-32_enable_1_>
  57.   <g726-40_enable_1_>no</g726-40_enable_1_>
  58. <dtmf_tx_method_1_>auto</dtmf_tx_method_1_>
  59.   <dial_plan_1_ ua="na">(1xxS0|2xxS0|6xxxxxxxxS0|9xxxxxxxxS0|xx.)</dial_plan_1_>
  60.   <enable_ip_dialing_1_ ua="na">No</enable_ip_dialing_1_>
  61.  
  62.   <!– User –>
  63.   <time_format>24hr</time_format>
  64.  
  65. </flat-profile>
  1. <flat-profile>
  2.  
  3.   <display_name_1_>Jon Bonilla</display_name_1_>
  4.   <user_id_1_>205</user_id_1_>
  5. <password_1_>secretillo</password_1_>
  6.  
  7. </flat-profile>

Una vez tenemos los dos ficheros, sólo necesitamos que el terminal sepa dónde encontrarlos. Hay varias maneras de hacerlo; la que he escogido es tener un servidor tftp en mi asterisk que sirva los ficheros al teléfono. Para ellos debemos instalar un servidor tftp. Para ellos como root instalamos atftp:
apt-get install atftpd
Editamos /etc/default/atftpd para decirle dónde estará nuestro directorio de tftp. En mi caso /tftpboot:
USE_INETD=true
OPTIONS="--daemon --port 69 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot"

Creamos el directorio /tftpboot y ponemos ahí el fichero general spa922.cfg. Después creamos el directorio “/tftpboot/spa922-MAC” donde irán los ficheros particulares de cada teléfono. Por ejemplo el “spa922-000e08de2995.cfg”

Ahora ya tenemos todo preparado. Sólo queda hacer saber al terminal dónde ha de buscar el servidor tftp. Para ello, lo que hacemos es pasarle una option desde el servidor dhcp cuando el terminal hace una petición. En el fichero de configuración del servidor dhcp /etc/dhcp3/dhcpd.conf tendríamos algo así:


subnet 10.10.10.0 netmask 255.255.255.0
{
range 10.10.10.100 10.10.10.254;
option domain-name-servers 212.55.8.132;
option routers 10.10.10.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.10.10.255;
option tftp-server-name "10.10.10.1";
}

Después de esto, tenemos que cuando enchufemos a la red el terminal nuevo éste cogerá la dirección de red del servidor, comprobará que hay un servidor tftp en el que encontrará sus ficheros de configuración y tendremos el terminal listo para usar sin haber tenido que tocar para nada el terminal o haber accedido a la configuración web. Esto es una gran ventaja en cuanto el número de terminales a implantar es mayor de unos pocos. Además si por alguna razón tenemos un usuario torpe y mete la pata, basta con reinicar el teléfono y éste se volvería a configurar con los valores correctos.

Para más parámetros a configurar en los terminales lo mejor es verlos todos detallados en el manual de linksys.

Google Calendar en Asterisk

Jueves, Agosto 30th, 2007

Hace no mucho comentábamos el uso de un calendario en webdav para que Asterisk comprobara los días festivos al recibir una llamada y supiera si debía permitir la llamada o saltar directamente al buzón de voz.

En esta entrada vamos a hacer algo parecido pero esta vez usando Google Calendar, el cual nos permite acceder a los eventos mediante una URL que apunta a nuestro calendario en formato Icalendar. Haremos que nuestro Asterisk consulte nuestro Google Calendar para tratar las llamadas entrantes y sepa si debe pasar la llamada, desviarla o saltar al buzón de voz del usuario.

Lo primero que haremos será crear una cuenta en google si no tenemos una. Con esta cuenta podemos crear tantos calendarios como queramos. En este caso crearemos un calendario para marcar los festivos de la empresa. Vamos a obviar los pasos a seguir para crear un calendario y supongamos que ya tenemos un calendario creado para tal efecto.

A la izquierda de la panatalla veremos nuestros calendario entre todos los que tenemos asociados a nuestra cuenta y debajo de ellos un enlace administrar calendarios.

Lista de calendarios

Pinchamos en administrar calendario y en la pantalla que nos sale elegimos el calendario que hayamos creado para marcar los festivos. Ahora tenemos una pantalla en la que podemos editar las propiedades del calendario, compartirlo con otros usuarios…etc. En este caso lo que nos interesa es la sección llamada Dirección Privada.

Dirección Privada

Vemos tres iconos XML ICAL HTML que nos dan acceso a nuestro calendario en diferentes formatos. En este caso lo que nos interesa es el formato ICAL. Guardamos la dirección del enlace al que apunta el icono porque es lo que vamos a usar para leer el calendario.

Una vez creado el calendario solo nos queda marcarlo con diferentes festivos. Podemos simplemente poner Festivo o podemos discriminar más y diferenciar todo lo que queramos. En este howto vamos a diferenciar festivos locales, festivos nacionales y festivos de empresa. Lo que vamos a hacer es crear un evento el día en cuestión, a cualquier hora y de cualquier duración, en el que pongamos estas etiquetas:

festivos

Una vez tenemos el calendario llega el momento de usarlo. Vamos a crear un AGI en ruby que consulte nuestro calendario y devuelva a asterisk una variable SALTO que usaremos en el dialplan.

calendario.rb

  1. #!/usr/bin/ruby
  2. require ‘rubygems’
  3. require ‘icalendar’
  4. require ‘open-uri’
  5. include Icalendar
  6. URL="http://www.google.com/calendar/ical/xxxxxx%40irontec.com/private-XXXXXXXXXXXXXXXXXX/basic.ics"
  7. calendarios = Icalendar.parse(open(URL))
  8. calendario = calendarios[0]
  9. festivo=nil
  10. calendario.events.each do |evento|
  11. if evento.dtstart.yday == Date.today.yday
  12. festivo=evento.summary
  13. break
  14. end
  15. end
  16. #Festivos
  17. if festivo == nil
  18. salto = "laboral"
  19. elsif festivo == "Festivo Irontec"
  20. salto = "festivo-irontec"
  21. elsif festivo == "Festivo Nacional"
  22. salto = "festivo-nacional"
  23. elsif festivo == "Festivo Local"
  24. salto = "festivo-local"
  25. else
  26. salto = "laboral"
  27. end
  28. print("SET VARIABLE SALTO #{salto}")
  29. exit

Una vez hecho esto ya solo tenemos que hacer el tratamiento en el dialplan. Doy por supuesto que ya sabemos hacer esto así que voy a poner una líneas meramente descriptivas:

  1. [entrantes]
  2. exten => 944048182,1,AGI(calendario.rb)
  3. exten =>944048182,n,Goto(${SALTO},s,1)
  4. [laboral]
  5. exten =>  s,1,NoOp(Aqui tratamiento de día laboral)
  6. [festivo-nacional]
  7. exten => s,1,NoOp(Festivo nacional)

Una vez hecho esto ya solo nos queda probarlo para ver que todo esta correcto. Ya tenemos una centralita aún más inteligente que demuestra una vez más que Asterisk está a años luz de las centralitas tradicionales. ¡Bienvenidos a la telefonía del siglo XXI!

Nota -> Siento lo de la indentación y coloreado del código pero wordpress es un mal bicho. Voy a ver si le hago la pelota a uno de mis compañeros del departamento web para que me hackeen un poco el CSS :)

Parche para APP_Rxfax : Consultar estado

Miércoles, Marzo 7th, 2007

SpanDSP es una librería para el Procesamiento Digital de Señales (DSP) que necesitaremos para poder transmitir/recibir Fax a través de asterisk. Junto con SpanDSP los autores facilitan dos aplicaciones para enviar fax y recibir fax en asterisk (rx_fax y tx_fax). A pesar de que puedes encontrar buenos manuales para hacerlas funcionar no siempre consigues los resultados esperados.

Y es que si consultamos la ayuda de txFax:

----------------------------------------
TxFAX(filename[|caller][|debug]): Send a given TIFF file to the channel as a FAX.
The “caller” option makes the application behave as a calling machine,
rather than the answering machine. The default behaviour is to behave as
an answering machine.
Uses LOCALSTATIONID to identify itself to the remote end.
LOCALHEADERINFO to generate a header line on each page.
Sets REMOTESTATIONID to the receiver CSID.
Returns -1 when the user hangs up, or if the file does not exist.
Returns 0 otherwise.
—————————————-
El retorno (0 y -1) es una practica común en el desarrollo de aplicaciones para c, pero no así en asterisk, donde es mas común devolver algún valor en una variable o saltar a una prioridad +101.

Por lo que se hace muy difícil consultar el estado del envío, si se ha enviado con éxito o no, ya que la manera de actuar de esta aplicación es la siguiente:

  • Si el fax llega bien entonces se continúa con el dialplan, pero no hay NINGUNA variable para advertir ese resultado.
  • Si el fax llega mal entonces se pasa directamente a la extensión Hangup del contexto, igualmente sin dejar un resultado en una variable.

Aplicando la siguiente linea a la aplicación se consigue modificar el comportamiento de esta:


static void phase_e_handler(t30_state_t *s, void *user_data, int result)
{
struct ast_channel *chan;
char far_ident[21]; chan = (struct ast_channel *) user_data;
if (result == T30_ERR_OK)
{
t30_get_far_ident(s, far_ident);
pbx_builtin_setvar_helper(chan, “REMOTESTATIONID”, far_ident); /******************* LINEA PARA MODIFICAR ******************************/
pbx_builtin_setvar_helper(chan, “RESULTADO”, “ENVIADO”); }
else
{
ast_log(LOG_DEBUG, “==============================================================================n”);
ast_log(LOG_DEBUG, “Fax send not successful - result (%d) %s.n”,result,t30_completion_code_to_str(result));
ast_log(LOG_DEBUG, “==============================================================================n”); /******************* LINEA PARA MODIFICAR ******************************/
pbx_builtin_setvar_helper(chan, “RESULTADO”, “ERROR”);
}
}
/*- End of function ——————————————————–*/

Gracias a esa función se puede dar un valor a una variable de canal, y como ocurre cuando el resultado es correcto se continúa con el dialplan.

Aqui dejamos el parche para que app_txfax devuelva una variable de estado. Su uso es muy facil:

# cd /usr/src/asterisk/apps

# patch app_txfax.c < app_txfax.patch

Dialplan para grabación de voces vía llamada telefónica

Lunes, Enero 15th, 2007

Introducción

En ocasiones puede ser suficiente el grabar las voces del menú menú IVR de nuestro Asterisk a través de una llamada telefónica. Esta opción se hace aún más interesante cuando el locutor no está con nosotros o cuando sencillamente no desponemos de equipamiento más profesional para grabación de voces.

A continuación se muestra un dialplan para Asterisk que constituye un cómodo y sencillo menú de grabación de voces.

Funcionamiento

La mecánica del dialplan es sencilla, todo se puede realizar con una única llamada. Tras la grabación de cada voz podremos escucharla y regrabarla, o bien elegir otra voz:

Esquema:

  • El usuario llama y se le introduce en el contexto grabacion_voces.
  • Se le solicita introduzca una contraseña para autenticarle.
  • Se le pide que marque un número (de n cifras) que se corresponde con una determinada voz a grabar (XX).
  • Se le manda al contexto grabacion_voces_opciones donde primeramente escucha la grabación actual del sonido.
  • Se le presenta un menú con las opciones:
    • 0 -> Grabar su voz para este sonido.
    • 1 -> Escuchar su grabación.
    • 2 -> Ir a otros sonidos.

De esta forma, mediante una única llamada podemos gestionar todas las voces, o las que nos interesen en cada ocasion.

(more…)

Integración de softphone y agenda de contactos

Viernes, Diciembre 1st, 2006

integration.jpg

En ocasiones puede ser interesante el uso de softphones en lugar de teléfonos de sobremesa, por ejemplo cuando se requiere manejar un ordenador mientras mantenemos una conversación telefónica.

Dentro de este escenario, en el que la telefonía radica en un programa de software, sería interesante ganar en agilidad aprovechando la integración de nuestro softphone con nuestra aplicación de agenda de contactos.

Objetivo

Buscar soluciones para realizar llamadas telefónicas desde nuestra agenda de contactos, sin la necesidad de tener que marcar el número de teléfono manualmente en el softphone.

Algunos softphones incluyen una pequeña agenda de contactos, pero sólo tienen validez para el propio softphone. Entendemos en este artículo que el usuario prefiere tener su agenda centralizada en una aplicación independiente y más completa (correo, agenda, notas, tareas, calendario, etc).

Por cuestiones ideológicas haremos hincapié sólo en soluciones de software libre, entendiendo que son además las que mejor permiten ser adaptadas a nuestras necesidades y las que mayor flexibilidad ofrecen.

(more…)

Consulta los festivos de un calendario WebDAV desde Asterisk

Martes, Octubre 10th, 2006

Calendario Festivos

Introducción

Una de las grandes ventajas de las centralitas basadas en Asterisk es su flexibilidad a la hora de realizar implantaciones. Asterisk Gateway Interface (AGI) dota a nuestra centralita de una potencia sin igual para la integración de la misma con diferentes servicios dentro de la empresa, como CRM, ERP o un calendario compartido como es el caso del presente tutorial.

A lo largo de este “howto” aprenderemos a implementar un sistema de consultas de calendario mediante un AGI de Asterisk.

Objetivo

Nuestra empresa quiere que la centralita responda con un mensaje de bienvenida específico los festivos y fines de semana.

La información sobre las fechas en las que la empresa cierra al público estará contenida en un calendario editable desde los clientes PIM.

Resumen

  • Instalaremos un servidor Apache2 + WebDav para compartir un calendario en formato ICalendar, todo ello en el servidor Debian Sarge que alberga nuestra centralita Asterisk.
  • Configuraremos el calendario en nuestro cliente PIM para consultarlo y editarlo.
  • Crearemos un AGI que consulte el día actual en el calendario y responda con un mensaje de aviso en caso de que sea festivo o fin de semana.

(more…)

Provisión TFTP para teléfonos Linksys

Jueves, Septiembre 7th, 2006

TFTP en telefoní­a IPEn instalaciones de telefonía IP con un número considerable de teléfonos la posibilidad de autoconfiguración de los mismos se torna como una opción muy a tener en cuenta por las comodidades que brinda. No sólo porque minimiza el tiempo de configuración de todos los terminales, sino porque permite actualizaciones y cambios de parámetros bajo demanda.

Por ejemplo: imaginemos que llevamos a cabo una instalación de Voz-IP con 20 teléfonos y desechamos la idea de la autoconfiguración. No sólo perdemos un tiempo considerable configurando a mano cada terminal, sino que ante la necesidad de cambiar cualquier parámetro de forma global deberemos configurar, de nuevo, terminal a terminal con el coste que lleva implícito.

Detallaré a continuación cómo preparar un servidor Debian Sarge para la autoconfiguración de X teléfonos Linksys SPA901 conectados todos ellos a la misma red.

(more…)

2005 © Irontec S.L. :: Powered by Irontec & Wordpress
[ IRONTEC S.L. - C.I.F. B-95274890 ]
[ Ctra. Basurto-Kastrexana nº70 / Enpresaldea ]
[ 48002 - Bilbao - Bizkaia ]