Tagungsräume basierend auf Asterisk

Vorwort


Guten Tag.

Es gab zwei Dinge, die mich dazu veranlassten, diesen Artikel zu schreiben: eine kleine Anzahl oder das Fehlen moderner Arbeitsbeispiele für Asterisk-Chips sowie die Zurückhaltung von Spezialisten, dieselben Chips mit den anderen zu teilen. Das bin ich jetzt über die RU-Community. Alle Arten von "Großvätern" in den Foren überschütten Sie eher mit Slops und schicken Sie zum Lesen von Büchern vor einem Jahrzehnt, als um nützliche Informationen zu geben. Die Forenthemen selbst, die in den Jahren 2005 bis 2010 erstellt wurden, sind sehr veraltet und manchmal wurde bereits etwas aus der aktuellen Version des Sternchens herausgesägt, und es muss etwas überarbeitet werden, damit es funktioniert.

Also.
Infolge der Aufgabe von CUCM zugunsten von Asterisk wurde das Management beauftragt, die beliebtesten Dienste unter den Benutzern in ihrer ursprünglichsten Form beizubehalten, um die Menschen nicht zu frustrieren. Eine davon war die Schaffung von Konferenzen. Zu diesem Zeitpunkt war ich bereits mit Asterisk vertraut, aber nicht so tief, so dass ich ungefähr anderthalb Wochen brauchte, um alle Arten von Konferenzoptionen zu sortieren, und eine andere Aufgabe ergab eine endgültige Entscheidung.

Das Problem ist, dass es von einer ähnlichen Lösung einen Artikel mit einem veralteten Treffen gibt sowie eine Art Monster , das ich immer noch nicht zur Arbeit bringen konnte. Ich schlage etwas vor, das nicht so sperrig ist.

Zellstoff


Ich werde nicht beschreiben, was Confbridge ist, für welche Abschnitte in dieser oder jener Konfiguration verantwortlich ist und was diese Option ist. Diese Informationen sind verfügbar und relevant. Nun zur Entscheidung als Ganzes.

Ziel: Ermöglichen, dass die Konferenz während eines Gesprächs erstellt wird, und dann weitere Abonnenten dort einladen. Das Hauptproblem ist, dass die Channelredirect-Funktion nicht wie gewünscht funktioniert. Das heißt, wenn Sie es während eines Gesprächs über den Wählplan ausführen, wird einer der Kanäle bei Bedarf abfliegen und der zweite wird zusammenbrechen. Das Klettern des gesamten Wählplans auf zwei Zeilen und das Registrieren der Option g auf Dials war faul. Und ich verstehe nicht, warum in den meisten Handbüchern jeder versucht, das Problem nur über den Wählplan zu lösen, ohne die Fähigkeit des Sternchens zu beachten, mit externen Skripten und ami zu arbeiten.

Also. Sternchen 14.4.0

Konferenzskript für 2 Optionen (mit Kommentaren):

Konferenz.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); } } 


Programmiergurus können den Code reparieren, indem sie daraus Süßigkeiten machen. Ich habe so gut ich konnte geschrieben.
Als Nächstes verwenden wir dieses Skript direkt in Asterisk.

Um eine Konferenz zu erstellen, habe ich die Kombination * 1 gewählt. Kurz und überschneidet sich nicht mit der Hauptnummerierung.

Fügen Sie der Datei functions.conf einen Skriptaufruf mit den erforderlichen Variablen hinzu, die an sie übergeben werden

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

Damit dies funktioniert, erstellen Sie eine Variable im Wählplan im Abschnitt [Globals] und fügen Sie unsere Funktion hinzu

 DYNAMIC_FEATURES=conference 

Um einer bereits erstellten Konferenz neue Teilnehmer hinzuzufügen, müssen Sie den Code in confbridge.conf registrieren

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

Nun, das Beste ist jetzt extensions.ael:

So erstellen Sie eine Konferenz (PHP-Skript adressiert hier beide Gesprächskanäle):

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

So fügen Sie einen neuen Benutzer hinzu (dialplan_exec-Adressen hier):

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

Das ist alles. Keine Kilotonnen Code im Wählplan. Alles ist geräumig. * 1 in einem Gespräch und Sie sind wieder in einer Konferenz * 1 Piepton und Wählen, wen Sie hinzufügen möchten.

