Se están integrando más y más comunicaciones modernas en el mundo que nos rodea, y la telefonía de oficina no es una excepción. Grandstream decidió mantenerse al día y agregó soporte para una interfaz especial CTI (integración de computadora y telefonía) a sus teléfonos. Inicialmente, se actualizaron los dispositivos de la serie GXP21XX, y un poco más tarde se actualizaron los dispositivos de la línea GXP16XX más joven, como GXP1610 , GXP1620 , etc.
De hecho, la "interfaz CTI" se dice en voz alta, en realidad, una pequeña API REST que le permite controlar su teléfono mediante simples solicitudes HTTP. Parecería: puede iniciar una llamada, rastrear el estado de las líneas utilizadas por el teléfono en la central, pero cuando se utiliza, por ejemplo, una centralita IP basada en la nube, esto no siempre es posible. Además de esto, CTI le permite controlar el altavoz, el volumen del altavoz, silenciar el micrófono, etc., lo que no siempre es posible en el nivel PBX.
Entonces, ¿qué podemos hacer con CTI? En general, no mucho, solo tenemos cinco tipos de solicitudes disponibles:
Solicitud | Descripción |
---|
api-get_line_status | Estado de la línea |
api-get_phone_status | Estado del teléfono |
api-send_key | Presionando una tecla (0-9, #, *, sensible al contexto, etc.) |
api-phone_operation | Las manipulaciones más simples con el teléfono (recibir una llamada, restablecer, etc.) |
api-sys_operation | Le permite reiniciar y restablecer el dispositivo a la configuración de fábrica |
Usar esto es muy simple, formamos una solicitud del formulario:
"http://IP /cgi-bin/api-get_line_status?passcode="
En respuesta, obtenemos JSON de la forma:
{ "response": "success", "body": [ { "line": 1, "state": "idle", "acct": 1, "active": 0, "remotename": "", "remotenumber": "" }, { "line": 2, "state": "connected", "acct": 2, "active": 1, "remotename": "", "remotenumber": "203" }, { "line": 3, "state": "idle", "acct": 1, "active": 0, "remotename": "", "remotenumber": "" }, ... { "line": 8, "state": "idle", "acct": 1, "active": 0, "remotename": "", "remotenumber": "" } ] }
Reemplazando api-get_line_status con api-get_phone_status en la solicitud, obtenemos una breve información por teléfono:
{ "response": "success", "body": "busy", "misc": "0" }
Este método es conveniente cuando solo necesitamos interrogar el estado del dispositivo o las líneas telefónicas y es muy inconveniente en los casos en los que queremos rastrear los cambios que están ocurriendo. Llegó una llamada, tomamos el número entrante y le mostramos al usuario una notificación, pero ¿cómo hacerlo? No tenemos la oportunidad de suscribirnos a ningún evento, no es una buena decisión golpear el teléfono dos o tres veces por segundo con solicitudes de estado. Desafortunadamente, en esta situación, CTI no es un asistente.
Buscamos más, api-send_key , como su nombre lo indica, sirve esta solicitud para enviar pulsaciones de teclas a las teclas del teléfono, puede enviar una a la vez o varias a la vez. De hecho, las pulsaciones de las teclas transferidas se inician a intervalos de aproximadamente un segundo, y este proceso no se puede interrumpir. Al mismo tiempo, las teclas del teléfono no están bloqueadas y pueden presionarse libremente, como resultado, el ejecutable del teléfono se convierte en un "desastre" incomprensible.
"http://192.168.4.118/cgi-bin/api-send_key?passcode=admin&keys=LINE2:2:0:3:SEND"
Como puede ver, se ha agregado otro parámetro de teclas , que indica qué teclas presionar. (Una tabla con una lista de todas las teclas que se pueden presionar virtualmente se encuentra en la documentación de CTI).
Lo primero que me viene a la mente: "¿No es posible escribir una extensión del navegador que le permita iniciar una llamada directamente desde él? La opción más simple no se hizo esperar. Como tengo el navegador principal de Google Chrome, escribí para ello, solo se necesitaron dos archivos para crear:
// manifest.json { "manifest_version": 2, "name": "ArtDial", "version": "0.1", "permissions": ["contextMenus"], "background": { "scripts": ["background.js"] } }
// background.js function dial(selectedText) { var serviceCall = 'http://192.168.4.118/cgi-bin/api-send_key?passcode=admin&keys='+ selectedText.replace(/[^\d]/g, '').split('').join(':') +':SEND'; var xhr = new XMLHttpRequest(); xhr.open("GET", serviceCall, true); xhr.send(); } chrome.contextMenus.create({ title: ": %s", contexts: ["selection"], onclick: function(info, tab) { dial(info.selectionText); } });
Los ponemos en una carpeta, en la página de extensiones activamos el modo desarrollador y conectamos nuestra extensión.
Para administrar las llamadas, se proporciona una solicitud de operación de API-teléfono , con la cual podemos aceptar o rechazar una llamada entrante (acceptcall / acceptcall), poner en espera o finalizar la conversación actual (holdcall / endcall). También está disponible un comando de cancelación más universal, que le permite rechazar y finalizar llamadas. Para enviar, utilice una solicitud del formulario:
"http://192.168.4.118/cgi-bin/api-phone_operation?passcode=admin&cmd=cancel"
Y lo último: api-sys_operation , nos permitirá reiniciar el teléfono o restablecerlo a la configuración de fábrica (REBOOT y RESET, respectivamente). Usamos consultas de la forma:
"http://192.168.4.118/cgi-bin/api-sys_operation?passcode=admin&request=REBOOT"
Es improbable que el uso de la integración de computadora y telefonía sea capaz de crear una aplicación dinámica que interactúe completamente con su entorno. Pero como herramienta adicional utilizada junto con otras API (URL de acción en teléfonos o AMI en Asterisk), CTI tiene derecho a existir.