Новый канальный драйвер chan_pjsip в Asterisk 13

Опубликовано в Asterisk

PJSIP Asterisk

Канальный драйвер chan_sip протокола SIP, был создан около 14 лет назад в далёком 2002 году, когда был создан, относительно новый стандарт, описанный в RFC 3261. В то время никто не мог предположить, что протокол SIP, станет играть на рынке VoIP основную роль и получит множество расширений, в виде спецификаций RFC, последующих стандартов.

Реализация драйвера SIP канала, в Asterisk была сделана в одном модуле, который называется chan_sip, который не предполагал глобального развития протокола. И в 2012 году модуль chan_sip, достиг точки, где его структура была уже не в состоянии идти в ногу, с новыми технологиями и обновлениями.

Таким образом, был создан новый канальный драйвер для Asterisk, который не только обеспечивает функциональность протокола SIP необходимую сегодня, но будет гибким и оптимизированным к новым изменениям в будущем. Результатом работы получился стек PJSIP в Asterisk, который не только канальный драйвер, но и многое другое.

Стек для Asterisk, был создан на основе мультимедийной библиотеки PJSIP с открытым исходным кодом, реализующую работу протоколов SIP, SDP, RTP, STUN, TURN и ICE. Она сочетает лучшие возможности SIP сигнализации, улучшенное преодоление NAT и высокий уровень взаимодействия с приложениями.

Сам стек PJSIP реализован в виде пакета, предоставленного набором загружаемых модулей, вместо одного модуля драйвера канала.

Несмотря на то, что канальный драйвер PJSIP в Asterisk 13 назван chan_pjsip - его целью является организация  моста, между стеком PJSIP и фактическим каналом PJSIP, исполняющим диалплан в астериске. Стек PJSIP состоит из множества других модулей, каждый из которых выполняет свой функционал. Данный подход имеет несколько преимуществ:

  • Реализация функциональных возможностей работы, в стеке PJSIP изолирована, что дает возможность его легче расширять, поддерживать и даже заменить! Например код, который обрабатывает медиа-данные (голос, видео) и код установления соединений, находится в отдельных динамически загружаемых модулях. Таким образом это, позволяет пользователю загружать только те модули, функциональность которых ему нужна.
  • Разработка нового функционала для стека PJSIP существенно проще, чем это было для драйвера канала chan_sip. Стек PJSIP в Asterisk содержит модули, которые предоставляют фреймворк, доступный для использования другим модулям, для получения нужного функционала. В качестве примера, один модуль, res_pjsip_pubsub, обеспечивает publish/subscribe фреймворк, для использования другими модулями, обеспечивающих функции уведомления о событиях (например BLF). chan_pjsip Asterisk

На рисунке можно увидеть высокий уровень модульной архитектуры стека PJSIP в Asterisk 13, показан выше. Обратите внимание, что он не показывает все модули в настоящее время в стеке PJSIP,  а скорее отображает функциональные возможности, небольшого выбора наиболее часто используемых модулей.

  • В новом Asterisk 13, в SIP-стек PJSIP добавлена поддержка списков ресурсов, определённых в RFC 4662, которые позволяют использовать Asterisk в качестве сервера RLS (Resource List Server). В том числе поддерживаются операции определения списков с данными о присутствии абонентов и состоянием почтовых ящиков, доступны средства управления подписками и пакетной доставки уведомлений подписчикам.
  • SIP-стек PJSIP теперь может быть использован в роли средства для распространения данных о состоянии устройства или почтового ящика через отправку PUBLISH-запросов другим экземплярам Asterisk. Данная возможность реализована по аналогии с поддержкой кластеризации в Asterisk при помощи XMPP или Corosync, но в отличие от средств кластеризации использование стека PJSIP для распространения данных о состоянии не зависит от наличия специальных демонов или серверов.

Конфигурация для нового стека PJSIP использует несколько другую схему, чем исторический драйвер SIP канала - chan_sip. Вместо того, чтобы объединять всю конфигурацию для устройства в peer/user/friend, новый стек использует подход разделения конфигурации на логические разделы, поэтому создаются разные разделы для различных целей.

В качестве примера, в sip.conf SIP пира, возможно, увидеть что-то вроде этого:

[my_phone]
type = peer
context = from-internal
disallow = all
allow = alaw
host = dynamic
secret = super_secret
qualify = yes
dtmfmode = rfc2833

Конфигурация PJSIP для этой endpoint будет выглядеть следующим образом:

[my_phone_auth]
type = auth
auth_type = userpass
username = my_phone
password = super_secret
 
[my_phone_aors]
type = aor
max_contacts = 10
qualify_frequency = 300
 
[my_phone_endpoint]
type = endpoint
auth = my_phone_auth
aors = my_phone_aors
disallow = all
allow = alaw
context = from-internal
dtmfmode = rfc4733

