Инструменты пользователя

Инструменты сайта


faq:dial_conf_extension_number

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
faq:dial_conf_extension_number [2020/10/13 14:06]
Портнов Алексей
faq:dial_conf_extension_number [2023/12/22 13:14] (текущий)
Портнов Алексей
Строка 16: Строка 16:
   - Укажите тип кода "​**PHP-AGI скрипт**"​   - Укажите тип кода "​**PHP-AGI скрипт**"​
   - Код <​code><?​php   - Код <​code><?​php
-require_once '​Globals.php';​ 
  
 +require_once '​Globals.php';​
 use MikoPBX\Core\System\Util;​ use MikoPBX\Core\System\Util;​
-use \MikoPBX\Core\Asterisk\AGI;​ +use MikoPBX\Core\Asterisk\AGI;​ 
-use \MikoPBX\Core\Asterisk\AsteriskManager;​+use MikoPBX\Core\Asterisk\AsteriskManager
 +use MikoPBX\Core\System\Processes;
  
 function checkStartConf(){ function checkStartConf(){
     $Z_DTMF ​        = '​354233';​     $Z_DTMF ​        = '​354233';​
-    $Z_PROVIDER_ID ​ = 'SIP-1601534775';+    $Z_PROVIDER_ID ​ = 'SIP-1692280724';
     $Z_DST ​         = '​84957776675';​     $Z_DST ​         = '​84957776675';​
 +    $asteriskCmd = Util::​which('​asterisk'​);​
 +    $busyboxCmd = Util::​which('​busybox'​);​
  
     $am = new AsteriskManager();​     $am = new AsteriskManager();​
Строка 32: Строка 35:
     $confEmpty = true;     $confEmpty = true;
     $confChannelFound = false;     $confChannelFound = false;
-    ​$data = $am->​meetMeCollectInfo($Z_DTMF); + 
-    foreach ($data as $channelData){ +    ​$result ​shell_exec("​$asteriskCmd ​-rx '​confbridge list $Z_DTMF' | $busyboxCmd grep default_menu | $busyboxCmd cut -f 1 -d ' '"​); 
-        $value = $am->​GetVar($channelData['​Channel'​], '​ZDTMF',​ null, false);+    foreach (explode(PHP_EOL, ​$result) ​as $channelData){ 
 +        if(empty($channelData)){ 
 +            continue; 
 +        } 
 +        $value = $am->​GetVar($channelData,​ '​ZDTMF',​ null, false);
         if(!empty($value)){         if(!empty($value)){
             // Это канал конференции.             // Это канал конференции.
Строка 43: Строка 50:
         }         }
     }     }
- 
     if($confChannelFound === false && $confEmpty === false){     if($confChannelFound === false && $confEmpty === false){
         // Необходимо соединить с внешней конференцией.         // Необходимо соединить с внешней конференцией.
Строка 54: Строка 60:
             null,             null,
             null,             null,
-            ​null,+            ​"Conf <​$Z_DTMF>"​,
             "​__ZDTMF={$Z_DTMF},​__ZPROVIDERID={$Z_PROVIDER_ID},​__ZDST={$Z_DST}}",​             "​__ZDTMF={$Z_DTMF},​__ZPROVIDERID={$Z_PROVIDER_ID},​__ZDST={$Z_DST}}",​
             '​0'​);​             '​0'​);​
  
     }elseif ($confChannelFound === true && $confEmpty === true){     }elseif ($confChannelFound === true && $confEmpty === true){
-        ​$asteriskCmd = Util::​which('​asterisk'​);​ +        ​Processes::​mwExec("​{$asteriskCmd} -rx 'confbridge ​kick {$Z_DTMF} all'"​);​
-        Util::​mwExec("​{$asteriskCmd} -rx 'meetme ​kick {$Z_DTMF} all'"​);​+
     }     }
 } }
