Виртуальная атс. часть 3: переводим asterisk на pjsip без лишних телодвижений

Модуль SIP канала Asterisk

SIP

  • SIP клиент: Это подразумевает, что Asterisk регистрируется как клиент на другом SIP сервере и совершает вызовы и принимает их через этот сервер. Входящие вызовы маршрутизируются на номер екстеншена, который прописан в Asterisk.
  • SIP сервер: Asterisk может быть сконфигурирован так, чтобы SIP клиенты (телефоны, программные клиенты) регистрировались на нем и устанавливали SIP сессии через этот сервер, т.е. совершали и отвечали на вызовы. Стоит отметить, что Asterisk — это не сервер, который может поддерживать всю функциональность SIP протокола, которую может предоставить, например, SIP express router. Если количество SIP телефонов у Вас исчисляется тысячами, Вам, наверно, стоит использовать SER а вызовы на голосовую почту и во внешний мир перенаправлять серверу Asterisk.
  • SIP шлюз: Сервер Asterisk может выступать в роли шлюза медиаданных между SIP, IAX, MGCP, H.323 и PSTN соединениями. Как пример, сервер Asterisk может быть соединен с общей телефонной сетью через ISDN, и предоставлять возможность Вашим SIP клиентам это соединение для выхода в публичную телефонную сеть.
  • Почему Asterisk не является SIP прокси сервером?

Замечания

  • Сервер Asterisk поддерживает ENUM — смотри: Asterisk config enum.conf.
  • Сервер Asterisk поддерживает DNS записи DNS SRV, где определяются SIP прокси сервера при вызовах с использованием Интернет доменов. Смотри: Asterisk SIP srvlookup
  • Когда и зачем Asterisk выступает в роли шлюза для медиаданных при использовании вызовов через SIP канал? — смотри: Asterisk SIP media path
  • Сервер Asterisk поддерживает вызовы с использованием SIP URL.
  • Сервер Asterisk поддерживает SIP коммуникацию по протоколу UDP, но не поддерживает TCP протокол в роли транспортного протокола.
  • Вы можете хранить конфигурацию Ваших SIP устройств в базе данных для использования динамической конфигурации , смотри: Asterisk Realtime Sip

Использование команды Dial для SIP каналов

DialtypeidentifiertimeoutoptionsURLtypeSIPtimeoutoptionsURLDialidentifierextenpeerportno

  • peer: имя вызываемого клиента. Это может быть одним из следующих значений:
    • клиент типа «peer» или «friend», который описан в файле sip.conf.
    • IP адрес (типа 192.168.1.8)
    • имя домена (например: asterisk.org). Для имен доменов, сервер Asterisk сначала ищет запись DNS SRV для данного имени домена (Если параметр srvlookup установлен). Если запись найдена, то она сообщает серверу Asterisk, к какому компьютеру нужно соединиться. Если для данного домена нет SRV записи, тогда Asterisk будет пытаться напрямую соединиться с указанной машиной.
  • portno: используемый UDP порт. Если не указан, Asterisk будет использовать стандартный SIP порт — 5060.
  • exten: если задан этот параметр, тогда Asterisk будет запрашивать удаленный сервер соединение с екстеншеном exten.

sip.confплане набора

Различные стили сигналов вызова (звонка)

  • Замечания по настройке различных телефонов для Asterisk
  • В описании на Ваш телефон.
  • На сайте производителя Вашего телефона.

Настройка множественной регистрации

После конвертации конфигурационного фала потребовалось увеличить количество контактов, которые могут подключаться к учетной записи (далее endpoint).

Каждую входящую регистрацию Asterisk рассматривает как contact.

Параметр «max_contacts» позволяет ограничить количество устройств, которые могут подключиться к endpoint.

Количество подключенных контактов можно посмотреть в CLI консоли Asterisk:

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

Пример c комментариями:

После правки dialplan началось интересное поведение системы.

