Ao desenvolver o PABX Askozia, enfrentamos a tarefa de configurar automaticamente os telefones e resolvê-lo à nossa maneira.
Autoprovisionamento Plug & Play (PnP), esta tecnologia é suportada por muitos fabricantes - Yealink, Snom, Fanvil.
As principais vantagens das configurações automáticas do telefone:
- Facilita a configuração inicial - não é necessário acessar a interface da web de cada dispositivo. Basta indicar a correspondência do endereço MAC do dispositivo e a conta no servidor de autoajuste.
- Simplifica o suporte - torna-se realmente mais fácil se você precisar alterar as configurações do dispositivo. Controlamos as configurações novamente no servidor
- É possível reduzir a configuração para o conjunto de starcode “* 911 * <SIP_ACC>” - em alguns casos, essa função simplesmente não está disponível. Nem todo trabalhador de escritório poderá configurar um telefone IP, mas discar uma combinação de números é uma tarefa simples.
Vamos descrever como o Plug & Play de provisionamento automático funciona.
No final do artigo, um link para o código-fonte de um pequeno script PHP que implementa a funcionalidade do servidor PnP.
Estudo de caso
Tivemos um caso interessante ao apresentar a telefonia a um de nossos clientes. O principal problema era que o cliente estava em outra cidade. Ao mesmo tempo, um dos requisitos era que, depois de desembalar o pacote com os telefones e conectá-los à rede, a telefonia funcionasse imediatamente.
O problema foi resolvido de forma relativamente simples. O cliente reservou vários endereços IP para nós. Montamos o equipamento em nosso escritório, embalamos em uma caixa e enviamos por correio.
Usando a configuração automática do dispositivo, a tarefa se tornaria muito mais simples.
Esquema PnP simplificado
O aparelho telefônico no início do trabalho envia uma solicitação
SIP SUBSCRIBE para o endereço IP multicast do endereço
224.0.1.75 .
Leia mais sobre 224.0.1.75224.0.1.75 - este é o IP multicast (para multicast) "reservado" para servidores SIP.
consulte
networksorcery.com/Enp/protocol/sip.htm224.0.1.75 SIP, Protocolo de Iniciação de Sessão (todos os servidores).
Em resposta, ele espera receber uma resposta
NOTIFY com instruções de configuração.

