Introducción.
El Cisco Unified IP Phone 9951 es un teléfono elegante con un display a color, excelente calidad en sus materiales, repleto de opciones y características, pero lograr que funcionara con elastix se estaba volviendo un dolor de cabeza. Al parecer este teléfono forma parte de una solución más completa llamada Cisco Unified Communications Manager ,aunque es posible usarlo con asterisk no esta pensado como para simplificar su uso con él.

Arranque del teléfono
Fueron 2 días de googlear todo tipo de información en páginas y foros hasta que por fin logré que se conectara al conmutador Elastix. Si se llegan a topar un con este teléfono estos son los puntos que deben de cubrir.
Firmware.

Phone Information
Es un punto importante porque el firmware del aparato debe de soportar el estándar de comunicación SIP . En el caso del 9951 tiene instalada la versión 9.x y según los foros que he leído esta versión soporta sin problemas este protocolo de comunicaciones. En otros modelos es probable que sea necesaria una actualización del firmware.
Servidor TFTP.

TFTPd32
Anteriormente había configurado teléfonos Linksys, nada más sencillo que abrir su página web, configurarlos, guardar los cambios y listo.
Las cosas son muy diferentes con el 9951. Para empezar necesita de un servidor TFTP . Al momento de iniciar el teléfono (o reconectarlo a la red) obtiene su dirección IP de un DHCP y luego busca su archivo de configuración XML (que discutiremos más adelante) en el servidor TFTP, este le proporciona el archivo y si todo salio bien veremos un teléfono listo para hacer llamadas.

Phone not registered
Provisionalmente instalé el programa Tftpd32 en una computadora con Windows, mientras investigo como hacerlo en el mismo servidor Elastix.
Su configuración es mínima, en el mismo directorio donde se instalan los archivos del programa se copian los archivos de configuración del teléfono.
Configuración del DNS.
Este punto puede ser un poco complicado. Verán, junto con la información que proporciona el servidor DHCP (como la dirección IP, los DNS y todo eso), también se puede configurar para que proporcione la dirección IP del servidor TFTP de nuestra red. El mismo programa Tftpd32 tiene un servidor DNS que soluciona este punto ya que se apunta a si mismo como el servidor TFTP.
Pero no todos queremos eso, muchos ya tenemos un router o servidor DHCP que hace ese trabajo. Afortunadamente en IPCop solo es necesario agregar la opción tftp-server-name y decirle cual es la dirección IP, solo que tengan cuidado de poner entre comillas la dirección del servidor.

Configuración del DHCP server
Configuración de Elastix.
Lo primero es dar de alta una extensión de pruebas. Esto no tiene mayor complicación y es muy sencillo. Por ejemplo di de alta la extensión 99 con el nombre de Pruebas 9951.
Para que se registre correctamente el teléfono hay que modificar dos archivos en la configuración del servidor Elastix. Ambos archivos están en la carpeta /etc/asterisk/ pero es más sencillo editarlos usando la herramienta Asterisk File Editor que se encuentra en el menú PBX - Tools.
sip_custom.conf
A este archivo le vamos a agregar las siguientes líneas:
udpbindaddr=0.0.0.0
tcpenable=yes
tcpbindaddr=0.0.0.0
callcounter=yes

sip_custom
sip_custom_post.conf
Y a este otro lo siguiente:
[99]+
transport=tcp
Esta configuración es para la extensión 99, si tenemos más tenemos que declarar líneas similares, una por cada extensión. Básicamente le estamos diciendo a elastix que agregue (+) a la extensión 99 lo que se le indica.

