Integração de Telefonia por Computador e Telefones Grandstream


Comunicações cada vez mais modernas estão sendo integradas ao mundo à nossa volta, e a telefonia de escritório não é exceção. A Grandstream decidiu manter e adicionou suporte para uma interface CTI (Computer-Telephony Integration) especial em seus telefones. Inicialmente, os dispositivos da série GXP21XX foram atualizados e, um pouco depois, os dispositivos da linha GXP16XX mais nova, como GXP1610 , GXP1620 , etc. foram atualizados .


De fato, a “interface CTI” é dita em voz alta, na realidade - uma pequena API REST que permite controlar seu telefone usando solicitações HTTP simples. Parece: você pode iniciar uma chamada, rastrear o status das linhas usadas pelo telefone no PBX, mas ao usar, por exemplo, um PBX IP baseado em nuvem, isso nem sempre é possível. Além disso, o CTI permite controlar o alto-falante, o volume do alto-falante, silenciar o microfone etc., o que nem sempre é possível no nível do PBX.


Então, o que podemos fazer com o CTI? Em geral, não muito, temos apenas cinco tipos de solicitações disponíveis:


PedidoDescrição do produto
api-get_line_statusStatus da linha
api-get_phone_statusStatus do telefone
api-send_keyPressionar uma tecla (0-9, #, *, sensível ao contexto etc.)
api-phone_operationAs manipulações mais simples com o telefone (receber uma chamada, redefinir etc.)
api-sys_operationPermite reiniciar e redefinir o dispositivo para as configurações de fábrica

Usando isso é muito simples, formamos uma solicitação do formulário:


"http://IP  /cgi-bin/api-get_line_status?passcode=" // (     ) 

Em resposta, obtemos JSON do formulário:


 { "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": "" } ] } 

Substituindo api-get_line_status por api-get_phone_status na solicitação, obtemos uma breve informação no telefone:


 { "response": "success", "body": "busy", "misc": "0" } 

Esse método é conveniente quando precisamos apenas interrogar o status do dispositivo ou das linhas telefônicas e é muito inconveniente nos casos em que queremos rastrear as alterações que estão ocorrendo. Uma chamada chegava, pegaríamos o número recebido e mostraríamos ao usuário uma notificação, mas como fazer isso? Não temos a oportunidade de se inscrever em nenhum evento, não é uma boa decisão martelar o telefone duas ou três vezes por segundo com solicitações de status. Infelizmente, nesta situação, o CTI não é um assistente.


Além disso, api-send_key , como o nome indica, atende a essa solicitação para enviar pressionamentos de teclas às teclas do telefone, você pode enviar um de cada vez ou vários de uma vez. De fato, as teclas são iniciadas em intervalos de cerca de um segundo e esse processo não pode ser interrompido. Ao mesmo tempo, as teclas do telefone não são bloqueadas e podem ser pressionadas livremente, como resultado, o executável do telefone se transforma em uma "bagunça" incompreensível.


 "http://192.168.4.118/cgi-bin/api-send_key?passcode=admin&keys=LINE2:2:0:3:SEND" 

Como você pode ver, outro parâmetro de teclas foi adicionado, indicando quais teclas pressionar. (Uma tabela com uma lista de todas as teclas que podem ser pressionadas virtualmente está na documentação do CTI.)


A primeira coisa que vem à mente: "Não é possível escrever uma extensão para o navegador que permita iniciar uma chamada diretamente a partir dele?" A opção mais simples não demorou a chegar. Como eu tenho o navegador principal do Google Chrome, escrevi para ele, foram necessários apenas dois arquivos para criar:


 // 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); } }); 

Colocamos eles em uma pasta; na página de extensões, ativamos o modo de desenvolvedor e conectamos nossa extensão.




Para gerenciar chamadas, é fornecida uma solicitação de operação api-phone , com a qual podemos aceitar ou rejeitar uma chamada recebida (acceptcall / rejectcall), colocar em espera ou encerrar a conversa atual (holdcall / endcall). Também está disponível um comando de cancelamento mais universal, que permite rejeitar e encerrar chamadas. Para enviar, use uma solicitação do formulário:


 "http://192.168.4.118/cgi-bin/api-phone_operation?passcode=admin&cmd=cancel" 

E a última coisa: api-sys_operation , permitirá reiniciar o telefone ou redefinir as configurações de fábrica (REBOOT e RESET, respectivamente). Usamos consultas do formulário:


 "http://192.168.4.118/cgi-bin/api-sys_operation?passcode=admin&request=REBOOT" 

É improvável que o uso apenas da integração de telefonia e computador seja capaz de criar um aplicativo de rolagem que interaja totalmente com o seu ambiente. Porém, como uma ferramenta adicional usada em conjunto com outras APIs (URLs de ação em telefones ou AMIs no Asterisk), a CTI tem o direito de existir.

Source: https://habr.com/ru/post/pt404241/


All Articles