アスタリスクに基づいた会議室

まえがき



こんにちは



この記事を書くきっかけとなったのは、アスタリスクの「チップ」の少数または最新の実例の不足と、これらの「チップ」を他の人と共有する専門家の不本意です。 これは、RUコミュニティについてです。 フォーラムのあらゆる種類の「祖父」は、少し有益な情報を提供するよりも、10年前の本を読むようにあなたにスロップを浴びせ、あなたを送る可能性が高いです。 2005年から2010年に作成されたフォーラムトピック自体は非常に時代遅れであり、現在のバージョンのアスタリスクから既に一部が削除されている場合があります。



だからここに。

アスタリスクを支持してCUCMを放棄した結果、経営者は、人々をイライラさせないように、最も人気のあるサービスを最も独創的な形でユーザーに維持することを任されました。 これらの1つは、会議の作成です。 その時までに、私はすでにアスタリスクに精通していましたが、それほど深くはなかったので、すべての種類の会議オプションを整理するのに約1週間半かかり、別のタスクが最終決定に至りました。



問題は、それに似た解決策から、時代遅れのミートミーを含む記事が存在するだけでなく、私がまだ仕事をすることができなかったある種のモンスターがあることです。 それほどかさばらないものをお勧めします。



パルプ



confbridgeとは何か、1つまたは別のconfigのどのセクションが担当するのか、このオプションは何なのかについては説明しません。この情報は利用可能で関連性があります。 さて、全体としての決定について。



目的:会話中に会議を作成できるようにし、そこにさらにサブスクライバーを招待します。 主な問題は、channelredirect関数が希望どおりに機能しないことです。 つまり、会話中にダイヤルプランからそれを実行すると、必要に応じてチャネルの1つが飛び出し、2つ目が崩壊し、ダイヤルプラン全体を2行に登り、Dialsのgオプションを登録するのが面倒になりました。 また、ほとんどのマニュアルで、外部スクリプトやamiを使用するアスタリスクの能力を無視して、だれもがダイヤルプランだけで問題を解決しようとする理由を理解していません。



だから。 アスタリスク14.4.0



2つのオプションの会議スクリプト(コメント付き):



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)
      
      





さて、今最高の部分はextensions.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}); }
      
      





それだけです ダイヤルプランにキロトンのコードはありません。 すべてが大容量です。 *会話中に1人、あなたがconfにいる場合、もう一度*ビープ音とダイヤル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など)を呼び出すだけです。



このサービスの最後の突然変異は、いわゆる「グループ会議」です。 これは、ビッグボスが面倒で全員を手動で追加できない場合ですが、ボタンを1つ押すとすべてが組み立てられます。 これを行うために、私は人々自身が混乱しないように、個別のサービスコード(* XXX)を作成することにしました。 私たちの組織では、今後100年間で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コンテキストに配置していることにお気づきかもしれません。 これは、2つ以上の機能を備えている場合に便利です。 私は*を介してそれらを作成することにしました。したがって、どのようなコンテキストでも、_ * Xと書くだけです。 このコンテキストでのアドレス。 おそらく誰かがよりエレガントなソリューションを見つけるでしょうが、私は数ヶ月間それを見つけていません。 そして、この機能はユーザーにアピールしました。



なぜconfではなくaelなのか? まあ、それはより構造化されており、読みやすいからです。

より理解しやすい。 1つのgotoif関数には価値があります。 私はまだルアに達していません。



なぜ大量収集の例では、AMIではなくbashによって作成された発信元なのですか? 問題は、amiを介して一連のOriginを実行することにより、システムが前のものが完了するまで待ってから次のものを提供することです。 そして、誰も電話をとらない場合、20秒のno_ansとそのような5個がありますか? あなたは収集するために夕方まで待つことができます。



まあ、それがおそらくすべてです。 この記事が私と同じ求職者の助けになることを願っています。これはすべて、ユーザーにとって迅速に、快適に行う必要があり、最も重要なことは、将来このシステムを維持することは、いわば、将来に備えて便利であるということです。



All Articles