SUBSCREVER Exemplo2019/09/02 09:26:41.543856 172.16.32.148:5059 -> 224.0.1.75:5060 SUBSCRIBE sip:MAC0015657322ff@224.0.1.75 SIP/2.0 Via: SIP/2.0/UDP 172.16.32.148:5059;branch=z9hG4bK42032775 From: <sip:MAC0015657322ff@224.0.1.75>;tag=42032772 To: <sip:MAC0015657322ff@224.0.1.75> Call-ID: 42032772@172.16.32.148 CSeq: 1 SUBSCRIBE Contact: <sip:MAC0015657322ff@172.16.32.148:5059> Max-Forwards: 70 User-Agent: Yealink SIP-T21P 34.72.14.6 Expires: 0 Event: ua-profile;profile-type="device";vendor="Yealink";model="T21D";version="34.72.14.6" Accept: application/url Content-Length: 0
As manchetes mais importantes e interessantes
- De - o endereço de papoula do dispositivo é 0015657322ff
- Evento - descreve de forma abrangente o dispositivo, fabricante, modelo, versão do firmware
- Contato - endereço do dispositivo
- Identificação de chamada - esse cabeçalho é interessante ao configurar dispositivos DECT a partir do Yealink, transfere o identificador de linha (número de série do tubo), delimitador " _ "
Depois que o servidor PnP receber essa solicitação, ele deverá responder
Exemplo NOTIFY 2019/09/02 09:26:41.550125 172.16.32.153:57593 -> 172.16.32.148:5059 NOTIFY sip:172.16.32.148:5059 SIP/2.0 Via: SIP/2.0/UDP 172.16.32.148:5059;branch=z9hG4bK42032775 Max-Forwards: 20 Contact: <sip:172.16.32.148:5059;transport=UDP;handler=dum> From: <sip:MAC0015657322ff@224.0.1.75>;tag=42032772 To: <sip:MAC0015657322ff@224.0.1.75> Call-ID: 42032772@172.16.32.148 CSeq: 3 NOTIFY Content-Type: application/url Subscription-State: terminated;reason=timeout Event: ua-profile;profile-type="device";vendor="MIKO";model="MikoServerPnP";version="1.8" Content-Length: 40 http://172.16.32.153:84/0015657322ff.cfg
Em uma mensagem NOTIFY, as informações mais valiosas estão no corpo da mensagem. Como regra, no corpo você deve passar um link para obter o arquivo de configuração:
http://172.16.32.153:84/0015657322ff.cfg
Se vários servidores PnP estiverem em execução na rede, quem será o primeiro a responder ao dispositivo irá configurá-lo.
O telefone, após o recebimento de NOTIFY, tenta atender à solicitação no endereço especificado.
Exemplo de solicitação e resposta do servidor # curl -i http://172.16.32.153:84/0015657322ff.cfg HTTP/1.0 200 OK Content-type: text/plain Date: Mon, 02 Sep 2019 06:52:23 GMT Connection: close Accept-Ranges: bytes Last-Modified: Mon, 02 Sep 2019 06:25:02 GMT Content-length: 769 #!version:1.0.0.1 account.1.enable = 1 account.1.label = PnP (203) ...
Um exemplo de implementação do servidor está disponível no github
https://github.com/boffart/MikoServerPnPPara que este servidor PnP funcione, você deve:
- PHP 7.1.9
- Soquetes php
- BusyBox v1.26.2
- As solicitações de transmissão devem ser permitidas na rede
Recursos do servidor PnP
- Ouve pedidos enviados para o endereço ' 224.0.1.75:5060 '
- Quando inicia, inicia o servidor da Web ( busybox httpd )
- Permite criar uma configuração simplificada do telefone
- Permite enviar para o Yealink NOTIFY para reiniciar
O uso de um servidor PnP permite usar "Links únicos".
Suponha que fornecemos o arquivo pelo link:
http://172.16.32.153:84/0015657322ff.cfg
O link direto usual para o arquivo. Obviamente, isso não é seguro. Conhecendo o endereço MAC do telefone e o endereço do servidor, você pode tentar obter uma configuração com logins e senhas.
Ao trabalhar com um servidor PnP, é possível fornecer um link exclusivo para cada solicitação de SUBSCRIBE:
http://172.16.32.153:84/?mac=0015657322ff&hash=0a67f5290
Um exemplo de uma fórmula para calcular um hash:
hash = md5(MAC + DATE + PID)
PID é o ID do processo do servidor PnP. Somente a
raiz pode reconhecê-lo.
Escolher esse
hash é praticamente impossível.
Se um recurso ocorrer por um link inválido, baniremos a praga.
Reiniciar o Yealink NOTIFY significa sem autorização
Sim, sim,
sem autorização .
Não pude fechar o dispositivo da versão atual do firmware a partir dessa possibilidade.
Basta executar o comando
php -f MikoServerPnP.php socket_client_notify <IP_PBX> <PORT_SIP_PBX> <IP_PHONE> <PORT_PHONE>
E o telefone irá reiniciar. Ao suspender esse comando no cron, você pode obter um efeito aterrorizante. Obviamente, isso é possível se soubermos o endereço IP e a porta SIP do telefone.
Um exemplo de função PHP para enviar NOTIFY public static function socket_client_notify($ip_pbx, $port_pbx, $ip_phone, $port_phone):void { $phone_user = 'autoprovision_user'; $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $msg = "NOTIFY sip:{$phone_user}@{$ip_phone}:{$port_phone};ob SIP/2.0\r\n". "Via: SIP/2.0/UDP {$ip_pbx}:{$port_pbx};branch=z9hG4bK12fd4e5c;rport\r\n". "Max-Forwards: 70\r\n". "From: \"asterisk\" <sip:asterisk@{$ip_pbx}>;tag=as54cd2be9\r\n". "To: <sip:{$phone_user}@{$ip_phone}:{$port_phone};ob>\r\n". "Contact: <sip:asterisk@{$ip_pbx}:{$port_pbx}>\r\n". "Call-ID: 4afab6ce2bff0be11a4af41064340242@{$ip_pbx}:{$port_pbx}\r\n". "CSeq: 102 NOTIFY\r\n". "User-Agent: mikopbx\r\n". "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE\r\n". "Supported: replaces, timer\r\n". "Subscription-State: terminated\r\n". "Event: check-sync;reboot=true\r\n". "Content-Length: 0\r\n\n"; $len = strlen($msg); socket_sendto($sock, $msg, $len, 0, $ip_phone, $port_phone); socket_close($sock); }
Configuração do servidor PnP
Localizado em
settings / settings.json { "url": "http://<pbx_host>:<http_port>/", "http_port": 84, "pbx_host": "172.16.32.153", "pbx_sip_port": "5060", "vm_extension": "*001", "feature_transfer": "**" }
Lista de permissões de MAC
Pode ser descrito em
settings / mac_white.conf . Separador - alimentação de linha.
Lista negra de MAC
Pode ser descrito em
settings / mac_black.conf . Separador - alimentação de linha.
Arquivos de configuração do telefone
Deve ser colocado no diretório
configs .
Usando o servidor PnP, você pode criar as configurações mais simples para Yeakink e Snom:
php -f MikoServerPnP.php mk_config SIP_ACCAUNT SECRET MAC
Materiais úteis