Wachstum


Durch die Wünsche der Benutzer verwirrt, begann ich, diese Funktion zu entwickeln.

Das nächste war die Möglichkeit, Konferenzen von Grund auf neu zu erstellen (nicht aus einer Konversation) sowie bereits erstellte Konferenzen anhand ihrer Nummer aufzurufen und nicht auf einen einladenden Anruf zu warten

Zum Wählplan hinzufügen:

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

Zum Skript hinzufügen:

Konferenz.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); 


Ich musste auch die Zeile _ * X ändern.

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

Um an der Konferenz teilzunehmen oder sie von Grund auf neu zu erstellen, rufen Sie einfach * 1 und eine Nummer an, z. B. * 15234.

Die letzte Mutation dieses Dienstes ist die sogenannte „Gruppenkonferenz“. Dies ist, wenn die großen Chefs zu faul sind, um alle manuell hinzuzufügen, aber ich möchte einen Knopf drücken und alles ist zusammengebaut. Zu diesem Zweck habe ich beschlossen, separate Service-Codes (* XXX) zu erstellen, damit die Leute selbst nicht verwirrt werden. Für unsere Organisation ist es unwahrscheinlich, dass in den nächsten 100 Jahren über 1000 Konferenzgruppen benötigt werden, daher sollte genügend Nummerierungsbestand vorhanden sein. Zu Hause können Sie ein anderes Präfix hinzufügen, also weisen Sie eine andere Nummerierungskapazität zu.

Wählplan:

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

Das Knarren der Teilnehmer selbst:

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); } 


Alle Gruppen werden in der Datenbank gemäß der Struktur „Gruppe, Nummer, Name, Beschreibung“ gespeichert. Wenn eine neue Gruppe angezeigt wird, fügen Sie sie einfach der Datenbank hinzu.

Um beispielsweise alle Direktoren für eine Besprechung zu sammeln, muss der General nur noch * 100 wählen. Und in der Regel haben große Chefs große Telefone. Daher binden wir * 100 an einen beliebigen Kurzwahlschlüssel, signieren ihn als "Direktoren" und der Benutzer kümmert sich nicht darum, was er eingeben soll. Ich drückte den Knopf - ich sammelte die Besprechung.

Nun antizipieren Sie Ihre Fragen:

Warum Skripte und Ami? Weil ich es mittels Wählplan nicht geschafft habe, beide Kanäle vernünftig umzuleiten, ohne sie auf dem Weg zu verlieren. In ami können Sie in der Umleitungsfunktion einen zusätzlichen Kanal anhängen + eine Variable dafür festlegen (z. B. die Konferenznummer, damit er auch jemanden hinzufügen kann).

Möglicherweise stellen Sie auch fest, dass ich Features in einen separaten service_code-ael-Kontext gestellt habe. Dies ist praktisch, wenn Sie mehr als ein paar Funktionen haben. Ich habe beschlossen, sie durch * zu machen, deshalb schreibe ich in jedem Kontext einfach _ * X. und Adresse in diesem Zusammenhang. Vielleicht findet jemand eine elegantere Lösung, aber ich habe sie seit einigen Monaten nicht mehr gefunden. Und diese Funktionalität hat die Benutzer angesprochen.

Warum ael, nicht conf? Nun, weil es strukturierter und leichter zu lesen ist.
und verständlicher. Eine gotoif-Funktion ist es wert. Ich habe lua noch nicht erreicht.

Warum werden in der Massensammlung Beispiele durch Bash und nicht durch AMI erstellt? Das Problem ist, dass das System durch Ausführen einer Reihe von Ursprungsdaten in einer Reihe über ami darauf wartet, dass die vorherige abgeschlossen ist, um die nächste zu erhalten. Und wenn niemand den Hörer abhebt und es 20 Sekunden no_ans und solche 5 Teile gibt? Sie können bis zum Abend warten, um zu sammeln.

Nun, das ist wahrscheinlich alles. Ich hoffe, dieser Artikel wird den gleichen Suchenden helfen wie ich, als dies alles schnell, bequem für die Benutzer erledigt werden musste, und vor allem war die Wartung dieses Systems in Zukunft für mich sozusagen mit einer Reserve für die Zukunft bequem.

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


All Articles