Настраиваем Asterisk
Итак, наша сервер Asterisk установлен и настроен. Этим мы занимались в предыдущей статье, если вы её пропустили, то можете ознакомиться с ней ЗДЕСЬ.
Теперь разберём один пример настройки Asterisk для небольшого офиса с использованием библиотеки pjsip.
Что такое PJSIP
Коротко остановимся на том, что же такое PJSIP:
PJSIP (Portable Jingle Session Initiation Protocol) - это библиотека программного обеспечения, реализующая протоколы SIP (Session Initiation Protocol) и Jingle. SIP является протоколом установки и управления VoIP-сессиями, а Jingle - протоколом установки медийных сессий в режиме реального времени для передачи голоса, видео и других мультимедийных данных.
PJSIP предоставляет инструменты и функциональность для разработки VoIP-систем и клиентских приложений, обеспечивающих связь через IP-сети. Он является мощной и гибкой библиотекой с открытым исходным кодом, написанной на языке программирования C. PJSIP обеспечивает полную реализацию протокола SIP и поддерживает различные расширения и функциональности, такие как аутентификация, шифрование, управление сессиями, маршрутизацию, обработку кодеков и многое другое.
Модуль SIP был полностью исключен из Asterisk начиная с версии 13. Вместо него начал применяться модуль PJSIP в качестве более современного и расширяемого решения для протокола SIP.
Основные отличия между модулем SIP и модулем PJSIP в Asterisk следующие:
-
Расширенные возможности: PJSIP предлагает более широкий набор функций и расширений протокола SIP, включая поддержку исходящих и входящих вызовов, текстовых сообщений, факсов, конференций и плейлистов медиа.
-
Гибкость конфигурации: PJSIP предоставляет более гибкий и модульный подход к конфигурации SIP-линий, точек и транспортов. Он позволяет более тонкую настройку параметров и более гибкую конфигурацию сетевых настроек.
-
Интеграция с другими протоколами: PJSIP позволяет интегрировать не только SIP, но и другие протоколы, такие как Jingle, XMPP и WebRTC. Это позволяет разработчикам создавать приложения, которые могут взаимодействовать с различными протоколами связи.
-
Новая архитектура: PJSIP предлагает обновленную архитектуру, основанную на стеке библиотеки PJSUA-API. Это позволяет разработчикам более просто использовать API и облегчает разработку приложений с использованием PJSIP.
В целом, PJSIP предоставляет более современные и расширяемые возможности для работы с протоколом SIP в Asterisk, и его использование рекомендуется для новых установок и разработки новых VoIP-приложений.
Исходя из вышесказанного, можно сделать однозначный вывод о том, что на сегодняшний день использовать модуль chan_sip в Asterisk не имеет особого смысла и если вы только начинаете осваивать Asterisk то лучше это делать с использованием PJSIP.
Исходные данные
Для примера рассмотрим настройку Asterisk для офиса состоящего из трёх рабочих мест со следующими вводными данными:
- Количество IP-телефонов (“железных” либо софтовых) - 3 шт;
- Сервер на которой установлен Asterisk и телефоны находятся в локальной сети и не имеют прямого доступа в интернет (находятся за NAT);
- Локальная сеть имеет адресацию - 192.168.10.0/24;
- Локальный IP адрес Asterisk сервера - 192.168.10.110;
- Интернет IP адрес роутера - 77.34.77.44;
- Внутренние номера телефонов - трёхзначные: 100, 101, 102;
- Внешний провайдер SIP телефонии - SIPNET.
Настройки PJSIP
Если вы производили установку сервера Asterisk по ЭТОМУ руководству, то у вас были созданы файлы примеров настроек для разных модулей.
Ввиду того, что рассматриваемый в данной статье вариант настройки Asterisk будет производится в двух конфигурационных файлах: /etc/asterisk/pjsip.conf
и /etc/asterisk/extesions.conf
- создадим их копии и очистим содержимое основных файлов:
cp /etc/asterisk/pjsip.conf /etc/asterisk/pjsip.conf_backup
cp /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf_backup
echo > /etc/asterisk/pjsip.conf
echo > /etc/asterisk/extensions.conf
В файл /etc/asterisk/pjsip.conf
добавим следующее содержимое:
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0
allow_reload=true
local_net=192.168.10.0/24 ;Здесь указываем свою локальную подсеть
local_net=127.0.0.1/32
external_media_address=77.34.77.44 ;Здесь указываем внешний IP адрес роутера
external_signaling_address=77.34.77.44 ;Здесь указываем внешний IP адрес роутера
;
;
;========Шаблон========= ;Используем шаблон для удобства добавления новых абонентов
;
[ofiice-endpoint](!)
type=endpoint
transport=udp-transport
context=from-internal
disallow=all
allow=alaw,ulaw
;
[pass-auth](!)
type=auth
auth_type=userpass
;
[contact-aor](!)
type=aor
max_contacts=1
;========================
;
;
;======Номер 100=========
[100](ofiice-endpoint)
auth=auth100
aors=100
;
[auth100](pass-auth)
password=123456 ;Указываем свой пароль доступа для абонента
username=100
;
[100](contact-aor)
;
;======Номер 101=========
[101](ofiice-endpoint)
auth=auth101
aors=101
;
[auth101](pass-auth)
password=123456 ;Указываем свой пароль доступа для абонента
username=101
;
[101](contact-aor)
;
;======Номер 102=========
[102](ofiice-endpoint)
auth=auth102
aors=102
;
[auth102](pass-auth)
password=123456 ;Указываем свой пароль доступа для абонента
username=102
;
[102](contact-aor)
;=======================
;
;
;========SIPNET=========
[sipnet]
type=registration
transport=udp-transport
outbound_auth=sipnet
server_uri=sip:sipnet.ru
client_uri=sip:0042700800@sipnet.ru ;Вместо 0042700800 вносим свой SIP ID с сайта sipnet.ru
retry_interval=60
;
[sipnet]
type=auth
auth_type=userpass
password=JUOkhgfr76 ;Указываем свой пароль от аккаунта sipnet.ru
username=0042700800 ;Вместо 0042700800 вносим свой SIP ID с сайта sipnet.ru
;
[sipnet]
type=aor
contact=sip:sipnet.ru:5060
;
[sipnet]
type=endpoint
transport=udp-transport
context=from-sipnet
disallow=all
allow=alaw,ulaw
outbound_auth=sipnet
aors=sipnet
from_user=0042700800 ;Вместо 0042700800 вносим свой SIP ID с сайта sipnet.ru
from_domain=sipnet.ru
;
[sipnet]
type=identify
endpoint=sipnet
match=sipnet.ru
;
;=======================
Приведённая выше конфигурация файла, является полностью рабочей и протестирована на реальном сервере Asterisk.
Для её применения необходимо внести изменения только в те строки, напротив которых написаны комментарии.
В случае изменения внутренних, телефонных номеров необходимо будет так же вносить правки в другие параметры секций конфигурационного файла!
В данной статья я не преследую цели дать подробное описание каждому параметру и секции конфигурационных файлов - эту информацию можно без проблем найти в интернете. Моя же задача, дать рабочую конфигурацию для быстрого развёртывания элементарного, рабочего Asterisk сервера.
/etc/asterisk/pjsip.conf
, необходимо перезагрузить pjsip, для чего выполним следующие команды:
- Войдём в консоль управления Asterisk:
asterisk -rvvvvvvv
В результате получим следующий вывод в консоли:
root@aster:~# asterisk -rvvvvvvv
Asterisk 21.1.0, Copyright (C) 1999 - 2022, Sangoma Technologies Corporation and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Running as user 'asterisk'
Running under group 'asterisk'
Connected to Asterisk 21.1.0 currently running on aster (pid = 484)
aster*CLI>
- Далее в консоли Asterisk дадим команду на перезапуск pjsip:
pjsip reload
Получим следующий вывод в консоли:
ster*CLI> pjsip reload
Module 'res_pjsip.so' reloaded successfully.
Module 'res_pjsip_authenticator_digest.so' reloaded successfully.
Module 'res_pjsip_endpoint_identifier_ip.so' reloaded successfully.
Module 'res_pjsip_mwi.so' reloaded successfully.
Module 'res_pjsip_notify.so' reloaded successfully.
Module 'res_pjsip_outbound_publish.so' reloaded successfully.
Module 'res_pjsip_publish_asterisk.so' reloaded successfully.
Module 'res_pjsip_outbound_registration.so' reloaded successfully.
-- Reloading module 'res_pjsip.so' (Basic SIP resource)
[Jan 28 21:46:19] NOTICE[877]: sorcery.c:1348 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
-- Reloading module 'res_pjsip_authenticator_digest.so' (PJSIP authentication resource)
-- Reloading module 'res_pjsip_endpoint_identifier_ip.so' (PJSIP IP endpoint identifier)
-- Reloading module 'res_pjsip_mwi.so' (PJSIP MWI resource)
-- Reloading module 'res_pjsip_notify.so' (CLI/AMI PJSIP NOTIFY Support)
-- Reloading module 'res_pjsip_outbound_publish.so' (PJSIP Outbound Publish Support)
-- Reloading module 'res_pjsip_publish_asterisk.so' (PJSIP Asterisk Event PUBLISH Support)
-- Reloading module 'res_pjsip_outbound_registration.so' (PJSIP Outbound Registration Support)
aster*CLI>
Теперь мы можем попробовать подключится к серверу с помощью софтовой звонилки, чтобы проверить правильность выполненных настроек.
Подключаем софтовый телефон
Для проверки и совершения звонков с компьютера или смартфона, я практически всегда использую бесплатную звонилку Linphone. Не смотря на её явный недостаток - уж очень какой то нелепый и неудобный интерфейс, у неё есть и очень два больших достоинства - это её кроссплатформенность и бесплатность. Загрузить последнюю версию данной программы можно на официальном сайте: linphone.org
Итак начнём настройку Linphone:
Перед тем как нажать клавишу “ИСПОЛЬЗОВАТЬ”, для контроля подключения, запустите консоль Asterisk командой:
asterisk -rvvvvvvv
Вот теперь жмём кнопку “ИСПОЛЬЗОВАТЬ”
Если подключение произошло успешно, мы должны увидеть следующее:
В окне Linphone:
В терминале Asterisk:
Всё, подключение у нас состоялось, однако звонки мы осуществлять пока не можем. До настоящего времени мы внисили правки только в один из подготовленных нами файлов конфигурации Asterisk, а именно: /etc/asterisk/pjsip.conf
.
Для того, чтобы мы могли совершать звонки, нам необходимо в файл /etc/asterisk/extensions.conf
добавить план звонков.
extensions.conf добавляем диалплан
Откроем файл /etc/asterisk/extensions.conf
в текстовом редакторе и приведём его к виду:
[from-internal]
include=long
exten = _XXX,1,Dial(PJSIP/${EXTEN})
same => n,Hangup()
;
[long]
exten => _X.,1,Dial(PJSIP/${EXTEN}@sipnet)
;
;
[from-sipnet]
exten = s,1,Answer()
same = n,Wait(5)
same = n,Dial(PJSIP/100)
Выполним перезагрузку всех модулей Asterisk командой в его консоли:
reload
Далее настраиваем ещё один Linphone на другом компьютере или смартфоне по образу и подобию, как мы делали это ранее и подключаемся к серверу.
В консоли Asterisk введём команду:
pjsip show aors
В результате мы должны увидеть сделанные нами регистрации на сервере:
Пробный звонок для внутренних абонентов
Позвоним из Linphone с абонентским номером 100 (В моём случае - это компьютер), на номер 101
В консоли Asterisk появился следующий вывод:
Пробный звонок через транк на внешний телефон
Из Linphone делаем тестовый звонок на свой мобильный номер в формате: 89662XXXXXX (то есть через “8” )
В консоли видим:
Попробуем набрать внешний номер SIPNET с мобильного телефона используя сотовую связь: В консоли видим:
Как видим наша виртуальная АТС на базе** Asterisk** успешно настроена и выполняет свои элементарные функции.
Одна неприятная ошибка
Выполнив всё в соответствии с данной статьёй вы получите виртуальную АТС настроенную согласно исходных данных
Исходных данных.
Однако, стоит предположить, что данная настройка делается как базовая и будет служить неким трамплином для дальнейших экспериментов и более углубленных настроек Asterisk.
При подключении и отключении различных звонилок, с различных устройств вы обязательно столкнётесь с ситуацией, в которой вы получите зависшую регистрация на сервере Asterisk.
Вот пример, того что я имею ввиду: вы настроили на своём смартфоне программу Linphone и подключились к Asterisk, совершили тестовый звонок на внутренний номер абонента - у вас всё получилось. После этого вы жестко закрываете приложение и связь с сервером обрывается, при этом приложение на смартфоне не отправило команду на разрыв соединения серверу и вот тут вы получаете “подвисшую регистрацию” на сервере.
После этого, вы снова запускаете Linphone на смартфоне и тут он вам радостно рапортует о том, подключится к серверу не удалось.
Подключение не удаётся, так как в Asterisk уже “висит” данное подключение. В консоли Asterisk это выглядит следующим образом:
Фрагмент на скриншоте, обведённый красным прямоугольником нам показал успешное подключение, затем я принудительно завершил приложение Linphone и запустил его повторно.
В результате появилась ошибка подключения, которая сообщает, что подключение не возможно, так как в конфигурации установлен лимит подключений на один логин и пароль равный 1.
Данное зависшее подключение сбросится автоматически через 15 минут, однако эту ситуацию можно исправить и не терять драгоценное время на ожидание.
Что нужно сделать:
- В консоли Asterisk вводим команду:
databese show
Получим следующий вывод: В этом выводе нас интересует идентификатор записи базы данных внутреннего абонента с номером 100 - подчёркнут красной линией на скриншоте приведённом выше.
- Скопируем его и выполним следующую команду:
database del registrar/contact 100;@c69b60851754ab97ceacb201858d636e
После этого получаем сообщение, что запись базы данных удалена:
- Проверяем существующие регистрации командой:
pjsip show aors
и видим что всё в порядке, все регистрации не активны:
Заключение
Данная статья не претендует на всеобъемлющую информацию по настройке библиотеки PJSIP в Asterisk - это всего лишь реализация одной, маленькой задачи описанной в исходных данных и призвана помочь новичку в Asterisk с “чего то” начать.
Я умышленно не стал описывать значения различных параметров в конфигурационных файлах - их без труда можно найти на просторах интернета.
Это статья - всего лишь помощь в освоении Asterisk со всеми его прелестями: автоответчик, проигрыванием различны приветственных сообщений, перехватом и переадресацией вызовов и так далее…