Softphone/API
Tabela de conteúdo |
Sobre este Guia
Este guia descreve a interface CTI - Computer Telephony Integration do Servidor uTech
Comentários sobre este Guia
Você pode fornecer comentários sobre este documento, enviando e-mail para o seguinte endereço:
- suporteutech@utech.com.br
Agradecemos seus comentários.
Visão Geral
Como funciona no Protocolo CTI uTech
O procoto CTI fornece uma interface entre Softphone e o aplicações CTI cliente.
- A aplicação CTI envia comandos para o Softphone para gerar, atender (se não configurado com auto-atendimento), desviar, e desligar chamadas
- O Softfone envia para a aplicação CTI eventos de chamadas efetuadas e recebidas.
Como conectar na API CTI do Softphone
O Softphone disponibiliza uma conexão TCP/IP, em porta configurada no menu Preferências, aba TAPI. Essa configuração possui, alem de uma porta onde o softphone irá esperar pela conexão do clinte, bom como um usuário e senha para a aplicação fazer login (Comando LOGIN).
Formato do Protocolo
O protocolo para comunicação com o Softphone é em formato TEXTO. Todos os campos pertencentes ao mesmo comando enviado ou evento recebido serão separados por ESPAÇO (0x20 em Hexadecimal). A aplicação CTI poderá receber vários eventos concatenados, que serão separados duas sequências dos caracteres CARRIAGE RETURN (CR) seguido de LINE FEED (LF) [ \r\n\r\n ou 0x0D + 0x0A + 0xAD + 0x0A em hexadecimal].
Exemplo de Evento recebido do Servidor CTI:
EVENTO CAMPO1:VALOR1 CAMPO2:VALOR2\r\n\r\n |
---|
CALL CALLID:1234567890 STATE:originated CALLING:2000 CALLED:2001\r\n\r\n |
---|
Conectado na API CTI do Softphone
A API do softphone utiliza o protocolo TCP e, por padrão, a porta 0000. Após conectar no endereço IP e Porta do Softphone, é necessário enviar o Comando LOGIN para autenticar a API. Após conectado e autenticado, a aplicação CTI começará a receber eventos do Softphone.
Comandos e Eventos
Abaixo é listado os eventos enviados pelo Softphone e os comandos disponíveis para a aplicação CTI. Em cada Comando/Evento contem uma breve descrição. Para maiores informações clique no link no sobre o Comando/Evento.
Comandos (Aplicação CTI -> Softphone) | |
---|---|
Comando LOGIN | Comando utilizado pela aplicação CTI para autenticar na API do Softphone. A aplicação DEVE fazer login para enviar comandos receber eventos. |
Comando DIAL | Comando enviado para o Servidor CTI solicitando a geração de chamadas. |
Comando ANSWER | Comando enviado pela aplicação CTI para atendimento de uma chamada. |
Comando DROP | Comando enviado pela aplicação CTI solicitando a rejeição ou para derrubar/desligar da chamada. |
Comando HOLD | Comando enviado pela aplicação CTI para solicitar que a chamada seja colocada em espera/musica. |
Comando RETRIEVE | Comando enviado pela aplicação CTI solicitado a remoção da chamada da espera/musica. |
Eventos (Softphone -> Aplicação) | |
Evento CALL | Evento enviado pelo Softphone para aplicação, informando novo evento de chamada. |
Estados de uma Chamada
Lista de Estados de uma chamada
Causas de Desligamento da Chamada
Lista de Causas de desligamento de uma chamada
Exemplo em PHP
<?php require 'vendor/autoload.php'; $api = array("connected" => false, "logged" => false, "status" => "idle", "user" => "admin", "pass" => "12345", "addr" => "10.0.0.123", "port" => "8000" ); $loop = React\EventLoop\Factory::create(); $connector = new React\Socket\Connector($loop,array('timeout' => 10.0)); $connector->connect("{$api['addr']}:{$api['port']}")->then( function (React\Socket\ConnectionInterface $connection) use ($loop, &$api){ echo "connection successfully established\n"; $api['connected'] = true; echo "Add Timer to call 1000....\n"; $timer = $loop->addTimer(5, function () use ($connection, &$api) { if($api['logged'] == true) { echo "Dial to 1000...\n"; $connection->write("DIAL TO:1000\r\n\r\n"); } else { echo "CTI cli not logged!\n"; } }); $connection->on('data', function ($data) use (&$api) { echo "RECV:$data"; if(strncmp($data, "LOGIN", 5) == 0){ if(strstr($data, "RESP:OK")){ echo "Login OK\n"; $api['logged'] = true; } else echo "Login Error!\n"; } }); $connection->on('end', function () { echo "Connection ended\n"; }); $connection->on('error', function (Exception $e) { echo 'Connection error: ' . $e->getMessage() . "\n"; }); $connection->on('close', function () { $api['connected'] = false; echo "Connection closed...\n"; }); if($api['connected'] == true) { if($api['logged'] == false) { echo "Send login ({$api['user']}, {$api['pass']})...\n"; $connection->write("LOGIN USER:{$api['user']} PASSWORD:{$api['pass']}\r\n\r\n"); } } }, function (Exception $error) { echo "Failed to connect due to $error ????\n"; exit(1); } ); $loop->run(); ?> |