النجمة. Dialplan Askozia 6. المكالمات الصادرة

ستتحدث المقالة عن الإصدار 6 المجاني من PBX Askozia . عند تطوير مقسم الهاتف ، كانت إحدى المهام الأولى تنظيم المكالمات الصادرة.

كيف كان ذلك


في الإصدار القديم من Askozia ، تم استخدام قوالب "dialplan" القياسية.

  • X! - جميع أرقام الهواتف
  • XXX - ثلاثة أرقام
  • .! - بالتأكيد جميع أرقام الهواتف

يمكن وصف مثال للسياق بشكل تخطيطي:

[outgoing] exten => _XXXXXX!,1,NoOp(Start outgoing calling...) same => n,Dial… 

بدا لنا أن هذا النهج غير مرن بما فيه الكفاية. لا توجد طريقة لوصف القاعدة التالية:

  • يبدأ الرقم في 79
  • يتبع 35 أو 26
  • باقي العدد هو 7 أرقام

تحت الخفض ، يتم وصف نهجنا ونتائج التطوير.

التنفيذ الحالي


قررنا تنفيذ هذه الوظيفة بشكل مختلف ، باستخدام REGEX .

مثال على القالب:

 79(25|26)[1-9]{7} 

  • (25 | 26) هو 25 أو 26
  • [0-9] - رقم من 0 إلى 9 ، وحدث من الأوقات الأولى أو أكثر
  • {7} - عدد مرات تواجد الحرف السابق

بناء جملة دالة REGEX هو:

 REGEX("regular expression" string) Return '1' on regular expression match or '0' otherwise 

مثال للاستخدام في Askozia 6:

 [outgoing] exten => _X!,1,NoOp(Start outgoing calling...) same => n,Ringing() same => n,ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-1-out,${EXTEN},1)) same => n,ExecIf($["${REGEX("^(7|8)[0-9]{10}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-2-out,${EXTEN},1)) same => n,Hangup() 

بالنسبة للمكالمات الصادرة ، يتم تنظيم نقطة دخول واحدة - السياق " الصادر " ، وتسمى وظيفة " ExecIf " فيه:

 ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"] 

إذا كان رقم الهاتف المحدد في المتغير " $ {EXTEN} " يتطابق مع النمط ، فسيتم توجيه المكالمة إلى السياق الفرعي باستخدام وظيفة " Gosub ".

إذا لم تنقطع المكالمة في السياق الفرعي ، فسيتم تشغيل المجموعة وفقًا للقاعدة المناسبة التالية.

بهذه الطريقة ، قمنا بحل المشكلة مع خطوط قناة واحدة. إذا كان الخط مشغولاً ، فستتواصل المكالمة مع الخط التالي حتى يتم الرد عليه.

أمثلة السياق:

 [SIP-PR-1] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-1/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return [SIP-PR-2] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-2/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return 

إلزامي في " sub " - يتحقق السياق من " DIALSTATUS ". إذا تم الرد على المكالمة ، فبعد انتهاء المحادثة ، سيتم إنهاء القناة باستخدام وظيفة " Hangup () ". إذا لم يتم ذلك ، فقد يحدث إعادة الاتصال برقم العميل في نهاية المكالمة.

دقة واحدة مهمة ، عند استخدام " Gosub " أو " Goto " ، فإننا لا نغير $ {EXTEN} عن قصد. حتى إذا كنت بحاجة إلى تعديل رقم الهاتف (إضافة / إزالة البادئة).

الحقيقة هي أنه عند تعديل EXTEN ، ستقوم العلامة النجمية بتعديل قيمة المتغير CDR (dst) ، مما سيؤدي إلى نتيجة سيئة التنبؤ في جدول محفوظات استدعاء CDR. أعتقد أنه من المهم في التاريخ الاحتفاظ بالعدد الذي طلبه الموظف.

كن حذرا عند وصف تعبير منتظم. استخدم الأحرف " ^ " ، بداية السطر و " $ " - نهاية السطر ، وإلا فقد تحصل على نتائج غير متوقعة.

على سبيل المثال ، فإن النموذج " [0-9] {6} " سوف يتوافق مع جميع الأرقام التي يوجد بها 6 أرقام أو أكثر. يطابق النموذج " ^ [0-9] {6} $ " أرقامًا مكونة من 6 أرقام فقط.

النتائج


لقد حصلنا على نظام فرعي مرن لوصف التوجيه الخارجي إلى PBX.
يتم عرض قائمة القواعد على النحو التالي:

صورة

مثال على بطاقة "قواعد" محددة:

صورة

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


All Articles