Askozia. Cara Kerja Plug & Play Autoprovisioning

Ketika mengembangkan Askozia PBX, kami menghadapi tugas mengatur telepon secara otomatis dan menyelesaikannya dengan cara kami sendiri.

Autoprovisioning Plug & Play (PnP), teknologi ini didukung oleh banyak produsen - Yealink, Snom, Fanvil.

Keuntungan utama pengaturan telepon otomatis:

  • Memfasilitasi pengaturan awal - tidak perlu pergi ke antarmuka web setiap perangkat. Cukup untuk menunjukkan korespondensi alamat MAC perangkat dan akun pada server pencarian otomatis.
  • Menyederhanakan dukungan - ini benar-benar menjadi lebih mudah jika Anda perlu mengubah pengaturan perangkat. Kami mengontrol pengaturan lagi di server
  • Dimungkinkan untuk mengurangi konfigurasi ke himpunan Starcode “* 911 * <SIP_ACC>” - dalam beberapa kasus fungsi ini tidak dihargai. Tidak setiap pekerja kantoran akan dapat mengonfigurasi telepon IP, tetapi memanggil kombinasi angka adalah tugas yang sederhana.

Mari kita jelaskan cara kerja Plug & Play Autoprovisioning. Di akhir artikel, tautan ke kode sumber skrip PHP kecil yang mengimplementasikan fungsionalitas server PnP.

Studi Kasus


Kami memiliki kasus yang menarik ketika memperkenalkan telepon kepada salah satu pelanggan kami. Masalah utama adalah bahwa klien berada di kota lain. Pada saat yang sama, salah satu persyaratannya adalah setelah membongkar paket dengan telepon dan menghubungkannya ke jaringan, telepon harus segera bekerja.

Masalahnya diselesaikan relatif sederhana. Klien telah memesan sejumlah alamat IP untuk kami. Kami menyiapkan peralatan di kantor kami dan mengemasnya dalam sebuah kotak dan mengirimkannya melalui kurir.

Menggunakan konfigurasi perangkat otomatis, tugas akan menjadi lebih sederhana.

Skema PnP Sederhana


Perangkat telepon pada awal pekerjaan mengirimkan permintaan SIP SUBSCRIBE broadcast ke alamat 224.0.1.75 IP multicast.
Baca lebih lanjut tentang 224.0.1.75
224.0.1.75 - ini adalah IP multicast (untuk multicasting) "disediakan" untuk server SIP.
lihat networksorcery.com/Enp/protocol/sip.htm
224.0.1.75 SIP, Session Initiation Protocol (semua server).

Sebagai tanggapan, ia mengharapkan untuk menerima respons NOTIFY dengan instruksi konfigurasi.

gambar

Contoh BERLANGGANAN
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 


Berita utama yang paling penting dan menarik


  • Dari - alamat poppy perangkat adalah 0015657322ff
  • Peristiwa - secara komprehensif menjelaskan perangkat, pabrikan, model, versi firmware
  • Kontak - alamat perangkat
  • Call-ID - header ini menarik ketika mengkonfigurasi perangkat DECT dari Yealink, ia mentransfer pengidentifikasi garis (nomor seri tabung), pembatas " _ "

Setelah server PnP menerima permintaan seperti itu, ia harus merespons

PEMBERITAHUAN contoh
 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 


Dalam pesan NOTIFY, informasi paling berharga ada di badan pesan. Sebagai aturan, di dalam tubuh Anda harus melewati tautan untuk mendapatkan file konfigurasi:

 http://172.16.32.153:84/0015657322ff.cfg 

Jika beberapa server PnP berjalan di jaringan, maka siapa yang pertama yang akan merespons perangkat akan mengkonfigurasinya.

Telepon, setelah menerima NOTIFY, berupaya memenuhi permintaan di alamat yang ditentukan.

Contoh permintaan dan respons server
 # 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) ... 


Contoh implementasi server tersedia di github https://github.com/boffart/MikoServerPnP

Agar server PnP ini berfungsi, Anda harus:

  • PHP 7.1.9
  • Soket php
  • BusyBox v1.26.2
  • Permintaan siaran harus diizinkan di jaringan

Fitur Server PnP


  • Mendengarkan permintaan yang dikirim ke alamat ' 224.0.1.75:5060 '
  • Ketika mulai, itu memulai server web ( busybox httpd )
  • Memungkinkan Anda membuat konfigurasi ponsel yang disederhanakan
  • Memungkinkan Anda mengirim ke Yealink NOTIFY untuk memulai ulang

Menggunakan server PnP memungkinkan Anda untuk menggunakan "tautan satu kali".


Misalkan kita memberikan file melalui tautan:

 http://172.16.32.153:84/0015657322ff.cfg 

Tautan langsung yang biasa ke file. Jelas, ini TIDAK aman. Mengetahui alamat MAC dari ponsel dan alamat server, Anda dapat mencoba untuk mendapatkan konfigurasi dengan login dan kata sandi.

Saat bekerja dengan server PnP, dimungkinkan untuk memberikan tautan unik untuk setiap permintaan SUBSCRIBE:

 http://172.16.32.153:84/?mac=0015657322ff&hash=0a67f5290 

Contoh rumus untuk menghitung hash:

 hash = md5(MAC + DATE + PID) 

PID adalah ID proses dari server PnP. Hanya root yang bisa mengenalinya.
Memilih hash semacam itu praktis tidak mungkin.

Jika banding terjadi melalui tautan yang tidak valid, maka kami melarang hama tersebut.

Reboot Yealink PEMBERITAHUAN berarti tanpa otorisasi


Ya, ya, tanpa otorisasi .
Saya tidak dapat menutup perangkat dari versi firmware saat ini dari kemungkinan ini.

Jalankan saja perintahnya

 php -f MikoServerPnP.php socket_client_notify <IP_PBX> <PORT_SIP_PBX> <IP_PHONE> <PORT_PHONE> 

Dan ponsel akan masuk ke reboot. Dengan menggantung perintah seperti itu di cron Anda dapat mencapai efek yang menakutkan. Tentu saja, ini dimungkinkan jika kita mengetahui alamat IP dan port SIP pada ponsel.

Contoh fungsi PHP untuk mengirim PEMBERITAHUAN
  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); } 


Konfigurasi Server PnP


Terletak di setting / 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": "**" } 

Daftar putih MAC


Dapat dijelaskan dalam pengaturan / mac_white.conf . Umpan garis pemisah.

Daftar hitam MAC


Dapat dijelaskan dalam pengaturan / mac_black.conf . Umpan garis pemisah.

File konfigurasi telepon


Harus ditempatkan di direktori konfigurasi .
Menggunakan server PnP, Anda dapat membuat konfigurasi paling sederhana untuk Yeakink dan Snom:

 php -f MikoServerPnP.php mk_config SIP_ACCAUNT SECRET MAC 

Bahan yang berguna


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


All Articles