قاعات اجتماعات على أساس العلامة النجمية

مقدمة


مساء الخير

كان هناك شيئان دفعاني إلى كتابة هذا المقال: عدد صغير أو عدم وجود أمثلة عمل حديثة على "رقائق" النجمة ، بالإضافة إلى إحجام المتخصصين عن مشاركة هذه "الرقائق" نفسها مع البقية. هذا أنا الآن عن مجتمع RU. جميع أنواع "الأجداد" في المنتديات من المرجح أن تمطر عليك بالمنازل وترسل لك قراءة كتب قبل عقد من الزمان بدلاً من تقديم معلومات مفيدة. مواضيع المنتدى نفسها ، التي تم إنشاؤها في 2005-2010 ، قديمة جدًا وأحيانًا ما تم بالفعل نشر شيء ما من الإصدار الحالي للعلامة النجمية ، وهناك شيء يجب إعادة بنائه كثيرًا لجعله يعمل.

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

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

اللب


لن أصف ما هو confbridge ، والأقسام في هذا التكوين أو ذاك المسؤول عن ذلك ، وما هو هذا الخيار ، هذه المعلومات متاحة وذات صلة. الآن حول القرار ككل.

الهدف: جعل المؤتمر ممكنا للانشاء خلال محادثة ، ثم دعوة المزيد من المشتركين هناك. المشكلة الرئيسية هي أن وظيفة توجيه القناة لا تعمل كما نود. أي إذا قمت بتنفيذها من خط الاتصال الهاتفي أثناء محادثة ، فإن إحدى القنوات ستطير عند الضرورة ، والثانية ستنهار ، وتسلق خط الاتصال الهاتفي بأكمله إلى سطرين وتسجيل الخيار g على Dials كان كسولًا. ولا أفهم لماذا يحاول الجميع في معظم الكتيبات حل المشكلة فقط من خلال خط الاتصال ، متجاهلين قدرة العلامة النجمية على العمل مع النصوص الخارجية و ami.

لذا النجمة 14.4.0

نص المؤتمر لخيارين (مع التعليقات):

Conference.php
<?php //    $host = "192.168.1.1"; $port = "5038"; $timeout = "10"; $user = "conference"; $pass = "1111"; // ,    1   2  $kusok = $argv[1]; //       if ($kusok == 1){ //  $channel = $argv[2]; $bridgepeer = $argv[3]; $confnum = $argv[4]; print_r($bridgepeer); print_r($confnum); // $sconn = fsockopen ($host, $port, $timeout) or die ("Connection to $host:$port failed!"); fputs ($sconn, "Action: Login\r\n"); fputs ($sconn, "Username: $user\r\n"); fputs ($sconn, "Secret: $pass\r\n\r\n"); //   fputs ($sconn, "Action: Setvar\r\n"); fputs ($sconn, "Channel: $channel\r\n"); fputs ($sconn, "Variable: CONFNUM\r\n"); fputs ($sconn, "Value: $confnum\r\n\r\n"); fputs ($sconn, "Action: Setvar\r\n"); fputs ($sconn, "Channel: $bridgepeer\r\n"); fputs ($sconn, "Variable: CONFNUM\r\n"); fputs ($sconn, "Value: $confnum\r\n\r\n"); // fputs ($sconn, "Action: Redirect\r\n"); fputs ($sconn, "Channel: $bridgepeer\r\n"); fputs ($sconn, "ExtraChannel: $channel\r\n"); fputs ($sconn, "Context: service_code-ael\r\n"); fputs ($sconn, "Exten: conference\r\n"); fputs ($sconn, "Priority: 1\r\n\r\n"); fputs($sconn, "Action: Logoff\r\n\r\n"); sleep(2); fclose ($sconn); } //     if ($kusok == 2) { //  $confnum = $argv[2]; $inviten = $argv[3]; $sconn = fsockopen ($host, $port, $errno, $errstr, $timeout) or die ("Connection to $host:$port failed!"); // fputs ($sconn, "Action: Login\r\n"); fputs ($sconn, "Username: $user\r\n"); fputs ($sconn, "Secret: $pass\r\n\r\n"); //     fputs ($sconn, "Action: Originate\r\n"); fputs ($sconn, "Channel: Local/".$inviten."@out-ael\r\n"); fputs ($sconn, "Context: service_code-ael\r\n"); fputs ($sconn, "Exten: conference\r\n"); fputs ($sconn, "Priority: 1\r\n"); fputs ($sconn, "Variable: CONFNUM=".$confnum."\r\n\r\n"); fputs($sconn, "Action: Logoff\r\n\r\n"); sleep(2); fclose ($sconn); } } 


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

من أجل إنشاء مؤتمر ، اخترت المجموعة * 1. لفترة وجيزة ولا يتقاطع مع الترقيم الرئيسي.

أضف استدعاء البرنامج النصي إلى features.conf مع المتغيرات المطلوبة التي تم تمريرها إليه

 [applicationmap] conference => *1,self,System(/usr/bin/php /home/script/conference.php 1 ${CHANNEL} ${BRIDGEPEER} ${CALLERID(num)}) 

بعد ذلك ، لكي يعمل هذا ، أنشئ متغيرًا في مخطط الاتصال في قسم [globals] وأضف ميزتنا

 DYNAMIC_FEATURES=conference 

لإضافة مشاركين جدد إلى مؤتمر تم إنشاؤه بالفعل ، ستحتاج إلى تسجيل الرمز في confbridge.conf

 [default_menu] type = menu *1=dialplan_exec(service_code-ael,conference_add,1) 

حسنًا ، الآن الجزء الأفضل هو الامتدادات. ael:

لإنشاء مؤتمر (يعالج البرنامج النصي php قناتي التحدث هنا):

  conference => { ConfBridge(${CONFNUM},,,default_menu); } 

لإضافة مستخدم جديد (عناوين dialplan_exec هنا):

 conference_add => { Read(INVITEN,dial,11,i); System(/usr/bin/php /home/script/conference.php 2 ${CALLERID(num)} ${INVITEN}); } 

هذا كل شيء. لا كيلو طن من التعليمات البرمجية في dialplan. كل شيء رحب. * 1 في محادثة وأنت في أسيوط ، مرة أخرى * 1 صفير والاتصال ، لمن تضيفه.

النمو


مرتبكًا برغبات المستخدمين ، بدأت في تطوير هذه الميزة.

كانت الفرصة التالية هي الفرصة لإنشاء مؤتمرات من الصفر (وليس من محادثة) ، وكذلك الانتقال إلى المؤتمرات التي تم إنشاؤها بالفعل من خلال رقمها ، وعدم انتظار مكالمة دعوة

أضف إلى خط الاتصال الهاتفي:

 _*1XXXX => { NoOp(${CONFCHAN}); Set(__CONFNUM=${EXTEN:2}); System(/usr/bin/php /home/script/conference.php 3 ${CONFCHAN} ${CONFNUM} ); } 

أضف إلى البرنامج النصي:

Conference.php
 //     if ($kusok == 3){ //  $channel = $argv[2]; $confnum = $argv[3]; // $sconn = fsockopen ($host, $port, $timeout) or die ("Connection to $host:$port failed!"); fputs ($sconn, "Action: Login\r\n"); fputs ($sconn, "Username: $user\r\n"); fputs ($sconn, "Secret: $pass\r\n\r\n"); //   fputs ($sconn, "Action: Setvar\r\n"); fputs ($sconn, "Channel: $channel\r\n"); fputs ($sconn, "Variable: CONFNUM\r\n"); fputs ($sconn, "Value: $confnum\r\n\r\n"); // fputs ($sconn, "Action: Redirect\r\n"); fputs ($sconn, "Channel: $channel\r\n"); fputs ($sconn, "Context: service_code-ael\r\n"); fputs ($sconn, "Exten: conference\r\n"); fputs ($sconn, "Priority: 1\r\n\r\n"); fputs($sconn, "Action: Logoff\r\n\r\n"); sleep(2); fclose ($sconn); 


