# Автоматическая телефонная станция •

# Вводная документация



# История версий

#### Введение

Система использует семантическое версионирование.

- Обновление между мажорными версиями возможен только после проведения аудита текущей версии станции. Для версии менее 8.0.0 для перехода необходима новая установка и настройка станции с помощью технической службы в рамках сопровождения или разовыми работами. Для версий более 8.0.0 переход возможен без новой установки с помощью технической службы в рамках сопровождения или разовыми работами.
- Обновление между минорными версиями возможен с помощью технической службы в рамках сопровождения или разовыми работами.
- Обновление между патч версиями возможен с помощью технической службы в рамках сопровождения или разовыми работами.

#### Версия 9.1.2 от 12.11.2025

- Добавлена возможность перезапуска службы.
- Добавлена дата запуска службы.
- Удален поиск из меню.

#### Версия 9.1.1 от 07.11.2025

- Изменена главная страница.
- Исправлена ошибка заблокированных адресов.

#### Версия 9.1.0 от 05.11.2025

- Добавлен модуль управления службами.
- Обновление миграции до версии 20251105132000.

#### Версия 9.0.1 от 28.10.2025

- Изменена страница авторизации.
- Изменена иконка сайта.

#### Версия 9.0.0 от 09.10.2025

- Обновление миграции до версии 20251009164000.
- Добавлена информация на главную страницу.
- Изменены настройки канального драйвера.

#### Версия 8.8.4 от 14.09.2025

- Изменена главная страница.

#### Версия 8.8.3 от 26.08.2025

- Добавлен генератор паролей.

#### Версия 8.8.2 от 26.08.2025

- Исправлена ошибка резервных копий.

#### Версия 8.8.1 от 19.08.2025

- Замена библиотеки PHPExcel с поддержкой PHP 7.4.

#### Версия 8.8.0 от 15.08.2025

- Добавлен отчет по автоматическому обзвону.
- Обновление миграции до версии 20250815130000.
- В автоматический обзвон добавлено количество попыток.
- Добавлено время вызова в модуль автоматического обзвона.
- Исправлен импорт контактов в модуле автоматического обзвона.
- Исправлен экспорт контактов в модуле автоматического обзвона.

#### Версия 8.7.4 от 13.08.2025

- Удалено создание транспорта при установке.
- Исправлены ошибки на главной странице.
- Добавлены новые параметры на главную страницу.

#### Версия 8.7.3 от 08.08.2025

- Добавлена информация об активных звонках на главную страницу.

#### Версия 8.7.2 от 29.07.2025

- Исправлен переход со страницы на страницу.
- Добавлена информация на главную страницу.

#### Версия 8.7.1 от 22.07.2025

- Исправлены таблицы Адрес записи и таблица контакты.

#### Версия 8.7.0 от 11.07.2025

- Обновление миграции до версии 20250711200000.
- Добавлена опция в адрес записи, квалификация контакта только при ответе со статусом 2xx.
- Исправлены ошибки атематического дозвона.

#### Версия 8.6.2 от 11.07.2025

- Добавлена информация по конечным точкам и контактам на главную страницу.
- Исправлен вывод выбора в формах.

#### Версия 8.6.1 от 10.07.2025

- Исправлены ошибки автоматического обзвона.
- Исправлены ошибки русификации модуля автоматического обзвона.
- Добавлена служба автоматического обзвона.
- Исправлены описания полей автоматического обзвона.
- Добавлено время между автоматическими обзвонами.

#### Версия 8.6.0 от 10.07.2025

- Обновление миграции до версии 20250709170000.
- Добавлен в тестовом режиме модуль автоматического обзвона.

#### Версия 8.5.0 от 03.07.2025

<p class="callout info">Если ранее транспорт был настроен на получение настроек из конфигурационного файла, то необходимо удалить все секции связанные с транспортным протоколом из базы данных, Заново перезаписать настройки каждого транспорта в меню канального драйвера. Применить настройки на станции.</p>

\# mysql  
&gt; use pbx  
&gt; select \* from static\_pjsip;  
&gt; delete from static\_pjsip;

- Настройки транспортного протокола перенесены в конфигурационный файл.
- Обновление миграции до версии 20250703164000.

#### Версия 8.4.17 от 03.07.2025

- Исправлена пагинация страниц.

#### Версия 8.4.16 от 10.03.2025

- Добавлена настройка для конечной точки "Заголовок P-Asserted-Identity"
- Добавлена настройка для конечной точки "Заголовок Remote-Party-ID"

#### Версия 8.4.15 от 07.03.2025

- Добавлена отладка контактов

#### Версия 8.4.14 от 01.03.2025

- Изменена отправка аудио файлов через Телеграм.

#### Версия 8.4.13 от 25.02.2025

- Добавлена информация в список конечных точек.

#### Версия 8.4.12 от 21.02.2025

- Добавлена информация на главную страницу.

#### Версия 8.4.11 от 18.02.2025

- Добавлена поддержка доменов.

#### Версия 8.4.10 от 24.12.2024

- Исправлена ошибка загрузки файлов.

#### Версия 8.4.9 от 03.12.2024

- Исправлены ошибки в статусах регистраций.

#### Версия 8.4.8 от 30.10.2024

- Исправлены ошибки в API.

#### Версия 8.4.7 от 30.10.2024

- Добавлена возможность выгрузки статистики через API.
- Исправлены ошибки в API.

#### Версия 8.4.6 от 01.09.2024

- Добавлены описания полей.

#### Версия 8.4.5 от 25.08.2024

- Добавлены описания полей.
- Исправлена ошибка с сохранением модемов.

#### Версия 8.4.4 от 22.08.2024

- Добавлены описания полей.

#### Версия 8.4.3 от 18.08.2024

- Исправлены ошибки.
- Добавлены описания полей.

#### Версия 8.4.2 от 05.08.2024

- Исправлены ошибки в создании дистрибутива.
- Исправлены ошибки в создании резервной копии.

#### Версия 8.4.1 от 05.08.2024

- Перенесен каталог синтеза файлов из веб интерфейса.

#### Версия 8.4.0 от 05.08.2024

- Константы разделены согласно модулям.
- Удалена таблица констант.

#### Версия 8.3.3 от 04.08.2024

- Добавлена возможность записи разговора в многоканальном режиме.

#### Версия 8.3.2 от 02.08.2024

- Добавлен выбор музыки на удержании для конечной точки.
- Добавлен новый механизм для группового вызова.

#### Версия 8.3.1 от 01.08.2024

- Удалена функция originate\_speach через API.

#### Версия 8.3.0 от 01.08.2024

- Добавлены настройки загрузки файла через интерфейс управления.
- Добавлена возможность загрузки файла через API.
- Добавлены пакеты к установке для загрузки файлов.
- Добавлена возможность передачи переменных через API.

#### Версия 8.2.10 от 12.07.2024

- Исправлена ошибка сохранения параметра Симметричный RTP в настройках конечной точки.

#### Версия 8.2.9 от 20.05.2024

- Добавлен параметр "Отклонение авторизации" в регистрациях канального драйвера.
- Исправлена ошибка поиска контакта в собрании конференций.

#### Версия 8.2.8 от 08.04.2024

- Переделан модуль синтеза в маршрутизации.
- Исправлены неверные показатели на главной странице.

