====== Конференция с постоянным внешним абонентом ======
[[faq:|Обратно к инструкциям]]
* Допустим на АТС настроена конференц-комната с номером "**354233**".
* При звонке сотрудника(ов) в конференцию необходимо всегда подключать внешнего абонента.
* При отключении сотрудников от конференции внешнего абонента необходимо отключать
Это может потребоваться для организации связи с внешней (относительно MIKOPBX) конференцией. Позволит сэкономить на исходящих звонках (будет занята только одна линия).
- В разделе "**Телефония**" - "**Конференция**" создаем новую конференцию
- Укажем название комнаты "**Z-CONF-354233**"
- Укажем внутренний номер "**354233**"
- Опишем "**Приложение Dialplan**" (см. [[:dialplan-applications|Приложения диалпланов]])
- Название "**Z-Worker-CONF**"
- Номер для вызова "**2200101**" (может быть произвольным)
- Укажите тип кода "**PHP-AGI скрипт**"
- Код connect();
$confEmpty = true;
$confChannelFound = false;
$result = shell_exec("$asteriskCmd -rx 'confbridge list $Z_DTMF' | $busyboxCmd grep default_menu | $busyboxCmd cut -f 1 -d ' '");
foreach (explode(PHP_EOL, $result) as $channelData){
if(empty($channelData)){
continue;
}
$value = $am->GetVar($channelData, 'ZDTMF', null, false);
if(!empty($value)){
// Это канал конференции.
$confChannelFound = true;
}else{
// Есть канал конечного пользователя.
$confEmpty = false;
}
}
if($confChannelFound === false && $confEmpty === false){
// Необходимо соединить с внешней конференцией.
$am->Originate(
'Local/'.$Z_DTMF.'@z-meetme',
$Z_DST,
'z-outgoing',
'1',
null,
null,
null,
"Conf <$Z_DTMF>",
"__ZDTMF={$Z_DTMF},__ZPROVIDERID={$Z_PROVIDER_ID},__ZDST={$Z_DST}}",
'0');
}elseif ($confChannelFound === true && $confEmpty === true){
Processes::mwExec("{$asteriskCmd} -rx 'confbridge kick {$Z_DTMF} all'");
}
}
$action = $argv[1]??'';
if($action === 'start'){
$pid = Processes::getPidOfProcess(basename($argv[0])." start$", getmypid());
if(!empty($pid)){
$killCmd = Util::which('kill');
Processes::mwExec("{$killCmd} {$pid}");
}
while (true){
checkStartConf();
sleep(10);
}
}else{
$agi = new AGI();
$agi->answer();
checkStartConf();
$agi->hangup();
}
- Правим файл "**/var/spool/cron/crontabs/root**" через меню [[:custom-files|Кастомизация системных файлов]]
- Добавляем задачу в конец файла: */1 * * * * /usr/bin/php -f /var/lib/asterisk/agi-bin/DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B.php start > /dev/null 2> /dev/null
- В данном примере "**DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B**" - Это идентификатор созданного ранее приложения. ID можно подсмотреть в адресной строке браузера при редактировании приложения.
- Опишем дополнительные контексты через меню [[:custom-files|Кастомизация системных файлов]]. Править будем файл **extensions.conf**. Добавьте в конец файла следущий текст:
[z-outgoing]
exten => _X!,1,Ringing()
same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
same => n,Dial(PJSIP/${EXTEN}@${ZPROVIDERID},600,${DOPTIONS}TKU(z-dial-answer)b(dial_create_chan,s,1))
same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
same => n,ExecIf($["${BLINDTRANSFER}x" != "x"]?AGI(check_redirect.php,${BLINDTRANSFER}))
same => n,Hangup()
[z-dial-answer]
exten => s,1,NoOp(Answered send DTMF...)
same => n,Gosub(dial_answer,${EXTEN},1)
same => n,SendDTMF(${ZDTMF})
same => n,return
[z-meetme]
exten => _X!,1,Answer()
same => n,Gosub(set-answer-state,${ZDTMF},1)
same => n,Set(CHANNEL(hangup_handler_wipe)=hangup_handler_meetme,s,1)
same => n,Set(CONFBRIDGE(bridge,record_file_timestamp)=false)
same => n,Set(CONFBRIDGE(bridge,record_conference)=yes)
same => n,Set(CONFBRIDGE(bridge,video_mode)=follow_talker)
same => n,Set(CONFBRIDGE(user,talk_detection_events)=yes)
same => n,Set(CONFBRIDGE(user,quiet)=yes)
same => n,Set(CONFBRIDGE(user,music_on_hold_when_empty)=yes)
same => n,ConfBridge(${ZDTMF})
same => n,Hangup()
При звонке в конференцию по номеру **354233** автоматически будет подключаться внешний абонент с номером **84957776675**. Как только абонент ответи, будет произведен набор добавочного номера **354233**. Как только все "внутренние" участники покинули конференцию, внешний абонент будет отключен.
Задача в крон нужна лишь для дополнительной "защиты", по сути это рестарт php скрипта каждую минуту
[[faq:|Обратно к инструкциям]]