ستتحدث المقالة عن
الإصدار 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.
يتم عرض قائمة القواعد على النحو التالي:

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