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