sip_custom_post
Configuración del archivo XML.
Este es de los puntos más oscuros. Tomé como base archivo publicado en los foros de elastix
\[2\]pero no funcionó. El articulo de Minden
\[1\]menciona los parámetros básicos para lograr una conexión, pero no tiene un ejemplo para el 9951. Por último el artículo de Voip-info
\[3\]menciona varios parámetros y los explica a detalle.
El archivo XML debe de tener un nombre especial formado con la Mac Address del dispositivo.
Ejemplo: Si la Mac Address del dispositivo es 1234567890AB el nombre del archivo sería,
SEP + Mac Address del dispositivo.cnf.xml
SEP1234567890AB.cnf.xml
Este archivo es el que se debe de copiar al servidor TFTP para que lo proporcione al teléfono durante su arranque.
Con esta información y revisando los logs de elastix hice un archivo de configuración base, espero que les sirva. Deben de sustituir los valores que puse en mayúsculas y entre corchetes por los apropiados para su instalación.
<device>
<deviceProtocol>SIP</deviceProtocol>
<sshUserId>admin</sshUserId>
<sshPassword>cisco</sshPassword>
<featurePolicyFile>DefaultFP.xml</featurePolicyFile>
<devicePool>
<dateTimeSetting>
<dateTemplate>D/M/Ya</dateTemplate>
<timeZone>SA Pacific Standard Time</timeZone>
<ntps>
<ntp>
<name>[DIRECCIÓN IP DEL SERVIDOR DE HORA (NTP)]</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>[DIRECCIÓN IP DEL SERVIDOR ELASTIX]</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
</devicePool>
<commonProfile>
<phonePassword/>
<backgroundImageAccess>true</backgroundImageAccess>
<callLogBlfEnabled>2</callLogBlfEnabled>
</commonProfile>
<loadInformation>sip9951.9-0-0-77</loadInformation>
<vendorConfig>
<disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
<pcPort>0</pcPort>
<settingsAccess>1</settingsAccess>
<garp>0</garp>
<voiceVlanAccess>0</voiceVlanAccess>
<videoCapability>1</videoCapability>
<autoSelectLineEnable>0</autoSelectLineEnable>
<webAccess>0</webAccess>
<spanToPCPort>1</spanToPCPort>
<loggingDisplay>1</loggingDisplay>
<loadServer/>
</vendorConfig>
<networkLocale>Spain</networkLocale>
<networkLocaleInfo>
<name>Spanish_Spain</name>
<uid>64</uid>
<version>1.0.0.0-1</version>
</networkLocaleInfo>
<deviceSecurityMode>1</deviceSecurityMode>
<authenticationURL/>
<directoryURL/>
<idleURL/>
<informationURL/>
<messagesURL/>
<proxyServerURL/>
<servicesURL/>
<dscpForSCCPPhoneConfig>96</dscpForSCCPPhoneConfig>
<dscpForSCCPPhoneServices>0</dscpForSCCPPhoneServices>
<dscpForCm2Dvce>96</dscpForCm2Dvce>
<transportLayerProtocol>4</transportLayerProtocol>
<capfAuthMode>0</capfAuthMode>
<capfList>
<capf>
<phonePort>3804</phonePort>
</capf>
</capfList>
<certHash/>
<encrConfig>false</encrConfig>
<sipProfile>
<sipProxies>
<backupProxy>USECALLMANAGER</backupProxy>
<backupProxyPort>5060</backupProxyPort>
<emergencyProxy>USECALLMANAGER</emergencyProxy>
<emergencyProxyPort>5060</emergencyProxyPort>
<outboundProxy/>
<outboundProxyPort/>
<registerWithProxy>true</registerWithProxy>
</sipProxies>
<sipCallFeatures>
<cnfJoinEnabled>true</cnfJoinEnabled>
<callForwardURI>x--serviceuri-cfwdall</callForwardURI>
<callPickupURI>x-cisco-serviceuri-pickup</callPickupURI>
<callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI>
<callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI>
<meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI>
<abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI>
<rfc2543Hold>false</rfc2543Hold>
<callHoldRingback>2</callHoldRingback>
<localCfwdEnable>true</localCfwdEnable>
<semiAttendedTransfer>true</semiAttendedTransfer>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>0</dndControl>
<remoteCcEnable>true</remoteCcEnable>
</sipCallFeatures>
<sipStack>
<sipInviteRetx>6</sipInviteRetx>
<sipRetx>10</sipRetx>
<timerInviteExpires>180</timerInviteExpires>
<timerRegisterExpires>3600</timerRegisterExpires>
<timerRegisterDelta>5</timerRegisterDelta>
<timerKeepAliveExpires>120</timerKeepAliveExpires>
<timerSubscribeExpires>120</timerSubscribeExpires>
<timerSubscribeDelta>5</timerSubscribeDelta>
<timerT1>500</timerT1>
<timerT2>4000</timerT2>
<maxRedirects>70</maxRedirects>
<remotePartyID>false</remotePartyID>
<userInfo>None</userInfo>
</sipStack>
<autoAnswerTimer>1</autoAnswerTimer>
<autoAnswerAltBehavior>false</autoAnswerAltBehavior>
<autoAnswerOverride>true</autoAnswerOverride>
<transferOnhookEnabled>false</transferOnhookEnabled>
<enableVad>false</enableVad>
<preferredCodec>none</preferredCodec>
<dtmfAvtPayload>101</dtmfAvtPayload>
<dtmfDbLevel>3</dtmfDbLevel>
<dtmfOutofBand>avt</dtmfOutofBand>
<alwaysUsePrimeLine>false</alwaysUsePrimeLine>
<alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
<kpml>3</kpml>
<natEnabled>false</natEnabled>
<natAddress>[DIRECCIÓN IP DEL SERVIDOR ELASTIX]</natAddress>
<stutterMsgWaiting>2</stutterMsgWaiting>
<callStats>false</callStats>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<startMediaPort>10000</startMediaPort>
<stopMediaPort>20000</stopMediaPort>
<voipControlPort>5060</voipControlPort>
<dscpForAudio>184</dscpForAudio>
<dscpVideo>136</dscpVideo>
<dscpForTelepresence>128</dscpForTelepresence>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
<softKeyFile>softkey.xml</softKeyFile>
<dialTemplate>dialplan.xml</dialTemplate>
<phoneLabel>[ETIQUETA DEL TELEFONO]</phoneLabel>
<sipLines>
<line button="1" lineIndex="1">
<featureID>9</featureID>
<featureLabel>[ETIQUETA DE LA EXTENSIÓN]</featureLabel>
<name>[NUMERO DE EXTENSION]</name>
<displayName>[ETIQUETA DE LA EXTENSIÓN]</displayName>
<contact>[NUMERO DE EXTENSION]</contact>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName>[NUMERO DE EXTENSION]</authName>
<authPassword>[CONTRASEÑA DE LA EXTENSION]</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
<maxNumCalls>4</maxNumCalls>
<busyTrigger>2</busyTrigger>
</line>
<line button="2">
<featureID>21</featureID>
<featureLabel>[ETIQUETA DE MARCADO RÀPIDO]</featureLabel>
<speedDialNumber>[EXTENSIÓN O NUMERO DE MARCADO RÀPIDO]</speedDialNumber>
<featureOptionMask>0</featureOptionMask>
</line>
<line button="3">
<featureID>20</featureID>
<featureLabel>Directorio</featureLabel>
<serviceURI>TFTP:directorio.xml</serviceURI>
</line>
</sipLines>
</sipProfile>
</device>
Esta es una lista de los valores que he estado modificando dentro del archivo XML.
Para especificar un servidor de hora:
Indicar la dirección del servidor Elastix:
Etiqueta del teléfono (aparece en la esquina superior derecha de la pantalla):
Información para la conexión de la extensión:
Conclusiones
Todavía me falta mucho por hacer con este teléfono. Tengo pendiente pasarle una lista de teléfonos a manera de directorio, pero mientras tanto ya puede hacer y recibir llamadas.

Telefono conectado exitosamente a Elastix

Recibiendo una llamada
Actualización 2011-09-30
Acabo de encontrar otro archivo de configuración mucho más completo y que te da más funcionalidad al teléfono.

Cisco 9951 archivo de configuración XML
Ahorita estoy investigando el uso de Open79xx XML Directory Este programa permite administrar una lista telefónica que carga automáticamente el teléfono.
Actualización 2012-06-05
Si durante las llamadas escuchan un beep de manera intermitente, por favor busquen este valor en el archivo xml de configuración y cambien su valor a cero.
Referencias
- \[1\] Configure Cisco IP Phones with Asterisk Una excelente guía sobre los puntos que hay que cuidar para que funcione este teléfono. Lamentablemente no cubre al Cisco 9951 pero aún así dio algo de luz en el camino.
- \[2\] TEMA: Cisco firmware SIP 9.x con Asterisk (9951 / 9971). Este fue el primer tema que ví. Lo malo de este artículo es que es muy escueto y muchas dudas las tuve que ir deduciendo.
- \[3\] Asterisk phone cisco 79x1 xml configuration files for SIP . Lo valioso de este articulo es que explica muchos de los puntos de configuración del archivo XML que sirve para configurar el teléfono.