#### Версия 8.2.7 от 02.04.2024

- Исправлена ошибка с резервным копированием файлов синтеза речи.

#### Версия 8.2.6 от 27.03.2024

- Исправлена ошибка перенаправления при запросах на внутренний или внешний адрес.

#### Версия 8.2.5 от 26.03.2024

- Исправлены заголовки страниц модулей.
- Исправлены названия таблиц в модуле синтеза речи.

#### Версия 8.2.4 от 25.03.2024


- Исправлена ошибка с удалением папки класса музыки на удержании.
- Исправлена ошибка с переименованием папки класса музыки на удержании.

#### Версия 8.2.3 от 25.03.2024


- Добавлена возможность разблокировать все адреса.
- Добавлена возможность разблокировать один адрес в джейле.

#### Версия 8.2.2 от 23.03.2024


- Переделана страница заблокированных IP адресов.

#### Версия 8.2.1 от 23.03.2024


- Исправление ошибок.
- Добавление версии миграции на главную страницу.

#### Версия 8.2.0 от 23.03.2024


- Исправление ошибок.
- Обновление миграции до версии 20240323150000.
- Добавление общей информации на главную страницу.
- Добавлен модуль синтеза речи.

# Документация администратора



# Групповой вызов абонентов

1\. Пример группового вызова абонентов

Set : DIALGROUP(group\_100,add)=PJSIP/user-101-domain  
Set : DIALGROUP(group\_100,add)=PJSIP/user-102-domain  
Set : DIALGROUP(group\_100,add)=PJSIP/user-103-domain  
Set : DIALGROUP(group\_100,add)=PJSIP/user-104-domain  
Set : DIALGROUP(group\_100,add)=PJSIP/user-105-domain  
Dial : ${DIALGROUP(group\_100)},60,tT

# Добавление нового абонента

1\. Настройка адреса записи

Канальный драйвер - Адрес записи.  
Добавить.

Наименование - Наименование адреса записи, Пример user-100-domain.  
Описание - Произвольное описание адреса записи.  
Идентификатор - Идентификатор адреса записи, является уникальным. Пример: user-100-domain.  
Контакт - Можно закрепить постоянный контакт за адресом записи.  
Истечение срока действия по умолчанию - Через какое время требовать регистрацию абонентского устройства. Пример 600.  
Почтовые ящики -   
Максимальное количество контактов - Максимальное количество контактов закрепленные за адресом записи.  
Минимальный срок действия - Минимальный срок действия регистрации.  
Удалить существующий - При повторной регистрации удаляет существующий контакт и заменяется новым.  
Частота квалификации - Время проверки абонентского устройства.  
Аутентификация квалификаций - Требуется ли аутентификация при квалификации.  
Максимальный срок действия - Максимальный срок действия регистрации.  
Исходящий прокси - Исходящий прокси.  
Квалификация контакта только при ответе со статусом 2xx - Квалификация контактов происходит если только ответ от другой стороны приходит со статусом 2xx.  
Поддержка Path - Включает поддержку Path для запросов регистрации.  
Таймаут квалификации - Время ожидания ответа от абонентского устройства.  
Расширение голосовой почты -  
Удалить недоступные - Удалить контакты если при проверке они являются не доступными.  
Группа - Группа в которую входит адрес записи.

2\. Настройка аутентификации

Канальный драйвер - Аутентификация  
Добавить

Наименование - Наименование аутентификации. Пример user-100-domain.  
Описание - Произвольное описание аутентификации.  
Идентификатор - Идентификатор аутентификации. Пример user-100-domain.  
Тип аутентификации - Какой тип аутентификации используется.  
Хэш md5 - Пароль в виде хэша md5.  
Пароль - Пароль  
Область - Область передаваемая в заголовках.  
Имя пользователя - Имя пользователя авторизации. Пример user-100-domain.  
Группа - Группа в которую входит аутентификация.

3\. Настройка конечной точки.

Канальный драйвер - Конечная точка.  
Добавить.

Наименование - Наименование конечная точки. Пример user-100-domain.  
Описание - Произвольное описание конечная точки.  
Идентификатор - Идентификатор конечная точки. Пример user-100-domain.  
Транспорт - Используемый транспорт  
Адрес записи - Используемый адрес записи  
Аутентификация - Используемая аутентификация.  
Маршрутизация - Используемая маршрутизация.  
Запрещенные кодеки - Запрещенные кодеки.  
Разрешенные кодеки - Разрешенные кодеки.  
Прямое медиа - Дает возможность соединять абонентов в обход станции.  
Режим DTMF - Режим DTMF.  
Использование обратного порта - Для инициализации звонка используется обратный порт.  
Поддержка ICE -  
Музыка на удержании - Музыка на удержании для абонента.  
Исходящая аутентификация - Исходящая аутентификация.  
Перезаписать контакт -   
Симметричный RTP -   
Заголовок P-Asserted-Identity -   
Заголовок Remote-Party-ID -   
Определитель номера - Определитель номера. Пример: User &lt;100&gt;  
Группа перехвата - Группа перехвата в которую входит конечная точка.  
Перехват групп - Какие группы может перехватывать конечная точка.  
Обнаружение факса -  
Поддержка T.38 -  
От домена - От какого домена отправлять запросы.  
От пользователя - От какого пользователя отправлять запросы.  
Таймаут RTP - Количество секунд после которых канал считается мертвым.  
Контроль доступа - IP адреса с которых разрешена регистрация абонентов.  
Индикаторы статуса -   
Поддержка WebRTC -  
Группа - Группа в которую входит конечная точка.

# Запись звонков в многоканальном режиме

Начиная с версии 8.3.4

Для настройки записи в многоканальном режиме необходимо изменить глобальную переменную MIXMONITOR\_COMMAND в маршрутизации. Данный параметр можно изменить только в базе данных в таблице static\_extensions.

Значение переменной по умолчанию:  
/var/lib/asterisk/scripts/wavtompeg/script.php --uniqueid="^{UNIQUEID}"

Значение переменной для записи в многоканальном режиме:  
/var/lib/asterisk/scripts/wavtostereompeg/script.php --uniqueid="^{UNIQUEID}"

Для записи разговора используется приложение MixMonitor с параметрами:  
MixMonitor: ${UNIQUEID}.wav,,${MIXMONITOR\_COMMAND}

Настройки приложения для записи в многоканальном режиме  
MixMonitor: ${UNIQUEID}.wav,r(${UNIQUEID}\_receive.wav)t(${UNIQUEID}\_transmit.wav),${MIXMONITOR\_COMMAND}

Для изменения параметра во всей телефонной станции необходимо выполнить запрос:

Выбрать строки:  
SELECT \* FROM `realtime\_extensions` WHERE `app` = "MixMonitor";

Для записи в одноканальном режиме необходимо заменить строки выполнив следующий запрос:  
UPDATE `realtime\_extensions` SET `appdata` = "${UNIQUEID}.wav,,${MIXMONITOR\_COMMAND}" WHERE `app` = "MixMonitor";

Для записи в многоканальном режиме необходимо заменить строки выполнив следующий запрос:  
UPDATE `realtime\_extensions` SET `appdata` = "${UNIQUEID}.wav,r(${UNIQUEID}\_receive.wav)t(${UNIQUEID}\_transmit.wav),${MIXMONITOR\_COMMAND}" WHERE `app` = "MixMonitor";

