Asterisco 1.8 a 16

Cerca de 10 anos atrás, nossa empresa tinha uma estação sem suporte SIP e o primeiro Asterisk 1.6 foi conectado via fluxos PRI. Posteriormente, eu queria redirecionamentos com substituição de número e gerenciamento de categoria, e chan_ss7 do netfors foi encontrado, que, após preencher um arquivo, poderia fazer tudo. O tempo passou e o PJSIP saiu na versão 13 do Aterisk, e chan_ss7 foi compilado apenas na versão 1.8. E periodicamente, uma vez a cada seis meses, ocorriam problemas com interrupções, que se manifestavam no desaparecimento da voz. Eles apareceram e passaram por si mesmos.



A estação principal foi substituída e aprendeu gole e foi decidido atualizar o Asterisk para 16.



A instalação foi realizada no debian 10. limpo. Os repositórios possuem a versão 16.2.1, então iremos construir a partir dos fontes. Baixe o Asterisk 16 mais recente, eu o tinha em 16.12.0:



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


Descompacte-o em uma pasta e vá até ele:



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


Agora vamos instalar todas as dependências necessárias no debian. Não há necessidade de iterar manualmente. Todas as dependências são coletadas em um script que precisa ser executado.



contrib/scripts/install_prereq install


Em seguida, baixe as fontes mp3, que são necessárias para construir o módulo mp3.



contrib/scripts/get_mp3_source.sh


Todas as dependências são instaladas e você pode prosseguir para a montagem.



./configure
make menuselect


Para o que é instalado por padrão, adiciono:



  • Na primeira guia, format_mp3.
  • Em Core Sound Packages, indico os sons russos RU-WAV.
  • Nos pacotes de som extras eu escolho Inglês EN-WAV, infelizmente não há russo.


Continuamos, após aceitar as configurações, clicando em Salvar e Sair. Compilar:



./configure
make


Então, vamos construir e instalar o pacote usando checkinstall:



checkinstall


Preenchemos a versão, o nome do pacote, etc. Escrevo o nome do pacote asterisco-16 para que não entre em conflito com o dos repositórios.



checkinstall


Adicione um usuário para executar o Asterisk e conceder permissões de pasta:



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


Configuramos o Asterisk para ser executado sob este usuário. Para fazer isso, adicione os parâmetros à configuração / etc / default / asterisk:



AST_USER="asterisk"
AST_GROUP="asterisk"


Após editar /etc/asterisk/modules.conf. Removemos coisas desnecessárias, por exemplo:



noload => chan_sip.so


Iniciamos o asterisco no console e verificamos se não há erros:



asterisk -cvvv


Se tudo estiver bem, adicione o serviço para inicializar e executar:



systemctl enable asterisk
systemctl start asterisk


Isso conclui a instalação e prossegue para a configuração.



No PJSIP, a sintaxe mudou radicalmente e não funcionará apenas para copiar a configuração. Há um conversor de configuração na pasta de origem contrib / scripts / sip_to_pjsip / sip_to_pjsip.py, mas o formato com aor separado, identificação, etc. não é conveniente e uma saída foi encontrada com pjsip_wizard. Só precisamos criar um transporte em /etc/asterisk/pjsip.conf add:



[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


Altere xxxx para o endereço IP que você ouvirá.



Criamos um modelo para o usuário:



[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


E então um usuário comum já terá uma configuração:



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


E isso já é muito parecido com o formato chan_sip, e mudamos os nomes dos parâmetros no editor substituindo as palavras.



Para clientes atrás de nat, em vez de nat = yes, faremos um modelo de hotel com a adição de linhas:



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


Para que o pjsip se comporte como chan_sip, ou seja, adicione um par um dispositivo. Alguns telefones chineses às vezes enviam por algum motivo um segundo registro de outra porta quando a primeira está ativa e isso permite que você contorne este bug.



aor/max_contacts = 1
aor/remove_existing = yes


Uma das características do PJSIP é o registro múltiplo, que não era suportado no chan_sip. Altere aor / max_contacts para a quantidade necessária e ligue no dialplan:



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


Tornou-se muito conveniente que você possa definir grupos de interceptação por nome, e não por números como antes:



endpoint/named_call_group = aveks
endpoint/named_pickup_group = aveks


O antigo chan_sip tinha um parâmetro de limite de chamadas que limitava o número de conversas entre pares. O novo chan_pjsip não tem isso, em todos os chats é recomendado limitar as chamadas pelo parâmetro GRUPO. Por alguma razão, em nenhum lugar dos manuais ele usa o parâmetro endpoint / device_state_busy_at e o adiciona a extensions.conf para o contexto de entrada e saída:



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


Você pode ver as linhas no console do 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


Aqui, 0 de 1 mostra quantas linhas estão ocupadas entre as possíveis.



Em 16, as macros do Asterisk tornaram-se obsoletas e tiveram que ser reescritas no Gosub.



Para transmitir o número do chamador ao ligar, adicione o cabeçalho de desvio a INVITE ao ligar:



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()


Aqui, 2222222 é o número da cidade na qual o encaminhamento é, 8XXXXXXXXXX é o número para o qual o encaminhamento é e, se necessário, adicione o código de área em vez de XXX sip: XXX $ {EXTEN} @xxxx>



Não houve problemas específicos com os arquivos de configuração de fila, apenas mudamos os membros de SIP para PJSIP.



Não se esqueça de usar a documentação

pjsip_wizard.conf

pjsip.conf



All Articles