Инициализация скриптов и создание сервиса
Поскольку схема работы с Битрикс 24, сервисом для AMI не совсем проста и прозрачна, на ней надо остановится отдельно. Астериск при активации AMI просто открывает порт и все. При присоединении клиента она запрашивает авторизацию, потом клиент подписывается на нужные события. События приходят простым текстом, который PAMI преобразует в структурированные объекты и предоставляет возможность задание функции фильтрации только по интересующим событиям, полям, номерам и т.д.
Как только звонок поступает, возникает событие NewExten начиная с родительского контекста , затем идут все события по порядку следования строк в контекстах. При получении информации из заданных в диалплане _custom переменных CallMeCallerIDName и CallStart вызывается
-
Функция запроса UserID, соответствующий внутреннему номеру, куда пришел звонок. А если это группа дозвона? Вопрос политический, надо создать звонок всем сразу (когда звонят все сразу) или создавать по мере обзвона при поочередном звонке? У большинства клиентов стоит стратегия Fisrt Available, поэтому с этим нет проблем, звонит только один. Но решать вопрос надо
-
Функция регистрации звонка в Битрикс24, которая возвращает CallID, необходимый потом для сообщения о параметрах звонка и ссылке на запись. Требует или внутренний номер или UserID
После окончания звонка вызывается функция загрузки записи, которая одновременно сообщает статус завершения звонка (Занят, Нет ответа, Успех), а также загружает ссылку на mp3 файл с записью (если есть).
Поскольку модуль CallMeIn.php должен работать непрерывно, для него был создан SystemD файл запуска callme.service, который надо положить в /etc/systemd/system/callme.service
инициализация и запуск скрипта происходит через systemctl или service
Сервис будет сам перезапускаться по необходимости (при падениях). Сервис слежения за входящими не требует установки веб сервера, нужен только php (который точно есть на сервере FeePBX). Но при отсутствии доступа к записям звонков через Веб сервер (еще и с https) не будет возможности прослушивать записи разговоров.
Теперь поговорим про исходящие звонки. У скрипта CallMeOut.php две функции:
-
Инициация звонка при поступлении запроса на php скрипт (в том числе по кнопке «Позвонить» в самом битриксе). Без веб сервера не работает, запрос поступает через HTTP POST, в запросе содержится токен
-
Сообщение о звонке, его параметрах и записях в Битрикс. Происходит по инициативе Asterisk в диалплане при окончании звонка
Веб сервер нужен только для двух вещей — загрузка файлов записей битриксом (по HTTPS) и вызов скрипта CallMeOut.php. Можно использовать встроенный сервер FreePBX, файлы для которого лежат /var/www/html, можно установить другой сервер или прописать другой путь.
Звонки
-
«Внешние звонки»
Покажет все звонки, поступившие извне на АТС или совершенные ее абонентами вовне. Делится на входящие и исходящие и позволяет искать звонки по очередям и/или группам.
Помимо очереди(ей), в фильтре для входящих можно выбрать группу (например, если в диалплане после Queue() идет Dial(), то звонки тоже найдутся).
В дополнение к основным фильтрам: дата, очередь(и) и/или группа, под спойлером есть еще ряд дополнительных. Вот как это выглядит:
Переключим плашку Звонки: вверху страницы на «Исходящие»
Фильтр несколько отличается, но в целом все тоже самое.
Также отмечу, что дополнительные фильтры могут искать звонки как по внутреннему номеру абонента так и по его ФИО (соответствие ФИО номеру задается в «Настройки — Номера — Внутренние», расскажу чуть позже) -
«Внутренние звонки»
Отчет найдет вам все звонки между внутренними номерами, т.е. абонентами АТС.
Подробно останавливаться не стану, думаю здесь все ясно. -
«Пропущенные звонки»
Это табличное исполнение отчета «Главная — Общая» в части пропущенных вызовов, т.е. покажет: кто/куда/во сколько вам позвонил и остался без ответа. -
«Позвонили впервые»
— А кто нам звонил впервые за указанный период времени (т.е. вообще когда-либо покуда ведется БД звонков с учетом выбранного периода)?
— А вот кто (скрин снова под спойлером).
Как и во всех табличных отчетах, мы видим:
дату звонка, кто из сотрудников ответил, номер звонящего и наш городской, длительность и прочие данные.
FAQ«Звонки»
Параметры asterisk и SIP клиента
Прописываем STUN сервер у SIP клиента
Это необходимо для того, чтобы как asterisk, так и сам клиент могли определить внешний IP адрес клиента. Для этого в SIP клиенте достатоно прописать STUN сервер. По умолчанию для протокола STUN используется UDP порт 3478 (если необходимо задавать порт для STUN сервера, используйте этот порт). Во многих SIP клиентах настройка STUN сервера может задаваться не в самих параметрах SIP аккаунта, а в глобальных настройках программы
Примеры STUN серверов (можно прописать любой из них):
stun.ekiga.net
stun.3cx.com
stun.ideasip.com
stun.iptel.org
stun.rixtelecom.se
stunserver.org
stun.softjoys.com
stun.voipbuster.com
stun.voipstunt.com
stun.voxgratia.org
Проверить STUN сервер на работоспособность, и получить информацию о NAT можно с помощью утилиты client: http://prdownloads.sourceforge.net/stun/client.exe?download. Описание ее можно найти здесь: http://www.interface.ru/home.asp?artId=22409
Осуществляем проброс портов к asterisk с внешнего IP адреса
Эту задачу решает маршрутизатор (у кого-то — прокси-сервер ISA/TMG/Kerio, у кого-то — Cisco, у кого-то — точка доступа Zyxel/D-Link/TP-Link/…). Вам необходимо обеспечить проброс портов как для протокола SIP (звонки), так и для протокола RTP (сам разговор):
- Выход в интернет для сервера asterisk через NAT. Открыты для выхода должны быть порты UDP 5060 (по умолчанию, SIP), и 10000-20000 (UDP по умолчанию, RTP).
- подключение извне (проброс портов) с UDP порта 5060 (по умолчанию) на сервер asterisk, и UDP 10000-20000 (по умолчанию). Несколько моментов:
- даже если asterisk в Вашей сети работает на порту 5060, вовсе не обязательно из интернета давать доступ к порту 5060. Можно указать (например) такой маппинг портов: с внешнего IP, UDP порт 50600, на локальный IP сервера asterisk, порт 5060;
- не обязательно открывать все 10000 RTP портов. Для каждого подключения asterisk требует 2 открытых RTP порта. И если в настройках asterisk (в файле rtp.conf) предварительно ограничить количество RTP портов (например 1000 портов обеспечит до 500 одновременных разговоров), то на сервере также можно ограничить количество внешних портов для подключения
Указываем в конфигурации asterisk внешний IP и порт
На удивление, тут все достаточно просто (во всяком случае, что касается asterisk версии 11.4): в sip.conf прописать несколько параметров в секции general:
Указываем внешний реальный ip адрес сервера asterisk. Если порт, открытый в интернет, не совпадает с внутренним портом астериска, не забываем указать его:
или
Разумеется, после создания/изменения подобных параметров в sip.conf может оказаться недостаточным сделать команду sip reload или даже reload. Может потребоваться перезагрузка самого сервиса asterisk:
Указываем в конфигурации asterisk диапазоны локальной сети
Для этого в sip.conf в секции general прописываем диапазоны локальных IP адресов
Обратите внимание: если у Вас подключены SIP провайдеры не через интернет, а по отдельным линиям связи, то подсети этих провайдеров тоже нужно указать как локальные сети:. Разумеется, после создания/изменения подобных параметров в sip.conf может оказаться недостаточным сделать команду sip reload или даже reload
Может потребоваться перезагрузка самого сервиса asterisk:
Разумеется, после создания/изменения подобных параметров в sip.conf может оказаться недостаточным сделать команду sip reload или даже reload. Может потребоваться перезагрузка самого сервиса asterisk:
Запрещаем прямые соединения клиентов, разрешаем только через asterisk
Прописываем в sip.conf, в секции general опцию:
В старых версиях asterisk (до версии 1.6.2) для этого необходимо было использовать опцию canreinvite, для запрещения повторной отправки пакетов INVITE. В более новых версиях эта опция была переименована.
Поддерживаем соединение со стороны asterisk
Необходима поддержка двух видов соединений: для SIP и для RTP. Параметры для обоих протоколов можно указать как для всех клиентов (в этом случае параметр прописывается в sip.conf в секции general), так и для конкретного клиента (в этом случае параметр прописывается в sip.conf в настройках конкретного клиента).
Для протокола SIP:
Вместо XXX можно указать число , в этом случае asterisk будет посылать SIP пакет клиенту каждые XXX миллисекунд, а можно указать просто yes, в этом случае XXX=300 .
Для протокола RTP:
Вместо YYY нужно указать число, в этом случае asterisk будет посылать RTP пакет клиенту каждые YYY секунд, по умолчанию этот параметр равен 0 (то есть выключен).
Что мы умеем сегодня
- Прослушивать и скачивать записи совершенных вызовов
(причем скачать можно все записи, найденные по фильтру поиска, одним архивом). - Отслеживать качество отработки звонков, оценивать их эффективность
(кто сколько принял/пропустил/совершил звонков; их продолжительность). - Создавать группы внутренних номеров и просматривать отчеты в разрезе этих групп
(для исходящих вызовов, в отчетах по входящим абоненты группируются посредством очередей Asterisk). - Предоставлять каждому супервизору доступ к группам и очередям, отчеты которых он может просматривать.
- Смотреть статистику входящих звонков в разрезе каждого «внешнего» номера
(сколько входящих за период было по каждому номеру, сколько принято/пропущено). - Просматривать подробные журналы внешних, внутренних и пропущенных звонков, а также журнал позвонивших вам впервые (табличные отчеты с гибким фильтром поиска).
- Экспортировать все отчеты в Excel.
- Добавлять комментарии к звонкам (в табличных отчетах).
- Осуществлять мониторинг АТС
(мы интегрировали наш сервис с zabbix и отправим вам email/sms в случае обнаружения проблем). - Оценить время работы и перерывов каждого оператора очереди за выбранный период.
- Добавить логотип вашей компании
(на страничку авторизации и в хедер для локальной версии и только в хедер для облачной). - Задать любой вопрос support’у прямо из интерфейса.
- Смотреть разбивку по количеству входящих и исходящих звонков по областям/краям и прочим субъектам РФ на Яндекс.Карте.
Road map
Предыстория
Материал изначально готовился как доклад для asterconf 2020. Теперь постараюсь описать все более подробно в этой статье.
MIKOPBX — это бесплатная АТС с открытым исходным кодом на базе Asterisk 16. Год назад мы взялись за переход на PJSIP.
Основные причины:
-
PJSIP поддерживает «множественную регистрацию». На одном аккаунте можно без проблем регистрировать несколько конечных UAC
-
Корректная работа входящей маршрутизации при настройке регистрации нескольких учетных записей провайдера на одном адресе (IP+PORT)
-
PJSIP более гибок в настройке
-
chan_sip не развивается и объявлен deprecated в Asterisk 17
Далее опишу с какими сложностями мы столкнулись и какие выгоды получили.
Основная причина — необходимость в поддержке «множественной регистрации». Крайне удобно подключить к аккаунту несколько софтфонов / телефонов и не беспокоится, входящий вызов поступит где бы ты не находился.
Лично у меня подключены следующие устройства:
-
Аппаратный телефон на рабочем столе в офисе
-
Софтфон на ноутбуке
-
Софтфон на смартфоне
При поступлении входящего звонка на добавочный, все устройства звонят одновременно.
Главная
-
«Общая», где представлена информация о всех поступивших на АТС звонках в разрезе внешних («городских») номеров.
Скриншот верхней части страницы был до ката, ниже идут диаграммы и график: -
«Очереди и Группы», в котором отображена информация о входящих звонках:
Здесь можно выбрать одновременно все очереди (повторюсь — очереди Asterisk), или одну/несколько необходимых.
Скриншоты отчета по исходящим звонкам под спойлером ниже, дабы не нагружать пост
Отчет строится по всем исходящим вызовам сотрудников вовне, либо в разрезе группы, которую вы можете создать в «Настройки — Группы».
- оценить «выхлоп» рекламной компании, где вы указали определенный номер телефона
- понять какой номер наиболее «популярен» у клиентов
- узнать соотношение принятых/пропущенных к поступившим на АТС звонкам в целом
- получить картину по входящим звонкам как по очереди(ям) так и по каждому оператору в отдельности
- отследить количественные и качественные характеристики исходящих вызовов сотрудников
«Главная»«Звонки»
SIP телефон(софтфон) для 1С:Предприятия 8 и IP АТС (виртуальная и офисная) Промо
«АТС.Ринголайн» и «Ringophone» — это современный взгляд, комплексное решение для организации телефонии в офисе, которое работает прямо из коробки. Решения направлены на организации, где главный упор сделан на коммуникацию и взаимоотношения с клиентами.
RingoPhone 1С — это бесплатный sip телефон, выполненный в виде внешней обработки для 1С. Данная панель телефонии разработана для любых конфигураций 1С:Предприятия 8. RingoPhone работает с АТС на базе Asterisk и провайдерами, которые поддерживают SIP протокол. IP телефония набирает огромную популярность и всё больше возможностей открывается при объединении телефонии и CRM системы. Возможность встроить телефон в свою CRM систему, позволяет осуществлять управление не только на уровне АТС, но и на уровне самого телефона.
АТС.RingoLine изначально создавалась с учётом интеграции с современными CRM системами. CRM системам доступно менять любые настройки АТС. Такие как: создание пользователей, добавление и удаление операторов колл-центра, возможность задавать переадресацию сотрудникам, получать информацию о звонках с АТС, а возможность доработки позволит заложить новые алгоритмы распределения звонков по сотрудникам в зависимости от данных в CRM системе.
1 стартмани
Раздел для тех, кто не в теме.
Кто уже читал мои предыдущие статьи и знает про AMI (Asterisk Manager Interface) и AJAM, может смело пропустить этот раздел.
AMI – это интерфейс управления Asterisk-ом. Но, подключения к AMI, как и девушки, бывают разные. Два основных:
- AMI поверх TCP, который часто называют просто AMI
- AMI поверх HTTP, его еще называют AJAM (Asynchronous Javascript Asterisk Manager). Хотя, особой асинхронности я там не увидел.
Если объяснять на пальцах, то разница между 1 и 2, как между толстым и веб-клиентом. Ссылка для тех, кто-то хочет накуриться правильных английских мануалов.Внешняя компонента ROM-Asterisk может использовать оба способа подключения.Внешняя компонента от МИКО использует только AJAM. Но нам, они пока не нужны – мы будем подключаться без них.
Получение значения UserAgent
Для выборка корректного SIP заголовка необходимо понимать какое конечное устройство подключено к endpoint. В случае с pjsip ситуация несколько изменилась. Пример:
Пример в одну строчку для AOR с ID 300. Для упрощения ID endpoint = ID AOR и = EXTEN:
В функцию «PJSIP_AOR» передаем ID AOR, и в качестве опции указываем, что вернуть нам следует поле «contact».
В функцию «PJSIP_CONTACT» передаем полученный контакт, и в качестве опции указываем, что вернуть следует поле «user_agent».
Обратите внимание, PJSIP_AOR(300,contact) вернет ID контакта, но это не тоже самое, что можно увидеть в CLI. Пример результата PJSIP_AOR:
Пример результата PJSIP_AOR:
Пример вывода в CLI:
Идентификация провайдера
Для рада провайдеров телефонии может наблюдаться следующая картина:
-
Успешно проходит регистрация по адресу sip.test.ru
-
Допустим sip.test.ru резолвится в 10.10.10.10
-
Входящие вызовы поступают с 11.11.11.11
-
Входящие могут поступать и с 10.10.10.10
Вызовы могут не пройти авторизацию и будут завершены.
В PJSIP есть возможность идентификации по IP адресу:
В параметре «match», через запятую, можно описать все IP адреса провайдера. В этом случае входящий будет корректно сопоставлен с нужным endpoint.
Кроме того, следует обратить внимание на опцию «endpoint_identifier_order». Значение по умолчанию:
Значение по умолчанию:
Если у вас есть несколько учетных записей одного провайдера, которые регистрируются на одном и том же адресе IP:PORT, то имеет смысл поменять порядок идентификации:
Пример, есть три транка:
-
99999 — подключается к 10.10.10.10:5060
-
88888 — подключается к 10.10.10.10:5060
-
77777 — подключается к 10.10.10.10:5060
Если не настроить «endpoint_identifier_order», то:
-
все входящие будут направлены в контекст произвольного endpoint (идентификация пройдет по адресу IP:PORT), к примеру в контекст endpoint «99999» .
-
канал, созданный при входящем будет всегда ассоциироваться с одним и тем же endpoint, к примеру PJSIP/99999-0000XXX, на какой внешний номер бы ни звонил клиент
Настройка множественной регистрации
После конвертации конфигурационного фала потребовалось увеличить количество контактов, которые могут подключаться к учетной записи (далее endpoint).
Каждую входящую регистрацию Asterisk рассматривает как contact.
Параметр «max_contacts» позволяет ограничить количество устройств, которые могут подключиться к endpoint.
Количество подключенных контактов можно посмотреть в CLI консоли Asterisk:
Для того, чтобы при входящем звонили сразу все контакты, потребовалось доработать dialplan.
Пример c комментариями:
После правки dialplan началось интересное поведение системы.
Наши ожидания не оправдались. Мы предполагали, что при таком звонке, asterisk будет оперировать двумя каналами «Кто звонит» и «Кому звонит». На практике, все оказалось иначе.
Asterisk
Оригинал: http://www.voip-info.org/tiki-index.php?page=Asterisk+introduction
как используя, так и не используяPSTN
Asterisk дает возможность в реальном времени работать как с телефонной сетью общего пользования (ТфОп — PSTN анг.), так и с VoIP сетями
- Подключить Ваших работников, работающих из дома, к офисной АТС, по широкополосным каналам связи
- Соединить офисы, вне зависимости от их удаленности, через VoIP, Интернет или через приватную IP сеть
- Ваши работники получат возможность пользоваться голосовой почтой, интегрированной с Web приложениями и E-mail
- Даст возможность создавать интерактивные голосовые меню, для доступа абонентов, например, со службой продаж или с другими подразделениями компании
- Даст возможность доступа к вашей корпоративной АТС работникам, находящимся в командировке, соединяясь с использованием VPN из гостиницы или аэропортов, где есть беспроводные WLAN точки доступа
- …и многое другое
- Музыка ожидания (Music-on-hold) для абонентов ждущих ответа в очереди вызовов, поддерживается как потоковое воспроизведение, так и проигрывание MP3 музыки
- Очереди вызовов, где агенты совместно отвечают на входящие вызовы и мониторят эти очереди
- Интеграция с системой синтеза речи (Можно обеспечить интеграцию с системой Festival)
- Ведет записи учета звонков (CDR) для интеграции с билинговыми системами
- Интеграция с системой распознавания речи (например, с Sphinx Open Source voice recognition software)
- Имеет интерфейсы для работы со стандартными телефонными линиями, а также для работы с интерфейсами ISDN BRI и PRI
Каналы — телефонные соединения с АТС
SIPIAXMGCPH.323ISDNBRIPRIДополнительная информация:
- Обзор каналов используемых в Asterisk
- Asterisk H323 channels: Канал H.323
- Asterisk IAX channels: Канал IAX Inter-Asterisk-Exchange, для соединения Asterisk серверов
- Asterisk SIP channels: Канал SIP
- Asterisk Features: Brief Explanation
Как куда звонить — план набора (dial plan)
extensions.conf
- Соединить вызывающего с голосовым ящиком, если пользователь не ответил на вызов с основного или дополнительного телефонного аппарата, например, в течении 20 секунд
- Соединить поступающий вызов с многопользовательской конференцией
- Перевести вызовы на другой сервер Asterisk
- Заблокировать вызовы от неопределенных или нежелательных абонентов
- Получить данные о звонящем, запросом из базы данных по номеру вызывающего абонента (callerID), и принять решение какая группа телефонисток (менеджеров или агентов) должна ответить на этот вызов
- Создать очереди вызовов и посадить толпу телефонисток для обслуживания входящих вызовов
Дополнительная информация:
- Asterisk config extensions.conf
- Asterisk tips and tricks
Управление сервером asterisk — manager интерфейс
- отслеживать в реальном времени, что происходит в Вашей АТС
- Отлаживать различные протоколы, при поступающих соединениях и исходящих звонках
- Просматривать активных пользователей и текущие вызовы
- Изменять данные во внутренней базе данных asterisk
- Перегружать конфигурацию без перезапуска АТС
Дополнительная информация:
- Asterisk CLI
- Asterisk GUI
Конфигурация сервера Asterisk
файлы конфигурации Asterisk/etc/asteriskДополнительная информация:
- Asterisk config files: Обзор файлов конфигурации
- Asterisk config extensions.conf: План набора — ключевая настройка всей функциональности в АТС
- Конфигурации различных каналов: sip.conf, iax.conf, mgcp.conf и т. д. …
- Конфигурации приложений: voicemail, meetme conferencing и т. д.
Дальнейшее развитие возможностей и скрипты в Asterisk
- Используя приложения в плане набора, для достижения нужного вам результата. Существует некоторое количество команд, которые помогут создать Вам нужный скрипт в плане набора, например, gotoif. Можно использовать переменные для хранения и проверки результатов, а также функции, работающие со строками, для обработки процесса вызова абонента.
- agi: Интерфейс с внешними приложениями, расширяющий возможности Вашего плана набора, при помощи приложений на любом языке программирования по Вашему усмотрению — PHP, Perl, C, Java, Unix Shell и другие
- manager: API интерфейса администрирования, с помощью которого Ваши приложения могут подсоединяться к Asterisk
- И, конечно, C API, документированное в исходный кодах
Дополнительная информация:
- Asterisk.org: Документация, IRC, bug tracker, ссылки, cvs download information
- Digium: Железки, лицензии, комерческая поддержка, ссылки на комерческих партнеров
И что с этим делать?
Думаю, нужно подбирать решение по конкретной ситуации. Обращайтесь – помогу, если смогу.
В качестве абстрактных рекомендаций, могу сказать следующее:
- Ищите, тестируйте и найдете. Весь инструмент во вложенной к статье обработке. Поиграйтесь с частотой запросов и с таймаутом ответа.
- Пофильтруйте события – хотя бы уберите лишние классы событий. Об этом написано в других моих статьях.
Если пользователь использует толстый клиент, то скорее всего, он сидит внутри сети. Тогда нечего заморачиваться, можно использовать обычный AMI через TCP. Подключаем этого пользователя через ROM-Asterisk и пусть себе работает.
Если пользователь использует тонкий клиент и сидит внутри сети, тогда тоже самое – AMI поверх TCP и ROM-Asterisk. Кстати, тонкому клиенту удаленному, но с хорошим каналом, это тоже подойдет.
Если пользователь использует веб-клиент или же тонкий клиент на нестабильном канале, тогда однозначно AJAM.
Интеграция с внешними системами
Что такое интеграция АТС и CRM? Это настройки и программы, которые конвертируют данные и события между двумя этими платформами и пересылают друг другу. Самым распространенным способом взаимодействия независимых систем является API, а самым популярным способом доступа к API является HTTP REST. Но только не для asterisk.
Внутри Asterisk есть:
-
AGI — синхронный вызов внешних программ/компонентов, используется в основном в диалплане, есть библиотеки типа phpagi, PAGI
-
AMI — текстовый TCP сокет, работающий по принципу подписки на события и ввода текстовых команд, напоминает SMTP изнутри, умеет отслеживать события и управлять вызовами, ,есть библиотека PAMI — самая популярная для создания связи с Asterisk
Удобство или неудобство, возможность или невозможность работы с тем или иным API определяются задачами, которые необходимо решить. Задачи для интеграции с CRM следующие:
-
Отследить начало вызова, куда его перевели, вытащить CallerID, DID, времена начала и конца, может быть данные из директории (для поиска связи телефона и пользователя CRM)
-
Начать и окончить запись звонка, сохранить в нужном формате, сообщить по окончании записи где лежит файл
-
Инициировать звонок по внешнему событию (из программы), позвонить внутреннему номеру, внешнему и соединить их
-
Опционально: интегрировать с CRM, группами дозвона и FollowME для автоматического перевода звонков при отсутствии на месте(по информации CRM)
Все эти задачи можно решить через AMI или ARI, но ARI предоставляет гораздо меньше информации, нет многих событий, не отслеживаются многие переменные, которые в AMI все таки есть (например вызовы макросов, задание переменных внутри макросов, в том числе запись звонков). Поэтому, для правильного и точного отслеживания — выберем пока AMI (но не окончательно). Кроме того (ну а куда ж без этого, мы люди ленивые) — в исходной работе (статья в хабр) используют PAMI. *Потом надо попробовать переписать на ARI, но не факт что получится.
Изучаем логику работы
Итак для начала, как все это должно работать. При поступления звонка извне на АТС (событие SIP INVITE от провайдера) начинается обработка диалплана(плана набора, dialplan) — правил, что и в каком порядке делать со звонком. Из первого пакета можно получить много информации, которую потом можно использовать в правилах. Отличным инструментом для изучения внутренностей SIP является анализатор sngrep (ссылка) который просто ставится в популярных дистрибутивах через apt install/yum install и подобное, но можно и из исходников собрать. Посмотрим лог звонка в sngrep
В упрощенном виде диалплан занимается только первым пакетом, иногда также в процессе разговора совершается перевод звонков, нажатия кнопок (DTMF), разные интересности типа FollowMe, RingGroup, IVR и прочего.
Что внутри Invite пакета
Собственно большинство простых диалпланов работают с первыми двумя полями и вся логика крутится вокруг DID и CallerID. DID — куда звоним, CallerID — кто звонит.
Но ведь у нас фирма а не один телефон — и значит в АТС скорее всего есть группы вызова (одновременный/последовательный звонок нескольких аппаратов) на городских номерах (Ring Group), IVR (Здравствуйте, вы позвонили… Нажмите один для…), Автоответчики (Phrases), Временные условия (Time Conditions), Переадресация на другие номера или на сотовый (FollowMe, Forward). Это значит, что однозначно определить кому на самом деле придет вызов и с кем будет разговор при поступлении вызова очень сложно. Вот пример начала прохождения типового вызова в АТС наших клиентов
После успешного входа звонка в АТС происходит путешествие его по диалплану в разных «контекстах». Контекст с точки зрения Asterisk — это нумерованный набор команд, каждая из которых содержит фильтр по набранному номеру (он называется exten, для наружного вызова на начальном этапе exten=DID). Командами в строке диалплана может быть все что угодно — внутренние функции (например позвонить внутреннему абоненту — , положить трубку — ), условные операторы (и подобные), переходы к другим правилам этого контекста (), переход другим контекстам в виде вызова функций (Gosub, Macro). Отдельно стоит директива , которая добавляет команды другого контекста в конец текущего контекста. Команды, включенные через include всегда выполняются после команд текущего контекста.
Вся логика работы FreePBX построена на включении друг в друга разных контекстов через include и вызов через Gosub, Macro и обработчики Handler. Рассмотрим контекст входящих вызовов FreePBX
Вызов проходит по всем контекстам сверху вниз по очереди, в кажом контексте могут быть вызовы других контекстов как макросов (Macro), функций(Gosub) или просто переходы (Goto), поэтому реальное дерево того, что вызывается можно отследить только в логах.
Типовая схема настройки типичной офисной АТС показана ниже. При вызове во входящих маршрутах ищется DID, по нему проверяются временные условия, если все в порядке — запускается голосовое меню. Из него по кнопке 1 или таймауту выход на группу дозвона операторов. После окончания звонка вызывается макрос hangupcall, после которого ничего уже в диалплане выполнить не удастся, кроме специальных обработчиков (hangup handler).
Где в этом алгоритме звонка мы должны поставлять информацию о начале звонка в CRM, где начинать запись, где оканчивать запись и отсылать ее вместе с информацией о звонке на CRM?
Исходящая регистрация
Согласно документации Asterisk, разработчики выделяют два основных вида проблем регистрации:
Временные (temporary) проблемы
-
No Response
-
408 Request Timeout
-
500 Internal Server Error
-
502 Bad Gateway
-
503 Service Unavailable
-
504 Server Timeout
-
Некоторые 6xx ответы
Постоянные (Permanent) проблемы
-
401 Unauthorized
-
403 Forbidden
-
407 Proxy Authentication Required
-
Прочие 4xx, 5xx, 6xx ошибки
В pjsip.conf при настройке исходящей регистрации обязательно необходимо описать опции для повторной попытки регистрации:
Если sip_to_pjsip.py для конвертации конфигурации, то эти опции придется описать вручную.
Реализация
Считаем, что админ уже все настроил и можно приступать.Все, что нам нужно – это HTTPСоединение и ровные руки, чтобы отправлять ровные запросы.Код работы с Asterisk настолько тривиальный, что его нет смысла здесь приводить. Все сводится к элементарной отправке и чтению HTTP-запросов. Не верите? Смотрите сами:
Организация соединения:
Соединение=Новый HTTPСоединение(IP,Port,,,,Таймаут,);Отправка и чтение запроса:
ТекстКоманды=»/asterisk/rawman?action=…бла-бла-бла»;Запрос=Новый HTTPЗапрос();Запрос.АдресРесурса=ТекстКоманды;Ответ=Соединение.Получить(Запрос);
Это все
Настройки
- «Основные»Путь к файлам записей разговоров, ваш логотип, отображать ли статус АТС, и прочие настройки разместились здесь. Также, внизу страницы, найдутся демон для синхронизации данных АТС в облачную версии и инструкция по его настройке.
-
«Номера»
-
«Внешние»
На этой страничке нужно внести все ваши «городские» номера и понятную легенду (например, «Москва», «Питер», «Реклама» и т.д.) для них. -
«Внутренние»
Началом работы с настройкой служит кнопка «Загрузить номера из БД».
Она подтянет соответствие внутренний_номер <-> callerid из базы данных (в запросе используются все звонки за последний год).
Далее список ведется вручную, вы можете исправить его, дополнить, а также задать пароль для каждого сотрудника, дабы он мог авторизоваться и посмотреть свои звонки.
-
«Внешние»
-
«Группы»
Группировать внутренние номера полезно в случае, если их очень много или нужно разделение, например, на отделы или смены. Список всех групп выглядит следующим образом:
Добавлять/удалять сотрудников можно по одному, используя мультиселект (ctrl/cmd + ЛКМ):
и поиск: -
«Супервизоры»
Именно здесь администратор редактирует список супервизоров и назначает им доступ к отчетам групп и очередей.
Меню настройки супервизора похоже на настройку групп, есть все те же возможности.
Вот как оно выглядит: -
«Комментарии»
Внесите необходимые комментарии, и после сможете выставить один из них для любого звонка в группе табличных отчетов.
Модуль 3: Управление прохождением голосового трафика через NAT и FIREWALL
Теория
- Варианты расположения VoIP участников с точки зрения NAT и FIREWALL
- Особенности протоколов сигнализации SIP и IAX с точки зрения NAT и FIREWALL
- Элементы конфигурации Asterisk с точки зрения NAT и FIREWALL
или, для видеозвонков:
- для подключение Asterisk к Asterisk по протоколу SIP
3.2 Настройка NAT и FIREWALL на интернет шлюзе предприятия
# cat /etc/resolv.conf
search corpX.un nameserver 192.168.X.10
- Отключаем маршруты в сети слушателей
- Настраиваем NAT ()
3.3 Подключение SIP абонента (server.corpX.un), находящегося за NAT к Asterisk провайдера
voip1.un# cat /etc/asterisk/sip.conf
... ... ;nat=yes nat=force_rport,comedia ;canreinvite=no directmedia=no qualify=yes ... ... ;nat=yes nat=force_rport,comedia qualify=yes ;canreinvite=no directmedia=no ...
server# service asterisk restart
3.4 Подключение Asterisk, находящегося за NAT к VoIP провайдеру
CHAN SIP
!!!Примечание!!!
Эксперимент работает не сразу, попробовать
- pfctl -F states на voip1.un
- отключить windows firewall на host системе
server# cat /etc/asterisk/sip.conf
... localnet=192.168.1.0/255.255.255.0 localnet=192.168.X.0/255.255.255.0 ;;externip=172.16.1.X ;externaddr=172.16.1.X:6050 externaddr=172.16.1.X ;;defaultexpiry=60 ... ... nat=comedia qualify=yes directmedia=no ...
3.6 Подключение пользователей к Asterisk, находящемуся за NAT
!!!Примечание!!!
На преподавательской системе прописать маршруты в сети слушателей (из-за сети 192.168.1.5/24)
server# cat /etc/asterisk/sip.conf
... ... nat=force_rport,comedia directmedia=no qualify=yes ... ... nat=force_rport,comedia directmedia=no qualify=yes ...
server# service asterisk restart
PUSH уведомления. Регистрация и управление из типовых конфигураций 1С
Расширение конфигурации предназначено для отправки push уведомлений для подписчиков сайта. Может быть использовано для обеспечения оповещения Ваших клиентов, Ваших сотрудников. Имеет законченный функционал, но может быть легко расширено под любую бизнес логику. НЕ использует сторонних сервисов.
Есть возможность рассылки , как массовой , так и индивидуально. Массовая подписка может быть отфильтрована по 5 параметрам. Данная разработка может использоваться как в составе любой конфигурации на базе платформе 8.3.12 и выше, так и как самостоятельная конфигурация.
10 стартмани
Docker
Если хочется быстро попробовать решение — есть вариант с Docker — быстро создать контейнер, дать ему порты наружу, подсунуть файлы настроек и попробовать (это вариант с LetsEncrypt контейнером, если сертификат уже есть, просто нужно перенаправить обратный прокси на веб сервер FreePBX (ему мы дали другой порт — 88), LetsEncrypt в докере по мотивам этой статьи
Запускать файл надо в скачанной папке проекта (после git clone), но предварительно залезть в конфиги астериска (папка asterisk) и прописать там пути к записям и URL вашего сайта
Этот файл docker-compose.yaml, запускается через
Если nginx не запустился, значит что то не так с конфигурацией в папке nginx/ssl_docker.conf