Наши ожидания не оправдались. Мы предполагали, что при таком звонке, asterisk будет оперировать двумя каналами «Кто звонит» и «Кому звонит». На практике, все оказалось иначе.

Предыстория

Материал изначально готовился как доклад для asterconf 2020. Теперь постараюсь описать все более подробно в этой статье.

MIKOPBX — это бесплатная АТС с открытым исходным кодом на базе Asterisk 16. Год назад мы взялись за переход на PJSIP.

Основные причины:

  • PJSIP поддерживает «множественную регистрацию». На одном аккаунте можно без проблем регистрировать несколько конечных UAC

  • Корректная работа входящей маршрутизации при настройке регистрации нескольких учетных записей провайдера на одном адресе (IP+PORT)

  • PJSIP более гибок в настройке

  • chan_sip не развивается и объявлен deprecated в Asterisk 17

Далее опишу с какими сложностями мы столкнулись и какие выгоды получили.

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

Лично у меня подключены следующие устройства:

  • Аппаратный телефон на рабочем столе в офисе

  • Софтфон на ноутбуке

  • Софтфон на смартфоне

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

Диагностика пользователей

6.1 Отображение списка SIP пользователей

Для отображения списка всех SIP пользователей asterisk, с их паролями, а также с основными параметрами (например, контекстами по умолчанию) воспользуйтесь командой:

Эта команда отобразит всех SIP пользователей. Если нужно ограничиться отдельными группами пользователей, воспользуйтесь командой:<шаблон>
например:

6.2 Отображение списка IAX2 пользователей

Для отображения списка всех IAX2 пользователей asterisk, с их паролями, а также с основными параметрами (например, контекстами по умолчанию) воспользуйтесь командой:

Эта команда отобразит всех IAX2 пользователей. Если нужно ограничиться отдельными группами пользователей, воспользуйтесь командой:<шаблон>
например:

6.3 Подробная информация о SIP пользователе

Для получения подробной информации об отдельном пользователе (такой как контекст, язык, callgrop/pickupgroup, CallerID, кодеки и так далее) выполните следующую команду:<имя пользователя>
Например:

Для IAX2 пользователя такой информации не предоставляется.

Термины и определения, специфичные для SIP

  • Пользовательские терминалы/агенты
  • SIP outbound proxy
  • SIP proxy: SIP прокси сервер.
  • SIP redirect server: SIP сервер переадресации
  • SIP registrar server SIP сервер определения местоположения пользователей/сервер обработки регистраций.
  • SIP URI — как определить соединение SIP, в URL
  • SIP Compression: Компрессия в SIP протоколе
  • SIP DMTF Signalling: Передача DTMF сигналов, используя SIP протокол
  • SIP Authentication: Авторизация в SIP протоколе

Ссылки по теме:

  • SIP simple: Система мгновенных сообщений на основе SIP
  • SDP: Описание протокола описания сеанса (Session Description Protocol)
  • SIP tools
  • SIP SS7 gateways
  • RTP: Протокол передачи данных в реальном времени- этот протокол очень часто использется для передачи голоса.
  • SIP call flows: Examples of SIP call flows
  • безопасность в SIP
  • IAX против SIP
  • SIP-T: Протокол Инициирования Сеанса для Телефонии RFC3372

Внешние ссылки о SIP:

  • PDF файл, описывающий протокол SIP (русский язык)
  • How a SIP server can handle the NAT traversal issue in SIP ?
  • Great SIP tutorial
  • SIPfoundry and in particular the sipX project
  • Columbia University SIP website — lots of diverse info here
  • SIP FAQ: Columbia University SIP FAQ — visit it!
  • SIP Introduction: ftp://ftp.berlios.de/pub/ser/latest/doc/html/sip_introduction.html
  • The SIP Forum: http://www.sipforum.com/
  • Doug Moeller’s full day VOIP tutorial Powerpoint presentation (large 13MB zip file)
  • VOIP Cookbook SIP and H.323
  • The SIP Center Comprehensive information and resources on all things SIP.
  • Packetizer’s SIP Information Site
  • quintum http://www.binnacleita.com/ sip gateways
  • SIP Wiki http://www.toyz.org/cgi-bin/sipwiki.cgi

Оригинал: http://www.voip-info.org/wiki/view/SIP, http://niits.ru/public/2003/011.pdf

Замечания

Переменная ${VXML_URL} может быть использована для добавления дополнительного элемента в заголовке SIP сообщения “To:”. Значение этой переменной будет добавлено, через точку с запятой, в конец заголовка “To:” SIP сообщения

Обратите внимание, что предыдущее описание использования этой возможности содержало ошибки; использование этой переменной не имеет никакого эффекта при загрузке сообщений в телефон Cisco 7960 (что-то в данный момент отключено в SIP firmware телефонов Cisco). Это проблема описана в: author’s e-mail
Переменная ${ALERT_INFO} может использоваться для создания нового заголовка с именем “Alert-Info:”, он может использоваться для задания определенного типа звонка на телефонных аппаратах фирмы Cisco, работающих с протоколом SIP, на которых установлено firmware версии 6.0 или выше

Для телефонов 7940/60, переменная ALERT_INFO может принимать следующие значения, для задания определенного встроенного сигнала вызова:

- Bellcore-BusyVerify
- Bellcore-Stutter
- Bellcore-MsgWaiting
- Bellcore-dr1
- Bellcore-dr2
- Bellcore-dr3
- Bellcore-dr4
- Bellcore-dr5

На данный момент нет возможности определить другой вызовов, можно выбрать только варианты проигрывания какого-либо вызова. Нужно весьма тщательно слушать, чтобы сказать, что сигналы вызова действительно чем-то отличаются. Существует багрепорт к Cisco: Cisco bug ID CSCec42938, в котором предлагается доделать возможность выбора сигналов вызова.

Параметры asterisk и SIP клиента

Прописываем STUN сервер у SIP клиента

Это необходимо для того, чтобы как asterisk, так и сам клиент могли определить внешний IP адрес клиента. Для этого в SIP клиенте достатоно прописать STUN сервер. По умолчанию для протокола STUN используется UDP порт 3478 (если необходимо задавать порт для STUN сервера, используйте этот порт). Во многих SIP клиентах настройка STUN сервера может задаваться не в самих параметрах SIP аккаунта, а в глобальных настройках программы
Примеры STUN серверов (можно прописать любой из них):
stun.ekiga.net
stun.3cx.com
stun.ideasip.com
stun.iptel.org
stun.rixtelecom.se
stunserver.org
stun.softjoys.com
stun.voipbuster.com
stun.voipstunt.com
stun.voxgratia.org
Проверить STUN сервер на работоспособность, и получить информацию о NAT можно с помощью утилиты client: http://prdownloads.sourceforge.net/stun/client.exe?download. Описание ее можно найти здесь: http://www.interface.ru/home.asp?artId=22409

Осуществляем проброс портов к asterisk с внешнего IP адреса

Эту задачу решает маршрутизатор (у кого-то — прокси-сервер ISA/TMG/Kerio, у кого-то — Cisco, у кого-то — точка доступа Zyxel/D-Link/TP-Link/…). Вам необходимо обеспечить проброс портов как для протокола SIP (звонки), так и для протокола RTP (сам разговор):

  1. Выход в интернет для сервера asterisk через NAT. Открыты для выхода должны быть порты UDP 5060 (по умолчанию, SIP), и 10000-20000 (UDP по умолчанию, RTP).
  2. подключение извне (проброс портов) с UDP порта 5060 (по умолчанию) на сервер asterisk, и UDP 10000-20000 (по умолчанию). Несколько моментов:
    1. даже если asterisk в Вашей сети работает на порту 5060, вовсе не обязательно из интернета давать доступ к порту 5060. Можно указать (например) такой маппинг портов: с внешнего IP, UDP порт 50600, на локальный IP сервера asterisk, порт 5060;
    2. не обязательно открывать все 10000 RTP портов. Для каждого подключения asterisk требует 2 открытых RTP порта. И если в настройках asterisk (в файле rtp.conf) предварительно ограничить количество RTP портов (например 1000 портов обеспечит до 500 одновременных разговоров), то на сервере также можно ограничить количество внешних портов для подключения

Указываем в конфигурации asterisk внешний IP и порт

На удивление, тут все достаточно просто (во всяком случае, что касается asterisk версии 11.4): в sip.conf прописать несколько параметров в секции general:

Указываем внешний реальный ip адрес сервера asterisk. Если порт, открытый в интернет, не совпадает с внутренним портом астериска, не забываем указать его:
или

Разумеется, после создания/изменения подобных параметров в sip.conf может оказаться недостаточным сделать команду sip reload или даже reload. Может потребоваться перезагрузка самого сервиса asterisk:

Указываем в конфигурации asterisk диапазоны локальной сети

Для этого в sip.conf в секции general прописываем диапазоны локальных IP адресов

Обратите внимание: если у Вас подключены SIP провайдеры не через интернет, а по отдельным линиям связи, то подсети этих провайдеров тоже нужно указать как локальные сети:. Разумеется, после создания/изменения подобных параметров в sip.conf может оказаться недостаточным сделать команду sip reload или даже reload

Может потребоваться перезагрузка самого сервиса asterisk:

Разумеется, после создания/изменения подобных параметров в sip.conf может оказаться недостаточным сделать команду sip reload или даже reload. Может потребоваться перезагрузка самого сервиса asterisk:

Запрещаем прямые соединения клиентов, разрешаем только через asterisk

Прописываем в sip.conf, в секции general опцию:
В старых версиях asterisk (до версии 1.6.2) для этого необходимо было использовать опцию canreinvite, для запрещения повторной отправки пакетов INVITE. В более новых версиях эта опция была переименована.

Поддерживаем соединение со стороны asterisk

Необходима поддержка двух видов соединений: для SIP и для RTP. Параметры для обоих протоколов можно указать как для всех клиентов (в этом случае параметр прописывается в sip.conf в секции general), так и для конкретного клиента (в этом случае параметр прописывается в sip.conf в настройках конкретного клиента).

Для протокола SIP:
Вместо XXX можно указать число , в этом случае asterisk будет посылать SIP пакет клиенту каждые XXX миллисекунд, а можно указать просто yes, в этом случае XXX=300 .

Для протокола RTP:
Вместо YYY нужно указать число, в этом случае asterisk будет посылать RTP пакет клиенту каждые YYY секунд, по умолчанию этот параметр равен 0 (то есть выключен).

О природе каналов и их происхождении

Каждый канал SIP и PJSIP непосредственно связан с SIP диалогом «PBX — UAC».

Проще говоря один INVITE = один канал вида SIP/104-0000XX.

Если к endpoint подключено несколько контактов, то при звонке на внутренний номер INVITE будет отправлен каждому контакту, будет создано несколько каналов.

Зная это, можно сделать следующие выводы:

  • Чем больше каналов, тем больше событий в AMI

  • Каждый канал пройдет определенный для него dialplan

  • Каждый канал повлияет на CDR записи

Если кратко подвести итог, то, после включения множественной регистрации, мы видим влияние на все основные модули наших продуктов:

  • История звонков на АТС

  • Функция записи разговоров

  • Работа CTI приложений, завязанных на AMI

Примеры

Каждый SIP клиент, который должен работать с Asterisk, должен быть определен в файле SIP.CONF. Ниже приводиться несколько примеров:


type=friend ; может быть: «friend» (это: peer+user), «peer» или «user»
context=from-sip
username=grandstream1 ; обычно, этот параметр совпадает с названием секции — section
fromuser=grandstream1 ; переназначает callerid, например,
; бывает необходимо для форварда вызовов — FWD
callerid=John Doe
host=192.168.0.23 ; У нас используется статический но интранетовский IP адрес
nat=no ; между нашим телефоном и Asterisk нет трансляции IP адресов (NAT)
canreinvite=yes ; заставляет весь голосовой RTP трафик проходить через Asterisk
dtmfmode=info ; может быть, как INBAND, так и INFO, например, для телефонов BudgeTone
mailbox=1234@default ; у клиента есть голосовой ящик 1234 в контексте голосовых ящиков: «default»
disallow=all ; необходимо задать disallow=al, перед тем, как использовать параметр allow=
allow=ulaw ; Обратите внимание: в клиентских секциях, порядок выбора кодека
; описанный в параметре allow= не имеет никакого значения!
;allow=alaw
;allow=g723.1 ; Asterisk поддерживает кодек g723.1 только в режиме pass-thru!
;allow=g729 ; Только в режиме Pass-thru , если у Вас нет лицензии на использование кодека g729

Выключите функцию подавления тишины (silence suppression) в клиенте X-Lite (“Transmit Silence”=YES)!

;Обратите внимание, что Xlite сам посылает NAT пакеты keep-alive, следовательно, надобности в qualify=yes нет

type=friend
username=xlite1
callerid="Jane Smith" <5678>
host=dynamic
nat=yes ; клиент X-Lite? находиться за роутером с трансляцией IP адресов (NAT)
canreinvite=no ; Обычно, устанавливается в 'NO', если клиент находиться за NAT
disallow=all
allow=gsm ; Кодек GSM требует намного меньшую полосу пропускания, тем ulaw.
allow=ulaw
allow=alaw


type=friend
secret=blah
host=dynamic
dtmfmode=inband ; Можно выбрать из: inband, rfc2833, или info
defaultip=192.168.0.59
mailbox=1234,2345 ; Голосовой ящик для работы индикатора "полученных новых сообщений"
disallow=all
allow=ulaw ; если режим для dtmf установлен 'inband',
allow=alaw ; то мы должны использовать только кодек g.711


type=friend
username=user2_pingtel
secret=blah
host=dynamic
qualify=1000 ; Рассматриваем клиента как неработающего,
; если ответ от него идет более 1 сек.
callgroup=1,3-4 ; Клиент является членом групп вызовов: 1, 3 и 4
pickupgroup=1,3-4 ; Мы можем совершать "pick-up" вызовов, нажатием *8,
; для вызовов из групп 1, 3 и 4
defaultip=192.168.0.60
disallow=all
allow=ulaw
allow=alaw
allow=g729



type=friend
username=user3_cisco
secret=blah
nat=yes ; Этот телефон находиться за роутером с NAT
host=dynamic
canreinvite=no ; Аппараты Cisco иногда подвисают,
; через некоторое кол-во reinvite запросов
qualify=200 ; Рассматриваем пир как нерабочий,
; если отклик от него приходит дольше, чем 200ms
defaultip=192.168.0.4
disallow=all
allow=ulaw
allow=alaw
allow=g729


type=friend

username=user4_cisco
fromuser=markster ; Определяем имя пользователя, помещаемого в поле "from" вместо callerid
secret=blah
defaultip=192.168.0.4 ; используйте или host=dynamic или defaultip=...
amaflags=default ; Может быть: default, omit, billing, documentation
accountcode=markster ; Пользователь ассоциирован с accountcode для упрощения билинга.
disallow=all
allow=ulaw
allow=alaw
allow=g729
allow=g723.1

После того, как Вы определите эти SIP аккаунты для Ваших клиентов в файле SIP.conf, то у этих клиентов появляется возможность зарегистрироваться на сервере asterisk и совершать исходящие вызовы. Для того, чтоб они могли принимать вызовы, Вам необходимо описать екстеншены для них в Вашем файле плане набора extensions.conf. Пример:

exten => 1010,1, Dial(SIP/user3_cisco,10,t)

Если кто-нибудь совершит вызов на номер 1010, тогда будут совершена попытка вызвать SIP клиента, зарегистрированного как user3_cisco.

