Asterisk от 1.8 до 16

Лет 10 назад у нас в компании была станция без поддержки sip и первый Asterisk 1.6 подключен по PRI потокам. В последующем захотелось переадресаций с подстановкой номера и управления категориями и был найден chan_ss7 от netfors, который после подпиливания напильником это все мог. Время шло и вышел PJSIP в 13 версии Aterisk, а chan_ss7 собирался только под 1.8. Да и периодически раз в полгода возникали проблемы с прерываниями, которые проявлялись в пропадающем голосе. Они сами появлялись и сами проходили.

Основная станция заменилась и научилась sip и было решено обновить Asterisk до 16.

Установка производилась на чистый debian 10. В репозиториях версия 16.2.1, поэтому собирать будем из исходников. Качаем последний Asterisk 16, у меня это был 16.12.0:

cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz

Распакуем в папку и перейдем в нее:

tar xzvf asterisk-16-current.tar.gz
cd asterisk-16.*

Установим теперь все необходимые зависимости в debian. Перебирать вручную их нет необходимости. Все зависимости собраны в скрипте, который надо запустить.

contrib/scripts/install_prereq install

Дальше скачаем исходники mp3, которые нужны для сборки mp3 модуля.

contrib/scripts/get_mp3_source.sh

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

./configure
make menuselect

К тому, что установлено по-умолчанию, я добавляем:


Продолжаем, после принятия настроек, нажатием на Save & Exit. Компилируем:

./configure
make

Затем соберем и установим пакет с помощью checkinstall:

checkinstall

Заполняем версию, имя пакета и т.д. Я имя пакета пишу asterisk-16, чтобы он не конфликтовал с тем который в репозиториях.

checkinstall

Добавим пользователя для запуска Asterisk и даем права на папки:

adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk
usermod -a -G dialout,audio asterisk
chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk

Настраиваем Asterisk на запуск под этим пользователем. Для этого добавляем в конфиг /etc/default/asterisk параметры:

AST_USER="asterisk"
AST_GROUP="asterisk"

После редактируем /etc/asterisk/modules.conf. Убираем лишнее, например:

noload => chan_sip.so

Стартуем asterisk в консоли и проверяем что нет ошибок:

asterisk -cvvv

Если все нормально, то добавляем службу в автозагрузку и запускаем:

systemctl enable asterisk
systemctl start asterisk

На это установка завершена и переходим к настройке.

В PJSIP координально поменялся синтаксис и просто скопировать конфиг не получиться. Есть конвертер конфига в папке с исходниками contrib/scripts/sip_to_pjsip/sip_to_pjsip.py, но формат с отдельными aor, identify и т.д. не удобен и был найден выход с pjsip_wizard. Нам только нужно создать transport в /etc/asterisk/pjsip.conf добавим:

[transport-udp]
type = transport
protocol = udp
bind = x.x.x.x
external_media_address = x.x.x.x
external_signaling_address = x.x.x.x

Меняете x.x.x.x на IP адрес на котором будете слушать.

Создаем шаблон для пользователя:

[main-template](!)
type=wizard
transport=transport-udp
accepts_auth = yes
accepts_registrations = yes
aor/qualify_frequency = 100
aor/max_contacts = 1
aor/remove_existing = yes
inbound_auth/auth_type = userpass
endpoint/disallow = all
endpoint/allow = alaw
endpoint/dtmf_mode = rfc4733
endpoint/deny = 0.0.0.0/0
endpoint/context = city_out
endpoint/direct_media = no
endpoint/device_state_busy_at = 1
endpoint/language = ru
endpoint/sdp_session = MySDp

И тогда обычный пользователь уже будет иметь конфиг:

[100](main-template)
endpoint/permit=192.168.100.1
inbound_auth/username=100
inbound_auth/password=P@$$Word123
endpoint/callerid='' <100>

А это уже очень похоже на формат chan_sip, и меняем названия параметров в редакторе заменой слов.

Для клиентов за натом вместо nat=yes сделаем отельный шаблон с добавлением строк:

endpoint/rtp_symmetric=yes
endpoint/force_rport=yes
endpoint/rewrite_contact=yes

Для поведения pjsip аналогичного с chan_sip, т.е. один пир одно устройство добавляем. Некоторые китайские телефоны иногда присылают зачем то вторую регистрацию с другого порта при действующей первой и это позволяет обойти этот баг.

aor/max_contacts = 1
aor/remove_existing = yes

Одна из фишек PJSIP это мнодественная регистрация, которая не поддерживалась в chan_sip. Меняем aor/max_contacts на нужное количество и в диалплане звоним:

exten => _XXX,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})})

Очень удобно стало что можно задавать группы перехвата по имени, а не цифрами как раньше:

endpoint/named_call_group = aveks
endpoint/named_pickup_group = aveks

В старом chan_sip был параметр call-limit, который ограничивал количество разговоров пиру. В новом chan_pjsip такого нет, во всех чатах рекомендуют ограничивать вызовы по параметру GROUP. Почему то нигде в мануалах не использует параметр endpoint/device_state_busy_at и добавляем в extensions.conf во входящий и исходящий контекст:

exten => _X.,1,GoSub(subDeviceBusy,s,1(${EXTEN},${CALLERID(num)}))
[subDeviceBusy]
exten => s,1,NoOp(PJSIP/${ARG1} has state ${DEVICE_STATE(PJSIP/${ARG1})})
exten => s,n,NoOp(CallerId is ${ARG2})
exten => s,n,ExecIf($["${DEVICE_STATE(PJSIP/${ARG1})}" = "BUSY"]?Hangup(17))
exten => s,n,Return

Посмотреть линии можно в консоли Asterisk:

pjsip show endpoint 100
Endpoint:  100/100                                      Not in use    0 of 1
     InAuth:  100-iauth/100
        Aor:  100                                            3
      Contact:  100/sip:100@192.168.0.10:5062       c34b4c2d4d Avail         7.981
  Transport:  transport-udp             udp      0      0  192.168.0.1:5060

Здесь 0 of 1 показывает сколько линий занято из возможных.

В 16 Asterisk макросы стали устаревшими поэтому пришлось переписать их на Gosub.

Чтобы при звонке передавался номер звонящего добавляем в INVITE заголовок Diversion при звонке:

exten => 2222222,n,Dial(PJSIP/8XXXXXXXXXX@trunk,,tTb(add_diversion^${EXTEN}^1)
[add_diversion]
exten => _XXXXXXX,1,Set(PJSIP_HEADER(add,Diversion)=<sip:XXX${EXTEN}@x.x.x.x>\;reason=unconditional\;screen=yes\;privacy=off)
exten => _XXXXXXX,n,Return()

Здесь 2222222 гоородской номер на котором стоит переадрессация, 8XXXXXXXXXX номер на который переадресация и если нужно то добавляем код города вместо XXX sip:XXX${EXTEN}@x.x.x.x>

С файлами конфигурации очередей особо проблем не возникло, меняем только members c SIP на PJSIP.

Не забываем пользоваться документацией
pjsip_wizard.conf
pjsip.conf
@kik_krsk
26.10.2020 16:39 UTC
Первоисточник

Комментарии

@sardigital
26.10.2020 12:36 UTC
+3
Прошло 10 лет, а Asterisk ставят всё еще из исходников…
@sardigital
26.10.2020 14:02 UTC
0
Если минусуешь, обосновывай
@beho1der
26.10.2020 15:56 UTC
0
а в чем проблема собрать из исходников, если знаешь что тебе нужно?
27.10.2020 18:25 UTC
0
ну как бы это не сборочный цех, а IP PBX. Сборка отдельно, телефония отдельно
28.10.2020 02:30 UTC
0
то есть нужно разбираться только в IP PBX и не нужно разбираться какие модули, кодеки, функции тебе нужны?
28.10.2020 02:37 UTC
0
После редактируем /etc/asterisk/modules.conf. Убираем лишнее, например:
noload => chan_sip.so


Про это вот цитата от автора.
@Vedga
26.10.2020 19:48 UTC
0

Что автор хотел сказать данной статьей? Что он умеет читать wiki.asterisk.org? Или русскоязычные мануалы по установке asterisk из исходников, коих десятки на просторах инета?
Правда в начале зачем-то упомянул сторонний драйвер канала SS7. К чему — вообще не понятно: те исходники адаптируются к 16-й версии за час, но и штатный dahdi вполне уживается даже с российским ОКС.

@agic
27.10.2020 09:37 UTC
0
просто сборка из исходников? хм…
@sardigital
28.10.2020 02:39 UTC
0
ага, заметил кстати, что нет установки?
28.10.2020 03:40 UTC
0

Если правильно помню checkinstall собирает и устанавливает пакет

28.10.2020 03:42 UTC
0
ок, он может и собрать и установить
28.10.2020 03:43 UTC
0
собсно тема не раскрыта что именно нужно собирать, новичку разобраться что нужно или не нужно в menuselect сложно.
28.10.2020 07:28 UTC
0
Думаю новичку лучше все собрать а ненужное отключить в modules.conf, в menuselect по умолчанию все нужное выбрано, не выбраны звуковые пакеты и устаревшие
29.10.2020 05:16 UTC
0
Хорошо, если просто отключить…
Конкретный пример: относительно недавно monitor стал устаревшим и по умолчанию не собирается, вместо него mixmonitor. Вопрос: является ли monitor не нужным новичку, т.к. не выбран по умолчанию?
p.s. И как быстро проблема станет заметной, т.к. после пересборки всё будет работать, просто не будет файлов с записями. Все контролируют их появление и посылают алерты? И долго новичок будет разбираться в чем проблема после обновления?
@Elsajalee
29.10.2020 05:09 UTC
0
Получается, что make menuselect известен, однако:
После редактируем /etc/asterisk/modules.conf. Убираем лишнее, например:
noload => chan_sip.so
так почему не убрать лишнее на этапе выбора того, что требуется собрать? Если ответ — а вдруг понадобится потом, то chan_sip точно не лучший пример; к тому же потом можно и пересобрать.
@vanyabrovaru
01.12.2020 07:36 UTC
0

Так я не пойму от PRI/PSTN отказались чтоль? Или где про zap?