All pages
Powered by GitBook
1 of 17

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Шаблоны номеров

Замена префикса номера с "8, 7" на "+7"

Необходимо заменить префиксы номеров 8, 7 на +7. Пример, номера 84952293042 и 74952293042 должны быть преобразованы к номеру +74952293042.

  1. Перейдите в раздел "Маршрутизация" → "Исходящие маршруты"

Нажмите "Добавить новое правило"

  1. Создайте шаблон как представлено на изображении:

  1. Нажмите "Сохранить"

Исходящая маршрутизация

Запрет звонка через резервный маршрут

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

В случае, если с одним шаблоном используется несколько маршрутов, то АТС будет пытаться совершить вызов по каждому из маршрутов, пока вызов не будет принят.

Не всегда этот функционал необходим и может возникнуть потребность его отключить.

На текущий момент это возможно сделать только через кастомизацию АТС.

  1. Перейдите в настройки провайдера и скопируйте его ID в адресной строке браузера:

ID провайдера
  1. Переходим в раздел «Кастомизация системных файлов»

Раздел "Кастомизация системных файлов"
  1. Переходим в раздел редактирования файла extensions.conf.

Редактирование файла "extensions.conf"
  1. Добавьте в конец файла следующий контекст:

[SIP-1688041950-outgoing-after-dial-custom]
exten => _X!,1,Hangup()
	same => n,return
Добавление кода в конец файла

Сохраните изменения. Теперь все звонки через маршруты, связанные с провайдером будут происходить без учета резервного провайдера. Будет отрабатывать только первый из исходящих маршрутов.

Удаление кода города из номера

Необходимо удалить код города 8495 или 7495, или 8499, или 7499 и оставлять 7-значный номер. Пример, номера 84952293042 и 74996382584 должны быть преобразованы к номеру 2293042 и 6382584 соответственно.

  1. Перейдите в раздел "Маршрутизация" → "Исходящие маршруты"

Нажмите "Добавить новое правило"

  1. Создайте шаблон как представлено на изображении:

  1. Нажмите "Сохранить"

Как запретить замену "+" на "00"

  1. Перейдите в раздел «Система» -> «Кастомизация системных файлов»

  1. Выберите для редактирования файл «/etc/asterisk/extensions.conf»

  1. Выберите режим «Добавлять в конец файла»

  1. Добавьте во второе поле текст

[outgoing](+)
exten => _+X!,1,Set(ADDPLUS=+);
    same => n,Goto(${CONTEXT},${EXTEN:1},1);
  1. Сохраните изменения

Добавить P-Preferred-Identity и Remote-Party-ID заголовок

Некоторые провайдеры при инициации исходящего звонка требуют отправки дополнительного SIP заголовка. В этой статье опишем способ его установить.

  1. Для решения задачи следует описать дополнительные контексты через меню Кастомизация системных файлов.

Раздел "Кастомизация системных файлов"
  1. Править будем файл extensions.conf.

Файл "extensions.conf"
  1. Добавьте в конец файла следующий текст:

[SIP-1611151795-outgoing-custom]
exten => _X!,1,Dial(PJSIP/${number}@SIP-${CUT(CONTEXT,-,2)},600,${DOPTIONS}TKU(dial_answer)b(dial_create_chan_${CUT(CONTEXT,-,2)}_custom,s,1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,ExecIf($["${DIALSTATUS}" = "BUSY"]?Busy(2))
    same => n,return
    
[dial_create_chan_1611151795_custom] 
exten => s,1,Gosub(lua_${ISTRANSFER}dial_create_chan,${EXTEN},1)
    same => n,Set(pt1c_is_dst=1) 
    same => n,Set(OUTGOING_CID=74952293042)
    same => n,ExecIf($["${OUTGOING_CID}x" != "x"]?Set(PJSIP_HEADER(add,P-Preferred-Identit)=<sip:${OUTGOING_CID}@127.0.0.1>))
    same => n,ExecIf($["${OUTGOING_CID}x" != "x"]?Set(PJSIP_HEADER(add,Remote-Party-ID)=<sip:${OUTGOING_CID}@127.0.0.1>))
    same => n,Set(__PT1C_SIP_HEADER=${UNDEFINED}) 
    same => n,Set(CHANNEL(hangup_handler_wipe)=hangup_handler,s,1) 
    same => n,return
Добавление кода в конец файла

Обратите внимание:

  1. Все вхождения строки «SIP-1611151795» следует заменить на ID провайдера «найти» можно в адресной строке браузера при редактировании учетной записи в web интерфейсе MIKOPBX

  2. Вместо «<sip:${OUTGOING_CID}@127.0.0.1>» следует задать требуемое значение заголовков

При использовании модуля «Группы пользователей»:

[SIP-1611151795-outgoing-ug-custom]
exten => _X!,1,Dial(PJSIP/${number}@SIP-${CUT(CONTEXT,-,2)},600,${DOPTIONS}TKU(dial_answer)b(dial_create_chan_custom,s,1))
	same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
	same => n,ExecIf($["${DIALSTATUS}" = "BUSY"]?Busy(2))
    same => n,return
    
[dial_create_chan_custom] 
exten => s,1,Gosub(lua_${ISTRANSFER}dial_create_chan,${EXTEN},1)
    same => n,Set(pt1c_is_dst=1) 
    same => n,Set(GR_VARS=${DB(UsersGroups/${FROM_PEER})}) 
    same => n,Set(tmpName=${CUT(GR_VARS,\,,2)})
    same => n,Set(tmpName=${CUT(tmpName,\_,3)})
	same => n,ExecIf($["${GR_VARS}x" != "x"]?Exec(Set(${GR_VARS}))) 
	same => n,ExecIf($["${GR_PERM_ENABLE}" == "1" && "${GR_ID_${tmpName}}" != "1"]?return) 
	same => n,ExecIf($["${GR_PERM_ENABLE}" == "1" && "${GR_CID_${tmpName}}x" != "x"]?MSet(GR_OLD_CALLERID=${CALLERID(num)},OUTGOING_CID=${GR_CID_${tmpName}}))
	same => n,ExecIf($["${OUTGOING_CID}x" != "x"]?Set(PJSIP_HEADER(add,P-Preferred-Identit)=<sip:${OUTGOING_CID}@127.0.0.1>))
	same => n,ExecIf($["${OUTGOING_CID}x" != "x"]?Set(PJSIP_HEADER(add,Remote-Party-ID)=<sip:${OUTGOING_CID}@127.0.0.1>))
    same => n,Set(__PT1C_SIP_HEADER=${UNDEFINED}) 
    same => n,Set(CHANNEL(hangup_handler_wipe)=hangup_handler,s,1) 
    same => n,return

Особенность этого варианта в том, что значение «OUTGOING_CID» будет браться из настроек групп пользователей. Для каждой группы можно назначить свое значение исходящего callerid. К примеру провайдер Westcall таким образом позволяет управлять значением callerid, который видит клиент.

Звонок через определенного провайдера

Для простой реализации рекомендуется использовать модуль "". Способ из данной статьи предназначен для более тонкой настройки.

Постановка задачи

В MikoPBX (Телефония → Сотрудники) настроены следующие учетные записи сотрудников:

В MikoPBX настроены два провайдера (Маршрутизация → Провайдеры телефонии):

Необходимо, чтобы:

  1. телефон, подключенный к учетной записи 201 звонил только через первого провайдера РТ

  2. телефон, подключенный к учетной записи 202 звонил только через второго провайдера Задарма(Novofon).

Звонки во внешний мир (в город) через обоих провайдеров реализуются по одинаковому исходящему правилу: это десятизначный номер, начинающийся с 7. Схематично задачу можно изобразить следующим образом:

Решение

Направить звонки по определенному провайдеру можно, используя префиксы исходящих шаблонов.

  • Звонки всегда будут идти через первого провайдера, если перед исходящим номером всегда добавлять 1. Следовательно, если 201 абонент будет набирать исходящие номера с префиксом 1, то вызовы пойдут через первого провайдера.

  • Звонки всегда будут идти через второго провайдера, если перед исходящим номером всегда добавлять 2. Следовательно, если 202 абонент будет набирать исходящие номера с префиксом 2, то вызовы пойдут через второго провайдера.

Схематично это можно изобразить следующим образом:

Реализовать эту задачу можно двумя способами в MikoPBX:

  1. Абоненты 201 и 202 всегда на телефоне будут добавлять определенные префиксы перед набираемым номером, т.е. если они хотят позвонить на номер 74952293042, они перед этим номером добавляют префикс 1 или 2, например 174952293042

  2. Абоненты 201 и 202 не набирают специальные префиксы, за них это действие выполняет сама АТС.

Первый способ

Первый способ реализации поставленной нами задачи предполагает, что абоненты 201 и 202 самостоятельно будут на телефоне набирать соответствующие префиксы перед набираемым номером. 201 абонент всегда перед номером будет добавлять 1, а 202 абонент - 2.

  1. Для первого провайдера создаем исходящее правило. Переходим в раздел Маршрутизация → Исходящие маршруты. Добавляем новое правило

  1. Заполняем параметры как на скриншоте ниже:

  1. Для второго провайдера Zadarma создаем исходящее правило. Переходим в раздел Маршрутизация → Исходящие маршруты. Добавляем новое правило как на скриншоте ниже:

Второй способ

Второй способ реализации поставленной нами задачи предполагает, что абоненты 201 и 202 НЕ будут на телефоне набирать соответствующие префиксы перед набираемым номером. За них это будет делать сама АТС! 1. Добавляем исходящие правила для первого и второго провайдера Zadarma, как описано в . Настройки все идентичны. 2. В разделе Маршрутизация → Провайдеры телефонии добавьте третью учетную запись провайдера

  1. Заполняем параметры как на скриншоте ниже:

  1. Сохраните учетную запись и в адресной строке скопируйте ID данного провайдера.

  1. Добавьте исходящее правило для созданного провайдера. Все звонки по умолчанию мы будем направлять через данного провайдера, поэтому будьте внимательны при создании исходящего шаблона. Звонки через наших провайдеров можно осуществлять на номера, начинающиеся с 7, поэтому наш шаблон принимает вид:

  1. Обратите внимание, приоритет исходящего правила для провайдера Router должен быть ниже всех!

  1. Переходим в раздел Система → Кастомизация системных файлов.

8. Открываем для редактирования конфигурационный файл extensions.conf.

  1. Выбираем режим «Добавлять в конец файла». В окне редактирования вставляем следующие строки:

В выше приведенном фрагменте кода Вам необходимо составить правильное наименование контекста. Формат создаваемого контекста:

ID-ПРОВАЙДЕРА - значение, которое вы сохранили на третьем шаге, описанном в данном способе. В нашем примере это SIP-1690973516

Сохраняем изменения и возвращаемся обратно к списку конфигурационных файлов.

Таким образом для 201 и 202 учетных записей мы задали префиксы. Все исходящие звонки теперь будут проходить через требуемого провайдера.

Маршрут "По умолчанию"

В ряде случаев, при описании входящих маршрутов необходимо направить вызов не на внутренний номер, а на мобильный номер сотрудника. В этом случае необходимо описать «Префикс по умолчанию», иначе могу возникнуть проблемы с обработкой таких вызовов.

При маршрутизации по DID номеру:

Для каждого провайдера следует также описать контекст:

На этом настройка завершена!

Добавление префикса "8" к номеру

Необходимо добавить префикс 8 к номеру. Пример, номера 4952293042 и 4996382584 должны быть преобразованы к номеру 84952293042 и 84996382584 соответственно.

  1. Перейдите в раздел "Маршрутизация" → "Исходящие маршруты"

Нажмите "Добавить новое правило"

  1. Создайте шаблон как представлено на изображении:

  1. Нажмите "Сохранить"

Убрать все спецсимволы из набираемого номера

Некоторые софтфоны / CTI решения при наборе передают номер телефона с спецсимволами, к примеру +7(495) 229-3042.

Такой вызов с большой вероятностью не пройдет, будет завершен по ошибке.

  1. Для решения задачи «фильтрации» символов следует описать дополнительный контекст через меню

  1. Править будем файл extensions.conf.

  1. Добавьте в конец файла следующий контекст:

Согласно описанному правилу, в набираемом номере останутся только символы *#1234567890

[globals](+)
MIKO_PREFIX_NUMBER_201=1; Префикс для внутреннего номера 201
MIKO_PREFIX_NUMBER_202=2; Префикс для внутреннего номера 202

[SIP-1690973516-outgoing-custom]
exten => _.!,1,ExecIf($[ "${PREFIX_NUMBER}x" != "x" ]?return)
    same => n,ExecIf($[ "${MIKO_PREFIX_NUMBER}x" == "x" ]?Set(MIKO_PREFIX_NUMBER=${MIKO_PREFIX_NUMBER_${CHANNEL(peername)}}))
    same => n,Set(PREFIX_NUMBER=${MIKO_PREFIX_NUMBER})
    same => n,ExecIf($[ "${MIKO_PREFIX_NUMBER}x" != "x" ]?Goto(outgoing,${MIKO_PREFIX_NUMBER}${EXTEN},4))
    same => n,return
    
[all_peers-custom]
include => internal-custom

[internal-custom]
exten => _.!,1,NoOp(Start custom context)
    same => n,ExecIf($[ "${MIKO_PREFIX_NUMBER}x" == "x" ]?Set(MIKO_PREFIX_NUMBER=${MIKO_PREFIX_NUMBER_${FROM_PEER}}))
    same => n,Return()
[ID-ПРОВАЙДЕРА-outgoing-custom]
[public-direct-dial-custom]
exten => _.!,1,NoOp(Start custom context)
    same => n,Set(__MIKO_PREFIX_NUMBER=2)
    same => n,Return()
[ID-ПРОВАЙДЕРА-incoming]
exten => _.!,1,NoOp(Start custom context)
    same => n,Set(__MIKO_PREFIX_NUMBER=2)
    same => n,Return() 
Управление телефонными группами
первом способе
Раздел "Сотрудники"
Настроенные провайдеры
Схема поставленной задачи
Схема решения задачи
Создание нового правила в разделе "Исходящие маршруты"
Параметры маршрутизации для первого провайдера
Параметры маршрутизации для второго провайдера
Создание новой учетной записи провайдера
Параметры Router
ID провайдера в адресной строке
Параметры маршрутизации для Router
Приоритеты исходящей маршрутизации
Раздел "Кастомизация системных файлов"
Файл Extensions.conf
Код для Extensions.conf
[all_peers-custom]

exten => s,1,NoOp(Cleaning dst number)
	same => n,Set(cleanNumber=${FILTER(\*\#1234567890,${EXTEN})})
	same => n,ExecIf($["${EXTEN}" != "${cleanNumber}"]?Goto(all_peers,${cleanNumber},1))
	same => n,return
Кастомизация системных файлов
Окно "Кастомизация системных файлов"
Файл 'Extensions.conf"
Добавление кода в конец файла
Раздел "Кастомизация системных файлов"

Нормализация набираемого номера телефона

Шаблон для исходящих на примере маршрута для провайдера Mango

Отсечение "999"

  1. Перейдите в раздел "Маршрутизация" -> "Исходящая маршрутизация":

Раздел "Исходящие маршруты"
  1. Опишем исходящий маршрут с префиксом «999»:

Правило маршрута для Mango
  1. Перейдите в раздел "Система" -> "Кастомизация системных файлов":

Раздел "Кастомизация системных файлов"
  1. Откройте для редактирования файл "extensions.conf". Установите режим "Добавлять в конец файла" и вставьте следующий контекст:

[all_peers](+)
exten => _999XXXXXXXXXXX,1,Set(OUT_CALL_PREFIX=999)
    same => n,Goto(all_peers,${EXTEN:3},1)

Этот код отрежет префикс для 14ти значного номера, превратит его в 11ти значный.

Добавление контекста в конец файла extensions.conf
  1. Добавьте еще один контекст:

[outgoing-custom]
exten => _[0-9*#+a-zA-Z]!,1,NoOp()
    same => n,ExecIf($["${NEW_DST_EXTEN}x" != "x"]?return)  
    same => n,Set(NEW_DST_EXTEN=${OUT_CALL_PREFIX}${EXTEN})
    same => n,GosubIf($["${OUT_CALL_PREFIX}x" != "x"]?outgoing,${OUT_CALL_PREFIX}${EXTEN},1)
    same => n,return
exten => _[hit],1,Hangup()
Добавление контекста в конец файла extensions.conf

При исходящем звонке будет добавлен отсеченный ранее префикс 999. В истории вызовов отобразится номер без набранного префикса, в 11ти значном формате:

Раздел "История вызовов"

Для звонков из CTI приложений нужно дополнить контекст:

[internal-originate](+)
exten => _XXX!,1,Set(pt1c_cid=${FILTER(\*\#\+1234567890,${pt1c_cid})})

	same => n,ExecIf($[ ${LEN(${CALLERID(num)})} == 14 ]?Set(__OUT_CALL_PREFIX=7${pt1c_cid:0:3}))
	same => n,ExecIf($[ ${LEN(${CALLERID(num)})} == 14 ]?Set(pt1c_cid=7${pt1c_cid:3}))

	same => n,Set(MASTER_CHANNEL(ORIGINATE_DST_EXTEN)=${pt1c_cid})
	same => n,Set(number=${FILTER(\*\#\+1234567890,${EXTEN})})
	same => n,ExecIf($["${EXTEN}" != "${number}"]?Goto(${CONTEXT},${number},$[${PRIORITY} + 1]))
	same => n,Set(__IS_ORGNT=${EMPTY})
	same => n,Gosub(interception_start,${EXTEN},1)
	same => n,ExecIf($["${pt1c_cid}x" != "x"]?Set(CALLERID(num)=${pt1c_cid}))
	same => n,ExecIf($["${origCidName}x" != "x"]?Set(CALLERID(name)=${origCidName}))
	same => n,GosubIf($["${DIALPLAN_EXISTS(${CONTEXT}-custom,${EXTEN},1)}" == "1"]?${CONTEXT}-custom,${EXTEN},1)
	same => n,ExecIf($["${SRC_QUEUE}x" != "x"]?Goto(internal-originate-queue,${EXTEN},1))
	same => n,ExecIf($["${CUT(CHANNEL,\;,2)}" == "2"]?Set(__PT1C_SIP_HEADER=${SIPADDHEADER})) 
	same => n,ExecIf($["${PJSIP_ENDPOINT(${EXTEN},auth)}x" == "x"]?Goto(internal-num-undefined,${EXTEN},1))
	same => n,Gosub(set-dial-contacts,${EXTEN},1)
	same => n,ExecIf($["${FIELDQTY(DST_CONTACT,&)}" != "1" && "${ALLOW_MULTY_ANSWER}" != "1"]?Set(__PT1C_SIP_HEADER=${EMPTY_VAR}))
	same => n,ExecIf($["${DST_CONTACT}x" != "x"]?Dial(${DST_CONTACT},${ringlength},TtekKHhb(originate-create-channel,${EXTEN},1)U(originate-answer-channel),s,1)))
exten => _[hit],1,Gosub(interception_bridge_result,${EXTEN},1)
	same => n,Hangup

Исходящий с набором внутреннего номера

Допустим есть некий номер 8-495-000-00-00, позвонив на который и набрав добавочный можно попасть на конкретного сотрудника. Это бывает крайне удобно, особенно если добавочный номер длиннее 3х символов. Далее опишем пример реализации задачи.

  1. Для решения задачи следует описать дополнительные контексты через меню Кастомизация системных файлов.

меню .
  1. Править будем файл extensions.conf.

Правка файла "extensions.conf"
  1. Добавьте в конец файла следующий текст:

    [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
Добавление кода в конец файла файл "extensions.conf"
  1. Далее необходимо описать Приложения диалпланов

Создание нового
  1. Выберите «Тип кода» - «Диалплан Asterisk»

Указание типа кода Диалплана
  1. Допустим «донабрать» нужно номер 3542331, установим это значение в «Номер для вызова приложения»

Указание номера "донабора" для вызова приложения
  1. Перейдите во вкладку "Программный код" Вставьте шаблон:

1,Set(_ZDTMF=${EXTEN})
n,Set(_ZDST=84950000000)
n,Set(_ZPROVIDERID=SIP-1601534775)
n,Goto(z-outgoing,${ZDST},1)
Вставка шаблона во вкладку "Программный код"
  • Если в поле «Номер для вызова приложения» указать шаблон 9XXXX, то станет возможно «донабрать» любые пятизначные номера, начинающиеся с цифры «9»

  • В приложении переменной «ZDST» присвойте номер, на который следует совершить вызов

  • В переменной «ZDTMF» следует указать номер для дополнительного набора

  • В переменной «ZPROVIDERID» укажите идентификатор провайдера, через которого следует совершить исходящий вызов. ID можно подсмотреть в адресной строке браузера при редактировании провайдера

Конференция с постоянным внешним абонентом

  • Допустим на АТС настроена конференц-комната с номером «354233».

  • При звонке сотрудника(ов) в конференцию необходимо всегда подключать внешнего абонента.

  • При отключении сотрудников от конференции внешнего абонента необходимо отключать

Это может потребоваться для организации связи с внешней (относительно MIKOPBX) конференцией. Позволит сэкономить на исходящих звонках (будет занята только одна линия).

  1. В разделе «Телефония» - «Конференция» создаем новую конференцию

  1. Укажем название комнаты «Z-CONF-354233»

  1. Укажем внутренний номер «354233»

  1. Опишем «Приложение Dialplan» (см. )

  1. Название «Z-Worker-CONF»

  1. Номер для вызова «2200103» (может быть произвольным)

  1. Укажите тип кода «PHP-AGI скрипт»

  1. Код

  1. Правим файл «/var/spool/cron/crontabs/root» через меню

  1. Добавляем задачу в конец файла:

  1. В данном примере «DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B» - Это идентификатор созданного ранее приложения. ID можно подсмотреть в адресной строке браузера при редактировании приложения.

  2. Опишем дополнительные контексты через меню . Править будем файл extensions.conf.

  1. Добавьте в конец файла следующий код:

При звонке в конференцию по номеру 354233 автоматически будет подключаться внешний абонент с номером 84957776675. Как только абонент ответи, будет произведен набор добавочного номера 354233. Как только все «внутренние» участники покинули конференцию, внешний абонент будет отключен.

Задача в крон нужна лишь для дополнительной «защиты», по сути это рестарт php скрипта каждую минуту

Равномерное распределение исходящих

  1. Перейдите в раздел

  1. Откройте на редактирование modules.conf

  1. Добавьте следующий код в конец файла:

  1. Откройте на редактирование файл extensions.conf

  1. Добавьте следующий код в конец файла:

В строках вида «Set(PUSH(rrItem)=SIP-1601534775)» перечисляются идентификаторы провайдеров, среди которых следует равномерно распределять исходящие. Идентификатор можно скопировать в адресной строке браузера при редактировании провайдера. В переменной «busyLevel» определяется максимально допустимое количество одновременных звонков через провайдера.

Для каждого провайдера потребуется описать исходящий маршрут. Шаблон в маршрутах должен быть одинаковым.

<?php

require_once 'Globals.php';

use MikoPBX\Core\System\Util;
use \MikoPBX\Core\Asterisk\AGI;
use \MikoPBX\Core\Asterisk\AsteriskManager;

function checkStartConf(){
    $Z_DTMF         = '354233';
    $Z_PROVIDER_ID  = 'SIP-1601534775';
    $Z_DST          = '84957776675';

    $am = new AsteriskManager();
    $am->connect();

    $confEmpty = true;
    $confChannelFound = false;
    $data = $am->meetMeCollectInfo($Z_DTMF);
    foreach ($data as $channelData){
        $value = $am->GetVar($channelData['Channel'], '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,
            null,
            "__ZDTMF={$Z_DTMF},__ZPROVIDERID={$Z_PROVIDER_ID},__ZDST={$Z_DST}}",
            '0');

    }elseif ($confChannelFound === true && $confEmpty === true){
        $asteriskCmd = Util::which('asterisk');
        Util::mwExec("{$asteriskCmd} -rx 'meetme kick {$Z_DTMF} all'");
    }
}

$action = $argv[1]??'';
if($action === 'start'){
    $pid = Util::getPidOfProcess(basename($argv[0])." start$", getmypid());
    var_dump($pid);
    if(!empty($pid)){
        $killCmd = Util::which('kill');
        Util::mwExec("{$killCmd} {$pid}");
    }
    while (true){
        checkStartConf();
        sleep(3);
    }
}else{
    $agi = new AGI();
    $agi->answer();
    checkStartConf();
    $agi->hangup();
}
*/1 * * * * /usr/bin/php -f /var/lib/asterisk/agi-bin/DIALPLAN-APP-EC12CFAE6783FE82FD34F16E40C7386B.php start > /dev/null 2> /dev/null
[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,Meetme(${EXTEN},qdMTr)
  same => n,Hangup()
Приложения диалпланов
Кастомизация системных файлов
Кастомизация системных файлов
Раздел "Конференция"
Окно создания новой конференции
Внутренний номер
Раздел Приложения диалпланов
Указание названия в меню создания диалплана
Указание номера для вызова приложения в меню создания диалплана
Указание типа кода в меню создания диалплана
Код в меню создания диалплана
Файл "/var/spool/cron/crontabs/root" в меню кастомизация системных файлов
Добавление задачи в конец файла
Правка файла "extensions.conf" в меню "Кастомизация системных файлов"
load => func_global.so
[all-outgoing-custom]
exten => _X!,1,NoOp()
    same => n,Set(NEED_RETURN=0)
    ; Описываем список провайдеров
    same => n,Set(PUSH(rrItem)=SIP-1601534775)
    same => n,Set(PUSH(rrItem)=SIP-1611151795)    
    same => n,Set(PUSH(rrItem)=SIP-1681205343)
    ; Максимальное количество одновременных звонков через линию
    same => n,Set(busyLevel=50)
    
    ; Проверка, есть ли провайдер в списке. 
    same => n,ExecIf($[ "${FIELDNUM(rrItem,\,,${PROVIDER_ID})}" == "0" ]?return)
    ; Если ID приоритетного провайдера определен, то сразу к проверке. 
    same => n,GotoIf($[ "${rrElement}x" != "x" ]?check)
    ; Инициализация массива
    same => n,Set(rrArray=${EMPTY})
    same => n,Set(i=${SHIFT(rrItem)})
    same => n,While(1)
    same => n,ExecIf($[ "${i}x" == "x" ]?ExitWhile())
    same => n,ExecIf($[ "${rrArray}x" != "x" ]?Set(rrArray=${rrArray},))
    same => n,ExecIf($[ "${GLOBAL(${i})}x" == "x" ]?Set(GLOBAL(${i})=0))
    same => n,Set(rrArray=${rrArray}${i}:${GLOBAL(${i})})
    same => n,Set(i=${SHIFT(rrItem)})
    same => n,EndWhile
    ; Поиск элемента с меньшим весом
    same => n,Set(rrArray=${SORT(${rrArray})})
    same => n,Set(rrElement=${SHIFT(rrArray)})
    same => n,While(1)
    same => n,ExecIf($[ $[${GROUP_COUNT(${rrElement})} < ${busyLevel}] ]?ExitWhile())
    same => n,ExecIf($[ "${rrElement}x" == "x" ]?ExitWhile())
    same => n,NoOp( ${rrElement} - is busy)
    same => n,Set(rrElement=${SHIFT(rrArray)})
    same => n,EndWhile
    same => n,NoOp(--- ${rrElement} ---)
    
    ; Проверка совпадает ли провайдер
    same => n(check),ExecIf($[ "${PROVIDER_ID}x" != "${rrElement}x" ]?Set(NEED_RETURN=1))
    same => n,ExecIf($[ "${PROVIDER_ID}x" != "${rrElement}x" ]?return)
    ; Увеличиваем счетчик
    same => n,Set(GLOBAL(${rrElement})=$[${GLOBAL(${rrElement})} + 1])
    ; Счетчик активных звонков через провайдера
    same => n,Set(GROUP()=${rrElement})
    same => n,return
Кастомизация системных файлов
Раздел "Кастомизация системных файлов"
Файл Modules.conf
Код для файла Modules.conf
Файл Extensions.conf
Код для extensions.conf
Кастомизация системных файлов
Приложения диалпланов

Пример шаблона: звонки в другую страну (Украина, Беларусь, Латвия)

Звонки на номера:

  • 383XXXXXXXXX

  • 380XXXXXXXXX

  • 375XXXXXXXXX

  • 371XXXXXXXXX

  1. Перейдите в раздел Маршрутизация → Исходящие маршруты

Раздел "Исходящие маршруты"
  1. Создайте новое правило исходящей маршрутизации

Создание нового правила исходящей маршрутизации
  1. Заполните параметры согласно шаблону снизу:

Шаблон для вызовов за рубеж

Теперь при звонке на любые номера, удовлетворяющие шаблонам: 383XXXXXXXXX, 380XXXXXXXXX, 375XXXXXXXXX, 371XXXXXXXXX вызов направится через провайдера Задарма(Novofon).

Замена префикса номера с "+7" на "8"

Необходимо заменить префиксы номеров +7 на 8. Пример, номер +74952293042 должен быть преобразован к номеру 84952293042.

  1. Перейдите в раздел "Маршрутизация" → "Исходящие маршруты"

Нажмите "Добавить новое правило"

  1. Создайте шаблон как представлено на изображении:

  1. Нажмите "Сохранить"

Звонки на экстренные номера

Необходимо иметь возможность звонить на экстренные номера 101, 102, 103, 112 и т.д.

  1. Переходим в раздел Маршрутизация → Исходящие маршруты.

Раздел ""
  1. Добавляем новое правило

Добавление нового правила
  1. Заполняем параметры как на скриншоте ниже:

Параметры для правила "Звонки на экстренные номера"
  1. Звонки на экстренные номера направляете через произвольного провайдера. Провайдер должен поддерживать набор экстренных номеров. Приоритет данного правила должен быть наивысшим, т.е. в списке созданных исходящих маршрутов он должен быть описан первым.

Указание приоритета для звонков на экстренные номера
  1. Перейдите в раздел Система → Кастомизация системных файлов.

Раздел "Кастомизация системных файлов"
  1. Откройте для редактирования конфигурационный файл extensions.conf.

Редактирование файла "extensions.conf"
  1. Установите режим «Добавлять в конец файла». В черное окно добавьте следующий фрагмент кода:

[internal](+)
exten => _1XX,1,Goto(outgoing,${EXTEN},1)	
Добавление кода в конец файла

В выше приведенном фрагменте кода мы описали правила для всех трехзначных номеров, начинающихся с 1. Если нужно указать конкретные экстренные номера, то вместо выше представленного кода нужно вставить следующие строки:

[internal](+)
exten => 112,1,Goto(outgoing,${EXTEN},1)
exten => 101,1,Goto(outgoing,${EXTEN},1)
exten => 102,1,Goto(outgoing,${EXTEN},1)
exten => 103,1,Goto(outgoing,${EXTEN},1)
Исходящие маршруты