artem
23.01.2013
9792

Передача 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-spb@company.local/astvoip1,of-msk@company.local/astvoip2,of-vg@company.local/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
username=of-spb@company.local/astvoip1                  ;Имя пользователя в формате логин@домен/ресурс
secret=pass_spb                                           ;Пароль
distribute_events=yes
status=available
usetls=no
usesasl=yes

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

buddy=of-msk@company.local/astvoip2
buddy=of-vg@company.local/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
username=of-msk@company.local/astvoip2
secret=pass_msk
distribute_events=yes
status=available
usetls=no
usesasl=yes
buddy=of-spb@company.local/astvoip1
buddy=of-vg@company.local/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
username=of-vg@company.local/astvoip3
secret=pass_vg
distribute_events=yes
status=available
usetls=no
usesasl=yes
buddy=of-spb@company.local/astvoip1
buddy=of-msk@company.local/astvoip2
</code>

Проверяем правильность настройки. Выполняем в консоли Asterisk

<code>
jabber show connections

Jabber Users and their status:

[asterisk] of-spb@armed.local/astvoip1     — Connected

 

—-

Number of users: 1

</code>
если статус соединения — Disconnected, значит соединение настроено неверно, включение debug в jabber.conf может помочь найти проблему.

<code>
jabber show buddies
Jabber buddy lists
Client: of-spb@armed.local/astvoip1
Buddy:        of-msk@company.local
Resource: astvoip2
node: http://www.asterisk.org/xmpp/client/caps
version: asterisk-xmpp
Jingle capable: yes
Status: 1
Priority: 0
Buddy:        of-vg@company.local
Resource: astvoip3
node: http://www.asterisk.org/xmpp/client/caps
version: asterisk-xmpp
Jingle capable: yes
Status: 1
Priority: 0
Buddy:        of-vg@company.local/astvoip3
Resource: None
Buddy:        of-msk@company.local/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>

 

 
avatar
  Подписаться  
Уведомление о

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

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

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices