SCROLL
Среднее время на прочтение: 4 мин.

Динамические конференции на Asterisk 16 + FreePBX 14

В порядке рабочей необходимости поставилась задача по реализации динамических конференций на FreePBX. Из функционала должна быть возможность перевода активного разговора в конференцию, возможность приглашать новых участников в созданную динамическую конференцию находясь в ней, а так же возможность самостоятельному подключения к активной динамической конференции.

В интернете есть несколько примеров реализации подобного рода задачи, но я решил реализовать по своему и так как мне нужно. Итак все ниже описанные действия производились на Asterisk 16 + FreePBX 14 + phpAGI.

По-умолчанию phpAGI задействован в FreePBX и дополнительных манипуляций по его настройки не требуется. Если ниже описанные действия будут применяться к голому Asterisk, то как настроить на нем phpAGI можно прочитать из этой статьи.

JUQwJUEyJUQwJUI1JUQxJTg1JUQwJUJEJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQwJUJFJUQwJUI1JTIwJUQwJUI3JUQwJUIwJUQwJUI0JUQwJUIwJUQwJUJEJUQwJUI4JUQwJUI1JTNB

  • В активном разговоре нажать *7 — создание и перевод участников разговора в конференцию.
  • В конференции нажать *7 — после гудка набрать номер кого хотим пригласить в конференцию и нажимаем #.
  • Набрать внутренний номер с префиксом *7 (прим. *71100) — если конференция с набранным номером (прим. 1100) существует, то будет присоединение к ней, в противном случае будет создана новая конференция.

Создаем скрипт /var/lib/asterisk/agi-bin/conference.php со следующим содержанием.

/var/lib/asterisk/agi-bin/conference.php
JTIzISUyRnVzciUyRmJpbiUyRnBocCUyMC1x
<?php require('phpagi.php');

// ------------------------------------------------//
//      Dymanic Conf module by Jakonda© 2020       //
//      web - https://jakondo.ru                   //
JTJGJTJGJTIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJTJGJTJG

JTJGJTJGJTIwJUQwJTlGJUQwJUJFJUQwJUI0JUQwJUJBJUQwJUJCJUQxJThFJUQxJTg3JUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwcGhwQUdJJTIwJTJGJTIwQUdJX0FzdGVyaXNrTWFuYWdlcg==
$agi = new AGI();
$asm = new AGI_AsteriskManager();
JTI0YXNtLSUzRWNvbm5lY3QoKSUzQg==

debug(".::: Starting scrypt (/var/lib/asterisk/agi-bin/cenference.php) :::.");

JTI0YWN0aW9uJTIwJTNEJTIwJTI0YXJndiU1QjElNUQlM0I=
JTI0Y29uZm51bSUyMCUzRCUyMCUyNGFyZ3YlNUIyJTVEJTNC

switch ($action) {
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY2FzZSUyMCUyMk5FVyUyMiUzQQ==
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmV3Y29uZigpJTNC
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslM0I=
        case "ADD":
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW52aXRlY29uZigpJTNC
                break;
        case "MANUAL":
                manualconf();
                break;
default:

}

