Cisco CP-7941G/CP-7941G-GE con Asterisk

Ya hace varios meses de mi primera entrada introductoria, y por fin he tenido algo de tiempo y ganas para escribir un artículo de verdad, y espero que alguno más venga pronto 🙂

Empezaré diciendo que no soy un experto en Asterisk, si no más bien un amateur entusiasta que ha estado jugando en sus ratos libres con esta fantástica tecnología…

Hace unos meses empecé una nueva y fascinante etapa de mi vida, en un nuevo trabajo, y allí me encontré que utilizaban unos teléfonos IP de Cisco que la verdad me gustaron mucho, así que estuve investigando, y descubrí que, aunque de fábrica vienen configurados para utilizar la tecnología propietaria de Cisco (SCCP – Skinny Client Control Protocol), son perfectamente capaces de utilizar el protocolo SIP (Session Initiation Protocol) y conectar con Asterisk. Pero no es una tarea fácil, sino que me costó varias tardes de lectura y búsqueda en Internet para conseguirlo. Decir también que, aunque está funcionando perfectamente, apenas he arañado un poco la superficie de todo lo que Asterisk y este teléfono son capaces de ofrecer.

Primero de todo, explicaré un poco la pequeña infraestructura que he montado en mi casa (sí! una centralita y un teléfono VoIP profesional en un entorno doméstico… ¿por qué no? :P).

Infraestructura

Los elementos que componen la infraestructura son los siguientes:

  • Cisco SPA-3102 SIP Gateway – Gateway de voz para convertir la línea de teléfono (PSTN) en digital
  • Switch Gigalan en el centro de comunicaciones de la casa
  • NAS Synology DS411J + Paquete Asterisk 1.8.13.1 instalado
  • Switch POE D-Link DGS-1008P
  • Softphone en mi PC, con auriculares USB
  • Cisco CP-7941G, comprado en Ebay de segunda mano

El Gateway SPA-3102 está conectado a la PSTN (Red telefónica convencional) para posibilitar su uso desde Asterisk.
El NAS está conectado a mi red, y además de hacer de disco duro de red, para Backups y almacenamiento multimedia, dispone de Asterisk instalado y actúa de centralita digital de la casa, entre otras cosas 😀
El Switch D-Link con POE se encarga de proporcionar la energía que el Cisco CP-7941G necesita, además de conectividad a la red de mi PC.

La configuración del Asterisk, con las debidas extensiones para el soft phone y el teléfono VoIP, así como del SPA-3102 quedan fuera del ámbito de este artículo, pues darían para muchos otros. Del propio Asterisk es muy fácil encontrar muchos manuales por Internet, del SPA no es tan fácil, e intentaré hacer un artículo propio para la configuración del mismo.

Una vez que tenemos todos los elementos necesarios, así como el Asterisk conectado con el gateway y el softphone y capaz de hacer llamadas, el primer paso para tener el teléfono Cisco conectado al Asterisk es cambiarle el Firmware del SCCP con el que seguro viene, a un Firmware SIP, y ya que estamos instalaremos el más reciente. Para ello iremos a la página de Cisco, en la que gratuitamente nos deberemos registrar. Una vez registrados y habiendo accedido con nuestras credenciales, procederemos a hacer click en la pestaña de «Support», y a introducir el nombre del producto en la casilla correspondiente (CP-7941G), buscamos la zona de Download Software dentro de «Cisco Unified IP Phone 7900 Series», seleccionamos el modelo en cuestión y cuando nos pregunte el «Software Type», elegimos «SIP Software».

Dependiendo de la versión con la que nuestro teléfono venga, es posible que tengamos que empezar por actualizar a una versión mas antigua del software, que sea compatible con la que tenemos, y de ahí actualizar a la mas moderna. En mi caso tuve que actualizar primero a la 8.5 y posteriormente ya pude actualizar a la 9.3, que es la última en el momento de escribir este artículo.

Para actualizar el teléfono, necesitaremos de un servidor TFTP, en mi caso utilicé el NAS Synology, que dispone de ese servicio instalado, pero es posible instalarlo en Windows o Linux sin demasiado problema. Así mismo, también necesitaremos un servidor DHCP, como el que cualquier router doméstico proporciona, y a ser posible, le asignaremos una IP estática al teléfono a través de la tabla de asignaciones del servidor DHCP.