# Настройка автоматического обзвона

1\. Предварительно необходимо настроить две маршрутизации. Для исходящих вызовов и для приветствия.

2\. Загрузите файл голосового приветствия на сервер через модуль Медиа -&gt; Аудиофайлы.

Назовите файл demo-domain.

3\. Настройка маршрутизации.

Пример маршрутизации проигрывания файла:

Маршрутизация: ivr-autodial-domain.

Расширение: s.

NoOp  
Answer  
Playback : demo-domain  
Hangup

Маршрутизация: outgoing-71234567890-domain.

Добавить расширение: h в исходящей маршрутизации.

NoOp : Переменные при завершении  
AGI : autodial/dialstatus.php,--dialstatus="${DIALSTATUS}",--contact\_uuid="${contact\_uuid}"  
Hangup

4\. После настройки маршрутизации можно переходить к настройкам автоматического обзвона.

# Настройка уведомлений Телеграм

1\. Авторизуемся на телефонной станции.

2\. Поиск идентификатора чата сотрудника.

Для поиска идентификатора чата, необходимо что бы сотрудник отписался боту телеграм.  
В телефонной станции заходим в меню Отладка - Телеграм.  
Если сотрудник отписался боту, то можно увидеть сообщение от данного сотрудника и его идентификатор чата.  
Данные об идентификаторе чата отображаются в течении последних 24 часов с момента написания телеграм боту.

3\. Настройка контактов получателей сообщений.

Заходим в меню Модули - Телеграм.  
Открываем список контактов получателей через Контакты в необходимой строке.  
Добавляем сотрудника в список контактов получателей:  
Наименование - Любое наименование.  
Описание - Описание контакта.  
Включен: Да.  
Идентификатор чата - идентификатор чата скопированный из отладки.

# Переадресация на сотовые номера сотрудников

#### Переадресация при входящих вызовах

Для настройка вызова на сотовый, необходимо использовать приложение Dial. Добавляется в место где необходимо произвести вызов на сотовый.

```
Dial: SIP/<Номер>@<Транк>,<Время>
```

Номер - Номер абонента  
Транк - Транк через который совершается вызов  
Время - Время дозвона абонента

Пример:

```
NoOp: Входящий вызов
...
...
...
Dial: SIP/user-110-office,15,tT
Dial: SIP/81234567890@peer-71234567890-office,60
Hangup
```

#### Переадресация при добавочных вызовах

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

Пример маршрутизации добавочного номера 110 с переадресацией на сотовый:

```
NoOp: Вызов на добавочный номер
Dial: SIP/user-110-office,15,t
Dial: SIP/81234567890@peer-71234567890-office,60
Hangup
```

#### Переадресация при внутренних вызовах

Для настройки переадресации при наборе внутреннего номера необходимо добавить в маршрутизацию внутренних номеров расширение 110.

Пример маршрутизации внутреннего номера 110 с переадресацией на сотовый:

```
NoOp: Вызов на внутренний номер
...
...
...
Dial: SIP/user-110-office,15,tT
Dial: SIP/81234567890@peer-71234567890-office,60
Hangup
```

# Перевод транспорта на статическую конфигурацию

1\. Отключение realtime для конфигурации транспорта.

update `static\_sorcery` set `commented` = 1 where `filename` = "sorcery.conf" and `category` = "res\_pjsip" and `var\_name` = "transport";

2\. Добавление статической конфигурации.

insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","type","transport");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","protocol","udp");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","bind","0.0.0.0:5060");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","local\_net","192.168.0.0/24");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","external\_media\_address","1.1.1.1");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","external\_signaling\_address","1.1.1.1");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","external\_signaling\_port","5060");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-udp","allow\_reload","yes");

insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","type","transport");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","protocol","tcp");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","bind","0.0.0.0:5061");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","local\_net","192.168.0.0/24");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","external\_media\_address","1.1.1.1");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","external\_signaling\_address","1.1.1.1");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","external\_signaling\_port","5061");  
insert into static\_pjsip (cat\_metric,var\_metric,commented,filename,category,var\_name,var\_val) values (0,0,0,"pjsip.conf","transport-tcp","allow\_reload","yes");

# Приложение Record

#### Краткое содержание

Запись в файл.

#### Описание

Если имя файла содержит «%d», эти символы будут заменены числом, увеличивающимся на единицу при каждой записи файла. Пользователь может нажать «#», чтобы прекратить запись и перейти к следующему приоритету. Если пользователь повесит трубку во время записи, все данные будут потеряны и приложение закроется.

- RECORDED\_FILE - Будет установлено окончательное имя файла записи без расширения.
- RECORD\_STATUS - Это окончательный статус команды
    
    
    - DTMF- Был получен завершающий DTMF ('#' или '\*', в зависимости от опции 't')
    - SILENCE- В записи возникла максимальная тишина.
    - SKIP- На линию еще не ответили и была указана опция 's'.
    - TIMEOUT- Достигнута максимальная длина.
    - HANGUP- Канал завис.
    - ERROR- Произошла неисправимая ошибка, повлекшая за собой ПРЕДУПРЕЖДЕНИЕ в журналах.

#### Синтаксис

Record(filename.format,\[silence,\[maxduration,\[options\]\]\])

#### Аргументы

- filename
    
    
    - filename - **необходимый**
    - format - **требуется** - формат типа записываемого файла (wav, gsm и т. д.).
- silence - Количество секунд молчания, которое можно разрешить перед возвращением.
- maxduration - Максимальная продолжительность записи в секундах. Если отсутствует или равен 0, то максимума нет.
- options
    
    
    - a - Добавлять к существующей записи, а не заменять.
    - n - Не отвечайте, но все равно запишите, если на линии еще не ответили.
    - o - Выход при нажатии 0, установив для переменной **RECORD\_STATUS** значение «OPERATOR» вместо «DTMF».
    - q - тихо (не издавать звуковой сигнал).
    - s - пропустить запись, если на линии еще нет ответа.
    - t - используйте альтернативный ключ завершения '\*' (DTMF) вместо стандартного '#'
    - u - Не обрезайте записанное молчание.
    - x - Игнорировать все клавиши терминатора (DTMF) и продолжать запись до зависания.
    - k - Сохранять записанный файл после зависания.
    - y - Прекратить запись, если получена какая-либо цифра DTMF*.*

# Ручное резервное копирование автоматической телефонной станции

Заходим через putty на сервер.

Для удобства можно использовать приложение Midnight Commander.

\# mc

Создаем во временной папке \\tmp, папку куда будем заливать резервные копии, и в будущем заархивируем (например backup).

\# mkdir /tmp/backup

Копируем в нее, сохраняя всю структуру, папки:

etc/asterisk  
opt/evolvex  
var/lib/asterisk  
var/www/html

Ниже производим действие в консоли:

\# cd /tmp/backup  
\# mysqldump -p pbx &gt; pbx.sql (вводим пароль от базы)

В папке backup должен появиться файл pbx.sql

Теперь всю папку backup заархивируем - находясь в папке tmp пропишем в консоли:

\# cd /tmp  
\# tar czf archive.tar.gz /tmp/backup/

Полученный архив закачиваем на обменник, можно по ftp (логин@адрес\_фтп\_сервера) и вводим пароль пользователя.

