
IP ATC أستريسك هو معالج قوي للاتصال عبر بروتوكول الإنترنت. كما أن واجهة FreePBX المستندة إلى الويب والتي تم إنشاؤها لـ Asterisk تبسط التكوين إلى حد كبير وتخفض عتبة تسجيل الدخول.
إذا كان بإمكانك الخروج بنوع من المهام المتعلقة بهاتف IP ، فمن المؤكد أنه يمكن تنفيذه في Asterisk. ولكن تأكد من أن المثابرة والتحمل ستكون مطلوبة منك.
واجهنا مهمة إعداد إعلامات البريد الإلكتروني للمكالمات التي لم يرد عليها. بتعبير أدق ، للإبلاغ عبر البريد الإلكتروني عن الحالات التي تم فيها وضع قائمة انتظار لمكالمة واردة ، ولكن لم يرد أحد (من الوكلاء) على هذه المكالمة الواردة.
والمثير للدهشة أننا لم نجد أي أدوات منتظمة لحل هذه المشكلة في FreePBX. سأتحدث عن كيفية حل هذه المشكلة في ظل الخفض.
مقدمةقبل حل المشكلة "وجهاً لوجه" ، بحثنا بالتأكيد عن معلومات على الإنترنت ، لكننا لم نعثر على حلول جاهزة (ربما كانت تبدو سيئة ، ولكن ماذا يمكنك أن تفعل ...).
لا يوجد عدد كبير من مهارات العمل في العلامة النجمية مباشرة كما نود ، وبالتالي فإن الحل المقترح
هنا لم يكن مفهوما بالكامل وتم التخلص منه.
أعجبني الحل المقترح
هنا ، رغم أنه لم ينجح. وبالتالي ، أكدوا أن العمل في علامة النجمة ضروري في سياق [قوائم الانتظار]. وبما أننا نعمل في Freepbx ، نحتاج إلى العمل في ملف التكوين "extensions_override_freepbx.conf". لاحظنا أنه من المناسب "إجراء مكالمات لم يرد عليها" قبل حدث hangupcall (نهاية مكالمة).
بعد قراءة المناقشة
هنا ، طرحت الفكرة أننا بحاجة إلى تصفية متغير "التخلص" في CDR لجميع الوكلاء في قائمة الانتظار. وبعد قراءة
هذه المعلومات ، تم تشكيل خطوات محددة لحل هذه المهمة.
ماذا لدينا:هناك FreePBX 13.0.197 يستخدم العلامة النجمية 13.12.1. إصدار نظام التشغيل SHMZ الإصدار 6.6 (النهائي). يعتمد التوزيع على CentOS.
يتم تكوين النجمة مع IVR (القائمة الصوتية) المنتشرة المكالمات الواردة في قوائم انتظار مختلفة (قوائم الانتظار). يتم تعيين الوكلاء (الوكلاء) لكل قائمة انتظار ، أي الوكلاء.
نظريةما يحدث في النجمةعندما تصل مكالمة واردة إلى علامة النجمة ، تذهب تلك المكالمة إلى الرد الآلي. يقوم المتصل بالاختيار من خلال الضغط على رقم معين على الهاتف وإدخال قائمة انتظار محددة. بعد ذلك ، يتلقى جميع وكلاء قائمة الانتظار المجانية مكالمة في وقت واحد.
من أجل فهم أفضل لما يحدث في هذه اللحظة وما يحدث بعد ذلك ، ننتقل إلى تقرير CDR (الشكل 1).
الشكل 1عندما تقع مكالمة واردة في قائمة الانتظار ، أصبحت قيمة المتغير "التخلص" بالنسبة لجميع الوكلاء مساوية لـ "لا إجابة" إذا لم يكن الوكلاء مشغولين في تلك اللحظة. يمكن أن يأخذ المتغير "Disposition" قيمًا أخرى (راجع
https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ) ، باستثناء القيمة "الإجابة". وفي الوقت الذي يجيب فيه أحد الوكلاء على المكالمة الواردة ، تصبح قيمة متغير "التخلص" من هذا الوكيل مساوية لـ "الإجابة".
من تقرير CDR ، يمكنك ملاحظة أنه عند وضع قائمة الانتظار للمكالمة (في عمود التطبيق ، تصبح القيمة "قائمة انتظار") ، ثم تظهر جميع الأحداث بنفس "uniqueid" (عمود النظام).
مجلس الإنماء والإعمار في سطورمن المهم أن نفهم ما هو CDR ، وعند أي نقطة في CDR يتم إدخال البيانات التي نلاحظها في تقرير CDR. CDR ، نسبة إلى نظام التشغيل ، هي قاعدة البيانات التي تسجّل Asterisk تقرير مكالمة مفصلاً (انظر
https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ). في حالتنا ، هذه قاعدة بيانات تسمى asteriskcdrdb ، والتي تقع في mysql. من الناحية التجريبية ، وجدنا أن البيانات المتعلقة بمكالمة ذات "uniqueid" معينة لا يتم إدخالها في asteriskcdrdb فور حدوث الحدث ، ولكن بعد حدث hangupcall (نهاية المكالمة).
مبدأ الحل المخلوقنظرًا لأن لدينا معرفة أكثر في باش أكثر من المعرفة في أستريسك ، فإن الفكرة الرئيسية هي على النحو التالي. قبل الحدث hangupcall ، استدعاء البرنامج النصي bash. تمرير 3 معلمات لهذا البرنامج النصي. المعلمة الأولى هي "uniqueid" ، لتصفية البيانات الواردة من مجلس الإنماء والإعمار. المعلمة الثانية هي "CALLERID (num)" (رقم المتصل) لمعرفة من يجب الاتصال به مرة أخرى. المعلمة الثالثة هي "NODEST" (رقم قائمة الانتظار) ، التي تم تلقي المكالمة إليها ، لمعرفة المشكلة التي حدثت فيها مكالمة ، ولمن لإرسال إشعار عبر البريد الإلكتروني لمكالمة لم يرد عليها.
يجب أن يتصل البرنامج النصي bash بقاعدة بيانات asteriskcdrdb في mysql وأن يأخذ جميع قيم المتغير "Disposition" مع "uniqueid" محدد. من البيانات التي تم الحصول عليها ، من الضروري استبعاد القيم: "لا إجابة" ، "مشغول" ، "فشل" ، "غير معروف". ونتيجة لذلك ، ستبقى "الإجابة" - أجابوا على المكالمة الواردة ، أو لا شيء على الإطلاق - المكالمة الفائتة.
علاوة على ذلك ، إذا لم يتم الاتصال ، يجب أن يرسل البرنامج النصي إشعارًا بالبريد الإلكتروني.
بالنظر إلى المستقبل ، ألاحظ نقطة مهمة. تنفذ العلامة النجمية الأوامر بالتسلسل ، في انتظار تنفيذها (وهو أمر منطقي بشكل عام). وسنتصل بالبرنامج النصي bash قبل تنفيذ أمر hangupcall. وبالتالي ، في الوقت الذي يتم فيه تنفيذ البرنامج النصي مباشرةً ، لن يتم إدخال المعلومات المتعلقة بالرقم الفريد الذي نبحث عنه في CDR بعد. لحل هذه المشكلة ، سنقوم باستدعاء البرنامج النصي bash باستخدام المعلمة "&" حتى تنتقل العلامة النجمية فورًا إلى الخطوة التالية ، وهي hangupcall. وداخل البرنامج النصي bash ، في البداية ، سنحدد مهلة زمنية صغيرة لإتاحة الوقت لـ Asterisk لإدخال البيانات مع "uniqueid" الذي يهمنا في CDR.
ممارسةقبل المتابعة لتكوين علامة النجمة وإنشاء برنامج نصي للباش ، تحتاج إلى تكوين إرسال إعلامات البريد الإلكتروني. لهذا ، سوف نستخدم الأداة المساعدة postfix.
إعداد Postfixلدينا مجال البريد "lucky.ru" الموجود في ياندكس. سنقوم بتهيئة postfix في وضع smtp-client وسنرسل رسائل من حساب asterisk@lucky.ru.
الحل مأخوذ من هنا:
https://www.dmosk.ru/miniinstruktions.php؟mini=postfix-over-yandex .
أولاً تثبيت / تحديث / التحقق من الحزم:
yum install postfix yum install mailx yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain
لن نقوم بالكتابة فوق ملف تكوين postfix الرئيسي "/etc/postfix/main.cf" ، لكننا سنعيده:
cp /etc/postfix/main.cf /etc/postfix/main.cf.sav
نقوم بتحرير الملف "/etc/postfix/main.cf" وننقله إلى النموذج التالي:
nano /etc/postfix/main.cf
ليس كل سطر في "/etc/postfix/main.cf" يمكن التعليق عليه. لا يتم تحديد التعليقات في بعض الأسطر بواسطة المحلل اللغوي ويتم تمريرها إلى المعالجة ، وهذا يؤدي إلى أخطاء. من الأفضل رفض التعليقات داخل هذا الملف. يمكنك تجربة ذلك عن طريق تشغيل "tail -f / var / log / messages" في النافذة التالية.
سأضع علامة على السطر "smtputf8_autodetect_classes = الكل". يتضمن هذا الإدخال utf-8 افتراضيًا ، والذي يسمح لك باستخدام الأبجدية السيريلية في نص الرسالة وفي سطر الموضوع دون معالجة إضافية (راجع
http://www.postfix.org/SMTPUTF8_README.html ).
قم بإنشاء دليل لملفات التكوين:
mkdir /etc/postfix/private
نقوم بتحرير الملف "/ etc / postfix / private / sender_relay". في ذلك ، تحتاج إلى تحديد خادم smtp الذي تحتاج إلى الرجوع إليه عند استخدام مجال البريد لدينا:
nano /etc/postfix/private/sender_relay
نقوم بتحرير الملف "/ etc / postfix / private / sasl_passwd". فيه سنشير إلى عنوان البريد الإلكتروني الذي سنستخدمه لإرسال الرسائل ، وكذلك اسم المستخدم وكلمة المرور لهذا الحساب (نحدد اسم المستخدم وكلمة المرور من خلال نقطتين):
nano /etc/postfix/private/sasl_passwd
تحرير الملف / etc / postfix / عام. سنقوم فيه بتدوين قواعد استبدال العنوان الصادر (راجع
https://wiki.merionet.ru/ip-telephoniya/30/postfix-nastrojka-otpravki-pochty-v-asterisk/ ):
nano /etc/postfix/generic
يعتمد العنوان الصادر الأول على محتويات "/ etc / hosts" و "/ etc / hostname" ، وكذلك على اسم المستخدم الذي سيرسل الرسالة. هذا على الرغم من أننا نستخدم عميل بروتوكول نقل البريد الإلكتروني وإرسال رسائل من asterisk@lucky.ru ، على أي حال ، فإن postfix سيحل في البداية محل "شيء خاص" في عنوان المرسل ويجب تصحيح هذا بالقواعد من ملف التكوين هذا.
سأذكر محتويات ملف / etc / hosts الخاص بي:
cat /etc/hosts
من المهم أن يحتوي الخادم على أي مجال (القيمة بعد الفترة) ، لأن أداة البريد الإلكتروني "تبحث عن" اسم المجال في "/ etc / hosts" وإذا لم "تجد" ذلك على الفور ، فسوف تستمر في القيام بذلك لعدة دقائق إضافية و عندها فقط أرسل رسالة. وهذا هو ، إذا لم يتم تسجيل المجال ، ثم سوف يغادر الرسالة مع تأخير لعدة دقائق.
سأذكر محتويات ملف / etc / hostname الخاص بي:
cat /etc/hostname
بعد ذلك ، تحتاج إلى نقل ملفات التكوين التي تم إنشاؤها إلى قواعد البيانات المفهرسة ، للقيام بذلك ، قم بتشغيل الأمر التالي:
postmap /etc/postfix/generic && postmap /etc/postfix/private/{sasl_passwd,sender_relay}
بعد ذلك ، نحتاج إلى تنزيل شهادة smtp.yandex.ru ووضعها على الخادم ، للقيام بذلك ، قم بتشغيل الأمر التالي:
openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25 > /etc/postfix/ca.pem
ولكن بعد ظهور المعلومات الفنية على الشاشة ، سيواصل الفريق "تعليقه". اضغط على Ctrl + C لإحباطه.
الآن قم بحذف جميع البيانات المهملة يدويًا من الملف الناتج واترك الشهادة فقط. يجب أن تحصل على شيء مثل هذا:
nano /etc/postfix/ca.pem
أخيرًا ، أعد تشغيل postfix:
service postfix restart
نرسل رسالة اختبار:
echo " " | mail -s " " admin@lucky.ru
admin@lucky.ru - عنوان الوجهة
هذا يكمل التكوين البادئة.
كتابة السيناريو باشقم بإنشاء دليل لتخزين نص برمجي bash (هنا شخص ما يعجبه أين):
mkdir /home/asterisk/scripts
قم بإنشاء ملف نصي bash:
touch /home/asterisk/scripts/noanswer.sh
نعطي أذونات ملف البرنامج النصي للتنفيذ:
chmod +x /home/asterisk/scripts/noanswer.sh
إذا كانت هناك شكوك حول حقوق الملف ، فيمكنك أثناء تصحيح الأخطاء منح حق الوصول الكامل إلى الملف. لكنها "ليست آمنة".
chmod 777 /home/asterisk/scripts/noanswer.sh
نص البرنامج النصي bash:
nano /home/asterisk/scripts/noanswer.sh
تحليل موجز للنص:
"النوم 7":
هذا هو الوقت نفسه التأخير الذي كتب عنه في وقت سابق. لدينا تأخير لمدة 7 ثوان. على الرغم من أنني أعتقد أن ثانية واحدة كافية.
«res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"»:
الاستعلام في mysql نضع في متغير منفصل للراحة.
بعد ذلك ، نقدم طلبًا في mysql ونرشح الناتج الناتج. نقوم بإزالة جميع الخيارات باستثناء "الإجابة" ، إن وجدت. إذا كان هناك العديد من قيم "الإجابة" ، فينبغي ترك قيمة واحدة فقط. في النهاية ، في متغير "الإجابة" نحصل إما "إجابة" أو "".
إذا كانت قيمة متغير الإجابة لا تساوي الإجابة ، فهذا مكالمة لم يرد عليها. اعتمادًا على رقم قائمة الانتظار ، باستخدام عامل تشغيل الحالة ، سنقوم بتعيين العنوان الذي من الضروري إرسال إشعار بالبريد الإلكتروني وما يجب كتابته في هذه الرسالة (جزء متغير من الرسالة).
فيما يلي خيار عندما يتم تعيين قائمة الانتظار في علامة النجمة ، لكن غير موصوف في البرنامج النصي. في هذه الحالة ، سيتلقى admin@lucky.ru رسالة تفيد بأن قائمة الانتظار غير معروفة للبرنامج النصي.
إذا تم وصف قائمة الانتظار ، فسيتم إرسال خطاب وجهة ورسالة مكررة إلى admin@lucky.ru للإشارة إلى "uniqueid" ، بحيث يمكنك تتبع الأحداث في هذه المكالمة ، إذا لزم الأمر.
هذا ينتهي البرنامج النصي.
ألاحظ أنه للاتصال بـ mysql ، استخدمنا اسم المستخدم وكلمة المرور اللذين عرفناهما مقدمًا. في FreePBX ، لمعرفة معلومات تسجيل دخول مستخدم Asterisk في mysql ، قم بتشغيل الأمر التالي:
cat /etc/amportal.conf | grep AMPDBUSER
ولاكتشاف كلمة مرور مستخدم Asterisk في mysql ، قم بتشغيل الأمر التالي:
cat /etc/amportal.conf | grep AMPDBPASS
تكوين النجمةنحن نستخدم FreePBX. يحتوي FreePBX على أنواع مختلفة من ملفات التكوين (انظر
https://asterisk-pbx.ru/wiki/freepbx/files ) ، يتم الكتابة فوق بعضها بواسطة FreePBX عند إعادة التشغيل ، وبعضها لا يتم الكتابة فوقه (يطلق عليها اسم مخصص) ، حيث إنها مصممة خصيصًا لذلك. للمستخدم.
سنعمل مع ملف التكوين "extensions_override_freepbx.conf" ، لأنه من النوع المخصص.
أولاً ، تأكد من توصيل الملف "extensions_override_freepbx.conf" في الملف "/etc/asterisk/extensions.conf". للقيام بذلك ، قم بتنفيذ الأمر التالي:
cat /etc/asterisk/extensions.conf | grep extensions_override_freepbx.conf
نقوم بتحرير الملف "/etc/asterisk/extensions_override_freepbx.conf" وننقله إلى النموذج التالي:
nano /etc/asterisk/extensions_override_freepbx.conf
كما كتبت سابقًا ، فإن الرمز "&" في النهاية مطلوب. نظرًا لأننا سنعمل في نص برمجي bash مع بيانات CDR مباشرةً من قاعدة بيانات mysql ، ويتم إدخال هذه البيانات في mysql فقط بعد تنفيذ "exten => h ، 2 ، Macro (hangupcall ،)" ، لا نحتاج إلى انتظار استكمال نص bash ، وانتقل إلى الخطوة التالية في علامة النجمة. ويجب أن يحتوي البرنامج النصي bash نفسه على تأخير زمني قبل تنفيذ الجزء الرئيسي منه.
لكي تسري التغييرات في ملف التكوين "/etc/asterisk/extensions_override_freepbx.conf" ، ستحتاج إلى إعادة تشغيل kernel النجمية باستخدام الأمر التالي:
/usr/sbin/asterisk -rx "core restart now"
يجب القيام بذلك بعد إنشاء البرنامج النصي bash.
استنتاجربما تكون هذه هي الطريقة رقم 1001 "لالتقاط المكالمات الفائتة" في علامة النجمة. شارك في التعليقات كيف يمكنك حل هذه المشكلة. وما ، في رأيك ، يمكن تحسينه / إعادة بنائه / تحسينه. سنكون ممتنين للأفكار البناءة.