Перевод статьи Using PJSIP_DIAL_CONTACTS in Asterisk

1. Введение

Эта статья предназначена для инженеров телефонных систем, которые работают с установками на основе Asterisk. Asterisk — это наиболее распространенное на сегодняшний день программное обеспечение для телекоммуникационных решений, поэтому есть большая вероятность, что ваша телефонная система использует Asterisk, даже если она носит другое название.

1.1 Телефонные системы — основные игроки

Если ваша система VoIP не работает на Asterisk, то, скорее всего, она использует FreeSwitch, поскольку эти два гиганта составляют подавляющее большинство установок, доступных сегодня в Интернете.

Вы можете узнать больше об этих основных продуктах, посетив их веб-страницы. Информацию о FreeSwitch можно найти на их портале:

а пользователи Asterisk, для которых написана эта статья, могут найти исчерпывающую информацию на портале Asterisk:

1.2 Что такое Asterisk?

Что же такое Asterisk? Asterisk лежит в основе многих современных телефонных систем, позволяя создавать как простые, так и очень сложные телефонные системы. Она позволяет администратору телефонной системы создать работоспособную телефонную систему всего за 10–20 строк кода. Этот код называется “диалпланом” и в сочетании с несколькими ключевыми параметрами конфигурации позволяет создать рабочую телефонную систему за очень короткое время и с минимальными усилиями.

2. Asterisk + PJSIP: преимущества

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

Несколько лет назад система Asterisk была значительно обновлена: по умолчанию используемая библиотека VoIP была заменена с оригинального модуля, известного просто как “sip” и основанного на программном пакете sofia, на более современную и гибкую систему под названием “pjsip”.

Это изменение означало, что рано или поздно, если ваша телефонная система работает под Asterisk, то вам захочется перейти на использование библиотеки pjsip вместо старого, теперь устаревшего модуля chan_sip.

Библиотека pjsip настроена так, чтобы более точно соответствовать концепциям, изложенным в официальной документации SIP, намного лучше, чем старая библиотека. Хороший обзор того, как pjsip работает в Asterisk, можно найти здесь, в официальной документации:

Большинство преимуществ, которые вы обнаружите при переходе на использование pjsip, описаны в основных статьях по этой теме. К этим преимуществам относятся:

  • Более современная архитектура кода

  • Библиотека, которая продолжает активно развиваться и исправляться

  • В скором времени станет доминирующей библиотекой, используемой для VoIP-продуктов

  • Лучшая общая совместимость с оборудованием с течением времени, так как это стандарт, по которому теперь будут проектироваться устройства

Среди этих преимуществ скрывается мощная концепция, которую легко упустить из виду. Если вы покопаетесь или найдете нужную документацию, то ясно увидите, что система pjsip может поддерживать несколько контактов для одного внутреннего номера.

В следующем разделе мы подробнее расскажем, что означает эта концепция.

3. Поддержка нескольких контактов для одного внутреннего номера

Если вы администрируете телефонную систему, то неизбежно столкнетесь с ситуацией, когда кто-то захочет, чтобы при наборе его внутреннего номера звонили как домашний, так и офисный телефоны. С точки зрения пользователя, он просто хочет иметь два телефона, “подключенных” к телефонной системе как один внутренний номер. Эта концепция и понимается под термином “несколько контактов на один внутренний номер”.

3.1 Старый способ: имитация нескольких контактов

В старые времена, когда Asterisk поставлялся с библиотекой sip, этого понятия не существовало, что приводило к некоторым неудобствам при настройке и конфигурации.

Можно было заставить систему работать таким образом, но для этого требовались хитрости, такие как использование функции “follow-me” или тщательно настроенных групп звонков, чтобы любой звонок на один внутренний номер фактически звонил на список из нескольких внутренних номеров, каждый из которых был настроен так, чтобы казаться одним внутренним номером. Даже не будем говорить о том, как убедиться, что почтовые ящики выстроены в ряд, а клавиши BLF правильно сопоставлены… дрожь.

В итоге можно было сделать это достаточно хорошо, чтобы обычный пользователь не осознавал, что его телефоны не являются действительно одинаковыми внутренними номерами, но это было запутанно, беспорядочно и сложно в обслуживании.

Конечно, люди осознавали это ограничение и усердно работали над поиском лучшего способа решения этой проблемы. Представляем новую, улучшенную библиотеку “pjsip”.

3.2 PJSIP – новый, элегантный способ обработки нескольких контактов

