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.75224.0.1.75 - ini adalah IP multicast (untuk multicasting) "disediakan" untuk server SIP.
lihat
networksorcery.com/Enp/protocol/sip.htm224.0.1.75 SIP, Session Initiation Protocol (semua server).
Sebagai tanggapan, ia mengharapkan untuk menerima respons
NOTIFY dengan instruksi konfigurasi.

Contoh BERLANGGANAN2019/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/MikoServerPnPAgar 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