Asignación del logo
Esto es relativamente sencillo, primero, necesitan un logo que cumpla con las siguientes características:
1.- Formato BMP
2.- En escala de grises, indexado.
3.- Tamaño máximo 90x56 px.
El teléfono accede a este archivo por medio de HTTP, así que deben tener también un servidor HTTP, guardar el logo en este y colocar el URL de acceso del mismo de la siguiente forma, ya sea en el archivo SIPDefault.cnf o en el archivo de cada teléfono SIP
logo_url: "URL del logo"
Por ejemplo, si el logo se encuentra en 192.168.0.1/asterisk/logo.bmp, deben colocar:
logo_url: "http://192.168.0.1/asterisk/logo.bmp"
Si por ejemplo poseen servidores de nombre (DNS) y 192.168.0.1 tiene asignado el registro "httpserver.dominiolocal.com" colocan:
logo_url: "http://httpserver.dominiolocal.com/asterisk/logo.bmp"
Es decir, colocal el FQDN en lugar de la IP, cabe acotar que el telefono solo descarga el logo cuando arranca, por ende si realizan algún cambio al mismo, para que se vea reflejado deberán reiniciar el teléfono (que si no lo había dicho antes, se puede realizar presionando las teclas settings + asterisco + 6).
Aplicación de directorio
Algo que me agrado mucho, es que los teléfonos 7940G permiten correr microaplicaciones escritas en xml, en este archivo PDF tienen una concisa guía de como escribir estas aplicaciones, en mi caso la aplicación de directorio funciona así:
1.- La aplicación XML en el teléfono se encarga de la presentación al usuario de un menú para poder realizar las búsquedas y luego mostrar los resultados obtenidos. La aplicación es accesible presionando la tecla "directory" en el teléfono y seleccionando "external directory".
2.- Si el usuario desea buscar algún contacto interno (extensión), selecciona la opción "directorio interno local. Se ejecuta un script PHP.
3.- Cuando el usuario desea buscar algún contacto externo, selecciona la opcion "buscar contacto", introduce los datos de este, la aplicación XML se encarga de pasar estos datos como una variable a un script PHP.
4.- Ambos scripts interactuan con una base de datos en MYSQL, los cuales generan una salida en formato XML que el teléfono interpreta para luego mostrar al usuario.
Para que el teléfono haga uso de esta aplicación deben incluir ya sea en el archivo SIPDefault.cnf o en el archivo individual de cada teléfono SIP
directory_url: "URL del archivo xml principal"
Mismas reglas que con el logo, el teléfono accede al archivo XML es mediante HTTP.
Abajo encontraran los códigos fuentes de los archivos XML y PHP, esta aplicación es muy sencilla y la escribí leyendo la guía en PDF que deje mas arriba y unas cuantas guías de W3Schools
menu1.xml es el archivo al que accede el teléfono y se referencia en la linea "directory_url", este genera un menú con dos opciones, según la opción que se presione se llama un archivo XML (buscar_contacto.xml) que le indica al teléfono que debe recibir un parámetro por parte del usuario (introducido utilizando el teclado) y luego enviarlo a un script php (busqueda.php) que a su vez genera una salida XML para que el teléfono la interprete, o se ejecuta un script PHP (interno.php) que genera a su vez una salida en formato XML, que el teléfono interpreta y luego muestra al usuario. El diagrama de flujo a continuación debería de dejar todo mas claro:
<CiscoIPPhoneMenu>
<Prompt>Directorio Telefonico</Prompt>
<MenuItem>
<Name>Buscar un contacto</Name>
<URL>URL buscar_contacto.xml</URL>
</MenuItem>
<MenuItem>
<Name>Directorio Interno Local</Name>
<URL>URL interno.php</URL>
</MenuItem>
</CiscoIPPhoneMenu>
buscar_contacto.xml
<CiscoIPPhoneInput>
<Title>Directorio telefonico</Title>
<Prompt>Criterio de busqueda</Prompt>
<URL>URL busqueda.php</URL>
<InputItem>
<DisplayName>Nombre</DisplayName>
<QueryStringParam>nombre</QueryStringParam>
<InputFlags>U</InputFlags>
</InputItem>
</CiscoIPPhoneInput>
interno.php
<?php
header('Content-Type: text/xml');
#DATOS DE CONEXION A LA BASE DE DATOS
$mysql_conn = mysqli_connect("IP O FQDN","USUARIO","CONTRASEÑA","BASE DATOS");
#VALORES A BUSCAR
$resultado = mysqli_query($mysql_conn,"SELECT * FROM contactos WHERE tag = 'ext'ORDER BY nombres");
print ("<CiscoIPPhoneDirectory>\n");
print ("<Title>");
print ("Directorio Telefonico");
print ("</Title>\n");
print ("<Prompt>");
print ("Coincidencias");
print ("</Prompt>\n");
while($row = mysqli_fetch_array($resultado))
{
print ("<DirectoryEntry>\n");
print ("<Name>");
print ($row['nombres']);
print ("</Name>\n");
print ("<Telephone>");
print ($row['numero']);
print ("</Telephone>\n");
print ("</DirectoryEntry>\n");
}
print ("</CiscoIPPhoneDirectory>\n");
?>
busqueda.php
<?php
header('Content-Type: text/xml');
#DATOS DE CONEXION A LA BASE DE DATOS
$mysql_conn = mysqli_connect("IP O FQDN","USUARIO","CONTRASEÑA","BASE DATOS");
#VALORES A BUSCAR
$NOM = $_GET["nombre"];
$resultado = mysqli_query($mysql_conn,"SELECT * FROM contactos WHERE ((nombres LIKE '%$NOM%') AND (tag !='ext')) ORDER BY nombres");
$total_resultado = mysqli_num_rows($resultado);
if($total_resultado == 0)
{
print ("\n");
print ("<CiscoIPPhoneText>\n");
print ("<Title>");
print ("Directorio Telefonico");
print ("</Title>\n");
print ("<Prompt>");
print ("No hay coincidencias");
print ("</Prompt>\n");
print ("</CiscoIPPhoneText>");
print ("\n");
}
else
{
print ("<CiscoIPPhoneDirectory>\n");
print ("<Title>");
print ("Directorio Telefonico");
print ("</Title>\n");
print ("<Prompt>");
print ("Coincidencias");
print ("</Prompt>\n");
while($row = mysqli_fetch_array($resultado))
{
print ("<DirectoryEntry>\n");
print ("<Name>");
print ($row['nombres']);
print ("</Name>\n");
print ("<Telephone>");
print ($row['numero']);
print ("</Telephone>\n");
print ("</DirectoryEntry>\n");
}
print ("</CiscoIPPhoneDirectory>\n");
}
?>
La base de datos en MySQL, contiene una sola tabla, que llamo directorio, esta tabla contiene 3 columnas: nombres (varchar 35), numero (varchar 15 y PK) y tag (varchar 3). Las dos primeras se explican solas, la ultima sin embargo la coloque para que sea fácil diferenciar de un contacto con varios números (ejemplo, extension local, celular, casa, etc.) Si se fijan en los scripts PHP notaran que en los queries utilizo este campo para distinguir que números mostrar.