JTJGJTJGJTIwJUQwJUE0JUQxJTgzJUQwJUJEJUQwJUJBJUQxJTg2JUQwJUI4JUQxJThGJTIwJUQxJTgxJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQwJUJEJUQwJUI4JUQxJThGJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQwJUJFJUQwJUI5JTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQwJUI4JTIwJUQwJUI4JUQwJUI3JTIwJUQwJUIwJUQwJUJBJUQxJTgyJUQwJUI4JUQwJUIyJUQwJUJEJUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUIzJUQwJUJFJUQwJUIyJUQwJUJFJUQxJTgwJUQwJUIw
function newconf()
{
        global $agi,$asm,$debug;

        $CL = $agi->get_variable('CHANNEL');
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0QlAlMjAlM0QlMjAlMjRhZ2ktJTNFZ2V0X3ZhcmlhYmxlKCdCUklER0VQRUVSJyklM0I=
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0Q04lMjAlM0QlMjAlMjRhZ2ktJTNFZ2V0X3ZhcmlhYmxlKCdEWU5BTUlDX1dIT19BQ1RJVkFURUQnKSUzQg==

        $CL = $CL['data'];
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0QlAlMjAlM0QlMjAlMjRCUCU1QidkYXRhJyU1RCUzQg==
        $CN = $CN['data'];

        // Получение информации кто активировал DTMF код
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0Q04lMjAlM0QlMjBzdWJzdHIoJTI0Q04lMkMlMjBzdHJwb3MoJTI0Q04lMkMlMjAlMjIlMkYlMjIpJTIwJTJCJTIwMSUyQyUyMHN0cnBvcyglMjRDTiUyQyUyMCUyMi0lMjIpJTIwLSUyMDQpJTNC

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0YXNtLSUzRXNlbmRfcmVxdWVzdCgnU2V0dmFyJyUyQ2FycmF5KCdDaGFubmVsJyUzRCUzRSUyMiUyNENMJTIyJTJDJ1ZhcmlhYmxlJyUzRCUzRSUyMkNPTkZOVU0lMjIlMkMnVmFsdWUnJTNEJTNFJTIyJTI0Q04lMjIpKSUzQg==
        $asm->send_request('Setvar',array('Channel'=>"$BP",'Variable'=>"CONFNUM",'Value'=>"$CN"));

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyTnVtYmVyJTIwJTVCJTI0Q04lNUQlMjBhY3RpdmF0ZWQlMjBEVE1GJTIyKSUzQg==
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyU291cmNlJTIwY2hhbm5lbCUyMCU1QiUyNENMJTVEJTIyKSUzQg==
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyQnJpZGdlZCUyMGNoYW5uZWwlMjAlNUIlMjRCUCU1RCUyMiklM0I=

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwJUQwJTlGJUQxJTgwJUQwJUJFJUQwJUIyJUQwJUI1JUQxJTgwJUQxJThGJUQwJUI1JUQwJUJDJTIwJUQwJUI1JUQxJTgxJUQwJUJCJUQwJUI4JTIwJUQwJUJEJUQwJUJFJUQwJUJDJUQwJUI1JUQxJTgwJTIwJUQwJUIyJUQwJUJEJUQxJTgzJUQxJTgyJUQxJTgwJUQwJUI1JUQwJUJEJUQwJUJEJUQwJUI4JUQwJUI5JTJDJTIwJUQxJTgyJUQwJUJFJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQxJTgwJUQwJUI1JUQxJTg4JUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQxJTgxJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQxJTgyJUQxJThDJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQxJTgzJUQxJThF
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThFJTIwJUQwJUI4JUQwJUI3JTIwJUQxJTgyJUQwJUI1JUQwJUJBJUQxJTgzJUQxJTg5JUQwJUI1JUQwJUIzJUQwJUJFJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUIzJUQwJUJFJUQwJUIyJUQwJUJFJUQxJTgwJUQwJUIw
        if (strlen($CN) == 4) {
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyQWxsb3clMjIpJTNC
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTIwZWxzZSUyMCU3Qg==
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyRGVueSUyMiklM0I=
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslM0I=
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdE

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwJUQwJTlGJUQwJUI1JUQxJTgwJUQwJUI1JUQwJUIxJUQxJTgwJUQwJUIwJUQxJTgxJUQxJThCJUQwJUIyJUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQxJTgxJUQwJUJFJUQwJUIxJUQwJUI1JUQxJTgxJUQwJUI1JUQwJUI0JUQwJUJEJUQwJUI4JUQwJUJBJUQwJUJFJUQwJUIyJTIwJUQwJUIyJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThF
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0YXNtLSUzRXNlbmRfcmVxdWVzdCgnUmVkaXJlY3QnJTJDYXJyYXkoJ0NoYW5uZWwnJTNEJTNFJTIyJTI0Q0wlMjIlMkMnRXh0cmFDaGFubmVsJyUzRCUzRSUyMiUyNEJQJTIyJTJDJ0NvbnRleHQnJTNEJTNFJTIyZHluYW1pYy1jb25mZXJlbmNlJTIyJTJDJ0V4dGVuJyUzRCUzRSUyMkNPTkYlMjIlMkMnUHJpb3JpdHknJTNEJTNFJTIyMSUyMikpJTNC
JTdE

// Функция добавления новых участник в динамически созданную активную конференцию
ZnVuY3Rpb24lMjBpbnZpdGVjb25mKCk=
JTdC
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZ2xvYmFsJTIwJTI0YWdpJTJDJTI0YXNtJTJDJTI0Y29uZm51bSUyQyUyNGRlYnVnJTNC

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwJUQwJTlFJUQwJUI2JUQwJUI4JUQwJUI0JUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUIyJUQwJUIyJUQwJUJFJUQwJUI0JUQwJUIwJTIwJUQwJUJEJUQwJUJFJUQwJUJDJUQwJUI1JUQxJTgwJUQwJUIwJTIwJUQwJUI0JUQwJUJCJUQxJThGJTIwJUQwJUI0JUQwJUJFJUQwJUIxJUQwJUIwJUQwJUIyJUQwJUJCJUQwJUI1JUQwJUJEJUQwJUI4JUQxJThGJTIwJUQwJUIyJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThF
        $result = $agi->get_data('beep', 4000, 11);
        $res = $result['result'];

        debug("Invite [$res] to dynamic conference [$confnum]");

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTJGJTIwJUQwJTlGJUQxJTgwJUQwJUI4JUQwJUIzJUQwJUJCJUQwJUIwJUQxJTg4JUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUJEJUQwJUIwJUQwJUIxJUQxJTgwJUQwJUIwJUQwJUJEJUQwJUJEJUQxJThCJUQwJUI5JTIwJUQwJUJEJUQwJUJFJUQwJUJDJUQwJUI1JUQxJTgwJTIwJUQwJUIyJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThF
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjAoc3RybGVuKCUyNHJlcyklMjAlM0QlM0QlMjA0KSUyMCU3Qg==
                $asm->send_request('Originate',array('Channel'=>"SIP/$res",'Context'=>"dynamic-conference",'Exten'=>"CONF",'Priority'=>"1",'CallerID'=>"PBX Conference $confbum <$confnum>",'Variable'=>"CONFNUM=$confnum"));
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTIwZWxzZSUyMCU3Qg==
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0YXNtLSUzRXNlbmRfcmVxdWVzdCgnT3JpZ2luYXRlJyUyQ2FycmF5KCdDaGFubmVsJyUzRCUzRSUyMkxvY2FsJTJGJTI0cmVzJTQwZnJvbS1pbnRlcm5hbC1hZGRpdGlvbmFsJTIyJTJDJ0NvbnRleHQnJTNEJTNFJTIyZHluYW1pYy1jb25mZXJlbmNlJTIyJTJDJ0V4dGVuJyUzRCUzRSUyMkNPTkYlMjIlMkMnUHJpb3JpdHknJTNEJTNFJTIyMSUyMiUyQydWYXJpYWJsZSclM0QlM0UlMjJDT05GTlVNJTNEJTI0Y29uZm51bSUyMikpJTNC
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdE
JTdE

JTJGJTJGJTIwJUQwJUE0JUQxJTgzJUQwJUJEJUQwJUJBJUQxJTg2JUQwJUI4JUQxJThGJTIwJUQxJTgwJUQxJTgzJUQxJTg3JUQwJUJEJUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQxJTgzJUQwJUJGJUQxJTgwJUQwJUIwJUQwJUIyJUQwJUJCJUQwJUI1JUQwJUJEJUQwJUI4JUQxJThGLiUyMCVEMCVBMSVEMCVCRSVEMCVCNyVEMCVCNCVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCNSUyMCVEMCVCNCVEMCVCOCVEMCVCRCVEMCVCMCVEMCVCQyVEMCVCOCVEMSU4NyVEMCVCNSVEMSU4MSVEMCVCQSVEMCVCRSVEMCVCOSUyMCVEMCVCQSVEMCVCRSVEMCVCRCVEMSU4NCVEMCVCNSVEMSU4MCVEMCVCNSVEMCVCRCVEMSU4NiVEMCVCOCVEMCVCOCUyMCVEMCVCOCUyMCVEMCVCRiVEMCVCRSVEMCVCNCVEMCVCQSVEMCVCQiVEMSU4RSVEMSU4NyVEMCVCNSVEMCVCRCVEMCVCOCVEMSU4RiUyMCVEMCVCQSUyMCVEMCVCMCVEMCVCQSVEMSU4MiVEMCVCOCVEMCVCMiVEMCVCRCVEMCVCRSVEMCVCOSUyMCVEMCVCNCVEMCVCOCVEMCVCRCVEMCVCMCVEMCVCQyVEMCVCOCVEMSU4NyVEMCVCNSVEMSU4MSVEMCVCQSVEMCVCRSVEMCVCOSUyMCVEMCVCQSVEMCVCRSVEMCVCRCVEMSU4NCVEMCVCNSVEMSU4MCVEMCVCNSVEMCVCRCVEMSU4NiVEMCVCOCVEMCVCOA==
ZnVuY3Rpb24lMjBtYW51YWxjb25mKCk=
{
        global $agi,$asm,$debug;

        $CL = $agi->get_variable('CHANNEL');
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0RVglMjAlM0QlMjAlMjRhZ2ktJTNFZ2V0X3ZhcmlhYmxlKCdFWFRFTicpJTNC

        $CL = $CL['data'];
        $EX = substr($EX['data'],2);

JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyJTI0Q0wlMjIpJTNC
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVidWcoJTIyJTI0RVglMjIpJTNC

        $asm->send_request('Setvar',array('Channel'=>"$CL",'Variable'=>"CONFNUM",'Value'=>"$EX"));
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0YXNtLSUzRXNlbmRfcmVxdWVzdCgnUmVkaXJlY3QnJTJDYXJyYXkoJ0NoYW5uZWwnJTNEJTNFJTIyJTI0Q0wlMjIlMkMnQ29udGV4dCclM0QlM0UlMjJkeW5hbWljLWNvbmZlcmVuY2UlMjIlMkMnRXh0ZW4nJTNEJTNFJTIyQ09ORiUyMiUyQydQcmlvcml0eSclM0QlM0UlMjIxJTIyKSklM0I=
JTdE

JTJGJTJGJTIwJUQwJUE0JUQxJTgzJUQwJUJEJUQwJUJBJUQxJTg2JUQwJUI4JUQxJThGJTIwJUQwJUIyJUQxJThCJUQwJUIyJUQwJUJFJUQwJUI0JUQwJUIwJTIwREVCVUclMjAlRDAlQjglRDAlQkQlRDElODQlRDAlQkUlRDElODAlRDAlQkMlRDAlQjAlRDElODYlRDAlQjglRDAlQjglMjAlRDAlQjIlMjAlRDAlQkElRDAlQkUlRDAlQkQlRDElODElRDAlQkUlRDAlQkIlRDElOEM=
JTJGJTJGJTIwLS0lMjAlRDAlQkYlRDAlQkUlRDAlQkIlRDAlQjUlRDAlQjclRDAlQkQlRDAlQkUlMjAlRDAlQjQlRDAlQkIlRDElOEYlMjAlRDAlQkUlRDElODIlRDAlQkIlRDAlQjAlRDAlQjQlRDAlQkElRDAlQjglMjAlRDElODAlRDAlQjAlRDAlQjElRDAlQkUlRDElODIlRDElOEIlMjAlRDElODElRDAlQkElRDElODAlRDAlQjglRDAlQkYlRDElODIlRDAlQjA=
function debug($string) {
        global $agi;
JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI0YWdpLSUzRXZlcmJvc2UoJTIyJTI0c3RyaW5nJTIyKSUzQg==
}

JTNGJTNF

Выдаем права на чтение и запуск для asterisk.

Y2hvd24lMjBhc3RlcmlzayUzQWFzdGVyaXNrJTIwJTJGdmFyJTJGbGliJTJGYXN0ZXJpc2slMkZhZ2ktYmluJTJGY29uZmVyZW5jZS5waHA=
Y2htb2QlMjA3NTUlMjAlMkZ2YXIlMkZsaWIlMkZhc3RlcmlzayUyRmFnaS1iaW4lMkZjb25mZXJlbmNlLnBocA==

JUQwJTlGJUQxJTgwJUQwJUJFJUQwJUJGJUQwJUI4JUQxJTgxJUQxJThCJUQwJUIyJUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQxJTgzJUQxJThFJTIwJUQxJTg0JUQxJTgzJUQwJUJEJUQwJUJBJUQxJTg2JUQwJUI4JUQxJThFJTIwJUQwJUI3JUQwJUIwJUQwJUJGJUQxJTgzJUQxJTgxJUQwJUJBJUQwJUIwJTIwJUQxJTgxJUQwJUJBJUQxJTgwJUQwJUI4JUQwJUJGJUQxJTgyJUQwJUIwJTJDJTIwJUQwJUJGJUQwJUJFJTIwJUQwJUJEJUQwJUIwJUQwJUI2JUQwJUIwJUQxJTgyJUQwJUI4JUQxJThFJTIwJUQwJUJBJUQwJUJFJUQwJUJDJUQwJUIxJUQwJUI4JUQwJUJEJUQwJUIwJUQxJTg2JUQwJUI4JUQwJUI4JTIwKjclMjAlRDAlQjglRDAlQjclMjAlRDAlQjAlRDAlQkElRDElODIlRDAlQjglRDAlQjIlRDAlQkQlRDAlQkUlRDAlQjMlRDAlQkUlMjAlRDElODAlRDAlQjAlRDAlQjclRDAlQjMlRDAlQkUlRDAlQjIlRDAlQkUlRDElODAlRDAlQjAuJTIwJUQwJTkyJTIwJUQxJTg0JUQwJUIwJUQwJUI5JUQwJUJCJTIwJTJGZXRjJTJGYXN0ZXJpc2slMkZmZWF0dXJlc19hcHBsaWNhdGlvbm1hcF9jdXN0b20uY29uZiVDMiVBMCVEMCVCNCVEMCVCRSVEMCVCMSVEMCVCMCVEMCVCMiVEMCVCQiVEMSU4RiVEMCVCNSVEMCVCQyUzQQ==

/etc/asterisk/features_applicationmap_custom.conf
conference=>*7,self,AGI(/var/lib/asterisk/agi-bin/conference.php,NEW)

JUQwJTlFJUQwJUIxJUQxJThBJUQxJThGJUQwJUIyJUQwJUJCJUQxJThGJUQwJUI1JUQwJUJDJTIwJUQwJUJGJUQxJTgwJUQwJUJFJUQwJUJGJUQwJUI4JUQxJTgxJUQwJUIwJUQwJUJEJUQwJUJEJUQxJTgzJUQxJThFJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQxJTgzJUQxJThFJTIwJUQxJTg0JUQxJTgzJUQwJUJEJUQwJUJBJUQxJTg2JUQwJUI4JUQxJThFJTIwJUQwJUIyJTIwJUQwJUIzJUQwJUJCJUQwJUJFJUQwJUIxJUQwJUIwJUQwJUJCJUQxJThDJUQwJUJEJUQxJThCJUQwJUI1JTIwJUQwJUJGJUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJDJUQwJUI1JUQwJUJEJUQwJUJEJUQxJThCJUQwJUI1LiUyMCVEMCU5MiUyMCVEMSU4NCVEMCVCMCVEMCVCOSVEMCVCQiUyMCUyRmV0YyUyRmFzdGVyaXNrJTJGZ2xvYmFsc19jdXN0b20uY29uZiVDMiVBMCVEMCVCNCVEMCVCRSVEMCVCMSVEMCVCMCVEMCVCMiVEMCVCQiVEMSU4RiVEMCVCNSVEMCVCQy4=

/etc/asterisk/globals_custom.conf
DYNAMIC_FEATURES=conference

Модифицируем параметры конференции, добавим возможность приглашать новых участников, по нажатию комбинации *7 в активной конференции. В файл /etc/asterisk/confbridge_custom.conf добавляем.

/etc/asterisk/confbridge_custom.conf
JTVCZHluYW1pY191c2VyJTVE
dHlwZSUyMCUzRCUyMHVzZXI=
talk_detection_events=yes
dsp_drop_silence=yes
YW5ub3VuY2Vfb25seV91c2VyJTNEbm8=

JTVCZHluYW1pY19tZW51JTVE
dHlwZSUyMCUzRCUyMG1lbnUlMjAqNyUzRGRpYWxwbGFuX2V4ZWMoZHluYW1pYy1jb25mZXJlbmNlJTJDSU5WSVRFJTJDMSk=

JUQwJTlFJUQwJUJGJUQwJUI4JUQxJTgxJUQxJThCJUQwJUIyJUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQxJTgwJUQwJUIwJUQwJUIxJUQwJUJFJUQxJTgyJUQxJTgzJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQwJUI4JUQxJTg1JTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQwJUI5JTIwJUQwJUIyJTIwJUQwJUI0JUQwJUI4JUQwJUIwJUQwJUJCJUQwJUJGJUQwJUJCJUQwJUIwJUQwJUJEJUQwJUI1LiUyMCVEMCU5MiUyMCVEMSU4NCVEMCVCMCVEMCVCOSVEMCVCQiUyMCUyRmV0YyUyRmFzdGVyaXNrJTJGZXh0ZW5zaW9uc19jdXN0b20uY29uZiVDMiVBMCVEMCVCNCVEMCVCRSVEMCVCMSVEMCVCMCVEMCVCMiVEMCVCQiVEMSU4RiVEMCVCNSVEMCVCQy4=

/etc/asterisk/extensions_custom.conf
JTVCZnJvbS1pbnRlcm5hbC1jdXN0b20lNUQ=
include => dynamic-conference


JTVCZHluYW1pYy1jb25mZXJlbmNlJTVE
; -----------------------------------------------------------------------------------------------------------------
; Динамические конференции. При активном разговоре, сотрудник может перевести разговор в конференцию, которая будет
JTNCJTIwJUQxJTgxJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQwJUJEJUQwJUIwJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQwJUI4KCVEMCVCRCVEMCVCRSVEMCVCQyVEMCVCNSVEMSU4MCUyMCVEMCVCQSVEMCVCRSVEMCVCRCVEMSU4NCVEMCVCNSVEMSU4MCVEMCVCNSVEMCVCRCVEMSU4NiVEMCVCOCVEMCVCOCUyMCVEMCVCMSVEMSU4MyVEMCVCNCVEMCVCNSVEMSU4MiUyMCVEMCVCRiVEMSU4MCVEMCVCOCVEMSU4MSVEMCVCMiVEMCVCRSVEMCVCNSVEMCVCRCUyMCVEMSU4MiVEMCVCMCVEMCVCQSVEMCVCRSVEMCVCOSUyMCVEMCVCNiVEMCVCNSUyMCVEMCVCQSVEMCVCMCVEMCVCQSUyMCVEMCVCOCUyMCVEMCVCMiVEMCVCRCVEMSU4MyVEMSU4MiVEMSU4MCVEMCVCNSVEMCVCRCVEMCVCRCVEMCVCOCVEMCVCOSUyMCVEMCVCRCVEMCVCRSVEMCVCQyVEMCVCNSVEMSU4MCUyMCVEMSU4MSVEMCVCRSVEMSU4MiVEMSU4MCVEMSU4MyVEMCVCNCVEMCVCRCVEMCVCOCVEMCVCQSVEMCVCMCkuJTIwJUQwJUExJUQwJUJFJUQxJTgyJUQxJTgwJUQxJTgzJUQwJUI0JUQwJUJEJUQwJUI4JUQwJUJBJTIwJUQwJUJDJUQwJUJFJUQwJUI2JUQwJUI1JUQxJTgy
JTNCJTIwJUQwJUI0JUQwJUJFJUQwJUIxJUQwJUIwJUQwJUIyJUQwJUI4JUQxJTgyJUQxJThDJTIwJUQxJTgzJUQxJTg3JUQwJUIwJUQxJTgxJUQxJTgyJUQwJUJEJUQwJUI4JUQwJUJBJUQwJUJFJUQwJUIyJTIwJUQwJUIyJTIwJUQxJTgxJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQwJUJEJUQwJUJEJUQxJTgzJUQxJThFJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThFLiUyMCVEMCVBMSVEMCVCRSVEMSU4MiVEMSU4MCVEMSU4MyVEMCVCNCVEMCVCRCVEMCVCOCVEMCVCQSVEMCVCOCUyMCVEMCVCQyVEMCVCRSVEMCVCMyVEMSU4MyVEMSU4MiUyMCVEMCVCRiVEMCVCRSVEMCVCNCVEMCVCQSVEMCVCQiVEMSU4RSVEMSU4NyVEMCVCOCVEMSU4MiVEMSU4QyVEMSU4MSVEMSU4RiUyMCVEMCVCQSUyMCVEMCVCNCVEMCVCOCVEMCVCRCVEMCVCMCVEMCVCQyVEMCVCOCVEMSU4NyVEMCVCNSVEMSU4MSVEMCVCQSVEMCVCRSVEMCVCOSUyMCVEMCVCQSVEMCVCRSVEMCVCRCVEMSU4NCVEMCVCNSVEMSU4MCVEMCVCNSVEMCVCRCVEMSU4NiVEMCVCOCVEMCVCOCUyMCVEMCVCMSVEMCVCNSVEMCVCNyUyMA==
JTNCJTIwJUQwJUJGJUQxJTgwJUQwJUI4JUQwJUIzJUQwJUJCJUQwJUIwJUQxJTg4JUQwJUI1JUQwJUJEJUQwJUI4JUQxJThGJTJDJTIwJUQwJUIwJTIwJUQxJTgyJUQwJUIwJUQwJUJBJTIwJUQwJUI2JUQwJUI1JTIwJUQxJTgxJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQxJTgyJUQxJThDJTIwJUQxJTgxJUQwJUIyJUQwJUJFJUQxJThFJTIwJUQwJUJEJUQwJUJFJUQwJUIyJUQxJTgzJUQxJThFJTIwJUQwJUI0JUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJDJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQxJTgzJUQxJThFJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThFLg==
JTNC
; -- Инструкция:
;  - В активном разговоре нажать *7 - создание и перевод участников разговора в конференцию
;  - В конференции нажать *7 - после гудка набрать номер кого хотим пригласить в конференцию и нажимаем #
JTNCJTIwJTIwLSUyMCVEMCU5RCVEMCVCMCVEMCVCMSVEMSU4MCVEMCVCMCVEMSU4MiVEMSU4QyUyMCVEMCVCMiVEMCVCRCVEMSU4MyVEMSU4MiVEMSU4MCVEMCVCNSVEMCVCRCVEMCVCRCVEMCVCOCVEMCVCOSUyMCVEMCVCRCVEMCVCRSVEMCVCQyVEMCVCNSVEMSU4MCUyMCVEMSU4MSUyMCVEMCVCRiVEMSU4MCVEMCVCNSVEMSU4NCVEMCVCOCVEMCVCQSVEMSU4MSVEMCVCRSVEMCVCQyUyMCo3JTIwKCVEMCVCRiVEMSU4MCVEMCVCOCVEMCVCQy4lMjAqNzExMDApJTIwLSUyMCVEMCVCNSVEMSU4MSVEMCVCQiVEMCVCOCUyMCVEMCVCQSVEMCVCRSVEMCVCRCVEMSU4NCVEMCVCNSVEMSU4MCVEMCVCNSVEMCVCRCVEMSU4NiVEMCVCOCVEMSU4RiUyMCVEMSU4MSUyMCVEMCVCRCVEMCVCMCVEMCVCMSVEMSU4MCVEMCVCMCVEMCVCRCVEMCVCRCVEMSU4QiVEMCVCQyUyMCVEMCVCRCVEMCVCRSVEMCVCQyVEMCVCNSVEMSU4MCVEMCVCRSVEMCVCQyUyMCglRDAlQkYlRDElODAlRDAlQjglRDAlQkMuJTIwMTEwMCklMjA=
JTNCJTIwJTIwJTIwJTIwJUQxJTgxJUQxJTgzJUQxJTg5JUQwJUI1JUQxJTgxJUQxJTgyJUQwJUIyJUQxJTgzJUQwJUI1JUQxJTgyJTJDJTIwJUQxJTgyJUQwJUJFJTIwJUQwJUIxJUQxJTgzJUQwJUI0JUQwJUI1JUQxJTgyJTIwJUQwJUJGJUQxJTgwJUQwJUI4JUQxJTgxJUQwJUJFJUQwJUI1JUQwJUI0JUQwJUI4JUQwJUJEJUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQwJUJBJTIwJUQwJUJEJUQwJUI1JUQwJUI5JTJDJTIwJUQwJUIyJTIwJUQwJUJGJUQxJTgwJUQwJUJFJUQxJTgyJUQwJUI4JUQwJUIyJUQwJUJEJUQwJUJFJUQwJUJDJTIwJUQxJTgxJUQwJUJCJUQxJTgzJUQxJTg3JUQwJUIwJUQwJUI1JTIwJUQwJUIxJUQxJTgzJUQwJUI0JUQwJUI1JUQxJTgyJTIwJUQxJTgxJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQwJUJEJUQwJUIwJTIwJUQwJUJEJUQwJUJFJUQwJUIyJUQwJUIwJUQxJThGJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJEJUQxJTg2JUQwJUI4JUQxJThGLg==
; -----------------------------------------------------------------------------------------------------------------
;
exten => CONF,1,NoOp(Dynamic Conference)
exten => CONF,n,ConfBridge(${CONFNUM},,dynamic_user,dynamic_menu)

exten => INVITE,1,NoOp(Conference Invite ${CONFNUM})
exten => INVITE,n,AGI(/var/lib/asterisk/agi-bin/conference.php,ADD,${CONFNUM})

ZXh0ZW4lMjAlM0QlM0UlMjBfKjdYWFhYJTJDMSUyQ05vT3AoQ3JlYXRlJTJGQ29ubmVjdCUyMER5bmFtaWMlMjBDb25mZXJlbmNlKQ==
exten => _*7XXXX,n,AGI(/var/lib/asterisk/agi-bin/conference.php,MANUAL)
Номерной план само собой может отличаться от моего (4-х значного), поэтом строку _*7XXXX адаптируйте под свой номерной план.

Перечитываем диалплан и можно проверять работу динамических конференций.

asterisk -rx 'dialplan reload'
 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение

Ответ на комментарий rootОтмена ответа
4 комментариев
  • А как можно запустить это скрипт на FreePBX 17 asterisk 21 ну и конечно же PJsip

  • Добрый день!
    Не удается запустить скрипт на голом астериск.
    Получаю ошибку:
    AGI Tx >> agi_request: /var/lib/asterisk/agi-bin/conference1.php
    AGI Tx >> agi_channel: PJSIP/111001-00000002
    AGI Tx >> agi_language: ru
    AGI Tx >> agi_type: PJSIP
    AGI Tx >> agi_uniqueid: 1658495905.2
    AGI Tx >> agi_version: 16.2.1~dfsg-2ubuntu1
    AGI Tx >> agi_callerid: 111001
    AGI Tx >> agi_calleridname: 111001
    AGI Tx >> agi_callingpres: 0
    AGI Tx >> agi_callingani2: 0
    AGI Tx >> agi_callington: 0
    AGI Tx >> agi_callingtns: 0
    AGI Tx >> agi_dnid: *7000
    AGI Tx >> agi_rdnis: unknown
    AGI Tx >> agi_context: from-internal
    AGI Tx >> agi_extension: *7000
    AGI Tx >> agi_priority: 2
    AGI Tx >> agi_enhanced: 0.0
    AGI Tx >> agi_accountcode:
    AGI Tx >> agi_threadid: 140293074446080
    AGI Tx >> agi_arg_1: MANUAL
    AGI Tx >>
    — AGI Script /var/lib/asterisk/agi-bin/conference1.php completed, returning 0

    в чем может быть проблема?

    • Это ответ на комментарий root

      У вас используется PJSIP, а на момент написания статьи я использовал ChanSIP.