Una vez encendido y conectado el teléfono a la red, observaremos que, obviamente, no conectará con ningún servidor, y se quedará perpetuamente intentando establecer conexión, pero ya nos permitirá acceder a los menús.
Pulsaremos el botón de Settings, y posteriormente en Network Configuration. En esta sección tomaremos nota de la dirección MAC, que necesitaremos para configurar el teléfono mas adelante.
Una vez tengamos la dirección MAC, entraremos en «IPv4 Configuration», donde nos indicará la dirección IP, IP del router y demás datos que el servidor DHCP le habrá proporcionado, y bajaremos hasta la opción «TFTP SERVER 1», que si estamos utilizando nuestro router doméstico, no estará asignada (al contrario que si utilizamos un servidor DHCP en Linux, por ejemplo, que nos permitiría asignar ese y otros valores a voluntad), y observaremos que no podremos modificar el valor de ese ni de ninguna otra opción. Para ello pulsaremos las teclas ‘**#‘ en rápida sucesión, y observaremos arriba a la derecha que el candado aparece abierto y que ahora podemos pulsar en EDIT, e introducir la dirección IP donde el servicio TFTP está funcionando.
En la carpeta que hemos configurado en el servidor TFTP como principal habremos depositado los ficheros que hemos obtenido tras descomprimir el firmware. Una vez hecho esto, pulsaremos las teclas ‘1,2,3,4,5,6,7,8,9,*,0,#‘ en rápida sucesión nuevamente para reiniciar el teléfono en modo carga de Firmware. Si todo ha ido bien observaremos cómo el teléfono entra en modo de carga, descarga todos los ficheros y se actualiza, reiniciándose a continuación.

Una vez tenemos el teléfono con un firmware que admita SIP, es hora de configurarlo. Para ello deberemos depositar en la carpeta de TFTP los ficheros SEP_MACADDRESS_.cnf.xml y dialplan.xml, y sustituir _MACADDRESS_ por la MAC que apuntamos anteriormente, de forma que el teléfono lo reconozca como su fichero de configuración.

Tras copiarlos a la carpeta, los editaremos, empezaremos primero por el dialplan.xml, por ser el mas sencillo:

En mi caso solo tengo 2 Templates, que le indican al teléfono qué debe hacer en caso de que se le introduzcan los patrones dados, y para mi centralita son:

  • 6… – Un 6 seguido de 3 números, que indica es una extensión interna (del 6000 al 6999), y con un timeout de 3 segundos antes de marcar, para que de tiempo a pulsar los números.
  • 0,……… – Un 0, seguido de una pausa y 9 números (el caso típico de los números en España), también configuraremos un timeout de 2 segundos, y un cambio de tono.

Adapta los Templates al caso concreto y configura el timeout y el tono a voluntad.

El segundo fichero es mucho más extenso y más complejo, y apenas he configurado las opciones mínimas para que funcione, por lo que si estás interesado en adaptar tu teléfono mas, deberás indagar por Internet para ver que has de cambiar en este fichero. Lo básico que hay que cambiar está en mayúsculas y es lo siguiente:

  • IP_SERVIDOR_NTP – En caso que desees que el teléfono obtenga de Internet la hora desde un servidor NTP, configúralo aquí. Recuerda configurar tu TimeZone y el estilo de hora y fecha que desees en la zona de dateTimeSetting
  • IP_SERVIDOR_ASTERISK – Este parámetro aparece varias veces en el fichero, deberás sustituirlo por la IP de tu servidor Asterisk
  • NUMERO_TELEFONO –  Sustituye este valor por el número de teléfono PSTN exterior o la extensión de tu teléfono. Aparecerá en pantalla arriba a la derecha.
  • NOMBRE_EXTENSION – Sustituye este valor por el nombre que quieras que aparezca en pantalla
  • USUARIO_SIP – Usuario SIP configurado en Asterisk
  • PASSWORD_SIP – Password para el usuario SIP configurado en Asterisk
  • NUMERO_EXTENSION – Número de la extensión asignada en Asterisk
  • VERSION_FIRMWARE – Versión del Firmware que has instalado, lo obtendrás del fichero SIP*.loads, en mi caso, es  SIP41.9-3-1SR2-1S
  • NUMERO_BUZON_VOZ – Extensión de Asterisk en la que está el buzón de voz

