Модуль 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 (сам разговор):
- Выход в интернет для сервера asterisk через NAT. Открыты для выхода должны быть порты UDP 5060 (по умолчанию, SIP), и 10000-20000 (UDP по умолчанию, RTP).
- подключение извне (проброс портов) с UDP порта 5060 (по умолчанию) на сервер asterisk, и UDP 10000-20000 (по умолчанию). Несколько моментов:
- даже если asterisk в Вашей сети работает на порту 5060, вовсе не обязательно из интернета давать доступ к порту 5060. Можно указать (например) такой маппинг портов: с внешнего IP, UDP порт 50600, на локальный IP сервера asterisk, порт 5060;
- не обязательно открывать все 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 (при условии, что пиры с такими именами присутствуют в системе).
При этом Вы увидите:
- Имя пира.
- IP адрес хоста, с которого зарегистрирован peer.
- Номер порта (со стороны пира), который используется для связи с астериском.
- Статус пира (Unmonitored, UNKNOWN, OK, …). В случае, если у Вас отображается состояние Unmonitored — значит, пир включен (активен), но настройках этого пира (в файле sip.conf) не указан параметр qualify.
- Другую информацию.
4.2 Подробная информация про SIP peer
Для того, чтобы получить подробную информацию о SIP пире, выполните в командной строке астериска следующую команду: <имя-пира>
например:
4.3 Статус IAX2 пира (или нескольких пиров)
Для того, чтобы получить (краткую) информацию об IAX2 пире, выполните в командной строке астериска следующую команду:<имя-пира>
например:
Так же Вы можете получить информацию о нескольких пирах. Используя слово like, Вы даете команду астериску отобразить все пиры, содержащие (в имени) указанную подстроку. Например, команда:
Эта команда отобразит информацию о пирах с именами 100, 1000, 1001…1009, 10000…100099, а также 1100 (при условии, что пиры с такими именами присутствуют в системе).
При этом Вы увидите:
- Имя пира.
- IP адрес хоста, с которого зарегистрирован peer.
- Номер порта (со стороны пира), который используется для связи с астериском.
- Статус пира (Unmonitored, UNKNOWN, OK, …). В случае, если у Вас отображается состояние Unmonitored — значит, пир включен (активен), но настройках этого пира (в файле iax.conf) не указан параметр qualify.
- Другую информацию.
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.