Какой порт прослушивает asterisk (на каком порту висит астериск)

3.1 Как определить SIP порт asterisk

Это можно определить локально, выполнив в консоли астериска (asterisk CLI) следующую команду:

Если астериск «висит» на UDP порту (обычно), то соответствующий порт Вы найдете в строке, начинающейся с «UDP Bindaddress», например:
UDP Bindaddress: 0.0.0.0:5060

Если же астериск «висит» на TCP порту (или вообще использует шифрование TLS), то искать надо строки «TCP SIP Bindaddress» и «TLS SIP Bindaddress» соответственно.

3.2 Как определить IAX2 порт asterisk

Это можно определить локально, выполнив в консоли астериска (asterisk CLI) следующую команду:

Номер порта, на котором «висит» asterisk, Вы найдете в строке «Bind Port» (обычно это порт 4569).

Идентификация провайдера

Для рада провайдеров телефонии может наблюдаться следующая картина:

  • Успешно проходит регистрация по адресу sip.test.ru

  • Допустим sip.test.ru резолвится в 10.10.10.10

  • Входящие вызовы поступают с 11.11.11.11

  • Входящие могут поступать и с 10.10.10.10

Вызовы могут не пройти авторизацию и будут завершены.

В PJSIP есть возможность идентификации по IP адресу:

В параметре «match», через запятую, можно описать все IP адреса провайдера. В этом случае входящий будет корректно сопоставлен с нужным endpoint.

Кроме того, следует обратить внимание на опцию «endpoint_identifier_order». Значение по умолчанию:

Значение по умолчанию:

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

Пример, есть три транка:

  • 99999 — подключается к 10.10.10.10:5060

  • 88888 — подключается к 10.10.10.10:5060

  • 77777 — подключается к 10.10.10.10:5060

Если не настроить «endpoint_identifier_order», то:

  • все входящие будут направлены в контекст произвольного endpoint (идентификация пройдет по адресу IP:PORT), к примеру в контекст endpoint «99999» .

  • канал, созданный при входящем будет всегда ассоциироваться с одним и тем же endpoint, к примеру PJSIP/99999-0000XXX, на какой внешний номер бы ни звонил клиент

Диагностика пиров

4.1 Статус SIP пира (или нескольких пиров)

Для того, чтобы получить (краткую) информацию о sip пире, выполните в командной строке астериска следующую команду:<имя-пира>
например:

Так же Вы можете получить информацию о нескольких пирах. Используя слово like, Вы даете команду астериску отобразить все пиры, содержащие (в имени) указанную подстроку. Например, команда:
Эта команда отобразит информацию о пирах с именами 100, 1000, 1001…1009, 10000…100099, а также 1100 (при условии, что пиры с такими именами присутствуют в системе).

При этом Вы увидите:

  1. Имя пира.
  2. IP адрес хоста, с которого зарегистрирован peer.
  3. Номер порта (со стороны пира), который используется для связи с астериском.
  4. Статус пира (Unmonitored, UNKNOWN, OK, …). В случае, если у Вас отображается состояние Unmonitored — значит, пир включен (активен), но настройках этого пира (в файле sip.conf) не указан параметр qualify.
  5. Другую информацию.

4.2 Подробная информация про SIP peer

Для того, чтобы получить подробную информацию о SIP пире, выполните в командной строке астериска следующую команду: <имя-пира>
например:

4.3 Статус IAX2 пира (или нескольких пиров)

Для того, чтобы получить (краткую) информацию об IAX2 пире, выполните в командной строке астериска следующую команду:<имя-пира>
например:

Так же Вы можете получить информацию о нескольких пирах. Используя слово like, Вы даете команду астериску отобразить все пиры, содержащие (в имени) указанную подстроку. Например, команда:
Эта команда отобразит информацию о пирах с именами 100, 1000, 1001…1009, 10000…100099, а также 1100 (при условии, что пиры с такими именами присутствуют в системе).

При этом Вы увидите:

  1. Имя пира.
  2. IP адрес хоста, с которого зарегистрирован peer.
  3. Номер порта (со стороны пира), который используется для связи с астериском.
  4. Статус пира (Unmonitored, UNKNOWN, OK, …). В случае, если у Вас отображается состояние Unmonitored — значит, пир включен (активен), но настройках этого пира (в файле iax.conf) не указан параметр qualify.
  5. Другую информацию.

4.4 Подробная информация про IAX2 peer

Для того, чтобы получить подробную информацию об IAX2 пире, выполните в командной строке астериска следующую команду: <имя-пира>
например:

Автоподъем. Paging. Intercom

Это крайне интересные функции. Все они завязаны на функцию «Автоответ». Может работать как с настольными телефонами, так и с многими софтфонами.

Принцип работы многих UAC схож. Чтобы «поднять трубку» достаточно в INVITE передать дополнительный заголовок. Пример:

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

При работе с chan_sip при originate достаточно было установить переменную SIPADDHEADER:

Работа с этой переменной была описана в chan_sip.с и при звонке заголовок добавлялся автоматически в INVITE.

В случае с PJSIP подход отличается. Упрощенный пример extensions.conf:

Опция «b» в команде «Dial» позволяет созданный канал назначения с помощью Gosub направить в дополнительный контекст «dial_create_chan».

Только в этом месте есть возможность управлять SIP заголовками ДО отправки INVITE.

Интересный вывод: «dial_create_chan» — место в dialplan, где канал еще существует, но НЕ связан с SIP диалогом.

Теперь более правильный пример установки заголовка:

С помощью функции «FIELDQTY» мы анализируем количество контактов, подключенных к endpoint. Если контактов несколько, то функцию лучше отключить, ведь сложно предугадать, на каком из телефонов сработает ответ на вызов.

С помощью функции «CUT» происходит разбор строки «SIPADDHEADER», выделяем имя заголовка и его значение.

Обязательно, после PJSIP_HEADER очищаем значение переменной SIPADDHEADER. Это страховка от случайного срабатывания «ответа» на вызов при переадресациях.

Что нужно сделать после установки asterisk для нормальной работы:

Проблема с отжиранием памяти:

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

03 5 * * 1-6 /usr/sbin/asterisk -rx 'restart when convenient' > /dev/null - каждый день в 5:30 мягкий рестарт, если нет активных звонков
50 6 * * sun /usr/sbin/asterisk -rx 'restart now' > /dev/null - в воскресенье asterisk перегружаем жестко.

Проблема с недоступностью DNS

Неприятная проблема с внешними dns. Суть ошибки в том, что при пропадании интернета отваливаются внутренние пиры и долго обрабатываются соединения с GSM шлюзов и SIP транков, валятся ошибки chan_sip, даже если они находятся в локальной сети.

Часто астериск настраивается для работы только с локальными адресами, например с gsm  шлюзом или оператор предоставляет транк с фиксированным ip адресом и переменная srvlookup не нужна. В таком случае, правильно будет запретить обращение к внешнему DNS серверу, которое может подвешать астериск, для этого в файле sip.conf в секции general прописать:

srvlookup=no

в FreePBX это счастье отключается по разному, но искать нужно в меню «настройках астериск для сип» примерно следущую строку:

srvlookup=yes,

Исходящая регистрация

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

Временные (temporary) проблемы

  • No Response

  • 408 Request Timeout

  • 500 Internal Server Error

  • 502 Bad Gateway

  • 503 Service Unavailable

  • 504 Server Timeout

  • Некоторые 6xx ответы

Постоянные (Permanent) проблемы

  • 401 Unauthorized

  • 403 Forbidden

  • 407 Proxy Authentication Required

  • Прочие 4xx, 5xx, 6xx ошибки

В pjsip.conf при настройке исходящей регистрации обязательно необходимо описать опции для повторной попытки регистрации:

Если sip_to_pjsip.py для конвертации конфигурации, то эти опции придется описать вручную.

