
Na primeira e na segunda parte de uma série de artigos, descobrimos como instalar um IP-PBX (IP-PBX) em um VPS de RuVDS executando o Ubuntu e configurar funções básicas usando o driver de canal chan_sip. Esta abordagem está obsoleta e o suporte a chan_sip será descartado em versões futuras do Asterisk. É melhor usar a biblioteca de multimídia PjSIP de código aberto. Apesar das diferenças dramáticas nos arquivos de configuração, a transição não é tão difícil quanto pode parecer à primeira vista.
O que é PjSIP?
É importante entender que PjSIP não é um protocolo novo, mas uma biblioteca inteira para trabalhar com uma pilha de protocolos que fornecem comunicação de voz: SIP, RTP, SDP, STUN, etc. É um monte de módulos, que se refletem no arquivo de configuração pjsip.conf (ele substitui o sip.conf tradicional). O arquivo é dividido em seções, e o módulo res_pjsip trabalha com ele principalmente, com cada seção definindo a configuração de algum objeto. Os nomes das seções são tradicionalmente colocados entre colchetes e uma seção deve conter a construção "type =" que define seu tipo.
Os tipos de seções podem ser os seguintes:
ENDPOINT - analógico do par em sip.conf, que define as opções para o protocolo SIP e interação com AOR, AUTH e TRANSPORT. Necessariamente vinculado a pelo menos uma seção AOR;
AOR- descreve como entrar em contato com a ENDPOINT;
TRANSPORTE - Esta seção descreve as configurações do protocolo da camada de transporte, websockets e métodos de criptografia (como o geral em sip.conf). Pode ser um para ENDPOINTs diferentes ou único para um ponto;
REGISTRO - responsável pelos registros de saída, por exemplo, troncos para provedores;
AUTH - contém opções e autoridades para registros de entrada e saída. Associados a ele estão ENDPOINT e REGISTRATIONS;
IDENTIFICAR - aqui você pode definir o IP de origem para ENDPOINT;
ACL - usado por res_pjsip para controlar conexões de entrada, não vinculado a ENDPOINT;
DOMAIN_ALIAS - aliases de domínio;
CONTATO- necessário não especificar explicitamente o URI do SIP no Dialplan;
Sistema - opções do sistema;
Global - opções globais;
Os nomes das seções podem ser arbitrários na maioria dos casos, mas, por exemplo, ENDPOINT e AOR devem ser nomeados de forma idêntica ao cabeçalho SIP URI.
Nossa ajuda dificilmente pode ser chamada de exaustiva, já que muitos chips interessantes foram deixados nos bastidores, como o PjSIP Configuration Wizard: enquanto falamos sobre a migração para uma nova biblioteca com pouco sangue. Você pode lidar com as nuances e sutilezas mais tarde.
Converta sip.conf em pjsip.conf
Por causa de sua modularidade, a estrutura do arquivo de configuração pjsip.conf é espalhada em uma camada fina em muitas seções - é muito mais complexa do que o bom e velho sip.conf. Os desenvolvedores do Asterisk pensaram em administradores simples e criaram um script para converter. Ele é escrito em Python e, se você construir software a partir do código-fonte, já está na distribuição: no diretório contrib / scripts / sip_to_pjsip / . Instalamos o Asterisk de um pacote binário incluído no repositório do Ubuntu, então os scripts tiveram que ser baixados do GitHub.
Embora o formato dos arquivos de configuração para diferentes versões do IP-PBX não tenha mudado muito, é melhor escolher scripts da versão do Asterisk que você instalou ao invés do padrão mais recente - em nosso caso, 16.2.

A versão do Asterisk pode ser visualizada no console IP-PBX usando o comando core show version.Você
precisará de todos os arquivos Python do diretório ontrib / scripts / sip_to_pjsip / no repositório do GitHub. Eles precisam ser adicionados a um diretório local, vá para o diretório com configurações do Asterisk (geralmente / etc / asterisk) e execute o script sip_to_pjsip.py com privilégios de superusuário. Sua principal tarefa é ler o arquivo sip.conf de entrada e fazer um novo pjsip.conf (consulte o wiki do Asterisk para obter detalhes).

O script fará o pjsip.conf, e então você terá que polir manualmente. Se você instalou o Asterisk de acordo com nossos artigos, você também terá que configurar o carregamento dos módulos em /etc/asterisk/modules.conf e mudar a chamada para o aplicativo Dial no Dialplan ( /etc/asterisk/extensions.conf ).
O arquivo /etc/asterisk/pjsip.conf feito pelo conversor mostrou-se inoperante na prática:
pjsip.conf
;--
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[general]
allowoverlap = no
[office]
call-limit = 2
[sipnet]
remotesecret =
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--;
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0
[sipnet]
type = aor
contact = sip:@sipnet.ru
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru
[sipnet]
type = endpoint
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user =
from_domain = sipnet.ru
aors = sipnet
[1001]
type = aor
max_contacts = 1
[1001]
type = auth
username = 1001
password =
[1001]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid = <1001>
auth = 1001
outbound_auth = 1001
aors = 1001
[acl]
type = acl
permit = XXX.XXX.XXX.XXX
deny = 0.0.0.0/0.0.0.0
[1002]
type = aor
max_contacts = 1
[1002]
type = auth
username = 1002
password =
[1002]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid = <1002>
auth = 1002
outbound_auth = 1002
aors = 1002
Sua sintaxe é direta, os detalhes podem ser encontrados no wiki do Asterisk . Será necessária a edição manual para limpar o arquivo de configuração. /Etc/asterisk/pjsip.conf
corrigido (como em sip.conf, modelos podem ser usados nele):
/Etc/asterisk/pjsip.conf corrigido
;===============TRANSPORT
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0
;===============ACL
[acl]
type = acl
deny = 0.0.0.0/0.0.0.0
permit = XXX.XXX.XXX.XXX
;===============SIPNET TRUNK
[sipnet]
type = registration
transport = transport-udp
outbound_auth = sipnet
server_uri = sip:sipnet.ru
client_uri = sip:@sipnet.ru
retry_interval = 60
[sipnet]
type = auth
auth_type = userpass
password =
username =
[sipnet]
type = aor
contact = sip:@sipnet.ru
[sipnet]
type = endpoint
transport = transport-udp
; Dialplan
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user =
from_domain = sipnet.ru
outbound_auth=sipnet
aors = sipnet
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru
;===============USER TEMPLATES
[endpoint-template](!)
type = endpoint
transport = transport-udp
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
[auth-template-userpass](!)
type = auth
auth_type = userpass
[aor-template-single-reg](!)
type = aor
; PjSIP
max_contacts = 1
;===============User 1001
[1001](endpoint-template)
auth = auth1001
aors = 1001
callerid = <1001>
[auth1001](auth-template-userpass)
username = 1001
password =
[1001](aor-template-single-reg)
;===============User 1002
[1002](endpoint-template)
auth = auth1002
aors= 1002
callerid = <1002>
[auth1002](auth-template-userpass)
username = 1002
password =
[1002](aor-template-single-reg)
Com os modelos, há menos papelada, mas também há uma maneira mais interessante de simplificar a vida do administrador - o Assistente de Configuração. Talvez este seja um dos truques mais convenientes do PjSIP, do qual trataremos no próximo artigo.
Reescrevendo o Dialplan
A parte mais simples: basta substituir o SIP pelo PJSIP na chamada para a aplicação Dial. Embora tenhamos modificado ligeiramente o Dialplan de teste mais simples do artigo anterior , lidaremos com coisas mais complexas posteriormente.
Arquivo de configuração /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no
priorityjumping=no
autofallthrough=yes
clearglobalvars=no
;
[default]
exten => _X.,1,NoOp()
same => n,Busy()
same => n,HangUp()
; homeoffice
[homeoffice]
;
exten => _1XXX,1,Dial(PJSIP/${EXTEN})
; SIPNET
exten => _.7XXXXXXXXXX,1,Dial(PJSIP/${EXTEN:1}@sipnet)
; sipnet-trunk, SIPNET
[sipnet-trunk]
;
A transição de chan_sip para PjSIP acabou não sendo particularmente difícil, mas requer uma boa quantidade de trabalho manual. Falha ao converter a configuração automaticamente: o script produziu uma versão inoperante, que teve que ser reescrita manualmente. No próximo artigo, daremos uma olhada no Assistente de Configuração e finalmente estenderemos o plano de discagem para receber chamadas, organizar conferências e resolver outras tarefas de roteamento de chamadas.