Строка 66: Строка 71:
 $action = $argv[1]??'';​ $action = $argv[1]??'';​
 if($action === '​start'​){ if($action === '​start'​){
-    $pid = Util::​getPidOfProcess(basename($argv[0]),​getmypid());​+    $pid = Processes::​getPidOfProcess(basename($argv[0])." start$"​, getmypid());​
     if(!empty($pid)){     if(!empty($pid)){
         $killCmd = Util::​which('​kill'​);​         $killCmd = Util::​which('​kill'​);​
-        ​Util::​mwExec("​{$killCmd} ​'{$pid}'");+        ​Processes::​mwExec("​{$killCmd} {$pid}"​);​
     }     }
     while (true){     while (true){
         checkStartConf();​         checkStartConf();​
-        sleep(3);+        sleep(10);
     }     }
 }else{ }else{
Строка 80: Строка 85:
     checkStartConf();​     checkStartConf();​
     $agi->​hangup();​     $agi->​hangup();​
-}</​code>​ +} 
-  - В коде приложения следует поправить следующие переменные<​code> ​   // Добавочный номер,  +</​code>​ 
-    // Номер телефона конференции ​(создана ранее) +  - Правим файл "​**/​var/​spool/​cron/​crontabs/​root**"​ через меню [[:custom-files|Кастомизация системных файлов]] 
-    // Этот номер ​будет набран при соединении с удаленной стороной  +  - Добавляем задачу в конец файла: <​code>​*/1 * * * * /usr/bin/php -f /​var/​lib/​asterisk/​agi-bin/​DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B.php start > /dev/null 2> /​dev/​null</​code>​  
-    ​// В данном примере ​номер конференции равен добавочному,​ +  - В данном примере ​"​**DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B**"​ - Это идентификатор созданного ранее приложения. ID можно подсмотреть в адресной строке браузера при редактировании приложения  
-    // Который будет набран при ​соединении с внешним ​абонентом.        +  - Опишем дополнительные контексты через меню [[:​custom-files|Кастомизация системных файлов]]. Править будем файл **extensions.conf**. Добавьте в конец файла следущий текст: <​code>​
-    $Z_DTMF ​        = '​354233';​ +
-    // Идентификатор провайдера, через него пойдет вызов +
-    // ID можно подсмотреть в адресной строке браузера ​ +
-    // при редактировании провайдера +
-    $Z_PROVIDER_ID ​ = '​SIP-1601534775';​ +
-    // Номер телефона внешнего абонента. +
-    $Z_DST ​         = '​84957776675';</​code>​ +
-  - Опишем дополнительные контексты через меню [[:​custom-files|Кастомизация системных файлов]]. +
-  - Править будем файл **extensions.conf**. Добавьте в конец файла следущий текст: <​code>​; Контекст для исходящих звонков:​+
 [z-outgoing] [z-outgoing]
 exten => _X!,​1,​Ringing() exten => _X!,​1,​Ringing()
- same => n,​Gosub(${ISTRANSFER}dial,​${EXTEN},​1) +  ​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,​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,​ExecIf($["​${ISTRANSFER}x"​ != "​x"​]?​Gosub(${ISTRANSFER}dial_hangup,​${EXTEN},​1)) 
- same => n,​Set(pt1c_UNIQUEID=${EMPTY_VALUE}) +  same => n,​Set(pt1c_UNIQUEID=${EMPTY_VALUE}) 
- same => n,​ExecIf($["​${BLINDTRANSFER}x"​ != "​x"​]?​AGI(check_redirect.php,​${BLINDTRANSFER})) +  same => n,​ExecIf($["​${BLINDTRANSFER}x"​ != "​x"​]?​AGI(check_redirect.php,​${BLINDTRANSFER})) 
- same => n,​Hangup() +  same => n,​Hangup() 
-; Контекст для донабора внутреннего номера.+
 [z-dial-answer] [z-dial-answer]
 exten => s,​1,​NoOp(Answered send DTMF...) exten => s,​1,​NoOp(Answered send DTMF...)
- same => n,​Gosub(dial_answer,​${EXTEN},​1) +  ​same => n,​Gosub(dial_answer,​${EXTEN},​1) 
- same => n,​SendDTMF(${ZDTMF}) +  same => n,​SendDTMF(${ZDTMF}) 
- same => n,return +  same => n,return 
-; Контекст для входа в конференцию. +
 [z-meetme] [z-meetme]
 exten => _X!,​1,​Answer() exten => _X!,​1,​Answer()
- same => n,Meetme(${EXTEN},qdMTr)+ 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()  same => n,Hangup()
 </​code>​ </​code>​
-  - Правим файл "​**/​var/​spool/​cron/​crontabs/​root**"​ через меню [[:​custom-files|Кастомизация системных файлов]] 
-  - Добавляем задачу в конец файла: <​code>​*/​1 * * * * /​usr/​bin/​php -f /​var/​lib/​asterisk/​agi-bin/​DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B.php start > /dev/null 2> /​dev/​null</​code>​ 
-  - В данном примере "​**DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B**"​ - Это идентификатор созданного ранее приложения. ID можно подсмотреть в адресной строке браузера при редактировании приложения.  ​ 
  
 <note important>​При звонке в конференцию по номеру **354233** автоматически будет подключаться внешний абонент с номером **84957776675**. Как только абонент ответи,​ будет произведен набор добавочного номера **354233**. Как только все "​внутренние"​ участники покинули конференцию,​ внешний абонент будет отключен. ​ </​note>​ <note important>​При звонке в конференцию по номеру **354233** автоматически будет подключаться внешний абонент с номером **84957776675**. Как только абонент ответи,​ будет произведен набор добавочного номера **354233**. Как только все "​внутренние"​ участники покинули конференцию,​ внешний абонент будет отключен. ​ </​note>​
 +
 +<note important>​Задача в крон нужна лишь для дополнительной "​защиты",​ по сути это рестарт php скрипта каждую минуту</​note>​
  
 [[faq:​|Обратно к инструкциям]] [[faq:​|Обратно к инструкциям]]
faq/dial_conf_extension_number.1602598013.txt.gz · Последние изменения: 2020/10/13 14:06 — Портнов Алексей