Библиотека pjsip создана с нуля для поддержки концепции одного расширения с несколькими контактами. Вы по-прежнему можете делать все по-старому, но это больше не требуется и даже не рекомендуется. Библиотека pjsip предоставляет всю необходимую поддержку, чтобы несколько устройств могли регистрироваться как один внутренний номер, и почти вся работа выполняется при переходе на использование pjsip.

Однако есть один ключ к тому, чтобы это работало, и он получил должное внимание. Без этой маленькой жемчужины вы можете зарегистрировать несколько контактов, но только первый из них будет отвечать на стандартные команды, такие как Dial и Page.

Функция, о которой вам нужно знать, — PJSIP_DIAL_CONTACTS. Она является ключом к поддержке регистрации нескольких телефонов в одной конечной точке (внутреннем номере) в Asterisk.

Можно было бы ожидать, что такая важная функция получит больше внимания, чем в доступной документации. На самом деле, эта функция вообще не упоминается в переработанном руководстве “Asterisk: Полное руководство”, а также не упоминается в руководстве по обновлению, на которое чаще всего ссылаются при переходе на использование библиотеки pjsip.

Эта статья призвана отдать должное PJSIP_DIAL_CONTACTS и показать, насколько проста в использовании эта функция и насколько мощным может быть ее эффект.

4. PJSIP_DIAL_CONTACTS: небольшое изменение, большой эффект

Чтобы увидеть всю мощь этой небольшой функции, давайте начнем с базового диалплана, который мы использовали бы для нашей старой телефонной системы на основе sip.

4.1 Набор номера по-старому

В данном случае у нас есть внутренний номер 100, который настроен на набор номера в течение 30 секунд, а затем переход на голосовую почту для этого внутреннего номера, если на звонок не отвечают. Для основной старой версии Asterisk диалплан этого номера может выглядеть очень похоже на приведенный ниже код:

Набор номера по-старому

Обратите внимание на выделенную команду Dial(), которая обрабатывает звонок на телефон, подключенный к внутреннему номеру, так как это единственная часть диалплана, которую необходимо изменить!

4.2 Набор номера с помощью PJSIP_DIAL_CONTACTS

Для поддержки нескольких устройств на каждом конечном устройстве команда Dial предыдущего обработчика внутреннего номера становится простой:

Набор номера с помощью PJSIP_DIAL_CONTACTS

Как видно из выделенной строки, единственное отличие заключается в вызове функции PJSIP_DIAL_CONTACTS внутри команды набора номера. Однако благодаря этому единственному изменению вы получаете возможность зарегистрировать множество телефонных устройств как один внутренний номер.

Теперь ваш код будет генерировать команду Dial(), необходимую для связи со всеми действительными зарегистрированными контактами для вашего внутреннего номера. Без дополнительных усилий вы можете зарегистрировать множество внутренних номеров. Например, один из них может быть тестовым телефоном, другой — программным телефоном, а два — “аппаратными” телефонами: один на работе, а другой дома.

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

5. Заключительное примечание: настройка max_contacts

Теперь, когда вы ознакомились с диалпланом вызова номера, позвольте мне подытожить, насколько просто использовать эту функцию. Чтобы правильно использовать возможность pjsip поддерживать несколько контактов на один конечный узел, необходимо убедиться в двух вещах:

  1. Вам нужно изменить команду Dial() для вызова PJSIP_DIAL_CONTACTS, как показано выше, чтобы обеспечить звонок по всем связанным контактам для конечной точки.

  2. Вам нужно установить значение max_contacts для AOR конечной точки, чтобы обеспечить возможность регистрации более одного контакта.

Мы уже рассмотрели функцию PJSIP_DIAL_CONTACTS, поэтому я кратко упомяну значение max_contacts. Оно настраивается внутри определения AOR для конечной точки. Простой пример показан в настройках для номера 6001, взятых из примера конфигурации Asterisk и измененных для увеличения max_contacts до 5:

Заключительное примечание: настройка max_contacts

Это все, что необходимо, чтобы разрешить регистрацию до пяти устройств на каждый внутренний номер. Измените его на 20, и вы сможете поддерживать двадцать устройств, все зависит от вас.

6. Заключение

Надеюсь, это поможет тем, кто еще не осознал, как использование PJSIP_DIAL_CONTACTS открывает возможности для сценариев с одним внутренним номером и несколькими телефонами в Asterisk.