Una vez configurados todos los parámetros, simplemente vuelve a reiniciar el teléfono con la misma combinación anterior (1,2,3,4,5,6,7,8,9,*,0,#) para que recargue la configuración desde el fichero cnf, y si todo ha ido bien, verás cuando termine de cargar que está registrándose con el servidor Asterisk y ya podrás utilizarlo!. Cada vez que hagas un cambio, deberás reiniciar el teléfono con la misma combinación y esperar a que lo cargue. Una vez que ya tengas todo a tu gusto, podrás apagar el teléfono o reiniciarlo (con la combinación **#**, que no le hará pasar por el modo de carga) y verás que la configuración permanece guardada y el servidor TFTP ya no es necesario.

En el caso que tengas problemas, analiza los logs de Asterisk para ver dónde está fallando, y si no tienes pistas, configura un servidor de Syslog y actívalo en el teléfono para que te informe de qué está haciendo y dónde está fallando.

Buena suerte, espero que te haya parecido interesante y gracias por leer hasta el final el artículo!. Ah! y siéntete libre de dejar comentarios/mejoras/erratas que encuentres 🙂

Málaga, Agosto de 2013

Actualización Diciembre 2013:
Este manual también es válido para la versión Gigabit Ethernet del CP-7941G, y seguramente para otras versiones, pero yo personalmente lo he probado con esas dos :D.

Actualización Agosto 2014:
He observado tras instalar unos cuantos teléfonos más, que en ocasiones el procedimiento para forzar al teléfono a que entre en modo de carga no funciona correctamente. Otra opción para conseguir que entre en modo de carga es desconectar el teléfono y volver a conectarlo mientras se mantiene pulsada la tecla # hasta que la pantalla esté en negro y las luces superiores parpadeen alternativamente en naranja, llegado a este punto basta con pulsar la combinación de teclas 1,2,3,4,5,6,7,8,9,*,0,# para entrar en modo actualización de firmware.
Adicionalmente, si el teléfono en el modo de carga solicita el fichero «term41.default.loads» repetidamente sin cargar el resto del firmware, puede ser que el firmware que estamos intentando instalar en el teléfono tenga un CUCM mas moderno e incompatible con el que el teléfono tiene, por lo que deberemos buscar un firmware en la web de Cisco con un CUCM mas antiguo que el teléfono soporte, y proceder a actualizar a partir de ahí a versiones superiores.

Actualización Agosto 2016:
Llevaba mucho tiempo intentando conectar por SSH al teléfono, sin conseguirlo, siempre me daba un error de cerrando conexión, que yo pensaba era debido a que tenía algo mal configurado:

ssh cisco@IP_TELF
Connection closed by IP_TELF

Y resulta que es un bug en el servidor SSH del teléfono, que impide la conexión:

4775: ERR 16:41:11.118945 INETD: select ready sshSock
4776: ERR 16:41:11.122665 INETD: accepted SSH from IP_PC:61041
4777: INF 16:41:11.319314 dropbear[29]:Child connection from IP_PC:61041
4778: INF 16:41:11.324310 dropbear[29]:LSC absent, trying MIC now

4779: INF 16:41:11.348392 dropbear[29]:sshd command thread starts up,pid:29,tid:39,qname:sshd_message_que29
4780: WRN 16:41:11.349759 dropbear[29]:wait for cmd
4781: INF 16:41:11.928539 dropbear[29]:exit before auth: bad buf_getwriteptr
4782: NOT 16:41:12.739928 SYSMSG: pid 29 (/bin/sshd) Normal Exit, status = 1

Para resolver el problema y poder conectar, basta con forzar la conexión con una mac mas pequeña o un cliente mas viejo de ssh:

ssh cisco@IP_TELF -m hmac-sha1
cisco@TELF_IP's password: 
login: debug
password: 

Con esto, y usando el usuario/password que configuramos en el XML podremos acceder. Una vez dentro podemos logarnos con los usuarios debug/debug o log/log.

Comandos a ejecutar con el usuario debug/debug:
register line 1 1 <- Conectar Linea 1 register line [0|1] [1..6]
register line 0 1 <- Desconectar Linea 1 Primer argumento opción, segundo argumento línea