Передача device state между серверами Asterisk с помощью XMPP PubSub
Рассмотрим пример — имеется три офиса в разных городах (например в Санкт-Петербурге, Москве и Волгограде), в каждом офисе есть сервер Asterisk со своим диапазоном внутренних номеров (Санкт-Петербург — 1XX, Москва — 2XX, Волгоград — 3XX), между серверами настроены IAX2-транки. Также в каждом из офисов есть несколько телефонов с панелями расширения, панели расширения поддерживают BLF, но Asterisk, пока что, не может передавать состояние устройства (device state) через транк, следовательно ни в одном из офисов […]
Рассмотрим пример — имеется три офиса в разных городах (например в Санкт-Петербурге, Москве и Волгограде), в каждом офисе есть сервер Asterisk со своим диапазоном внутренних номеров (Санкт-Петербург — 1XX, Москва — 2XX, Волгоград — 3XX), между серверами настроены IAX2-транки. Также в каждом из офисов есть несколько телефонов с панелями расширения, панели расширения поддерживают BLF, но Asterisk, пока что, не может передавать состояние устройства (device state) через транк, следовательно ни в одном из офисов не получится отслеживать состояние телефонов в других офисах. О решении этой проблемы и пойдет речь.
Для Asterisk есть два модуля для реализации передачи состояний устройств, оба входят в стандартный пакет:
- res_ais.so — модуль для интеграции Asterisk и OpenAIS, в том числе позволяет реализовать передачу состояний устройств его средствами (работает только в сетях с низкой задержкой, для работы через интернет не годится следовательно, в данном случае, не подходит).
- res_jabber.so — модуль интеграции Asterisk и Jabber, позволяет реализовать передачу состояний устройств с помощью PubSub.
PubSub — расширение протокола XMPP, описанное в дополнении XEP-0060. Позволяет пользователям подписываться на узлы PubSub и получать уведомления, при их обновлении. Разработчик модуля рекомендует jabber-сервер Tigase для использования PubSub, но Openfire проще в настройке, поэтому я использовал его.
Установка и настройка OpenFire
Скачиваем с сайта разработчика (http://www.igniterealtime.org/downloads/index.jsp) последнюю версию RPM-пакета и устанавливаем (openfire будет установлени в /opt/openfire, RPM-пакет включает в себя и Java JRE).
wget http://www.igniterealtime.org/downloadServlet?filename=openfire/openfire-3.7.1-1.i386.rpm
rpm -ivh openfire-3.7.1-1.i386.rpm
Создаем базу данных MySQL для OpenFire.
mysql -u root -p
CREATE DATABASE openfire;
GRANT ALL ON openfire.* TO ‘openfire’@’localhost’ IDENTIFIED BY ‘password’;
use openfire;
source /opt/openfire/resources/database/openfire_mysql.sql;
exit
Запускаем openfire.
service openfire start
Заходим в админку openfire по адресу http://IP-адрес_хоста_openfire:9090. При первом входе задаем пароль для входа, имя домена, параметры подключения к базе данных. Параметры подключения к базе данных потом можно изменить в файле /opt/openfire/conf/openfire.xml, имя домена — в адменике Server > Server Manager > System Properties, параметр xmpp.domain. Если поменяли имя домена, нужно пересоздать X.509-сертификаты сервера, заходим в Server > Server Settings > Server Certificates, удаляем сертификаты, после этого в верхней части страницы появляется ссылка для создания новых сертификатов (можно создать сертификаты вручную с помощью keytool). В нашем примере домен будет company.local, а jabber.company.local — имя хоста Openfire.
Переходим на вкладку Users/Groups и создаем пользователя для каждой АТС (в нашем примере будут пользователи of-spb — для АТС в Санкт-Петербурге, of-msk — для АТС в Москве и of-vg — для АТС в Волгограде). Снова идем в настройки сервера Server > Server Manager > System Properties и создаем там свойство «xmpp.pubsub.sysadmin.jid» со значением «of[email protected]/astvoip1,[email protected]/astvoip2,[email protected]/astvoip3» (astvoip1, astvoip2 и astvoip3 — имена Jabber-ресурсов и могут быть любыми, но должны оставаться одними и теми же на всех этапах установки). Это даст всем трем пользователям права администратора PubSub и возможность создавать свои PubSub-узлы.
Установка и настройка Asterisk
Asterisk устанавливается как обычно, с тем исключением, что в menuselect нужно включить сборку модуля res_jabber в разделе Resource Modules. На каждом хосте Asterisk создаем в директории /etc/asterisk файл jabber.conf следующего содержания (здесь приведен конфиг для АТС в Санкт-Петербурге):
<code>
[general]
debug=no ;Если включить, все сообщения протокола Jabber будут отображаться в консоли Asterisk (полезно при первоначальном поиске проблем, потом нужно выключить)
autoregister=yes ;Автоматически добавлять собеседников, указанных в конфиге ниже
collection_nodes=yes ;Включить поддержку режима XEP-0248 для передачи состояний устройств
pubsub_autocreate=yes ;Поддерживает ли Jabber-сервер автоматическое создание PubSub-узлов (Openfire поддерживает)
далее настройки Jabber-подключения
[asterisk]
type=client
serverhost=jabber.company.local ;IP-адрес или DNS-имя Jabber-сервера
pubsub_node=pubsub.jabber.company.local
[email protected]/astvoip1 ;Имя пользователя в формате логин@домен/ресурс
secret=pass_spb ;Пароль
distribute_events=yes
status=available
usetls=no
usesasl=yes
Далее перечисляем собеседников, у которых следует получать состояния устройств
[email protected]/astvoip2
[email protected]/astvoip3
</code>
Для включения модуля res_jabber.so перезагружаем Asterisk, либо выполняем в консоли Asterisk
<code>
module load res_jabber.so
</code>
Конфиги для остальных АТС:
(для Москвы)
<code>
[general]
debug=no
autoregister=yes
collection_nodes=yes
pubsub_autocreate=yes
[asterisk]
type=client
serverhost=jabber.company.local
pubsub_node=pubsub.jabber.company.local
[email protected]/astvoip2
secret=pass_msk
distribute_events=yes
status=available
usetls=no
usesasl=yes
[email protected]/astvoip1
[email protected]/astvoip3
</code>
(для Волгограда)
<code>
[general]
debug=no
autoregister=yes
collection_nodes=yes
pubsub_autocreate=yes
[asterisk]
type=client
serverhost=jabber.company.local
pubsub_node=pubsub.jabber.company.local
[email protected]/astvoip3
secret=pass_vg
distribute_events=yes
status=available
usetls=no
usesasl=yes
[email protected]/astvoip1
[email protected]/astvoip2
</code>
Проверяем правильность настройки. Выполняем в консоли Asterisk
<code>
jabber show connections
Jabber Users and their status:
[asterisk] [email protected]/astvoip1 — Connected
—-
Number of users: 1
</code>
если статус соединения — Disconnected, значит соединение настроено неверно, включение debug в jabber.conf может помочь найти проблему.
<code>
jabber show buddies
Jabber buddy lists
Client: [email protected]/astvoip1
Buddy: [email protected]
Resource: astvoip2
node: http://www.asterisk.org/xmpp/client/caps
version: asterisk-xmpp
Jingle capable: yes
Status: 1
Priority: 0
Buddy: [email protected]
Resource: astvoip3
node: http://www.asterisk.org/xmpp/client/caps
version: asterisk-xmpp
Jingle capable: yes
Status: 1
Priority: 0
Buddy: [email protected]/astvoip3
Resource: None
Buddy: [email protected]/astvoip2
Resource: None
</code>
Примечание: каждый раз, при изменении DEVICE_STATE какого-либо номера, модуль res_jabber.so выдает в консоль Asterisk ошибку ‘409’. Эта ошибка безопасна и работе системы не мешает.
Модуль res_jabber.so настроен, осталось добавить хинты в диалплан Asterisk. Если установлен FreePBX, хинты следует добавлять в файл /etc/asterisk/extensions_custom.conf в контекст [ext-local-custom]. В нашем случае, на АТС в Санкт-Петербурге добавляем следующие хинты для слежения за состоянием номеров 201, 202, 308 и 321 на других АТС:
<code>
[ext-local-custom]
exten ≥ 201,hint,SIP/201
exten ≥ 202,hint,SIP/202
exten ≥ 308,hint,SIP/308
exten ≥ 321,hint,SIP/321
</code>
После применения диалплана, хинты можно проверить командой в консоли Asterisk:
<code>
core show hints
…
201@ext-local-custom : SIP/201 State:InUse Watchers 0
202@ext-local-custom : SIP/202 State:Idle Watchers 0
308@ext-local-custom : SIP/308 State:Ringing Watchers 0
321@ext-local-custom : SIP/321 State:Idle Watchers 0
…
</code>
Остались вопросы?
Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.