voip_json_configvoip_json_config — это конфигурация, которая объясняет Vetmanager, как интерпретировать события и данные конкретной АТС.
Vetmanager подключается к Asterisk Manager Interface (AMI) и получает поток технических событий, например:
Названия, последовательность и набор полей этих событий могут различаться в зависимости от:
chan_sip;Поэтому Vetmanager не привязан к одной жёсткой последовательности событий. Правила их обработки задаются в voip_json_config.
voip_json_config не настраивает SIP-транки, маршруты или пользователей АТС. Он описывает только преобразование событий и данных Asterisk во внутреннюю модель звонка Vetmanager.
Конфигурация может содержать два раздела:
{
"AMI": {},
"CDR": {}
}AMI отвечает за события в реальном времени и всплывающие уведомления о звонках.CDR отвечает за чтение истории звонков из базы Asterisk.Для стандартного FreePBX раздел CDR часто работает без индивидуальной конфигурации. Чаще всего под конкретную АТС адаптируется раздел AMI.
В упрощённом виде жизненный цикл выглядит так:
Asterisk
│
│ AMI-события
▼
Правила voip_json_config
│
├── новый звонок
├── ответ на звонок
└── завершение звонка
│
▼
Vetmanager
├── показывает уведомление
├── ищет клиента по номеру
├── определяет внутреннего абонента
└── сохраняет итоговую историю звонкаОдин реальный разговор может создать несколько каналов и десятки AMI-событий. Конфигурация должна отфильтровать технический шум, объединить нужные события в один звонок и определить его состояния.
AMIУпрощённый пример:
{
"AMI": {
"callId": "floor({Uniqueid})",
"allowEvents": [
"Newchannel",
"NewCallerid",
"DialBegin",
"DialEnd",
"Hangup"
],
"rules": {
"incoming": [
{
"event": "NewCallerid",
"state": "newCall",
"next": [1],
"condition": "length({CallerIDNum}) > 6",
"variables": {
"callerNo": "{CallerIDNum}",
"receiver": "{Exten}",
"realId": "{Uniqueid}",
"TYPE": "INCOMING"
}
},
{
"event": "DialEnd",
"state": "answerCall",
"next": [2]
},
{
"event": "Hangup",
"state": "endCall",
"next": "finish"
}
]
}
}
}Это только пример структуры. Окончательные события и условия определяются после получения фактического потока AMI от конкретной АТС.
callIdПример:
"callId": "floor({Uniqueid})"callId определяет идентификатор, по которому события объединяются в один звонок.
Один звонок может создать несколько каналов с разными Uniqueid. В зависимости от конфигурации АТС может потребоваться использовать:
Uniqueid;Linkedid;Неправильно выбранный callId может привести к следующим симптомам:
allowEventsПример:
"allowEvents": [
"Newchannel",
"DialBegin",
"DialEnd",
"Hangup"
]Это список событий, которые Vetmanager должен обрабатывать. Asterisk отправляет большое количество технических событий, большинство из которых для интеграции не требуется.
Все события, используемые в rules, должны также присутствовать в allowEvents. Если событие есть в правиле, но отсутствует в allowEvents, оно не будет обработано.
rulesПравила обычно разделяются на два направления:
"rules": {
"incoming": [],
"outgoing": []
}incoming — правила входящих звонков;outgoing — правила исходящих звонков.Каждый массив описывает ожидаемую последовательность событий. Порядок правил важен: очередное событие должно соответствовать одному из допустимых следующих шагов.
eventПример:
"event": "NewCallerid"Это название AMI-события, которое должно быть обработано на данном этапе.
В разных конфигурациях одну и ту же стадию звонка могут обозначать разные события. Например, ответ сотрудника может определяться через:
DialEnd;BridgeEnter;AgentConnect;Newstate;Поэтому одной информации о версии FreePBX или Asterisk недостаточно для гарантированного выбора событий.
stateПример:
"state": "newCall"state определяет действие внутри Vetmanager. Основные состояния:
startCall — начать обработку звонка;newCall — зарегистрировать новый звонок и показать уведомление;answerCall — отметить, что на звонок ответили;endCall — завершить звонок и закрыть уведомление.В зависимости от сценария могут использоваться дополнительные промежуточные состояния, например для удержания.
conditionПример:
"condition": "length({CallerIDNum}) > 6 & {ChannelState} = 4"condition фильтрует события. Это помогает отличить:
Можно использовать сравнения и логические операции:
= — равно;!= — не равно;> и < — сравнение;& — логическое «И»;| — логическое «ИЛИ».Также доступны функции преобразования значений:
length() — длина строки;floor() — округление числового идентификатора;instr() — проверка вхождения подстроки;substr() — получение части строки;firstexists() — выбор первого непустого поля.variablesПример:
"variables": {
"callerNo": "{CallerIDNum}",
"receiver": "{Exten}",
"realId": "{Uniqueid}",
"TYPE": "INCOMING"
}Здесь поля AMI преобразуются во внутренние поля звонка Vetmanager:
callerNo — внешний телефонный номер;receiver — внутренний номер сотрудника;realId — идентификатор звонка;TYPE — направление звонка.Поле receiver особенно важно, если в Vetmanager включена привязка внутренних номеров к пользователям. По нему система определяет, какому сотруднику показать уведомление.
nextПример перехода к следующим правилам:
"next": [1, 2]Пример завершения обработки:
"next": "finish"Таким образом, правила образуют конечный автомат:
новый звонок → ответ → завершениеВетвление позволяет учитывать пропущенный звонок, ответ другого сотрудника, очередь или разные варианты завершения.
CDRРаздел CDR описывает чтение истории звонков из базы Asterisk.
Упрощённый пример:
{
"CDR": {
"callId": "floor({uniqueid})",
"tableName": "cdr",
"timestampField": "{calldate}",
"map": {
"uniqueid": "{uniqueid}",
"start_datetime": "{calldate}",
"start_timestamp": "{datetime_timestamp}",
"destination": "{dst}",
"source": "{src}",
"length": "{billsec}",
"disposition": "{disposition}",
"filepath": "{recordingfile}",
"line_number": "{did}"
}
}
}Индивидуальная настройка CDR нужна, если:
Основные поля, которые Vetmanager должен получить:
uniqueid — идентификатор звонка;start_datetime — дата и время начала;start_timestamp — время начала в числовом формате;source — номер, с которого звонили;destination — номер назначения;length — продолжительность разговора;disposition — результат звонка;filepath — путь к записи разговора;direction — входящий или исходящий звонок;line_number — внешний номер линии.Для стандартного FreePBX обычно используется таблица cdr и поля calldate, src, dst, billsec, disposition, recordingfile, did и uniqueid.
Использование PJSIP допустимо и само по себе не мешает интеграции. Vetmanager не регистрируется как SIP-абонент и не подключается к транкам.
При этом PJSIP может влиять на:
Channel и DestChannel;Exten, CallerIDNum и ConnectedLineNum;Например, имя канала может начинаться с PJSIP/, тогда как в старой конфигурации оно начиналось с SIP/. Если условия используют поле канала, их необходимо адаптировать.
1. Открывается доступ к AMI
АТС должна разрешать TCP-подключение с диапазона Vetmanager:
84.38.177.144/28Обычно AMI работает на TCP-порту 5038, но может использоваться другой внешний порт.
2. Проверяется подключение
Проверяются:
3. Устанавливается исходная конфигурация
Сначала можно использовать стандартный вариант для FreePBX. Он служит отправной точкой, а не гарантированно готовой конфигурацией для любой установки.
4. Выполняются тестовые звонки
Рекомендуемые сценарии:
5. Анализируются AMI-события
Для каждого сценария определяются:
6. Корректируется voip_json_config
Разработчик изменяет:
allowEvents;rules;condition;variables;callId;7. Проверяется история CDR
Отдельно проверяются:
8. Проверяется получение записи
Если требуется прослушивание, Vetmanager подключается к FTP/FTPS-серверу, получает файл записи и сохраняет его в своё файловое хранилище.
Путь к записи должен соответствовать значению recordingfile из CDR и структуре каталогов на сервере.
Версии FreePBX и Asterisk помогают выбрать исходный шаблон, но не определяют окончательное поведение.
На одинаковых версиях события могут различаться из-за:
Поэтому используется следующий подход:
стандартный шаблон FreePBX
↓
фактические AMI-события тестовых звонков
↓
индивидуальная корректировка voip_json_config
↓
повторная проверка всех сценариевУведомление не появляется
Возможные причины:
allowEvents;condition;incoming или outgoing;Уведомление появляется несколько раз
Возможные причины:
callId;newCall.Уведомление не закрывается
Возможные причины:
Hangup относится к другому каналу;callId;next.Неправильно определяется сотрудник
Возможные причины:
Exten;ConnectedLineNum, DestCallerIDNum или другое поле;receiver сохраняется публичный номер линии;История есть, но уведомлений нет
CDR и AMI — независимые части интеграции. История может успешно загружаться из базы, даже если правила AMI ещё не настроены.
Уведомления есть, но история не загружается
AMI может работать при неправильном доступе к базе CDR или несовместимой структуре таблицы. В этом случае отдельно проверяются подключение к базе и раздел CDR.
Для подключения рекомендуется:
Для первоначального подключения потребуются:
cdr;voip_json_config позволяет подключать разные конфигурации Asterisk/FreePBX без жёсткой привязки Vetmanager к одной версии или одному набору событий.
Основной принцип работы:
voip_json_config фильтрует и связывает события.Стандартный шаблон FreePBX является отправной точкой. Окончательная конфигурация проверяется и при необходимости корректируется разработчиком по фактическим событиям входящих и исходящих тестовых звонков.