Типы логических разделов PJSIP:

Ниже приводится краткое описание каждого типа раздела и пример его конфигурации. Есть десятки вариантов конфигурации для некоторых разделов, но мы ограничимся минимальными для простоты понимания вопроса.

ENDPOINT

Модуль ENDPOINT определяет многочисленные параметры SIP, а также связь с другими модулями - AUTH, AOR и TRANSPORT. Раздел ENDPOINT должен быть обязательно связана с одной или несколькими разделами AOR. ENDPOINT является основным профилем SIP телефона или SIP транка в res_pjsip, аналогично пиру в sip.conf. Только если там определялись почти все параметры, то здесь часть ключевых свойств вынесены в специальные модули, которые и будут рассмотрены ниже. Пример транка провайдера Zadarma:

[111111]
type=endpoint
transport=udp-transport
context=zadarma-in
disallow=all
allow=alaw
allow=ulaw
outbound_auth=111111_auth
aors=111111
from_user=111111
direct_media=no

TRANSPORT

Настройка транспортного уровня res_pjsip. Возможно использование протоколов UDP, TCP, WebSockets и методов шифрования TLS/SSL. Можно настроить один транспортный раздел для использования множеством точек (ENDPOINT), или создать уникальный транспортный уровень для конкретной точки. Каждый транспорт в системе должен иметь уникальный порт (аналогично как и в sip_profiles во FreeSWITCH).

[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

AUTH

Раздел аутентификации содержит опции и полномочия для входящих и исходящих регистраций. С этим разделом ассоциируются такие разделы как ENDPOINT и REGISTRATIONS. Множество точек и регистраций могут использовать один и тот же раздел аутентификации, если это требуется.

[111111_auth]
type=auth
auth_type=userpass
password=Password
username=111111

AOR

Главная функция AoR (Address of Record) указать Asterisk, как связаться с ENDPOINT. Без соответствующей AOR раздела, точка ENDPOINT будет недоступна для вызова. Здесь также задаются соответствия голосовой почте, MWI, продолжительность действия регистрации -expiration и настройки qualify (периодической отправки SIP сообщений OPTONS для мониторинга состояния устройств).

Когда Asterisk получает запрос на регистрацию от устройства, он в первую очередь ищет соответствующую SIP заголовку To: «111»<sip:111@192.168.0.34;transport=UDP> запись в именах раздела AOR – в нашем примере [111]

[111111]
type=aor
contact=sip:111111@sip.zadarma.com:5060

REGISTRATION

Раздел регистраций отвечает за исходящие регистрации. Используется для регистрации в удаленных системах, будь то другой Asterisk или транк от провайдера. Для регистрации понадобится определить используемый транспорт и раздел аутентификации. Помимо этого, наверняка, потребуется указать контакт для входящих вызовов.

[111111]
type=registration
transport=udp-transport
outbound_auth=111111_auth
server_uri=sip:sip.zadarma.com
client_uri=sip:111111@sip.zadarma.com
retry_interval=60
expiration=120
contact_user=111111

IDENTIFY

Определяет конечные точки с помощью IP-адреса источника.

[111111]
type=identify
endpoint=111111
match=sip.zadarma.com

DOMAIN_ALIAS

Псевдоним домена, [Имя] данного раздела является псевдонимом, а конфигурационная опция domain=, доменным именем, которому сопоставлен псевдоним.

CONTACT

Контакты являются одним из способов не указывать явно SIP URI в плане набора (диалплане).

Узнать возможные варианты значений и параметры по умолчанию можно с помощью встроенной справки интерфейса командной строки (CLI):

config show help res_pjsip <configobject> <configoption>  

Наглядное отношение связей модулей стека PJSIP можно разделить:

связи модулей стека PJSIP

ENDPOINT

  • Множество ENDPOINTs связываются с множеством AORs
  • Ноль или больше ENDPOINTs связаны с ноль или одной AUTHs
  • Ноль или больше ENDPOINTs связаны с как минимум одним TRANSPORT
  • Ноль или одна ENDPOINTs связана с определенной IDENTIFY

REGISTRATION

  • Ноль или больше REGISTRATIONs связаны с ноль или одной AUTHs
  • Ноль или больше REGISTRATIONs связаны с как минимум одним TRANSPORT

AOR

  • Множество ENDPOINTs связываются с множеством AORs
  • Множество AORs связаны с множеством CONTACTs

CONTACT

  • Множество CONTACTs связываются с множеством AORs

IDENTIFY

  • Ноль или больше ENDPOINTs связаны с определенным IDENTIFY объектом.

ACL, DOMAIN_ALIAS

  • Эти объекты не имеют направленных связей с другими объектами.

Мы совершенно уверены, что новый стек PJSIP будет лучшим шагом вперед для SIP в Asterisk.

Коментарии: