sexta-feira, 31 de julho de 2020

Configurando o Asterisk para receber chamadas SIP.


Se você deseja receber uma chamada via SIP, de uma ITSP ou até mesmo de outro Softswitch PBX IP, claro que não recomendo via SIP, o correto é via IAX, mas cada um é cada um. Há algumas coisas que você necessita configurar.

O arquivo de configuração do Asterisk® SCF™ (SIP.CONF) define os parâmetros para aceitar chamadas SIP recebidas. Precisamos fazer algumas alterações nesses arquivo para processar corretamente as chamadas recebidas. As configurações aqui são apenas para que você possa receber e tratar de maneira adequada as chamadas Inbounds (recebidas) pelo seu Asterisk® SCF™.

Edite o arquivo SIP.CONF e faça as devidas alterações tal como se encontra abaixo:

[general]
bindport=5060 ; Porta UDP para monitorar a sinalização que chega.
bindaddr=0.0.0.0 ; Colocando desta forma vamos vincular a todas as redes que chega.
disallow=all
allow=ulaw, alaw, gsm, ilbc
context=from-itsp
callerid=unknow
tos=0x68
;---------------------- Atrás de NAT --------------------
externip=203.214.45.124 ;Necessário para atras de NAT
localnet=192.168.0.0/255.255.255.0 ;Necessário para atrás de NAT
fromdomain=asterisklibre.org
canreinvite=no ;Necessário para chamadas ocorrer.
insecure=port,invite
srvlookup=yes ; Necessários para de saída.

Explicação

bindport - A porta UDP à qual se vincular. O padrão é 5060
bindaddr - O endereço IP para escutar as requisições SIP.
disallow - Sempre especificado primeiro para desativar todos os CODECs; em seguida, usamos o comando allow para especificar apenas os que queremos usar.
context - A seção para enviar chamadas SIP para processamento. O from-itsp processará as chamadas, desde que as chamadas anônimas esteja definido como sim. Caso contrário, ele apenas emitirá um tom de ocupado.
tos - Tipo de serviço - usado para priorização de tráfego, se suportado na rede.
externip - Se você estiver atrás de um NAT, defina esse valor com o seu endereço de IP público. Se você não estiver atrás de um NAT, exclua esta linha.
localnet - Se você estiver atrás de um NAT, defina esse valor com a sua sub-rede local e valores de máscara de rede. Observe que você pode ter várias linhas localnet=IP/MASCARA.
fromdomain - Use se desejar que o Asterisk® SCF™ acrescente um domínio (em vez de seu próprio nome de host) às chamadas efetuadas. Observe que, para que chamadas recebidas via ITSP (externas) à sua organização possam entrar em contato com você usando esse domínio, os registros SVR DNS apropriados devem ser configurados nos servidores DNS voltados para o público.
canreinvite - deve ser definido como não (no) para permitir que desvios para as trocas media sejam processados ​​corretamente. A configuração como sim (yes) resultará no cancelamento das chamadas e o ID do evento 1150 será registrado no servidor da media pelo Media Core, dizendo "The Unified Messaging server was unable to create a message for the fax call with ID...".
srvlookup - Deve ser definido como sim (yes) para permitir que o Asterisk® SCF™ faça chamadas SIP de saída externas à sua organização. 

Algumas pessoas sugerem o uso de nat=yes no sip.conf se o seu servidor Asterisk® SCF™ estiver atrás de um NAT. Descobri que isso não é necessário e tende a interromper chamadas/desvios para a troca quando ativado. Enquanto as configurações externip e localnet estiverem presentes, o Asterisk® SCF™ não deverá ter problemas ao processar a chamada por trás de um NAT. Se você tiver extensões individuais por trás de um NAT, poderá definir nat=yes em cada definição de extensão em sip.conf. Isso é necessário nesse cenário e não interrompe desvios ou chamadas para a troca.

Um guia detalhado sobre todas as opções disponíveis no sip.conf está disponível na Wiki do voip-info.org. Lembrando que desde o Asterisk® SCF™ 11 nat=yes não é mais usado, devendo usar nat=force_rport,comedia.

Encaminhamento de porta

Se o seu servidor Asterisk® SCF™ estiver protegido por um NAT, você precisará configurar o encaminhamento de porta no seu roteador. Você precisará encaminhar as seguintes portas para o servidor Asterisk® SCF™.

Nome do serviço:
Porta SIP : 5060
Protocolo: UDP

Nome do serviço: RTP
Porta: 10000-20000
Protocolo: UDP

Se você precisar alterar o intervalo de portas RTP, edite para modificar o rtp.conf

[geral]
rtpstart = 10000
rtpend = 20000

Registros SRV DNS

O SIP depende muito dos registros DNS SRV para poder rotear chamadas pela Internet. Para garantir que as pessoas possam entrar em contato com você, configure os seguintes registros SRV nos servidores DNS voltados para o IP público.

_sip._udp.mypbxip.com. 86400 IN SRV 10 5 5060 vox.mypbxip.com.
_sip._udp.vox.mypbxip.com. 86400 IN SRV 10 5 5060 vox.mypbxip.com.

E finalmente....Você também pode configurar aliases SIP para que as chamadas recebidas possam ser direcionadas para um alias@mypbxip.com em vez de extnumber@mypbxip.com.

Mas recomendo, que se de fato for usar SIP Trunk entre seus Softswiths PBX IP ou entre a ISTP e seu Softswitch PBX IP, faça uso de uma VPN. 

E se for usar um trunk entre dois Softswitch PBX IP, baseados em Asterisk faça udo de Trunks IAX. 

Segue um ótimo post sobre este assunto: Connecting Two Asterisk Boxes Together via IAX

Thats All FOLKS! (Isso é tudo, pessoal!)








quinta-feira, 9 de julho de 2020

Como configurar o GoIP-1/4/8 (GSM VoIP Gateway) como um Gateway de tronco para o Asterisk® SCF™ (P2).

Então se você chegou aqui, eu estou, dando continuidade à este assunto. Aqui tem a primeira parte, recomendo que primeira realize os procedimentos que descrevo nele. 

O primeiro passo a fazer é acessar o seu GTW GoIP, apesar de ter alguns métodos legais de descobrir o IP do seu equipamento, eu particularmente curto o TCPDUMP

Como na primeira parte estou disponibilizando o canal do fabricante, e assim você tem acesso ao manual, aqui não vou da uma de MÍGUÊ, vou descrever apenas como está no meu GATEWAY GSM OVER INTERNET PROTOCOL

Vamos descobrir qual é o IP atribuído pelo DHCP ao nosso equipamento. Então execute o comando:

# tcpdump -i eth0 ether host FF:FF:FF:FF:FF:FF 

O MAC (Media Access Control). Um endereço MAC é responsável pela identificação única dos dispositivos em uma rede, consistindo em um endereço (número) de 48 bits gravado em uma memória ROM presente na própria interface física de rede (placa de rede).

Veja o resultado na Imagem 01:

Imagem 01 - Resultado do TCPDUMP

O importante é Request who-has 192.168.0.2, este é o IP atribuído pelo DHCP ao nosso GTW GoIP (lembrando que GoIP é o nome da tecnologia e não do equipamento, o equipamento é um DBL GTW GoIP, da DBL Technology). 

Com está informação, vamos acessar o GTW GoIP pelo Browser de sua preferencia, e vamos chegar nas informações tal como se encontra na Imagem 02. Como pode verificar, se seguiu corretamente a primeira parte deste artigo, seu GTW GoIP se encontra com VOIPsinalizando que não está configurado, e é isto que iremos fazer nesta parte do artigo.


Imagem 02 - Status > Summary VOIP NOT CONFIGURATION


Vamos acessar o item do menu, Configurations (Imagem 03):

   Imagem 03 - Configurations


O primeiro item é Preferences  (Imagem 04), nele vamos fazer as alterações exatamente como está no bloco em vermelho➋ da imagem. 

OBS: São as configurações que deu certo para meu cenário, logo vai dar certo para você.

Imagem 04 - Configurations > Preferences

O segundo item é Network➊, (Imagem 05) deixe suas configurações iguais ao bloco em vermelho da imagem. 

OBS: Se deixar o DHCP habilitado vai bagunçar sua rede.

Imagem 05 - Configurations > Network

O terceiro item é Basic VoIP➊ (Imagem 06), faça as suas configurações tal como fiz para o meu cenário vermelho. Aqui algumas particularidades, que é o seguinte, eu crio o nome do Trunk os últimos quatros (MCDU) do assinante do telefone Móvel. No meu caso é um telefone 11 9 4444 6686 (fictício), então o 6686. O restante foi a melhor solução para trabalhar com IVR/URA. 

OBS: Não deixe o Backup Server habilitado.

Imagem 06 - Configurations > Basic VoIP

O quarto item é Advance VoIP➊ (Imagem 07), deixe suas configurações iguais a da caixa vermelha do meu cenário.

Imagem 07 - Configurations > Advance VoIP

O quinto item é Media➊ (Imagem 08), é importante que deixe a ordem dos CODECS iguais a minha caixa vermelha➋.

Imagem 08 - Configurations > Media


O sexto item é Call Out➊ (Imagem 09), neste item é importante colocar o número do CHIP da operadora em Forwarding to Number, isto vai facilitar o tratamento desta chamada em nosso Dialplan (extensions.ael). Então deixe suas configurações igual a minha na caixa vermelha.

Imagem 09 - Configurations > Call Out

O sétimo item é Call Out Auth(Imagem 10), este item é uma black list de números que podem ser originados chamadas para eles, em meu caso tenho isto em um BD então deixei desabilitado, até porque a quantidade ai é de apenas 15 registros, ou seja muito pouco para uma lista de PROCON. Então como está na minha caixa vermelha, deixe desabilitado. 

Imagem 10 - Configurations > Call Out Auth

O decimo item é Call In (Imagem 11), aqui fique atento para o contexto de entrega em seu Dialplan, isto é setado em Dial Plan, veja que no meu caso eu coloquei FROM-GOIP (minusculo), então deixe igual a minha caixa vermelha.

Imagem 11 - Configurations > Call In

O decimo primeiro item é Call In Auth(Imagem 12), tal como Call Out Auth, deixei desabilitado pois uso em um BD. Então deixe igual a minha caixa vermelha.

Imagem 12 - Configurations > Call In Auth

O decimo segundo item é SIM➊ (Imagem 13), aqui vem dois pontos importantes, IMEI e HIDE MY GSM NUMBER. Coloque o IMEI de um telefone morto (um aparelho velho, compre no Mercado Livre, somente para ter o IMEI, pois segundo a nova lei, todos os IMEI's não homologados pela ANATEL são automaticamente bloqueados pela operadora. E uma jogada de mestre deste equipamento é poder colocar o IMEI valido do pais de operação. Deixe igual a minha caixa vermelha.

Imagem 13 - Configurations > SIM

O decimo terceiro item é SIM Forward➊ (Imagem 14), neste item é importantíssimo deixar tudo desabilitado, assim seu poder de manipulação fica no Dialplan. Logo deixe tudo igual a minha caixa vermelha.
Imagem 14 - Configurations > SIM Forward

O decimo quarto item é o IMEI➊ (Imagem 15), aqui deve colocar o mesmo IMEI do aparelho morto que colocou em SIM. Caixa vermelha.

Imagem 15 - Configurations > IMEI

O decimo quinto item é o SMS (Imagem 16), por motivos óbvios deixei os mesmo desabilitado, em um futuro irei ver de fato como usar este item, então irei fazer um artigo sobre o assunto. Mas para que funcione em nosso cenário as chamadas e SIP INFO da operadora, deixe igual a minha caixa vermelha. Caso você tenha descoberto como usar SMS via este equipamento, me mande sua receita pelo e-mail: suporte@delphini.com.br, que farei a homologação da receita e um artigo sobre ela com as devidas informações de origem que deu mérito ao artigo.

Imagem 16 - Configurations > SMS

O decimo sexto item é o GSM Carrier➊ (Imagem 17), aqui é melhor ficar automático, isto porque o sistema móvel do Brasil não é unificado. Então deixe igual a minha caixa vermelha.

Imagem 17 - Configurations > GSM Carrier

Nosso decimo sétimo e último item, é o GSM Base Station (Imagem 18), que deve ficar em modo automático também devido nossa rede móvel no Brasil. Deixe as suas configurações igual a minha caixa vermelha.

Imagem 18 - Configurations > GSM Base Station

Com todas estas configurações, voltando no item Summary, na coluna VOIP➊ (Imagem 19), vamos ter a seguinte informação 401, ou seja nosso equipamento já está se comunicando com o Asterisk® SCF™, o que ocorre é que não temos as configurações de TRUNK em PJSIP.CONF, que vamos fazer no próximo artigo!

Imagem 19 - Summary > VOIP

Somente para concluir, veja como está chegando a informação em seu Dialplan (Imagem 20) , ou seja o equipamento de fato está tentando fazer um registro em nosso Asterisk® SCF™.

Imagem 20 - Summary > VOIP


Artigos: ➍ ➎ ➏







quarta-feira, 1 de julho de 2020

Extensions LUA (primeiros passos).



extensions.lua

CONSOLE = "Console/DSP -- Interface do console para demonstração.
--CONSOLE = "DAHDI/1"
--CONSOLE = "Phone/phone0"

IAXINFO = "guest"       -- IAX ToIP modo trunk=yes (username/password).
--IAXINFO = "myuser:mypass"

TRUNK = "DAHDI/G2"
TRUNKMSD = 1
-- TRUNK = "IAX2/user:pass@provider"

A interface do console para demostração de extensões (extensions) deve ser definida em uma tabela global chamada "extensions". A tabela "extensions" deve conter um grupo de tabelas, cada qual, representando um contexto (context). As extensões são definidas em cada contexto. Ver abaixo  os exemplos.

Os nomes de extensões podem ser números, letras ou combinações dos mesmos. E se um nome de extensão é precedido por um caractere '_', é interpretado como um padrão ao invés de um literal. Nos padrões, alguns caracteres têm significados especiais:

X = qualquer dígito de 0 a 9;
Z = qualquer dígito de 1 a 9;
N = qualquer dígito de 2 a 9;
[1235-9] = qualquer dígito entre colchetes (neste exemplo, 1,2,3,5,6,7,8,9);
. (ponto)curinga, corresponde a qualquer coisa restante (por exemplo, _9011. qualquer coisa que comece com 9011, excluindo o próprio 9011);
! (exclamação) curinga, faz com que o processo de correspondência seja concluído assim que pode determinar inequivocamente que nenhuma outra correspondência é possível.

Por exemplo, a extensão _NXXXXXXX corresponderia a 8 dígitos normais (um número fixo local por exemplo: 4004 2222). Já padrões para chamadas, _55ZZNXXXXXXXX (exemplo: 55 11 4004 2222), representaria o código do pais, mais o código de área e o telefone do assinante, repare que ambos os padrões estão sendo precedido pelo carácter de informação do padrão "_" (subscribe).

Caso tenha alguma dúvida sobre padrões, recomendo ler o artigo sobre Numeração Telefônica da Teleco

Se a sua extensão tiver caracteres especiais, como '.' (ponto) e '!' (exclamação) você deve explicitamente fazer uma string na definição da tabela:

["_special."] = function;
["_special!"] = function;

Não há prioridades. Todas as extensões do Asterisk® SCF™ parecem ter uma única prioridade, ou seja consistem de fato, em uma única prioridade.
 
Cada contexto é definido como uma tabela na tabela de extensões. Os nomes de contexto devem ser cadeias de caracteres.

Um contexto pode ser incluído em outro contexto usando a extensão "includes". Esta extensão deve ser definida para uma tabela que contém uma lista de nomes de contexto. Não coloque referências a tabelas na tabela de inclusão.

include = {"ddl", "ddd", "ddi"};

ddl = discagem direta local;
ddd = discagem direta à distancia;
ddi = discagem direta internacional.

As variáveis de canal podem ser acessadas através da tabela global de 'canais'.

v = channel.var_name
v = channel["var_name"]
v.value
v: get ()


channel.var_name = "value"
channel["var_name"] = "value"
v:set("value")

channel.func_name(1,2,3):set("value")
value = channel.func_name(1,2,3):get()
channel["func_name(1,2,3)"]:set("value")
channel["func_name(1,2,3)"] = "value"
value = channel["func_name(1,2,3)"]:get()

Observe o uso do operador ':' (dois pontos) para acessar os métodos get() e set().

Observe também a ausência das seguintes construções dos exemplos acima:
channel.func_name (1,2,3) = "value" - isso NÃO funcionará;
value = channel.func_name (1,2,3) - isso NÃO funcionará conforme o esperado.

Os aplicativos do Dialplan podem ser acessados através da tabela global 'app'.

app.Dial("DAHDI/1")
app.dial("DAHDI/1")
app["dial"]("DAHDI/1")

Um serviço automático é executado automaticamente enquanto o código LUA está em execução. O serviço automático pode ser parado e reiniciado usando as funções autoservice_stop() e autoservice_start(). O serviço automático deve estar em execução antes de iniciar operações de execução longa. O serviço automático será automaticamente interrompido antes de executar aplicativos e funções do plano de marcação (Dialplan) e será reiniciado posteriormente. A função autoservice_status() pode ser usada para verificar o status atual do serviço automático e retornará true se um serviço automático estiver em execução no momento.

Nota sobre conflitos de nomenclatura:
LUA permite que você consulte as entradas da tabela usando o '.' (ponto) notação, Exemplo: app.goto(algo), apenas se a entrada não entrar em conflito com uma palavra reservada do LUA. No exemplo 'goto', com Lua 5.1 ou anterior, 'goto' não é uma palavra reservada; portanto, você chamaria o aplicativo de plano de discagem do Asterisk® SCF™ 'goto'. Agora, em LUA 5.2, ocorreu, a introdução da instrução de controle 'goto' que torna 'goto' uma palavra reservada. Isso faz com que o interpretador do LUA falhe ao analisar o arquivo e o pbx_lua.so falhará ao carregar. O mesmo se aplica a qualquer uso de tabelas reservadas ao LUA, incluindo extensões, canais e quaisquer tabelas que você criar.

Há duas maneiras de contornar isso: Como LUA diferencia maiúsculas de minúsculas, é possível usar nomes em maiúsculas, Exemplo: app.Goto(alvo) para se referir aos aplicativos, funções, etc. do Asterisk® SCF™, ou você pode usar a sintaxe completa, Exemplo: app["goto"](alvo da coisa). Ambas as sintaxes são compatíveis com versões anteriores de Lua. Para tornar seus planos de marcação (Dialplan) LUA mais fáceis de manter e reduzir a chance de futuros conflitos, convém usar a sintaxe do aplicativo app["goto"](algo da coisa) para todos os acessos à tabela.

function outgoing_local(c, e)
    app.dial("DAHDI/1/" .. e, "", "")
end

function demo_instruct()
    app.background("demo-instruct")
    app.waitexten()
end

function demo_congrats()
    app.background("demo-congrats")
    demo_instruct()
end

-- Responda ao channel e reproduza os arquivos de som demo
function demo_start(context, exten)
    app.wait(1)
    app.answer()

    channel.TIMEOUT("digit"):set(5)
    channel.TIMEOUT("response"):set(10)
    -- app.set("TIMEOUT(digit)=5")
    -- app.set("TIMEOUT(response)=10")

    demo_congrats(context, exten)
end

function demo_hangup()
    app.playback("demo-thanks")
    app.hangup()
end

extensions = {
    demo = {
        s = demo_start;
        
        ["2"] = function()
            app.background("demo-moreinfo")
            demo_instruct()
        end;
        
        ["3"] = function ()
            -- define o idioma para português.
            channel.LANGUAGE():set("br") 
            demo_congrats()
        end;
        
        ["1000"] = function()
            -- Lembre-se da nota de conflito de nomenclatura.
            app['goto']("default", "s", 1)
        end;
        
        ["1234"] = function()
            app.playback("transfer", "skip")
            -- faça um Dial aqui
        end;
        
        ["1235"] = function()
            app.voicemail("1234", "u")
        end;
        
        ["1236"] = function()
            app.dial("Console/dsp")
            app.voicemail(1234, "b")
        end;

        ["#"] = demo_hangup;
            t = demo_hangup;
            i = function()
            app.playback("invalid")
            demo_instruct()
        end;
        
        ["500"] = function()
            app.playback("demo-abouttotry")
            app.dial("IAX2/guest@misery.digium.com/s@default")
            app.playback("demo-nogo")
            demo_instruct()
        end;
        
        ["600"] = function()
            app.playback("demo-echotest")
            app.echo()
            app.playback("demo-echodone")
            demo_instruct()
        end;
        
        ["8500"] = function()
            app.voicemailmain()
            demo_instruct()
        end;
    };

    default = {
        -- por padrão, faça a demonstração.
        include = {"demo"};
    };

ATENÇÃO: Se o seu Asterisk® SCF™ estiver conectado à Internet (cloud) e você não tiver allowguest=no no sip.conf, todos os usuários poderão usar seu contexto público (public) sem autenticação. Nesse caso, você deve verificar quais serviços você oferece a seus clientes.

    public = {
           include = {"demo"};
  
    };

    ["local"] = {
        ["_NXXXXXX"] = outgoing_local;
        
    };
}

hints = {
    demo = {
        [1000] = "SIP/1000";
        [1001] = "SIP/1001";
    };
    
    default = {
        ["1234"] = "SIP/1234";
    };
}

Bom se você chegou até aqui, parabéns... Eu recomendo que você faça uma pequena leitura neste post: Aprenda LUA em 15 minutos.

E se quiser temos uma comunidade no Telegram onde estamos todos iniciando em extensions.lua. Asterisk Dialplan LUA Brasil, seja bem vindo!