artem
23.01.2013
15348

Передача device state между серверами Asterisk с помощью XMPP PubSub

Рассмотрим пример — имеется три офиса в разных городах (например в Санкт-Петербурге, Москве и Волгограде), в каждом офисе есть сервер Asterisk со своим диапазоном внутренних номеров (Санкт-Петербург — 1XX, Москва — 2XX, Волгоград — 3XX), между серверами настроены IAX2-транки. Также в каждом из офисов есть несколько телефонов с панелями расширения, панели расширения поддерживают BLF, но Asterisk, пока что, не может передавать состояние устройства (device state) через транк, следовательно ни в одном из офисов […]

Рассмотрим пример — имеется три офиса в разных городах (например в Санкт-Петербурге, Москве и Волгограде), в каждом офисе есть сервер Asterisk со своим диапазоном внутренних номеров (Санкт-Петербург — 1XX, Москва — 2XX, Волгоград — 3XX), между серверами настроены IAX2-транки. Также в каждом из офисов есть несколько телефонов с панелями расширения, панели расширения поддерживают BLF, но Asterisk, пока что, не может передавать состояние устройства (device state) через транк, следовательно ни в одном из офисов не получится отслеживать состояние телефонов в других офисах. О решении этой проблемы и пойдет речь.

 

 Для Asterisk есть два модуля для реализации передачи состояний устройств, оба входят в стандартный пакет:

  1. res_ais.so — модуль для интеграции Asterisk и OpenAIS, в том числе позволяет реализовать передачу состояний устройств его средствами (работает только в сетях с низкой задержкой, для работы через интернет не годится следовательно, в данном случае, не подходит).
  2. 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>

 

Книга 101 функция Asterisk
Познакомьтесь с возможностями Asterisk. Найдите инструменты, которые помогут вашей компании развиваться.
Скачать книгу
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.