Salas de reuniones basadas en asterisco

Pr贸logo


Buenas tardes

Hubo 2 cosas que me llevaron a escribir este art铆culo: un peque帽o n煤mero o la falta de ejemplos de trabajo modernos de "chips" de Asterisk, as铆 como la reticencia de los especialistas a compartir estos mismos "chips" con el resto. Este soy yo ahora sobre la comunidad RU. Es m谩s probable que todo tipo de "abuelos" en los foros lo llene de descuidos y lo env铆e a leer libros de hace diez a帽os en lugar de darle poca o m谩s informaci贸n 煤til. Los propios temas del foro, creados en 2005-2010, est谩n muy desactualizados y, a veces, ya se ha eliminado algo de la versi贸n actual del asterisco, y hay que rehacer mucho para que funcione.

Entonces aqu铆.
Como resultado del abandono de CUCM en favor de Asterisk, la administraci贸n se encarg贸 de preservar los servicios m谩s populares entre los usuarios en su forma m谩s original, para no frustrar a las personas. Una de ellas fue la creaci贸n de conferencias. En ese momento, ya estaba familiarizado con Asterisk, pero no tan profundamente, as铆 que me tom贸 alrededor de una semana y media ordenar todo tipo de opciones de conferencia, y una tarea diferente surgi贸 con una decisi贸n final.

El problema es que a partir de una soluci贸n similar a la que hay, hay un art铆culo con un encuentro desactualizado, as铆 como alg煤n tipo de monstruo que todav铆a no pude poner a trabajar. Sugiero algo no tan voluminoso.

Pulpa


No describir茅 qu茅 es confbridge, de qu茅 secciones de una configuraci贸n en particular son responsables y de qu茅 es esta opci贸n, solo tendr茅 esta informaci贸n y est谩 actualizada. Ahora sobre la decisi贸n en su conjunto.

Objetivo: hacer posible la conferencia para crear durante una conversaci贸n, y luego invitar a m谩s suscriptores all铆. El principal problema es que la funci贸n channelredirect no funciona como nos gustar铆a. Es decir, si lo ejecuta desde el plan de marcado durante una conversaci贸n, entonces uno de los canales saldr谩 volando cuando sea necesario, y el segundo colapsar谩, y subir todo el plan de marcado a 2 l铆neas y registrar la opci贸n g en Diales fue flojo. Y no entiendo por qu茅 en la mayor铆a de los manuales todos intentan resolver el problema solo a trav茅s del plan de marcado, ignorando la capacidad del asterisco para trabajar con scripts externos y ami.

Entonces Asterisco 14.4.0

Script de conferencia para 2 opciones (con comentarios):

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


Los gur煤s de la programaci贸n pueden arreglar el c贸digo haciendo dulces, escrib铆 lo mejor que pude.
A continuaci贸n, comenzamos a usar este script directamente en el propio Asterisk.

Para crear una conferencia, eleg铆 la combinaci贸n * 1. Brevemente y no se cruza con la numeraci贸n principal.

Agregue una llamada de script a features.conf con las variables requeridas que se le pasen

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

Luego, para que esto funcione, cree una variable en el plan de marcado en la secci贸n [globales] y agregue nuestra funci贸n

 DYNAMIC_FEATURES=conference 

Para agregar nuevos participantes a una conferencia ya creada, deber谩 registrar el c贸digo en confbridge.conf

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

Bueno, ahora la mejor parte son las extensiones.

Para crear una conferencia (el script php aborda ambos canales de conversaci贸n aqu铆):

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

Para agregar un nuevo usuario (direcciones de dialplan_exec aqu铆):

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

Eso es todo. No hay kilotones de c贸digo en el plan de marcado. Todo es espacioso. * 1 en una conversaci贸n y est谩 en una conf, de nuevo * 1 pitido y marcando, a qui茅n agregar.

Crecimientos


Confundido por los deseos de los usuarios, comenc茅 a desarrollar esta funci贸n.

La siguiente fue la oportunidad de crear conferencias desde cero (no desde una conversaci贸n), as铆 como ir a conferencias ya creadas por su n煤mero y no esperar una llamada de invitaci贸n.

Agregar al plan de marcado:

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

A帽adir al gui贸n:

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


Tambi茅n tuve que modificar la l铆nea _ * X.

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

Ahora, para ingresar a la conferencia o crearla desde cero, simplemente llame al * 1 y a un n煤mero, por ejemplo * 15234.

La mutaci贸n final de este servicio es la llamada "conferencia grupal". Esto es cuando los grandes jefes son demasiado vagos para agregar a todos manualmente, pero quiero presionar un bot贸n y todo est谩 ensamblado. Para hacer esto, decid铆 crear c贸digos de servicio separados (* XXX) para que las personas no se confundan. Para nuestra organizaci贸n, es poco probable que se necesiten m谩s de 1000 grupos de conferencia en los pr贸ximos 100 a帽os, por lo que deber铆a haber suficiente stock de numeraci贸n. En casa, puede agregar como un prefijo diferente, as铆 que asigne una capacidad de numeraci贸n diferente.

Dialplan:

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

El crujido de los propios participantes:

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


Todos los grupos se almacenan en la base de datos de acuerdo con la estructura de "Grupo, n煤mero, nombre, descripci贸n". Si aparece un nuevo grupo, simplemente agr茅guelo a la base de datos.

Ahora, para recopilar, por ejemplo, todos los directores para una reuni贸n, el general solo necesita marcar * 100. Y como regla, los grandes jefes tienen tel茅fonos grandes. Por lo tanto, vinculamos * 100 a cualquier tecla de marcaci贸n r谩pida, la firmamos como "directores" y el usuario no se molesta en escribir. Presion茅 el bot贸n. Reun铆 la reuni贸n.

Ahora anticipando sus preguntas:

驴Por qu茅 guiones y ami? Porque mediante el plan de marcado no pude hacer una redirecci贸n sensata de ambos canales sin perderlos en el camino. En ami, en la funci贸n de redireccionamiento, puede adjuntar un canal adicional + configurar una variable para 茅l (por ejemplo, el n煤mero de conferencia, para que tambi茅n pueda agregarle alguien).

Tambi茅n puede notar que pongo caracter铆sticas en un contexto separado de service_code-ael. Esto es conveniente cuando tiene m谩s de un par de piezas de cualquier caracter铆stica. Decid铆 hacerlos a trav茅s de *, por lo tanto, en cualquier contexto, simplemente escribo _ * X. y direcci贸n en este contexto. Quiz谩s alguien encuentre una soluci贸n m谩s elegante, pero no la he encontrado en varios meses. Y esta funcionalidad atrajo a los usuarios.

驴Por qu茅 ael, no conf? Bueno, porque es m谩s estructurado y m谩s f谩cil de leer.
y m谩s comprensible Una funci贸n gotoif vale la pena. Todav铆a no he llegado a lua.

驴Por qu茅 en el ejemplo de colecci贸n masiva se originan a trav茅s de bash y no a trav茅s de AMI? El problema es que al ejecutar un mont贸n de originar en una fila a trav茅s de ami, el sistema espera a que se complete el anterior para dar el siguiente. 驴Y si nadie levanta el tel茅fono, y hay 20 segundos sin_ans y esas 5 piezas? Puedes esperar hasta la noche para recoger.

Bueno, eso es probablemente todo. Espero que este art铆culo ayude a los mismos buscadores que yo cuando todo esto deb铆a hacerse de manera r谩pida, c贸moda para los usuarios, y lo m谩s importante, en el futuro, mantener este sistema fue conveniente para m铆, por as铆 decirlo, con una reserva para el futuro.

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


All Articles