Askozia. كيف يعمل التوصيل والتشغيل التلقائي

عند تطوير Askozia PBX ، واجهنا مهمة إعداد الهواتف تلقائيًا وحلها بطريقتنا الخاصة.

Autoprovisioning Plug & Play (PnP) ، ويدعم هذه التكنولوجيا من قبل العديد من الشركات المصنعة - Yealink ، Snom ، Fanvil.

المزايا الرئيسية لإعدادات الهاتف التلقائي:

  • يسهل الإعداد الأولي - لا حاجة للذهاب إلى واجهة الويب لكل جهاز. يكفي الإشارة إلى مراسلات عنوان MAC للجهاز والحساب على خادم الضبط التلقائي.
  • يبسط الدعم - يصبح الأمر أسهل إذا كنت بحاجة إلى تغيير إعدادات الجهاز. نحن نتحكم في الإعدادات مرة أخرى على الخادم
  • من الممكن تقليل الإعداد إلى مجموعة الرموز النجمية "* 911 * <SIP_ACC>" - في بعض الحالات ، لا يكون لهذه الوظيفة ببساطة سعر. لن يتمكن كل موظف في المكتب من تكوين هاتف IP ، لكن الاتصال بمجموعة من الأرقام مهمة بسيطة.

دعنا نصف كيف تعمل ميزة Autoprovisioning Plug & Play. في نهاية المقال ، رابط إلى الكود المصدري لبرنامج نصي PHP صغير يقوم بتنفيذ وظيفة خادم PnP.

دراسة حالة


كان لدينا حالة مثيرة للاهتمام عند تقديم الاتصالات الهاتفية لأحد عملائنا. المشكلة الرئيسية هي أن العميل كان في مدينة أخرى. في الوقت نفسه ، كان أحد المتطلبات أنه بعد تفريغ الطرد بالهواتف وتوصيلها بالشبكة ، يجب أن تعمل المهاتفة على الفور.

تم حل المشكلة ببساطة نسبيا. قام العميل بحجز عدد من عناوين IP الخاصة بنا. قمنا بإعداد المعدات في مكتبنا وتعبئتها في صندوق وإرسالها عن طريق البريد.

باستخدام التكوين التلقائي للجهاز ، ستصبح المهمة أكثر بساطة.

مخطط PnP المبسط


يرسل الهاتف في بداية العمل طلب بث SIP SUBSCRIBE إلى عنوان IP للإرسال المتعدد 224.0.1.75 .
قراءة المزيد عن 224.0.1.75
224.0.1.75 - هذا هو IP الإرسال المتعدد (للإرسال المتعدد) "محفوظة" لخوادم SIP.
راجع networksorcery.com/Enp/protocol/sip.htm
224.0.1.75 SIP ، بروتوكول بدء الجلسة (جميع الخوادم).

رداً على ذلك ، يتوقع تلقي رد NOTIFY مع إرشادات التكوين.

صورة

مثال على الاشتراك
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 


العناوين الأكثر أهمية ومثيرة للاهتمام


  • من - عنوان الخشخاش للجهاز هو 0015657322ff
  • حدث - يصف بشكل شامل الجهاز والشركة المصنعة والطراز وإصدار البرنامج الثابت
  • الاتصال - عنوان الجهاز
  • Call-ID - هذا الرأس مثير للاهتمام عند تكوين أجهزة DECT من Yealink ، فهو ينقل معرف الخط (الرقم التسلسلي للأنبوب) ، والمحدد " _ "

بمجرد تلقي خادم PnP مثل هذا الطلب ، يجب أن يستجيب

مثال المثال
 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 


في رسالة NOTIFY ، تكون المعلومات الأكثر قيمة في نص الرسالة. كقاعدة عامة ، في الجسم يجب عليك تمرير رابط للحصول على ملف التكوين:

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

إذا كانت هناك عدة خوادم PnP تعمل على الشبكة ، فسيكون ذلك هو أول من يستجيب للجهاز.

عند استلام NOTIFY ، يحاول الهاتف تلبية الطلب على العنوان المحدد.

طلب الخادم ومثال الاستجابة
 # 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) ... 


مثال تنفيذ الخادم متاح على github https://github.com/boffart/MikoServerPnP

لكي يعمل خادم PnP هذا ، يجب عليك:

  • PHP 7.1.9
  • مآخذ php
  • BusyBox v1.26.2
  • يجب السماح بطلبات البث على الشبكة

ميزات خادم PnP


  • يستمع إلى الطلبات المرسلة إلى العنوان " 224.0.1.75:5060 "
  • عند بدء تشغيله ، يبدأ تشغيل خادم الويب ( busybox httpd )
  • يسمح لك بإنشاء تكوين مبسط للهاتف
  • يسمح لك بإرسال إلى Yealink NOTIFY لإعادة التشغيل

يتيح لك استخدام خادم PnP استخدام "الروابط لمرة واحدة".


لنفترض أننا نقدم الملف من خلال الرابط:

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

الرابط المباشر المعتاد للملف. من الواضح ، هذه ليست آمنة. معرفة عنوان MAC للهاتف وعنوان الخادم ، يمكنك محاولة الحصول على التكوين مع تسجيل الدخول وكلمات المرور.

عند العمل مع خادم PnP ، من الممكن إعطاء رابط فريد لكل طلب اشتراك:

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

مثال على صيغة لحساب التجزئة:

 hash = md5(MAC + DATE + PID) 

PID هو معرف العملية لخادم PnP. الجذر فقط يمكن التعرف عليه.
لاختيار هذا التجزئة هو عمليا مستحيل.

إذا حدث استئناف عبر رابط غير صالح ، فإننا نمنع الآفة.

إعادة تشغيل Yealink NOTIFY يعني دون إذن


نعم ، نعم ، دون إذن .
لم أستطع إغلاق الجهاز من الإصدار الحالي للبرامج الثابتة من هذا الاحتمال.

فقط قم بتشغيل الأمر

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

وسيذهب الهاتف إلى إعادة التشغيل. من خلال تعليق مثل هذا الأمر في cron ، يمكنك تحقيق تأثير مرعب. بالطبع ، هذا ممكن إذا علمنا عنوان IP ومنفذ SIP للهاتف.

مثال PHP وظيفة لإرسال الإخطار
  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); } 


تكوين خادم PnP


تقع في الإعدادات / 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": "**" } 

القائمة البيضاء لماك


يمكن وصفها في الإعدادات / mac_white.conf . فاصل - تغذية الخط.

قائمة ماك السوداء


يمكن وصفها في الإعدادات / mac_black.conf . فاصل - تغذية الخط.

ملفات تكوين الهاتف


يجب أن توضع في دليل التكوينات .
باستخدام خادم PnP ، يمكنك إنشاء أبسط التكوينات لـ Yeakink و Snom:

 php -f MikoServerPnP.php mk_config SIP_ACCAUNT SECRET MAC 

مواد مفيدة


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


All Articles