# Ручное создание резервной копии АТС

1\. Запускается под администратором.

mkdir /tmp/backup  
mysqldump -upbx -ppassword pbx &gt; /tmp/backup/pbx.sql  
mkdir /tmp/backup/etc  
mkdir /tmp/backup/var  
mkdir /tmp/backup/var/lib  
mkdir /tmp/backup/var/www  
mkdir /tmp/backup/var/www/html  
cp -R /etc/asterisk /tmp/backup/etc/asterisk  
cp -R /var/lib/asterisk /tmp/backup/var/lib/asterisk  
cp -R /var/www/html/pbx /tmp/backup/var/www/html/pbx  
cp -R /opt /tmp/backup  
tar cfvz /tmp/backup.tar.gz /tmp/backup

2\. Скопировать резервную копию backup.tar.gz на другой носитель.

# Синтез речи

#### Введение

Для оперативного создания голосовых приветствий и интерактивных голосовых меню в версии 8.0.0 была реализована возможность синтезировать речь через Web интерфейс телефонной станции. Данный модуль использует синтез от компании Яндекс. Для подключения данного модуля необходимо получить Yandex IAM Token. Полученный токен необходимо ввести в Настройки - Яндекс - Yandex IAM Token.

#### Синтез речи

Для работы с синтезом речи необходимо открыть меню Медиа - Синтез речи. Откроется окно настроек синтеза речи.