Получение значения UserAgent

Для выборка корректного SIP заголовка необходимо понимать какое конечное устройство подключено к endpoint. В случае с pjsip ситуация несколько изменилась. Пример:

Пример в одну строчку для AOR с ID 300. Для упрощения ID endpoint = ID AOR и = EXTEN:

В функцию «PJSIP_AOR» передаем ID AOR, и в качестве опции указываем, что вернуть нам следует поле «contact».

В функцию «PJSIP_CONTACT» передаем полученный контакт, и в качестве опции указываем, что вернуть следует поле «user_agent».

Обратите внимание, PJSIP_AOR(300,contact) вернет ID контакта, но это не тоже самое, что можно увидеть в CLI. Пример результата PJSIP_AOR:

Пример результата PJSIP_AOR:

Пример вывода в CLI:

Настройки Астериск для «Мультифона»

Включение и отключение транка multifon

Включить SIP транк мультифона можно с мобильного телефона командой *137#

Значение Описание Пример
Звонки приходят на мобильный
https://sm.megafon.ru/sm/client/routing/set?login=ТЕЛЕФОН@multifon.ru&password=ПАРОЛЬ&routing=0
Звонки приходят только на SIP
https://sm.megafon.ru/sm/client/routing/set?login=ТЕЛЕФОН@multifon.ru&password=ПАРОЛЬ&routing=1
Звонки приходят на SIP и мобильный
https://sm.megafon.ru/sm/client/routing/set?login=ТЕЛЕФОН@multifon.ru&password=ПАРОЛЬ&routing=2
Проверка текущего статуса
https://sm.megafon.ru/sm/client/routing/?login=ТЕЛЕФОН@multifon.ru&password=ПАРОЛЬ

при параллельном  вызове, если в астериске настроено приветствие, он будет первым перехватывать вызов.

Пара слов о кодеках и совместимости

Исторически сложилось так, что используются для связи в основном три-четыре кодека, даже если вы поставите качественный кодек, оператор предоставит Вам стандартные A-Law, U-Law ну еще может быть G722, GSM. Посмотрите строку регистрации, что предлагает оператор и отключите неиспользуемые кодеки. Даже не очень нагруженный астериск начинает лагать и терять голос, если ему приходится перекодировать в одном транке 2-3 кодека, а при значительной нагрузке проблемы гарантированы. Как пример, телефон Грандстрим настроен на G722, который астериск понимает, но отдает сип-оператору ULAW .

Нет входящих звонков

Если не приходят звонки, а исходящая связь есть, первое что нужно проверить проходит ли соединение, для чего зайти в консоль астера

asterisk -vvvr
local_aster*CLI> sip set debug peer multifon
SIP Debugging Enabled for IP: xx.xx.xx.xx:5060

<--- SIP read from UDP:xx.xx.xx.xx:5060 --->
INVITE sip:[email protected]:5060;user=phone SIP/2.0
Via: SIP/2.0/UDP xx.xx.xx.xx:5060;branch=z654646v520doi1kf4kt400
Max-Forwards: 68
Call-ID: 564654adds@85432131
From: 3951 <sip:[email protected]:5060;user=phone>;tag=A-1-8b320006-ead54c5966
To: <sip:[email protected]>
CSeq: 7745748 INVITE
Expires: 130000
Supported: replaces,100rel
Contact: <sip:ASS@[email protected]:5060;transport=udp>
Allow: INVITE,ACK,CANCEL,BYE,INFO,OPTIONS,PRACK,NOTIFY,MESSAGE,REFER,REGISTER,UPDATE
Content-Length: 166
Content-Type: application/sdp

Если Вы не видите чего то подобного при поступлении звонка, значит дело в сетевых настройках или настройках фаервола. Посмотрите в той же cli консоли на каком порту астериск ждет входящий:

kvm*CLI> sip show settings

у вас должно быть что то вроде:

что значит, астериск слушает на портах TCP и UDP 5060.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: