Askozia. Como funciona o Plug & Play de provisionamento automático

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.75
224.0.1.75 - este é o IP multicast (para multicast) "reservado" para servidores SIP.
consulte networksorcery.com/Enp/protocol/sip.htm
224.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.

imagem

SUBSCREVER Exemplo
2019/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/MikoServerPnP

Para 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


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


All Articles