[![image.png](https://docs.enxx.ru/uploads/images/gallery/2024-10/scaled-1680-/RnOY9Do05kuzBKhe-image.png)](https://docs.enxx.ru/uploads/images/gallery/2024-10/RnOY9Do05kuzBKhe-image.png)

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

<table id="bkmrk-%D0%93%D0%BE%D0%BB%D0%BE%D1%81-%D0%9F%D0%BE%D0%BB-%D0%90%D0%BC%D0%BF%D0%BB%D1%83%D0%B0-ale" style="width: 100%; height: 844px;"><thead><tr><th style="width: 27.0674%;">Голос</th><th style="width: 10.0112%;">Пол</th><th style="width: 62.9101%;">Амплуа</th></tr></thead><tbody><tr><td style="width: 27.0674%;">`alena` (по умолчанию)  
</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
радостная — `good`   
</td></tr><tr><td style="width: 27.0674%;">`filipp`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">—</td></tr><tr><td style="width: 27.0674%;">`ermil`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">(по умолчанию) нейтральный — `neutral`   
радостный — `good`</td></tr><tr><td style="width: 27.0674%;">`jane`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
радостная — `good`   
раздраженная — `evil`</td></tr><tr><td style="width: 27.0674%;">`madirus`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">—</td></tr><tr><td style="width: 27.0674%;">`omazh`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
раздраженная — `evil`</td></tr><tr><td style="width: 27.0674%;">`zahar`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">(по умолчанию) нейтральный — `neutral`   
радостный — `good`</td></tr><tr><td style="width: 27.0674%;">`dasha`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
радостная — `good`  
дружелюбная — `friendly`</td></tr><tr><td style="width: 27.0674%;">`julia`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
строгая — `strict`</td></tr><tr><td style="width: 27.0674%;">`lera`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
дружелюбная — `friendly`</td></tr><tr><td style="width: 27.0674%;">`masha`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) радостная — `good`   
строгая — `strict`   
дружелюбная — `friendly`</td></tr><tr><td style="width: 27.0674%;">`marina`</td><td style="width: 10.0112%;">Ж</td><td style="width: 62.9101%;">(по умолчанию) нейтральная — `neutral`   
шепот — `whisper`   
дружелюбная — `friendly`</td></tr><tr><td style="width: 27.0674%;">`alexander`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">(по умолчанию) нейтральный — `neutral`   
радостный — `good`</td></tr><tr><td style="width: 27.0674%;">`kirill`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">(по умолчанию) нейтральный — `neutral`   
строгий — `strict`   
радостный — `good`</td></tr><tr><td style="width: 27.0674%;">`anton`</td><td style="width: 10.0112%;">M</td><td style="width: 62.9101%;">(по умолчанию) нейтральный — `neutral`   
радостный — `good`</td></tr></tbody></table>

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

[![synth-index-list.jpg](https://docs.enxx.ru/uploads/images/gallery/2024-10/scaled-1680-/LTnNYBT4J4zPPMVY-synth-index-list.jpg)](https://docs.enxx.ru/uploads/images/gallery/2024-10/LTnNYBT4J4zPPMVY-synth-index-list.jpg)

Для скачивания аудиофайла нажмите кнопку "Скачать".

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

#### Дополнительно

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

# Скрипт отслеживания службы

1\. Скрипт отслеживания службы

\#!/bin/sh  
\# Название процесса  
DAEMON="asterisk"  
\# "Убираем" grep из вывода  
EXCLUDE="grep"  
\# Минимальное количество процессов  
PROC\_NUM="0"  
\# Команда для перезапуска  
RESTART="/etc/init.d/asterisk restart"  
\# Утилита ps  
PS="/bin/ps"  
\# Утилита grep  
GREP="/usr/bin/grep"  
if \[ `$PS -ax | $GREP $DAEMON | $GREP -v $EXCLUDE | wc -l` -le "$PROC\_NUM" \]  
then  
 $RESTART  
fi

# Смена исходящей маршрутизации для внутреннего номера

1\. Меню - Канальный драйвер - Конечная точка

[![image.png](https://docs.enxx.ru/uploads/images/gallery/2025-02/scaled-1680-/2WEGbYKRDM3OeTxs-image.png)](https://docs.enxx.ru/uploads/images/gallery/2025-02/2WEGbYKRDM3OeTxs-image.png)

2\. Нажимаем редактировать напротив нужной конечной точки.

3\. Меняем параметр маршрутизация.

[![image.png](https://docs.enxx.ru/uploads/images/gallery/2025-02/scaled-1680-/dzP1T5Tu0C8t6sI2-image.png)](https://docs.enxx.ru/uploads/images/gallery/2025-02/dzP1T5Tu0C8t6sI2-image.png)

# Сообщение после звукового сигнала

#### Подготовка аудиофайла

Необходимо подготовить файл звукового приветствия, например "Оставьте сообщение после звукового сигнала".  
Через меню Медиа - Аудиофайлы загрузите файл с наименованием "message-office".  
Файл должен быть в формате wav (rate 8000 Hz, sample rate 16 bits, mono).

#### Настройка маршрутизации

Необходимо подготовить новую маршрутизацию, например "message-office"  
В созданной маршрутизации добавить расширение "s"

```
NoOp : Сообщение после звукового сигнала
Answer
Playback : message-office
Record : /tmp/${UNIQUEID}.wav,,300,k
Hangup
```

#### Настройка отправки на электронную почту

Добавить в маршрутизацию расширение "h"

```
NoOp : Отправка сообщения на электронную почту
AGI : email/attachment.php,--source="${CALLERID(number)}",--destination="Номер",--emails="mail@example.com",--attachment="/tmp/${UNIQUEID}.wav"
Hangup
```

#### Настройка перенаправления

В нужном месте маршрутизации добавьте приложение "GoTo"

```
NoOp : Входящий вызов
...
...
...
Goto : message-office,s,1
Hangup
```

# Документация пользователя



# Авторизация пользователя

1\. Авторизация пользователя

Для входа в Web интерфейс телефонной станции необходимо ввести IP адрес телефонной станции в Web браузере. Ссылка для входа будет иметь вид https://&lt;IP&gt;/pbx.

При правильном вводе откроется страница авторизации где необходимо ввести Логин и Пароль.

[![auth.jpg](https://docs.enxx.ru/uploads/images/gallery/2024-10/scaled-1680-/UHY6OMHfrEkFvPdD-auth.jpg)](https://docs.enxx.ru/uploads/images/gallery/2024-10/UHY6OMHfrEkFvPdD-auth.jpg)

2\. Восстановление пароля

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

[![password-recovery.jpg](https://docs.enxx.ru/uploads/images/gallery/2024-10/scaled-1680-/NoSAlZ3aO7mZMJEu-password-recovery.jpg)](https://docs.enxx.ru/uploads/images/gallery/2024-10/NoSAlZ3aO7mZMJEu-password-recovery.jpg)

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

# Настройка автоматического обзвона

1\. Предварительные настройки должны быть выполнены администратором телефонной станции.

2\. Авторизуемся на автоматической телефонной станции.

3\. Заходим в меню Модули -&gt; Автоматический обзвон.

4\. Нажимаем Добавить.

5\. Заполняем форму справочника автоматического обзвона.

[![image.png](https://docs.enxx.ru/uploads/images/gallery/2025-08/scaled-1680-/KEIxSxyP5x2ITk4L-image.png)](https://docs.enxx.ru/uploads/images/gallery/2025-08/KEIxSxyP5x2ITk4L-image.png)

Наименование - Произвольное наименование справочника автоматического обзвона.  
Описание - Произвольное описание справочника автоматического обзвона.  
Статус - Статус автоматического обзвона, для активации обзвона необходимо выбрать "Активный".  
Лимит - Количество звонков выполняемых за один обзвон. Необходимо установить значение менее количества доступных каналов.  
Перерыв - Перерыв между обзвонами. Необходимо установить время в секундах. Время должно быть больше чем будет проигрываться приветствие и завершение вызова.  
Количество попыток - Количество попыток дозвона до абонента.  
Исходящая маршрутизация - Настраивается предварительно администратором телефонной станции, необходимо использовать исходящую маршрутизацию.  
Маршрутизация - Маршрутизация с которой соединяется абонент, настраивается предварительно администратором станции.  
Расширение - Расширение маршрутизации на который приходит вызов.  
Группа - Группа за которой закреплен данный справочник.

# Документация разработчика



# Структура модуля телефонной станции

1\. Веб интерфейс модуля

Контроллер модуля  
pbx - application - controllers - module - Index.php

Модель модуля  
pbx - application - models - module - Index\_model.php

Вид модуля  
pbx - application - view - module - add\_page.php  
pbx - application - view - module - edit\_page.php  
pbx - application - view - module - index\_page.php

Русификация  
pbx - language - russian - module - index\_lang.php

2\. Видимость в конфигурации

pbx - application - config - pbx\_config.php

$config\['module'\] = 'yes';

3\. Меню

pbx - application - view - template - sidebar.php

4\. Сервисы  
\# /var/lib/asterisk/daemons/module/module\_daemon.service  
\# /var/lib/asterisk/daemons/module/daemon.php

5\. AGI скрипты

\# /var/lib/asterisk/agi-bin/module/agi.php

6\. Скрипты модуля

/var/lib/asterisk/scripts/module/script.php

7\. База данных

Таблица module

uuid Первичный varchar(36)  
name varchar(128)  
description varchar(128)  
group\_uuid varchar(36)

Индекс uuid

8\. Миграция модуля

pbx - application - migrations - timestamp\_add\_module.php

# Документация API



# Evolvex API

#### Введение

Программный интерфейс разработанный компанией Evolvex. Позволяет взаимодействовать с телефонной станцией через HTTP запросы. Позволяет расширить функциональность стандартного Manager API.

#### Проверка доступа

Проверка доступа

GET /api/index/check

<table border="1" id="bkmrk-" style="border-collapse: collapse; width: 100%; height: 89.1051px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td>Параметр</td><td>Тип</td><td>Обязательный</td><td>Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">context</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Нет</td><td style="height: 29.7017px;">Маршрутизация</td></tr><tr><td>uniqueid</td><td>String</td><td>Нет</td><td>Уникальный идентификатор звонка</td></tr></tbody></table>

Ответ в Json:

```json
{
  "data": {
    "api_user": {
      "uuid": "5485137a-3c6d-454e-9801-d3b875f7a5e0",
      "name": "API",
      "description": "",
      "enable": "yes",
      "api_key": "84f8fc34-82ad-46b0-b5f3-3cfd0462beeb",
      "group_uuid": "4c343af6-4a91-469a-a717-f682e52c830f"
    },
    "access": {
      "uuid": "0eb1bc58-b259-4c88-be02-a059d50cecc3",
      "name": "incoming",
      "description": "Входящая маршрутизация",
      "group_uuid": "4c343af6-4a91-469a-a717-f682e52c830f"
    },
    "file": true
  }
```

#### Получение файла mp3

GET /api/index/get\_file\_mp3

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5" style="border-collapse: collapse; width: 100%; height: 89.1051px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td>Параметр</td><td>Тип</td><td>Обязательный</td><td>Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr><td>uniqueid</td><td>String</td><td>Нет</td><td>Уникальный идентификатор звонка</td></tr></tbody></table>

Ответ:

Потоковое аудио

#### Получение файла wav

GET /api/index/get\_file\_wav

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-1" style="border-collapse: collapse; width: 100%; height: 89.1051px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td>Параметр</td><td>Тип</td><td>Обязательный</td><td>Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr><td>uniqueid</td><td>String</td><td>Нет</td><td>Уникальный идентификатор звонка</td></tr></tbody></table>

Ответ:

Потоковое аудио

#### Получение статуса звонка

GET /api/index/status

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-2" style="border-collapse: collapse; width: 100%; height: 89.1051px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td>Параметр</td><td>Тип</td><td>Обязательный</td><td>Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr><td>calleridnum</td><td>String</td><td>Нет</td><td>АОН</td></tr><tr><td>connectedlinenum</td><td>String</td><td>Нет</td><td>Соединенная линия</td></tr><tr><td>context</td><td>String</td><td>Нет</td><td>Маршрутизация</td></tr><tr><td>exten</td><td>String</td><td>Нет</td><td>Расширение</td></tr></tbody></table>

Ответ в Json:

```json
{
  "data": [
    {
      "Event": "Status",
      "Privilege": "Call",
      "Channel": "PJSIP/user-00000011",
      "ChannelState": "5",
      "ChannelStateDesc": "Ringing",
      "CallerIDNum": "109",
      "CallerIDName": "",
      "ConnectedLineNum": "110",
      "ConnectedLineName": "",
      "Language": "ru",
      "AccountCode": "",
      "Context": "outgoing",
      "Exten": "109",
      "Priority": "1",
      "Uniqueid": "1711279935.61",
      "Linkedid": "1711279935.60",
      "Type": "PJSIP",
      "DNID": "",
      "EffectiveConnectedLineNum": "110",
      "EffectiveConnectedLineName": "",
      "TimeToHangup": "0",
      "BridgeID": "",
      "Application": "AppDial",
      "Data": "(Outgoing Line)",
      "Nativeformats": "(alaw|ulaw)",
      "Readformat": "alaw",
      "Readtrans": "",
      "Writeformat": "alaw",
      "Writetrans": "",
      "Callgroup": "0",
      "Pickupgroup": "0",
      "Seconds": "5",
      "Variable": "DIALEDPEERNUMBER=user/sip:user@1.1.1.1:5937",
      "DIALEDPEERNUMBER": "user/sip:company@1.1.1.1:5937",
      "ActionID": "66000f44594c1"
    },
    {
      "Event": "Status",
      "Privilege": "Call",
      "Channel": "PJSIP/user",
      "ChannelState": "4",
      "ChannelStateDesc": "Ring",
      "CallerIDNum": "110",
      "CallerIDName": "",
      "ConnectedLineNum": "109",
      "ConnectedLineName": "",
      "Language": "ru",
      "AccountCode": "",
      "Context": "outgoing",
      "Exten": "109",
      "Priority": "7",
      "Uniqueid": "1711279935.60",
      "Linkedid": "1711279935.60",
      "Type": "PJSIP",
      "DNID": "109",
      "EffectiveConnectedLineNum": "109",
      "EffectiveConnectedLineName": "",
      "TimeToHangup": "0",
      "BridgeID": "",
      "Application": "Dial",
      "Data": "PJSIP/user/sip:user@1.1.1.1:5937,60,tT",
      "Nativeformats": "(alaw|ulaw)",
      "Readformat": "alaw",
      "Readtrans": "",
      "Writeformat": "alaw",
      "Writetrans": "",
      "Callgroup": "0",
      "Pickupgroup": "0",
      "Seconds": "5",
      "Variable": "SIPDOMAIN=pbx1.ru",
      "RINGTIME_MS": "298",
      "RINGTIME": "0",
      "PROGRESSTIME_MS": "",
      "PROGRESSTIME": "",
      "DIALEDTIME_MS": "",
      "DIALEDTIME": "",
      "ANSWEREDTIME_MS": "",
      "ANSWEREDTIME": "",
      "DIALEDPEERNAME": "",
      "DIALEDPEERNUMBER": "",
      "DIALSTATUS": "",
      "MIXMONITOR_FILENAME": "/var/spool/asterisk/monitor/1711279935.60.wav",
      "SIPDOMAIN": "pbx1.ru",
      "ActionID": "66000f44594c1"
    }
  ]
}
```

#### Создание звонка

GET /api/index/originate

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-3" style="border-collapse: collapse; width: 100%; height: 178.21px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td style="height: 29.7017px;">Параметр</td><td style="height: 29.7017px;">Тип</td><td style="height: 29.7017px;">Обязательный</td><td style="height: 29.7017px;">Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">channel</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">Канал</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">exten</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">Расширение</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">context</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">Маршрутизация</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">priority</td><td style="height: 29.7017px;">Integer</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">Приоритет</td></tr><tr><td>callerid</td><td>String</td><td>Нет</td><td>АОН</td></tr><tr><td>variable</td><td>String</td><td>Нет</td><td>Переменные</td></tr><tr><td>async</td><td>Boolean</td><td>Нет</td><td>Асинхронный ввод</td></tr></tbody></table>

variable - позволяет передать несколько переменных через запятую. Например variable=file=123,idcall=456

#### Загрузка файла

POST /api/index/uploads

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-4" style="border-collapse: collapse; width: 100%; height: 178.21px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td style="height: 29.7017px;">Параметр</td><td style="height: 29.7017px;">Тип</td><td style="height: 29.7017px;">Обязательный</td><td style="height: 29.7017px;">Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">file</td><td style="height: 29.7017px;">File</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">Файл</td></tr></tbody></table>

Пример загрузки файла:

```php
$curl_file = curl_file_create("/home/user/test.wav");

$post = array("file"=> $curl_file);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http:/192.168.0.2/pbx/api/index/uploads?api_key=11111111-2222-3333-4444-555555555555");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec($ch);
curl_close($ch);
```

#### Получение статистики звонков

POST /api/index/get\_log\_cdr

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-5" style="border-collapse: collapse; width: 100%; height: 178.21px;"><colgroup><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col><col style="width: 24.9663%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td style="height: 29.7017px;">Параметр</td><td style="height: 29.7017px;">Тип</td><td style="height: 29.7017px;">Обязательный</td><td style="height: 29.7017px;">Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">api\_key</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Да</td><td style="height: 29.7017px;">API Ключ</td></tr><tr style="height: 29.7017px;"><td style="height: 29.7017px;">start</td><td style="height: 29.7017px;">Datetime</td><td style="height: 29.7017px;">Нет</td><td style="height: 29.7017px;">Начало записей логов, если не указано берется начало дня.</td></tr><tr><td>end</td><td>Datetime</td><td>Нет</td><td>Конец записей логов, если не указано берется конец дня.</td></tr></tbody></table>

Ответ в Json:

```
{
  "data": [
    {
      "accountcode": null,
      "src": "79123456789",
      "dst": "110",
      "dcontext": "local-evolvex",
      "clid": "\"Сергей\" <79123456789>",
      "channel": "Local/110@local-evolvex-00000167;2",
      "dstchannel": "PJSIP/user-110-evolvex-000002a0",
      "lastapp": "Dial",
      "lastdata": "PJSIP/user-110-evolvex/sip:user-110-evolvex@1.1.1.1:10110,60,t",
      "start": "2024-10-30 09:59:15",
      "answer": null,
      "end": "2024-10-30 09:59:22",
      "duration": "7",
      "billsec": "0",
      "disposition": "NO ANSWER",
      "amaflags": "DOCUMENTATION",
      "userfield": null,
      "uniqueid": "1730267955.2409",
      "linkedid": "1730267935.2405",
      "peeraccount": null,
      "sequence": "1923",
      "source": null,
      "destination": null,
      "direction": null,
      "group_uuid": null
    }
  ]
}
```

# Manager API

#### Введение

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

/arawman =&gt; Raw HTTP Manager Event Interface with Digest authentication  
/rawman =&gt; Raw HTTP Manager Event Interface  
/amxml =&gt; XML Manager Event Interface with Digest authentication  
/mxml =&gt; XML Manager Event Interface

Документация описывает взаимодействие с интерфейсом событий через необработанные HTTP запросы. Аналогичная документация применима и к другим вариантам.

#### Авторизация

GET /rawman?action=login

<table border="1" id="bkmrk-action-%D0%94%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5-user" style="border-collapse: collapse; width: 100%; height: 130px;"><colgroup><col style="width: 25.0931%;"></col><col style="width: 23.7271%;"></col><col style="width: 27.191%;"></col><col style="width: 23.9775%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td style="height: 29.7017px;">Параметр</td><td style="height: 29.7017px;">Тип</td><td style="height: 29.7017px;">Обязательный</td><td style="height: 29.7017px;">Описание</td></tr></thead><tbody><tr style="height: 35.2983px;"><td style="height: 35.2983px;">username

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Да</td><td style="height: 35.2983px;">Пользователь</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">secret

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Да</td><td style="height: 35.2983px;">Пароль</td></tr></tbody></table>

Пример запроса: [http://&lt;ip&gt;:8088/rawman?action=login&amp;username=test&amp;secret=test](http://192.168.0.84:8088/asterisk/rawman?action=login&username=test&secret=test)

Пример ответа:

```
Response: Success
Message: Authentication accepted
```

#### Проверка доступности

GET /rawman?action=ping

Пример ответа:

```
Response: Success
Ping: Pong
Timestamp: 1711272193.709205
```

#### Запрос статуса телефонной станции

GET /rawman?action=status

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-1" style="border-collapse: collapse; width: 100%; height: 165.298px;"><colgroup><col style="width: 25.0931%;"></col><col style="width: 23.7271%;"></col><col style="width: 27.191%;"></col><col style="width: 23.9775%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td style="height: 29.7017px;">Параметр</td><td style="height: 29.7017px;">Тип</td><td style="height: 29.7017px;">Обязательный</td><td style="height: 29.7017px;">Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">actionid</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Нет</td><td style="height: 29.7017px;">Идентификатор запроса</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">channel

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Нет</td><td style="height: 35.2983px;">Канал</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">variables

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Нет</td><td style="height: 35.2983px;">Переменные</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">allvariables

</td><td style="height: 35.2983px;">Boolean

</td><td style="height: 35.2983px;">Нет</td><td style="height: 35.2983px;">Все переменные</td></tr></tbody></table>

Пример ответа:

```
Response: Success
EventList: start
Message: Channel status will follow

Event: Status
Privilege: Call
Channel: PJSIP/user
ChannelState: 6
ChannelStateDesc: Up
CallerIDNum: 110
CallerIDName: 
ConnectedLineNum: <unknown>
ConnectedLineName: <unknown>
Language: ru
AccountCode: 
Context: outgoing
Exten: 153
Priority: 3
Uniqueid: 1711273253.11
Linkedid: 1711273253.11
Type: PJSIP
DNID: 153
EffectiveConnectedLineNum: <unknown>
EffectiveConnectedLineName: <unknown>
TimeToHangup: 0
BridgeID: 
Application: Queue
Data: queue
Nativeformats: (alaw)
Readformat: alaw
Readtrans: 
Writeformat: slin
Writetrans: (slin@8000)->(alaw@8000)
Callgroup: 0
Pickupgroup: 0
Seconds: 21

Event: StatusComplete
EventList: Complete
ListItems: 1
Items: 1
```

#### Запрос создания звонка

GET /rawman?action=originate

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5-2" style="border-collapse: collapse; width: 100%; height: 165.298px;"><colgroup><col style="width: 25.0899%;"></col><col style="width: 23.7303%;"></col><col style="width: 27.191%;"></col><col style="width: 23.9775%;"></col></colgroup><thead><tr style="height: 29.7017px;"><td style="height: 29.7017px;">Параметр</td><td style="height: 29.7017px;">Тип</td><td style="height: 29.7017px;">Обязательный</td><td style="height: 29.7017px;">Описание</td></tr></thead><tbody><tr style="height: 29.7017px;"><td style="height: 29.7017px;">actionid</td><td style="height: 29.7017px;">String</td><td style="height: 29.7017px;">Нет</td><td style="height: 29.7017px;">Идентификатор запроса</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">channel

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Да</td><td style="height: 35.2983px;">Канал</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">exten

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Да</td><td style="height: 35.2983px;">Расширение</td></tr><tr style="height: 35.2983px;"><td style="height: 35.2983px;">context

</td><td style="height: 35.2983px;">String

</td><td style="height: 35.2983px;">Да</td><td style="height: 35.2983px;">Маршрутизация</td></tr><tr><td>priority

</td><td>Integer

</td><td>Да</td><td>Приоритет</td></tr><tr><td>application

</td><td>String

</td><td>Нет</td><td>Приложение</td></tr><tr><td>data

</td><td>String

</td><td>Да</td><td>Данные приложение</td></tr><tr><td>timeout

</td><td>Integer

</td><td>Да</td><td>Таймаут</td></tr><tr><td>callerid

</td><td>String

</td><td>Нет</td><td>АОН</td></tr><tr><td>variable

</td><td>String

</td><td>Нет</td><td>Переменные</td></tr><tr><td>account

</td><td></td><td>  
</td><td>  
</td></tr><tr><td>earlymedia

</td><td></td><td>  
</td><td>  
</td></tr><tr><td>async

</td><td>Boolean

</td><td>Нет</td><td>Асинхронный ввод</td></tr><tr><td>codecs

</td><td></td><td>  
</td><td>  
</td></tr><tr><td>channelid

</td><td></td><td>  
</td><td>  
</td></tr><tr><td>otherchannelid

</td><td></td><td>  
</td><td>  
</td></tr></tbody></table>

Пример запроса: [http://&lt;ip&gt;:8088/rawman?action=originate&amp;channel=PJSIP/user&amp;context=outgoing&amp;exten=100&amp;priority=1&amp;async=true](http://192.168.0.84:8088/asterisk/rawman?action=login&username=test&secret=test)

#### Список команд

GET /rawman?action=listcommands

Пример ответа:

```
Response: Success
AbsoluteTimeout: Set absolute timeout.  (Priv: system,call,all)
AGI: Add an AGI command to execute by Async AGI.  (Priv: agi,all)
AOCMessage: Generate an Advice of Charge message on a channel.  (Priv: aoc,all)
Atxfer: Attended transfer.  (Priv: call,all)
BlindTransfer: Blind transfer channel(s) to the given destination  (Priv: call,all)
Bridge: Bridge two channels already in the PBX.  (Priv: call,all)
BridgeDestroy: Destroy a bridge.  (Priv: <none>)
BridgeInfo: Get information about a bridge.  (Priv: <none>)
BridgeKick: Kick a channel from a bridge.  (Priv: <none>)
BridgeList: Get a list of bridges in the system.  (Priv: <none>)
BridgeTechnologyList: List available bridging technologies and their statuses.  (Priv: <none>)
BridgeTechnologySuspend: Suspend a bridging technology.  (Priv: <none>)
BridgeTechnologyUnsuspend: Unsuspend a bridging technology.  (Priv: <none>)
CancelAtxfer: Cancel an attended transfer.  (Priv: call,all)
Challenge: Generate Challenge for MD5 Auth.  (Priv: <none>)
Command: Execute Asterisk CLI Command.  (Priv: command,all)
ConfbridgeKick: Kick a Confbridge user.  (Priv: call,all)
ConfbridgeList: List participants in a conference.  (Priv: reporting,all)
ConfbridgeListRooms: List active conferences.  (Priv: reporting,all)
ConfbridgeLock: Lock a Confbridge conference.  (Priv: call,all)
ConfbridgeMute: Mute a Confbridge user.  (Priv: call,all)
ConfbridgeSetSingleVideoSrc: Set a conference user as the single video source
  distributed toall other participants.  (Priv: call,all)
ConfbridgeStartRecord: Start recording a Confbridge conference.  (Priv: system,all)
ConfbridgeStopRecord: Stop recording a Confbridge conference.  (Priv: system,all)
ConfbridgeUnlock: Unlock a Confbridge conference.  (Priv: call,all)
ConfbridgeUnmute: Unmute a Confbridge user.  (Priv: call,all)
CoreSettings: Show PBX core settings (version etc).  (Priv: system,reporting,all)
CoreShowChannelMap: List all channels connected to the specified channel.  (Priv: system,reporting,all)
CoreShowChannels: List currently active channels.  (Priv: system,reporting,all)
CoreStatus: Show PBX core status variables.  (Priv: system,reporting,all)
CreateConfig: Creates an empty file in the configuration directory.  (Priv: config,all)
DBDel: Delete DB entry.  (Priv: system,all)
DBDelTree: Delete DB Tree.  (Priv: system,all)
DBGet: Get DB Entry.  (Priv: system,reporting,all)
DBGetTree: Get DB entries, optionally at a particular family/key  (Priv: system,reporting,all)
DBPut: Put DB entry.  (Priv: system,all)
DialplanExtensionAdd: Add an extension to the dialplan  (Priv: system,all)
DialplanExtensionRemove: Remove an extension from the dialplan  (Priv: system,all)
Events: Control Event Flow.  (Priv: <none>)
ExtensionState: Check Extension Status.  (Priv: call,reporting,all)
ExtensionStateList: List the current known extension states.  (Priv: call,reporting,all)
FAXSession: Responds with a detailed description of a single FAX session  (Priv: call,all)
FAXSessions: Lists active FAX sessions  (Priv: call,all)
FAXStats: Responds with fax statistics  (Priv: reporting,all)
Filter: Dynamically add filters for the current manager session.  (Priv: system,all)
GetConfig: Retrieve configuration.  (Priv: system,config,all)
GetConfigJSON: Retrieve configuration (JSON format).  (Priv: system,config,all)
Getvar: Gets a channel variable or function value.  (Priv: call,reporting,all)
Hangup: Hangup channel.  (Priv: system,call,all)
ListCategories: List categories in configuration file.  (Priv: config,all)
ListCommands: List available manager commands.  (Priv: <none>)
LocalOptimizeAway: Optimize away a local channel when possible.  (Priv: system,call,all)
LoggerRotate: Reload and rotate the Asterisk logger.  (Priv: system,reporting,all)
Login: Login Manager.  (Priv: <none>)
Logoff: Logoff Manager.  (Priv: <none>)
MailboxCount: Check Mailbox Message Count.  (Priv: call,reporting,all)
MailboxStatus: Check mailbox.  (Priv: call,reporting,all)
MessageSend: Send an out of call message to an endpoint.  (Priv: message,all)
MixMonitor: Record a call and mix the audio during the recording.
  Use of StopMixMonitor is required to guarantee the audio file
  is available for processing during dialplan execution.  (Priv: system,all)
MixMonitorMute: Mute / unMute a Mixmonitor recording.  (Priv: system,call,all)
ModuleCheck: Check if module is loaded.  (Priv: system,all)
ModuleLoad: Module management.  (Priv: system,all)
Originate: Originate a call.  (Priv: originate,all)
Ping: Keepalive command.  (Priv: <none>)
PJSIPHangup: Hangup an incoming PJSIP channel with a SIP response code  (Priv: system,call,all)
PJSIPQualify: Qualify a chan_pjsip endpoint.  (Priv: system,reporting,all)
PJSIPRegister: Register an outbound registration.  (Priv: system,reporting,all)
PJSIPShowAors: Lists PJSIP AORs.  (Priv: system,all)
PJSIPShowAuths: Lists PJSIP Auths.  (Priv: system,all)
PJSIPShowContacts: Lists PJSIP Contacts.  (Priv: system,all)
PJSIPShowEndpoint: Detail listing of an endpoint and its objects.  (Priv: system,all)
PJSIPShowEndpoints: Lists PJSIP endpoints.  (Priv: system,all)
PJSIPShowRegistrationInboundContactStatuses: Lists ContactStatuses
  for PJSIP inbound registrations.  (Priv: system,all)
PJSIPShowRegistrationsInbound: Lists PJSIP inbound registrations.  (Priv: system,all)
PJSIPShowRegistrationsOutbound: Lists PJSIP outbound registrations.  (Priv: system,reporting,all)
PJSIPShowResourceLists: Displays settings for configured resource lists.  (Priv: system,all)
PJSIPShowSubscriptionsInbound: Lists subscriptions.  (Priv: system,all)
PJSIPShowSubscriptionsOutbound: Lists subscriptions.  (Priv: system,all)
PJSIPUnregister: Unregister an outbound registration.  (Priv: system,reporting,all)
PresenceState: Check Presence State  (Priv: call,reporting,all)
QueueAdd: Add interface to queue.  (Priv: agent,all)
QueueChangePriorityCaller: Change priority of a caller on queue.  (Priv: <none>)
QueueLog: Adds custom entry in queue_log.  (Priv: agent,all)
QueueMemberRingInUse: Set the ringinuse value for a queue member.  (Priv: agent,all)
QueuePause: Makes a queue member temporarily unavailable.  (Priv: agent,all)
QueuePenalty: Set the penalty for a queue member.  (Priv: agent,all)
QueueReload: Reload a queue, queues, or any sub-section of a queue or queues.  (Priv: <none>)
QueueRemove: Remove interface from queue.  (Priv: agent,all)
QueueReset: Reset queue statistics.  (Priv: <none>)
QueueRule: Queue Rules.  (Priv: <none>)
QueueStatus: Show queue status.  (Priv: <none>)
QueueSummary: Show queue summary.  (Priv: <none>)
QueueWithdrawCaller: Request to withdraw a caller from the queue back to the dialplan.  (Priv: <none>)
Redirect: Redirect (transfer) a call.  (Priv: call,all)
Reload: Send a reload event.  (Priv: system,config,all)
SendText: Sends a text message to channel. A content type
  can be optionally specified. If not set it is set to an empty
  string allowing a custom handler to default it as it sees fit.  (Priv: call,all)
Setvar: Sets a channel variable or function value.  (Priv: call,all)
ShowDialPlan: Show dialplan contexts and extensions  (Priv: config,reporting,all)
Status: List channel status.  (Priv: system,call,reporting,all)
StopMixMonitor: Stop recording a call through MixMonitor,
  and free the recording's file handle.  (Priv: system,call,all)
UpdateConfig: Update basic configuration.  (Priv: config,all)
UserEvent: Send an arbitrary event.  (Priv: user,all)
WaitEvent: Wait for an event to occur.  (Priv: <none>)
```

#### Описание команд

GET /rawman?action=command&amp;command=manager show command waitevent

Пример ответа:

```
Response: Success
Message: Command output follows
Output: [Syntax]
Output: Action: WaitEvent
Output: [ActionID:] <value>
Output: Timeout: <value>
Output: 
Output: [Synopsis]
Output: Wait for an event to occur. 
Output: 
Output: [Description]
Output: This action will elicit a 'Success' response. Whenever a manager event is
Output: queued. Once WaitEvent has been called on an HTTP manager session, events will
Output: be generated and queued.
Output: 
Output: [Arguments]
Output: ActionID
Output:     ActionID for this transaction. Will be returned.
Output: Timeout
Output:     Maximum time (in seconds) to wait for events, '-1' means forever.
Output: 
Output: [See Also]
Output: Not available
Output: 
Output: [Privilege]
Output: <none>
Output: 
Output: [List Responses]
Output: None
Output: 
Output: [Final Response]
Output: None
Output: 
Output: 
```