كان علي أيضًا تعديل الخط _ * X.

  _*X. => { set(__CONFCHAN=${CHANNEL}); Dial(Local/${EXTEN}@service_code-ael); 

الآن ، للدخول إلى المؤتمر أو إنشائه من الصفر ، ما عليك سوى إجراء مكالمة إلى * 1 ورقم ، على سبيل المثال * 15234.

التحور النهائي لهذه الخدمة هو ما يسمى ب "مؤتمر المجموعة". يحدث هذا عندما يكون الرؤساء الكبار كسالى للغاية بحيث لا يمكنهم إضافة الجميع يدويًا ، لكني أريد الضغط على زر واحد ويتم تجميع كل شيء. للقيام بذلك ، قررت عمل رموز خدمة منفصلة (* XXX) حتى لا يختلط الأمر على الأشخاص أنفسهم. بالنسبة لمنظمتنا ، من غير المحتمل أن تكون هناك حاجة لأكثر من 1000 مجموعة مؤتمرات في المائة عام القادمة ، لذلك يجب أن يكون هناك ما يكفي من مخزون الترقيم. في المنزل ، يمكنك الإضافة كبادئة مختلفة ، لذا خصص سعة ترقيم مختلفة.

خط الاتصال الهاتفي:

  _*XXX=> { Set(CONFNUM=${CALLERID(num)}); System(/usr/bin/php /home/script/groups.php ${EXTEN:1} ${CONFNUM}); ConfBridge(${CONFNUM},,,default_menu); } 

صرير المشاركين أنفسهم:

groups.php
 //  function call ($group, $confnum) { $many = count($group); //       for ($i=0; $many>$i; $i++) { //    $num = trim(array_shift($group[$i])); // system("asterisk -rx \"channel originate Local/$num@out-ael application ConfBridge $confnum\""); } } //    function conf_group ($groupid) { //   $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); $pdo = new PDO("odbc:mssql_asterisk, "asterisk, "121212", $opt); //   $sql = "SELECT extension FROM [asterisk].[dbo].[conf_groups] where groupid = $groupid"; $select = $pdo->query($sql); $result = $select->fetchAll(); // $pdo = NULL; return $result; } //  ,    $groupid = $argv[1]; //   $confnum = $argv[2]; //   $group=conf_group($groupid); // call($group, $confnum); } 


يتم تخزين جميع المجموعات في قاعدة البيانات وفقًا لهيكل "المجموعة ، الرقم ، الاسم ، الوصف". إذا ظهرت مجموعة جديدة ، فما عليك سوى إضافتها إلى قاعدة البيانات.

الآن ، لتجميع ، على سبيل المثال ، جميع المديرين للاجتماع ، يحتاج العام فقط إلى طلب * 100. وكقاعدة عامة ، يمتلك الرؤساء الكبار هواتف كبيرة. لذلك ، نربط * 100 بأي مفتاح طلب سريع ، ونوقع عليه كـ "مخرجين" ولا يزعج المستخدم ما يكتبه. ضغطت على الزر - جمعت الاجتماع.

توقع أسئلتك الآن:

لماذا مخطوطات و ami؟ لأنه من خلال خط الاتصال الهاتفي ، لم أتمكن من إجراء إعادة توجيه عاقل لكلتا القناتين دون فقدهما على طول الطريق. في ami ، في وظيفة إعادة التوجيه ، يمكنك إرفاق قناة إضافية + تعيين متغير لها (على سبيل المثال ، رقم المؤتمر ، حتى يتمكن أيضًا من إضافة شخص إليه).

قد تلاحظ أيضًا أنني أضع الميزات في سياق service_code-ael منفصل. هذا مناسب عندما يكون لديك أكثر من قطعتين من أي ميزات. قررت أن أجعلها من خلال * ، لذلك ، في أي سياق ، فقط أكتب _ * X. والعنوان في هذا السياق. ربما يجد شخص ما حلاً أكثر أناقة ، لكنني لم أجده منذ عدة أشهر. وهذه الوظيفة جذبت المستخدمين.

لماذا ael ، لا أسيوط؟ حسنًا ، لأنها أكثر تنظيمًا وأسهل للقراءة.
وأكثر قابلية للفهم. وظيفة gotoif واحدة تستحق ذلك. لم تصل بعد إلى لوا.

لماذا في المجموعة الجماعية ينشأ المثال من خلال bash وليس من خلال AMI؟ تكمن المشكلة في أنه من خلال تنفيذ مجموعة منشأ على التوالي من خلال ami ، ينتظر النظام لاستكمال السابق لإعطاء التالي. وإذا لم يلتقط أحد الهاتف ، وكان هناك 20 ثانية no_ans ومثل هذه القطع الخمس؟ يمكنك الانتظار حتى المساء لجمع.

حسنًا ، ربما هذا كل شيء. آمل أن تساعد هذه المقالة نفس الباحثين كما كنت عندما كنت بحاجة إلى القيام بكل هذا بسرعة وبشكل مريح للمستخدمين ، والأهم من ذلك ، في المستقبل للحفاظ على هذا النظام كان ملائمًا لنفسي ، إذا جاز التعبير ، مع احتياطي للمستقبل.

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


All Articles