Миграция с chan_sip на chan_pjsip в Asterisk: полное руководство по переходу
- Предупреждения в CLI Asterisk о скором удалении драйвера
chan_sip(SIP stack deprecated). - Невозможность использовать современные функции: несколько контактов на один экстеншн (WebRTC + аппаратный телефон), продвинутый NAT traversal и асинхронный I/O.
- Высокая задержка обработки SIP-диалогов при большом количестве одновременных вызовов.
1. Концептуальная разница архитектуры
В chan_sip одна секция в sip.conf описывала все параметры. В chan_pjsip сущности разделены на 5 модульных объектов:
- transport: сетевой протокол, порт и IP-биндинг (UDP/TCP/TLS/WSS).
- endpoint: медиа-настройки, кодеки, параметры вызова и связь с остальными объектами.
- aor (Address of Record): куда отправлять вызовы (IP-адрес или динамическая регистрация с
max_contacts). - auth: учетные данные (логин и пароль) для входящей/исходящей аутентификации.
- identify: сопоставление входящих вызовов по IP-адресу (для транков без регистрации).
2. Автоматическая конвертация через sip_to_pjsip.py
cd /usr/src/asterisk/contrib/scripts
python3 sip_to_pjsip.py /etc/asterisk/sip.conf /etc/asterisk/pjsip.conf.converted3. Ручная настройка транка от провайдера в pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=192.168.0.0/16
external_media_address=203.0.113.10
external_signaling_address=203.0.113.10
; --- Провайдерский транк с регистрацией ---
[provider-out]
type=registration
outbound_auth=provider-auth
server_uri=sip:sip.provider.com
client_uri=sip:1234567@sip.provider.com
[provider-auth]
type=auth
auth_type=userpass
username=1234567
password=SuperSecretPassword
[provider-aor]
type=aor
contact=sip:sip.provider.com:5060
[provider-endpoint]
type=endpoint
context=from-trunk
disallow=all
allow=alaw,ulaw
outbound_auth=provider-auth
aors=provider-aor
[provider-identify]
type=identify
endpoint=provider-endpoint
match=sip.provider.com4. Корректировка диалплана extensions.conf
Замените канальный вызов SIP/ на PJSIP/:
; Было в chan_sip:
; same => n,Dial(SIP/101,30)
; same => n,Dial(SIP/provider-out/${EXTEN})
; Стало в chan_pjsip:
same => n,Dial(PJSIP/101,30)
same => n,Dial(PJSIP/${EXTEN}@provider-endpoint,30)5. Отключение chan_sip в modules.conf
В файле /etc/asterisk/modules.conf добавьте:
noload => chan_sip.so
load => chan_pjsip.so
load => res_pjsip.soasterisk -rx "module unload chan_sip.so"
asterisk -rx "pjsip reload" Частые вопросы (FAQ)
Можно ли запускать chan_sip и chan_pjsip одновременно на одном сервере?
Да, но они должны слушать разные порты или разные IP-адреса. Например, chan_pjsip биндится на 0.0.0.0:5060, а chan_sip временно переводится на порт 5061 (если TLS не используется) для плавной поэтапной миграции абонентов.
Как разрешить одному абоненту регистрировать несколько телефонов (Multiple Contacts)?
В секции [aor] соответствующего эндпоинта укажите параметр max_contacts = 5. Теперь при звонке на PJSIP/101 вызов пойдет одновременно на мобильное приложение, веб-телефон и офисный аппарат.
Какими командами проверять статус абонентов и транков в PJSIP?
В консоли Asterisk CLI используйте: pjsip show endpoints, pjsip show registrations, pjsip show aors, pjsip show auths.
Почему входящие звонки от провайдера падают с ошибкой 401 Unauthorized?
Если провайдер присылает вызовы с разных IP-адресов пула, убедитесь, что в объекте [identify] в директиве match перечислены все IP-адреса или подсеть провайдера (например, match=198.51.100.0/24).