terça-feira, 13 de dezembro de 2022

Asterisk® SCF™ Aplicativo: sendDTMF( )


O Aplicativo de Dialplan do Asterisk® SCF™: sendDTMF( ), envia uma sequencia especificada de tons DTMF em um canal.

Descrição

Envia a sequencia especificada de dígitos para o canal. 

Sintaxe

sendDTMF(dígitos[,timeout_ms[,duration-ms[,canal]]])

Argumentos

dígitos - números ou símbolos suportados

  0 - 9  - números

   * #    - os caracteres especiais * e #

  a - d  - letras latinas minúsculas de a a d

  A - D - letras latinas maiusculas de A a D

    w     - pausa (wait) de 0,5 segundos

    W    - pausa (wait) de 1 segundo

    F     - flash gancho se suportado pelo canal

timeout_ms - intervalo entre os sinais DTMF - por padrão são de 0,25 segundos.

duration_ms - duração de cada dígito.

canal - o canal para onde os dígitos devem ser enviados.

Observação: O Aplicativo de Dialplan do Asterisk® SCF™ Dial( ), com o parâmetro D também pode enviar sequencias DTMF.

Exemplo

Nesse exemplo temos um Dial sendo executado sobre um sistema POTS (Sistema de Cartão), e estamos substituindo o número do sistema e o pincode.

O assinante faz a marcação do prefixo 001 e o número chamado. 

O sistema liga para o número da operadora (cardnum) e envia a sequencia de DTMF: o codigo pin e o numero de destino da chamada (PIN e NUM).

[from-internal]
exten => _001X.,1,noop
   same => n,answer
   same => n,mset(num=${EXTEN:3},pin=1234567,cardnum=6666666)
   same => n,Dial(PJSIP/${cardnum}@pjsip_trunk,,U(sub-card^${pin}^${num}))
[sub-card]
exten =>  s,1,senddtmf(W${ARG1}w${ARG2}#,,,)
   same => n,return

Fonte: Asterisk® Documentation

 

quinta-feira, 15 de setembro de 2022

Asterisk Module and Build Option Selection - XXX cel_pgsql

                     Olá a todos, depois de muito tempo, venho trazer uma treta bacana que peguei no Asterisk® SCF™, por algum motivo no método normal de instalação das dependências do Asterisk® SCF™ não ocorreu o atendimento da dependência para que o Asterisk Module and Build Option Selection identifica-se o PGSQL(E) para o modulo cdr_pgsql e cel_pgsql. Observe a imagem a seguir:


Para entender o que está ocorrendo, entre no fonte do Asterisk® SCF™ e execute o teste pelo script install_prereq:

# cd /usr/local/src/asterisk-13.35.0/

# contrib/scripts/install_prereq test

Neste caso, que estamos expondo, a resposta foi essa:

yum install --skip-broken --assumeyes speexdsp-devel postgresql-devel mysql-devel iksemel-devel hoard gmime.x86_64 gmime-devel.x86_64 

Observe que entre a resposta do teste, esta sendo informado que postgresql-devel não foi encontrado para atender os módulos do Asterisk® SCF™. 

Executando o comando do RPM para validar os pacotes instalados obtemos a seguinte resposta:

# rpm -qa | grep postgres

postgresql11-libs-11.13-1PGDG.rhel7.x86_64
postgresql11-server-11.13-1PGDG.rhel7.x86_64
postgresql11-devel-11.13-1PGDG.rhel7.x86_64
postgresql11-11.13-1PGDG.rhel7.x86_64
postgresql11-contrib-11.13-1PGDG.rhel7.x86_64

Ou seja, temos o PostgreSQL 11 instalado, e logo sabemos que o PostgreSQL11-Devel se encontra instalado, mas o  Asterisk® SCF™ não sabe. Então para ter certeza que ter certeza de qual versão se encontra ativo e funcional no Sistema Operacional use esse comando:

# psql --version | awk '{print $3}' | awk -F '.' '{print $1}'
11

Obtivemos o resultado sendo 11, então execute o configure para essa versão do postgresql-devel, deste modo:

# ./configure --prefix=/usr --with-postgres=/usr/pgsql-11/.

Entre novamente no Menu Select do Asterisk Module and Build Option Selection:

# make menuselect

E observe que agora temos os modulos ativos para serem copilados, veja as figuras a seguir:

 

Agora para compilar este Build com segurança, devemos parar o Asterisk® SCF™, para isso execute os próximos passos:
 
# systemctl stop asterisk.service
 
# make -j4
 
# make install 

# ldconfig

# systemctl start asterisk.service
 
# rasterisk -vvvvgci
 
Na console do  Asterisk® SCF™ valide se os módulos já estão ativos, caso não estejam suba eles. Lembrando que para que os módulos sejam carregados automaticamente é necessário em modulos.conf a opção autoload do modules estar ativa para yes:

[modules]
autoload=yes

*CLI> module show like cel_pgsql.so
Module          Description                              Use Count  Status       Support Level
cel_pgsql.so   PostgreSQL CEL Backend             0          Running    extended
1 modules loaded

*CLI> module show like cdr_pgsql.so
Module          Description                              Use Count  Status       Support Level
cdr_pgsql.so   PostgreSQL CDR Backend             0          Running   extended
1 modules loaded

Pronto, a partir deste ponto, a sua comunicação com o banco de dados PostgreSQL via conector nativo do  Asterisk® SCF™ funcionando.Tire a prova de conexão com o CORE/PBX:

*CLI> cel show status
CEL Logging: Enabled
CEL Tracking Event: HANGUP
CEL Tracking Event: ANSWER
CEL Tracking Event: BRIDGE_ENTER
CEL Tracking Event: ATTENDEDTRANSFER
CEL Tracking Event: USER_DEFINED
CEL Tracking Event: LINKEDID_END
CEL Event Subscriber: CEL Custom CSV Logging
CEL Event Subscriber: ODBC CEL backend
CEL Event Subscriber: CEL PGSQL backend

Se executar o comando cdr show status, vais ver que também está tudo funcional entre o modulo e CORE/PBX.

Lembrando que não é mais recomendado usar o modulo nativo para MySQL e PostgreSQL. É altamente recomendado usar a conexão com Banco de Dados via UnixODBC.

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


quarta-feira, 3 de agosto de 2022

Asterisk® SCF™ Remoção total para reinstalação - Metodo Recomendado.

Imagine a seguinte situação, você por algum motivo necessita de fazer um reinstalação do Asterisk® SCF™ em seu servidor, muitas vezes vejo as pessoas apenas indo na pasta do source, e executando todos os procedimentos de instalação novamente, as vezes nem se preocupam em parar o Asterisk® SCF™. 

Bem isso é totalmente errado, e pode trazer consequências prejudiciais a sua produção, aqui vou demonstrar como fazer isso de maneira segura e correta. 

E porque eu necessito de reinstalar o Asterisk® SCF™? Bom no meu caso isso ocorre quando tenho que desenvolver algo que tenho que utilizar uma versão antiga do Asterisk® SCF™, tipo um downgrade... 

Nesse exemplo, estou removendo um Asterisk® SCF™ versão 16.28.0-rc1, e instalando uma versão 13.35.0 para um projeto especifico.

Claro que os procedimentos a seguir, também pode ser utilizado para quando quiser remover por completo o  Asterisk® SCF™, a ponto de não querer mais usar ele em um servidor especifico.

Eu necessito lhe informar que você deve fazer backup do seu projeto atual? Ok! Então faça um backup da pasta /etc/asteirsk/ em algum lugar, assim como /var/lib/asterisk/. 

E vamos nessa!

killall -9 safe_asterisk
killall -9 asterisk
systemctl disable asterisk.service
rm -rf /etc/asterisk
rm -rf /var/log/asterisk
rm -rf /var/lib/asterisk
rm -rf /var/lib64/asterisk
rm -rf /var/spool/asterisk
rm -rf /usr/lib/asterisk
rm -rf /usr/lib64/asterisk
reboot

OBS: Dependendo da instalação, systemctl disable asterisk.service, pode não estar habilitado ou foi configurado para ser executado via @reboot cron, e não por daemon service.

Agora pode baixar o pacote do Asterisk® SCF™, e refazer a instalação, estou usando o Rock Linux™ e confesso que estou muito feliz com essa distribuição baseada no Sistema Operacional GNU/Linux.  

cd /usr/local/src/
wget https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-13.35.0.tar.gz
tar -xvf asterisk-13.35.0.tar.gz
cd asterisk-13.35.0/
./contrib/scripts/install_prereq install
./configure --libdir=/usr/lib64 --with-jansson-bundled=yes --with-pjproject-bundled=yes
make menuselect
make -j4
make install
make basic-pbx
make config

Pronto, agora você está com uma nova versão totalmente limpa em seu servidor. Em make menuselect, corrija todos os pontos que sejam importantes para sua solução. 

Um outro ponto que deve ser tomado em conta, é que para  Asterisk® SCF™ até a versão 14, devemos usar o comando:

./configure --libdir=/usr/lib64 --with-jansson-bundled=yes --with-pjproject-bundled=yes

Para versões superiores a versão 15, deve ser assim:
 
./configure --libdir=/usr/lib64 --with-jansson-bundled=yes
 
Thats All FOLKS! (Isso é tudo, pessoal!)


sábado, 4 de junho de 2022

Capítulo 22. Agrupamento (Clustering).

Você pode não conseguir comer um cacho de uva de uma única vez, mas é muito fácil comer uma a uma.

- Jacques Roumain - Escritor, Político e Defensor do Marxismo Haitiano. 1907 ~ 1944, Porto Príncipe/Haiti.

A palavra agrupamento (Clustering) pode significar coisas diferentes para pessoas diferentes. Algumas pessoas diriam que o clustering é simplesmente ter um sistema replicado em espera disponível para ser ativado quando o sistema primário falhar. Para outros, clustering é ter vários sistemas trabalhando em conjunto, com dados replicados, totalmente redundantes e infinitamente expansíveis. Para a maioria das pessoas, provavelmente está em algum lugar entre esses dois extremos.

Este capítulo do livro  Asterisk: The Definitive Guide (3nd Edition for Asterisk 1.8), escrito por Leif Madsen, Jim Van Meggelen, e Russell Bryant. é explorado as possibilidades de clustering que existem com Asterisk® SCF™ em alto nível, dando a você o conhecimento e direção para começar a planejar seu sistema no futuro. Como exemplos, discutiremos algumas das ferramentas que usamos em nossa próprias grandes implantações; embora não haja uma única maneira de construir um Cluster de Asterisk® SCF™, as topologias que abordamos provaram ser confiáveis ao longo dos anos.

Nossos exemplos se aprofundarão na construção de um call center distribuído, uma das razões mais populares para construir um sistema distribuído. Em alguns casos, isso é necessário simplesmente porque uma empresa possui escritórios satélites que deseja vincular ao sistema primário. Para outros, o objetivo é integrar funcionários remotos ou poder lidar com um grande número de extensões. Começaremos analisando um sistema Softswitch PBX IP simples e tradicional e veremos como esse sistema pode eventualmente se transformar em algo muito maior.

Call Centers Tradicionais

A maioria dos sistemas implantados antes do ano 2000 será bastante semelhante. Eles envolverão um conjunto de linhas telefônicas entregues por meio de uma PRI (PSTN) ou por meio de um conjunto de linhas analógicas (POTS), que se conectam a um sistema de PABX (Central de Comutação, Hardware) que entrega chamadas para aparelhos que provavelmente são proprietários (Cisco, Avaya, Intelbras, etc.) dos sistemas implantados. Esses sistemas provavelmente fornecerão um conjunto básico de funções, com funções extras, como correio de voz e conferência, sendo fornecidas por meio de módulos externos que pode custar milhares de dólares. Essa topologia é ilustrada na Figura 22.1, "Central de Atendimento Tradicional".

Figura 22.1. Central de Atendimento Tradicional

Esses sistemas utilizarão um conjunto de regras para entregar chamadas aos agentes por meio das regras padrão de distribuição automática de chamadas (DAC/ACD) e terão pouca flexibilidade. Provavelmente será impossível ou caro adicionar agentes remotos, pois as chamadas precisariam ser entregues pela PSTN, que utiliza duas linhas telefônicas: um apara o chamador de entrada da fila e outra para ser entregue ao agente remoto (na maioria dos casos, os agentes precisam apenas residir no mesmo local físico que o próprio PABX).
No entanto, esses sistemas telefônicos tradicionais estão sendo gradualmente eliminados, à medida que mais pessoas começam a clamar pelos recursos que o VoIP traz para a mesa. E mesmo para sistema que não usarão VoIP, soluções como o Asterisk® SCF™ trazem recursos que antes custavam milhares de dólares como parte incluída do software. 

É claro que, com o dinheiro investido em hardware caro em sistemas tradicionais, é natural que as organizações com esses sistemas queiram obter o máximo de uso possível deles. Além disso, simplesmente trocar um sistema existente não é apenas caro (custos de fiação para telefones SIP, custos de substituição de aparelhos proprietários, etc.), mas pode ser invasivo para o Call Center, especialmente se ele operar continuamente.

Talvez, no entanto, tenha chegado a hora de expandir e o sistema existente não consiga mais acompanhar o número de linhas necessárias e o número de extensões necessários para acompanhar a demanda. Nesse caso, pode ser vantajoso olhar para um sistema híbrido, onde hardware existente continua a ser usado, mas novas extensões e recursos são adicionados ao sistema usando o  Asterisk® SCF™.

Sistemas Híbridos

Um sistema de telefonia híbrido (figura 22.2, "Sistema Híbrido Remoto) contém a mesma funcionalidade e hardware de um sistema de telefonia tradicional, com exceção de  outro sistema, como o Asterisk® SCF™, que está conectado a ele, fornecendo capacidade e funcionalidade adicionais. Adicionar o Asterisk® SCF™ a um sistema tradicional normalmente é feito através de uma conexão PRI (PSTN). Do ponto de vista do sistema tradicional, o Asterisk® SCF™ se parecerá com outra companhia telefônica (Escritório Central ou Operadora VoIP - ITSP, Internet Telephony Service Provider). Dependendo da forma como o sistema tradicional opera e dos serviços disponíveis para ou da ITSP, o Asterisk® SCF™ entregará chamadas do PRI (PSTN) através dele mesmo e para o PABX existente, ou o PABX existente enviará chamada pela conexão PRI para o Asterisk® SCF™, que em seguida, direciona as chamadas para os novos terminais (Telefones IPs) e para a própria ITSP, criando ai, uma Rota de Menor Custo (Least Cost Routing).  

Figura 22.2. Sistema Híbrido Remoto

Com o Asterisk® SCF™ no cenário (circuito), a funcionalidade pode ser movida aos poucos do sistema PABX existente para o Asterisk® SCF™, que pode assumir um papel maior e comandar mais do sistema ao longo do tempo. Eventualmente, o sistema de PABX existente pode simplesmente ser usado como um método para enviar chamadas para os aparelhos existentes (analógicos, POTS), nas estações dos agentes, com aqueles sendo eliminados ao longo do tempo e substituídos por telefones baseados em SIP, à medida que a fiação é instalada e os telefones IPs são comprados.

Ao adicionar o Asterisk® SCF™ ao circuito existente, ganhamos um novo conjunto de funcionalidades e vantagens, como:

  • Suporte para funcionários remotos: as chamadas são entregues pela conexão de Internet Existentes, para Gateways IPs, Telefones IPs, Softphones em Desktops, Tablets e até mesmo em Smartphones;
  • Funcionalidades como conferencia e correio de voz (com a possibilidade de os usuários serem notificados por e-mail de novas mensagens);
  • Linhas telefônicas expandidas usando VoIP e redução de custos de longa distancia (DDD e DDI)

Tal sistema ainda sofre de algumas desvantagens, pois todo o hardware precisa residir na instalação do Call Center, e ainda estamos restritos a usar hardware (relativamente) caro no sistema Asterisk® SCF™ para conexão ao PABX tradicional. No entanto, estamos indo na direção certa e, com o sistema Asterisk® SCF™ no circuito, podemos iniciar a migração ao longo do tempo, limitando as interrupções nos negócios e adotado uma abordagem mais gradual para treinar os usuários.

Asterisk® SCF™ Puro, Não Distribuído (Nondistributed)

O próximo passo em nossa jornada é o sistema Asterisk® SCF™ Puro (Puro que dizer, somente a linha de comando, se nenhuma interface gráfica, lembrando que a interface gráfica oficial do projeto Sangoma Digium é o FreePBX e não mais o AsteriskNow). Neste sistema, migramos com sucesso do sistema PBX existente e agora estamos lidando com todas as funcionalidades através do Asterisk® SCF™. Nosso PRI (PSTN) existente foi anexado ao Asterisk® SCF™ e expandimos nossa capacidade integrando um Provedor de Telefonia Pela Internet (ITSP) em nosso sistema. Todos os agentes/usuários agora estão usando telefones SIP (Telefones IP, e Softphones) e até adicionam0os vários funcionários remotos. Está topologia é ilustrada na Figura 22.3, "Asterisk® SCF™ Puro, Não Distribuído (Nondistributed)".

Figura 22.3. Asterisk® SCF™ Puro, Não Distribuído (Nondistributed)

Funcionários remotos podem ser uma grande vantagem para uma empresa. Permitir que seu trabalho em locais remotos (Home Office, P. Ex.) não apenas aumenta o moral dos funcionários, aliviando o fardo de uma viagem potencialmente longa, mas também permite que os funcionários trabalhem em um ambiente em que se sintam confortáveis, o que pode torná-los mais produtivos. Além disso, o gerente do Call Center não tem menos controle sobre as estatísticas dos funcionários; suas chamadas ainda podem ser monitoradas para fins de treinamento, e os dados estatísticos coletados não parecem diferentes para o gerente do que para os funcionários que residem na instalação.

Uma vantagem mensurável para a empresa é a redução na quantidade de hardware necessária a ser comprada para cada funcionário. Se os agentes puderem utilizar seus sistema de computador, redes elétricas e conexões de Internet existentes, a empresa poderá economizar uma quantia significativa de dinheiro apoiando funcionários remotos. Além disso, esses funcionários podem estar localizados em todo o mundo, para expandir o número de horas que seus agentes estão disponíveis, permitindo que você atenda a mais fusos horários. 

A utilização deste sistema é simples e eficiente, mas à medida que a empresa cresce, o sistema pode chagar a um problema de capacidade.

Integração do Asterisk® SCF™ Puro ao Banco de dados.

Integrar o  Asterisk® SCF com um banco de dados pode adicionar muitas funcionalidades ao seu sistema. Além disso, ele fornece uma maneira de construir utilitários de configuração baseados na WEB para facilitar a manutenção de um sistema Asterisk® SCF™. Além disso, permite acesso instantâneo a informações do Dialplan e outras partes do sistema do Asterisk® SCF™.

Banco de Dados Único

Adicionar integração de banco de dados ao Asterisk® SCF™ (Figura 22.4 "Integração de Banco de Dados ao Asterisk® SCF™, Banco de Dados Único") é uma maneira poderosa de obter acesso a informações que podem ser manipuladas por outros meios. Por exemplo, podemos ler informações sobre as extensões e dispositivos no sistema de um banco de dados usando a Arquitetura Realtime Asterisk - ARA, e podemos modificar as informações armazenadas no banco de dados por meio de um sistema externo, como uma pagina da Web (GUI Interface).  

A integração com o banco de dados adiciona uma camada entre o Asterisk® SCF™ e a Interface Web com a qual o Web Designer está familiarizado e permite a manipulação de dados de uma forma que não requer nenhum conjunto de habilidades adicionais. O conhecimento do próprio Asterisk® SCF™ é deixado  para o administrador do Asterisk® SCF™, e o desenvolvedor Web pode trabalhar alegremente com ferramentas com as quais está familiarizado.

Figura 22.4. Integração de Banco de Dados ao Asterisk® SCF™, Banco de Dados Único

Claro, isso torna o sistema Asterisk® SCF™ um pouco mais complexo de construir, mas a integração com um banco de dados via ODBC adiciona todos os tipos de possibilidades (como o hot-desking). O FUNC_ODBC é uma ferramenta poderosa para o administrador do Asterisk® SCF™, fornecendo a habilidade de construir um Dialplan estático usando dados de natureza dinâmica.

Também gostamos muito do módulo FUNC_CURL, que fornece  integração com serviços da Web sobre HTTP diretamente do Dialplan.

Com os dados abstraídos diretamente do Asterisk® SCF™ agora teremos mais facilidade para avançar em direção a um sistema que está se preparando para ser agrupado (Clustered). Podemos usar algo como Linux-HA (http://www.linux-ha.org/wiki/Main_Page) para fornecer failover automático entre os sistemas. Embora, no caso de uma falha as chamadas no sistema com falha sejam perdidas, o failover levará apenas alguns instantes (menos de um segundo) para ser detectado e o sistema aparecerá para seus usuários como imediatamente disponível novamente. Nesta configuração, como nossos dados são abstraídos fora do Asterisk® SCF™ podemos usar aplicativos como UNISON (https://www.cis.upenn.edu/~bcpierce/unison/) ou até mesmo o RSYNC para manter os arquivos de configuração sincronizados entre os Sistemas Operacionais e o Backup do Sistema. Também podemos usar o SubVersion ou o Git para rastrear alterações nos arquivos de configuração, facilitando a reversão de alterações que não funcionam. 

É claro que se nosso banco de dados desaparecer devido a uma falha do hardware ou do software, nosso sistema ficará indisponível a menos que seja programado de forma a poder funcionar sem a conexão com o banco de dados. Isso pode ser feito por meio do uso de um banco de dados local que simplesmente se atualiza periodicamente a partir do banco de dados primário, ou por meio de informações programadas diretamente no Dialplan. Na maioria dos casos, a funcionalidade do sistema neste modo será mais simples do que quando o banco de dados estava disponível, mas pelo menos o sistema não ficará totalmente inutilizável.

Uma solução melhor seria usar um banco de dados replicado, que permite que os dados gravados em um servidor de banco de dados sejam gravados em outro servidor ao mesmo tempo. O Asterisk® SCF™ pode então fazer o failover para o  outro banco de dados automaticamente se o servidor primário ficar indisponível.

Banco de Dados Replicados

O uso de um banco de dados replicado fornece alguma redundância no back-end para ajudar a limitar a quantidade de tempo de inatividade que os chamadores e os agentes experimentam se ocorrer uma falha no banco de dados. Uma configuração de banco de dados Mestre-Mestre é necessária para que os dados possam ser gravados em qualquer banco de dados e replicados automaticamente para o outro sistema, garantindo que tenhamos uma cópia exata dos dados em duas máquinas físicas. Outra vantagem dessa abordagem é que um único sistema não precisa mais lidar com todas as transações do bando de dados; a carga pode ser dividida entre os servidores. A Figura 22.5 "Integração de Banco de Dados do Asterisk® SCF™ com Banco de Dados Distribuído" ilustra esse cenário recomendado.

Figura 22.5  Integração de Banco de Dados do Asterisk® SCF™ com Banco de Dados Distribuído

Já utilizamos em nossos cenários a replicação Mestre-Mestre do MySQL antes (agora usamos o PostgreSQL) e funciona muito bem. Não realizamos o mesmo cenário com MariaDB, logo não temos como assegurar o comportamento. Também quero dizer que não é difícil de configurar, e existem vários tutoriais na Internet. Outros sistemas de banco de dados provavelmente também conterão essa funcionalidade, especialmente se você estiver usando um sistema comercial com o Oracle ou MS SQL.

Failover pode ser feito nativamente no Asterisk® SCF™, pois res_odbc.so e func_odbc.so contêm opções de configuração que permitem especificar vários bancos de dados. Em res_odbc.so, você pode especificar a ordem preferencial para conexões de banco de dados em caso de falha. Em fun_odbc.so, você pode até especificar servidores diferentes para ler e gravar dados por meio de funções no Dialplan que você cria. Toda essa flexibilidade permite que você forneça um sistema que funcione bem para o seu negócio.

Programas externos também podem ser usados para controlar o Failover entre sistemas. O aplicativo PEN (http://siag.nu/pen/) é um balanceador de carga para aplicativos TCP simples, como HTTP ou SMTP, que permite que vários servidores apareçam como um. Isso significa que o Asterisk® SCF™ só precisa ser configurado para se conectar a um único endereço IP (ou hostname); o aplicativo PEN cuidará de controlar qual servidor será uasdo para cada solicitação.

Asterisk® SCF™ Puro e Estados de Dispositivos Distribuído

Os estados do dispositivo no Asterisk® SCF™ são importantes tanto do ponto de vista do software (o Asterisk® SCF™ pode precisar saber o estado de um dispositivo ou da linha em um dispositivo para saber se uma chamada pode ser feita para ele) quanto do ponto de vista do usuário (P. Ex., uma luz (BFL/HINT) pode ser ligada ou desligada para indicar se uma determinada linha esta em uso ou se um agente está disponível para mais chamadas). Do ponto de vista de uma fila, é extremamente importante saber o status do dispositivo que um agente está usando para determinar se o próximo chamador da fila pode ser distribuído para esse agente. Sem o conhec9imento do estado do dispositivo, a fila simplesmente faria varias chamadas para o mesmo endpoint.

Depois de começar a expandir seu sistema único em vários servidores (potencialmente em vários locais físicos, como escritórios remotos ou satélites), você precisará distribuir o estado do dispositivo dos terminais entre os sistemas. O tipo de implementação necessária dependerá se você os está distribuindo entre sistema na mesma LAN (links de baixa latência) ou em uma WAN (links de alta latência). 

Bem, vamos discutir os dois métodos de distribuição de estado dos dispositivos na sequencia: OpenAIS para links de baixa latência e XMPP para links de alta latência.

Distribuindo Estados de Dispositivos em uma LAN

A implementação do OpenAIS (Using OpenAIS) foi adicionada pela primeira vez ao Asterisk na branch 1.6.1, para permitir a distribuição de informações de estado do dispositivo entre servidores. A adição do OpenAIS forneceu grandes possibilidades para sistemas distribuídos, pois a consciência do estado do dispositivo é um aspecto importante de tais sistemas. Os métodos anteriores exigiram o uso de GROUP( ) e GROUP_CONT( ) para cada canal, com essa informação consultada por DUNDi®. Embora essa abordagem seja útil em alguns cenários (podemos usar essa funcionalidade para pesquisar o número de chamadas que nossos sistemas estão processando e direcionar chamadas de forma inteligente para sistemas que lidam com menos chamadas), como um mecanismo para determinar as informações de estado do dispositivo, se está presente ou não.

Figura 22.6. Distribuição de Estado do Dispositivo com OpenAIS

O OpenAIS nos deu a primeira implementação de um sistema que permite que o estado dos dispositivos e as indicações de mensagens em espera sejam distribuídos entre vários sistemas Asterisk® SCF™ (veja a Figura 22.6, "Distribuição de Estado de Dispositivo com OpenAIS"). A desvantagem da implementação do OpenAIS é que ela exige que todos os sistemas residam em links de baixa latência, o que normalmente significa que todos precisam residir no mesmo local físico, conectados ao mesmo switch. Dito isso, embora a biblioteca OpenAIS não funcione em redes fisicamente separadas, ela permite que um Queue( ) resida em um Servidor Asterisk® SCF™ e seus membros da fila residam em outro Servidor Asterisk® SCF (ou vários Servidores Asterisk® SCF). Ele faz isso sem exigir que usemos canais locais e testemos sua disponibilidade por meio de outros métodos, limitando (ou eliminando) o número de tentativas de conexão feitas na rede e o toque de vários dispositivos.

O uso do OpenAIS tem uma vantagem, pois é relativamente fácil de configurar e começar a trabalhar. A desvantagem é que não é distribuível em locais físicos. A partir da branch 1.8, porém, podemos usar o XMPP para Distribuição de Estado do Dispositivo em uma rede de longa distância, como você verá na próxima seção.

Distribuindo Estados de Dispositivos em uma WAN

Desde a branch 1.8 do Asterisk® SCF™, foi adicionado uma implementação que usa XMPP para distribuição de estado do dispositivo. Como o protocolo XMPP é projetado para (ou pelo menos permite) uso em redes de longa distância, agora podemos ter sistemas Asterisk® SCF™ em diferentes locais físicos, distribuindo informações de estado do dispositivo entre si (veja a Figura 22.7, "Distribuindo Estados de Dispositivos com XMPP"). Com a implementação do OpenAIS, a biblioteca seria usada em cada sistema, permitindo que eles distribuíssem informações de estado do dispositivo. No cenário XMPP, um servidor central (ou cluster de servidores) é usado para distribuir o estado entre todas os Servidores Asterisk® SCF™ no cluster. Atualmente, a melhor aplicação para fazer isso é o Servidor Tigase XMPP (https://tigase.net/), devido ao suporte a eventos PubSub. Embora outros servidores XMPP possam ser suportados no futuro, apenas o Tigase é conhecido por funcionar no momento.  

Figura 22.7, Distribuindo Estados de Dispositivos com XMPP

Com o XMPP, as filas podem ser localizadas em diferentes locais físicos e os escritórios satélites podem receber chamadas do escritório principal ou vice-versa. Isso fornece outra camada de redundância, porque se o site principal ficar offline e o ITSP for configurado de forma a fazer failover para outro escritório, as chamadas poderão ser distribuídas entre esses escritórios satélites até que o site principal volte a ficar online. Isso é bastante empolgante para muitas pessoas, pois adiciona uma camada de funcionalidade que não estava disponível anteriormente e a maior parte pode ser feita com uma configuração relativamente mínima.

A vantagem da distribuição de estado do dispositivo com XMPP (Using XMPP), é que, é possível distribuir o estado para vários locais físicos, o que não é possível com o OpenAIS. A desvantagem é que é mais complexo de configurar (já que você precisa de um serviço externo rodando o servidor Tigase XMPP ou alternativo) do que a implementação do OpenAIS.

Múltiplas Filas, Múltiplos Sites

Agora, vamos ser criativos e usar as várias ferramentas que discutimos nas seções anteriores para criar uma infraestrutura de fila distribuída. A Figura 22.8, " Infraestrutura de Filas Distribuídas" ilustra um exemplo de configuração onde temos cinco servidores Asterisk® SCF™ sendo liderados por outro cluster usado para distribuir/rotear as chamadas para as várias filas que configuramos. Nosso ITSP envia chamadas para o clouster de roteamento (que pode ser algo como Kamailio®, ou mesmo vários servidores Asterisk® SCF™ implementando DUNDi® ou algum outro método para rotear e distribuir chamadas, P. Ex. FreeSWITCH®), que então envia as chamadas conforme apropriado para um dos três Servidores Asterisk® SCF™ nos quais temos nossas filas configuradas. Cada servidor lida com uma fila diferente, como vendas, suporte, técnico e devoluções (apenas exemplos). Esses servidores, por sua vez, usam os agentes localizados em dois locais físicos separados. os dispositivos dos agentes são registrados em seus próprios servidores de registro local (que também podem realizar outras funcionalidades).

Veja, estamos mostrando todos os aspectos do sistema para manter o diagrama simples, mas neste caso usaríamos o sistema de estado de dispositivo distribuído XMPP, pois estamos sugerindo que os agentes são distribuídos em vários sites físicos.

Figura 22.8, Infraestrutura de Filas Distribuídas

Todos os agentes nos diferentes locais podem ser carregados em uma ou mais filas e, como estamos distribuindo informações de estado do dispositivo, cada fila saberá o estado atual dos agentes na fila e distribuirá apenas os chamadores aos agentes conforme apropriado. Além disso, podemos configurar penalidades para filas e/ou para os agentes para que os chamadores cheguem aos melhores agentes se estiverem disponíveis, e só usar os outros agentes quando todos os melhores agentes estiverem em uso.

Podemos adicionar mais agentes ao sistema adicionando mais servidores ao cluster no mesmo local ou em locais físico adicionais. Também podemos expandir o número de filas  que suportamos adicionando mais servidores, cada um lidando com uma fila ou filas diferentes. 

Uma desvantagem de usar este sistema é a forma como o aplicativo Queue( ) foi desenvolvido. Queue( ) é uma das aplicações mais antigas do Asterisk® SCF™, e infelizmente não acompanhou o ritmo de desenvolvimento no domínio da distribuição de estado do dispositivo, então não há como distribuir o mesmo Queue( ) em vários servidores. P. Ex. suponha que você tenha filas de vendas em dois servidores. Se um chamador entra na fila de vendas do primeiro servidor Asterisk® SCF™ , e então outro chamador entra na fila de vendas do segundo servidor Asterisk® SCF™, nenhuma informação será distribuída entre essas filas para indicar quem é o primeiro e quem é o segundo na fila de vendas. As duas filas são efetivamente separadas e não se conhecem a nível de sistemas. Talvez versões futuras do Asterisk® SCF™  tenham a capacidade  de fazer isso, mas no momento não há suporte. Mencionamos isso para que você possa planejar seu sistema de acordo com essas limitações.

Como as filas em algumas implementações (como em Call Centers) podem ser necessárias para lidar com muitas chamadas de uma só vez, os requisitos de processamento e carga para um único servidor podem ser bastante altos. Ter a capacidade de acessar os mesmo recursos de agentes em vários servidores significa que podemos distribuir nossos chamadores entre vários servidores, reduzindo significativamente os requisitos de processamento colocados em um único sistema. Um sistema não precisa mais fazer tudo - podemos dividir vários componentes do sistema em diferentes servidores.

Um ótimo recurso para ser utilizado entre os vários servidores Asterisk® SCF™ é um Peering IAX2 mantendo assim a qualidade da chamada, bem como a distribuição das mesmas sem o uso de muito recursos. E deixando assim  SIP somente para os usuários/devices/endpoint e ITSP.

Conclusão

Neste capitulo, foi explorado como você pode fazer a transição de um sistema de telefonia tradicional (não Asterisk® SCF™, ou não Softswitch PBX IP) para um Call Center distribuído. Ao logo do caminho, vimos como um Call Center com apenas algumas posições pode ser transformar em um sistema com centenas de posições em diferente locais físicos.

Embora a capacidade de expandir seus negócios e planejar o futuro seja crucial, também é importante não criar um sistema mais complexo do que o necessário. Quanto maior você for e quanto mais distribuído for um sistema que você construir, mais tempo levara para decolar e mais difícil será fazer todas as coisas que são importantes quando ocorrerem mudanças, como testar implementar as mudanças, e manter as coisas sincronizadas. Se o seu sistema nunca vai crescer além de um Call Center de 40 posições, não construa um para 500 posições. Tudo o que vc está fazendo é adicionar custos e complexidade adicionais para acomodar um sistema em uma escala que pode nunca ser totalmente realizada.

Construir um sistema simples agora e planejar para o futuro e como você vai chegar lá (especialmente se você puder fazer isso em iterações, sem ter que destruir toda a sua infraestrutura ou começar do zero) vai te colocar em funcionamento tanto mais rápido. À medida que você cresce, você pode adicionar mais peças, determinar se a abordagem que vc está adotando está correta e, se não , voltar e retrabalhar essa peça em particular. Esse tipo de abordagem pode poupar muitas dores de cabeça no futuro, quando vc percebe que não precisa refazer todo o seu sistema complexo por causa de algum novo requisito que você não previu no inicio.

Também mencionamos algumas vantagens de ter um sistema distribuído com funcionários remotos, como melhorar a moral dos funcionários e redução de custos. Você pode usar as conexões de Internet, hardware e eletricidade existentes de seus funcionários, o que pode economizar dinheiro para a empresa, e seus funcionários se beneficiarão evitando o agravamento e os custos de se deslocar para um escritório todos os dias. Embora nem todas as situações permitam esse tipo de cenário, vale a pena explorar se adicionar suporte para funcionários remotos será útil para o seu negocio.

Finalmente, o estado do dispositivo distribuído pode abrir um mundo de possibilidades para sua empresa, permitindo que ela cresça além do único sistema Asterisk que faz tudo. A divisão da funcionalidade em vários servidores agora é uma realidade e pode ser abordada com uma medida de confiança nunca vista anteriormente.

Fonte: Asterisk: The Definitive Guide (3nd Edition for Asterisk 1.8), escrito por Leif Madsen, Jim Van Meggelen, e Russell Bryant. (Capitulo 22).













 


terça-feira, 1 de fevereiro de 2022

Channel PJSIP < == > Channel SIP (Configurando um Tronco IP)

Fonte: https://iplinktelecom.com/

Este guia irá ajuda-lo a realizar a configuração de um Tronco IP entre dois servidores Asterisk® SCF™, utilizando canais diferentes em relação ao protocolo SIP, afinal não importa se é CHANNEL SIP (modulo chan_sip.so) ou CHANNEL PJSIP (modulo chan_pjsip.so), o protocolo é único, SIP 2.0, ainda com a RFC 3261.

E claro que unificar ambas tecnologias não é uma tarefa facil, o recomendado é que você ABANDONE o modulo chan_sip.so. E passe a usar unicamente o modulo chan_pjsip.so. Mas como existes ainda muitas empresas que fazem uso do modulo chan_sip.so, vamos encontrar na planta de Telefonia IP (ToIP) a necessidade de criar um trunk entre as duas tecnologias (tecnologias não protocolo!).

Asterisk® SCF™ é uma estrutura de código aberto para a construção de aplicativos de comunicação. O Asterisk® SCF™ transforma um computador comum em um servidor de comunicação. O Asterisk® SCF™ lhe permite implementar sistemas em telecomunicações, como Softswitch PBX IP, Gateways POTS, ISDN, GSM, Servidores de Conferência e outras soluções personalizadas que depende exclusivamente do seu conhecimento sobre o Asterisk® SCF™. É usado por pequenas empresas e grande empresas, Call Centers, Operadoras e Agências Governamentais, em todo o mundo.

Existem dois métodos padrão para conectar um Softswitch PBX IP, baseado em Asterisk® SCF™ entre si: 

  • CHANNEL SIP, para usar o mesmo PROTOCOLO de Iniciação de Sessão (SIP) padrão usado para conectar telefones que fazem uso do PROTOCOLO SIP.
  • CHANNEL PJSIP, para usar a pilha de PROTOCOLOS Open Source Embedded SIP, que passou a ser padrão, usado para conectar telefones que fazem uso do PROTOCOLO SIP.
Muito importante lembrar que o correto para fazer um tronco entre dois servidores Asterisk® SCF™ é fazendo uso do PROTOLOCO IAX que se encontra também na versão 2.0. Aqui tem um post sobre isso

Para mais documentação do Asterisk® SCF™, veja:
  • http://www.asteriskdocs.org é um livro HTML gratuito (o livro impresso correspondente é publicado convencionalmente pela O'Reilly em Inglês e pela Novatec em Português).
  • http://www.asterisk.org é o site do Asterisk® SCF™, operado pela Digium® uma empresa do grupo Sangoma®.

.Instruções para configurar um tronco entre dois servidores Asterisk® SCF™, a seguir vamos ver:
  • Configurar um tronco SIP utilizando PJSIP_WIZARD;
  • Configurar o servidor para fazer e receber chamadas entre eles;
  • Concluindo a configuração básica do PJSIP;
  • Configurar o Dialplan.

Pré-requisitos:
  • Um servidor com Asterisk fazendo uso do modulo chan_sip.so;
  • Um servidor com Asterisk fazendo uso do modulo chan_pjsip.so;
  • Rede totalmente funcional entre os servidores.
1 - Segue as configurações para o servidor fazendo uso do modulo chan_sip.so:

OBS: Algumas configurações são recomendadas, ou seja não são obrigatórias.

Edite o arquivo sip.conf:

[general]
dtmfmode=rfc2833
notifyringing=yes
context=from-pstn
srvlookup=yes
disallow=all
rtptimeout=60
useragent=PBX IP
qualify=100000
nat=yes
maxexpirey=1800
defaultexpirey=1800
tcpenable=yes
#include "sip_custom.conf"
register => srvchansip:srv12345@172.31.31.2:5060/94455

[94455]
type=friend
allow=ulaw
allow=alaw
allow=g729
allow=gsm
dtmfmode=rfc2833
call-limit=60
defaultuser=srvchansip
fromuser=srvchansip
fromdomain=172.31.31.1
qualify=yes
port=5060
secret=srv12345
insecure=port,invite
host=172.31.31.1
context=from-itx-srvchanpjsip
transport=udp

2 - Segue as configurações para o servidor fazendo uso do modulo chan_sip.so:

Edite o arquivo pjsip_wizard.conf:

[trunk_defaults] 
type = wizard 

[srvchansip] 
endpoint/transport = 0.0.0.0-udp 
endpoint/allow = !all,ulaw,alaw,G729,G722 
endpoint/rewrite_contact = yes 
endpoint/dtmf_mode = rfc4733 
endpoint/context = from-pstn 
endpoint/force_rport = yes 
aor/qualify_frequency = 60 
sends_auth = no 
sends_registrations = no 
remote_hosts = 172.31.31.1:5060

OBS: para que esta configuração funcione, o modulo res_pjsip_config_wizard.so deve estar instalado e carregado. Este modulo está disponível desde o 
Asterisk® SCF™ 13.2.


3 - Configurando o Asterisk® SCF™ para fazer e receber chamadas:

Você precisará modificar o arquivo /etc/asterisk/pjsip_wizard.conf para adicionar as configurações globais para as extensões que utilizaremos em nossa POC (Proof Of Concept).

Neste exemplo, estamos configurando uma extensão 95566 para fazer e aceitar chamadas. Os parâmetros que fazem referência a 95566 e senha podem ser personalizados para seus requisitos e mapeados para os seguintes campos:
 
[defaults_user](!)
type = wizard 
accepts_registrations = yes 
sends_registrations = no 
accepts_auth = yes 
sends_auth = no 
endpoint/context = from-internal 
endpoint/allow = !all,ulaw,alaw,G729,G722 
endpoint/dtmf_mode = rfc4733 
endpoint/rewrite_contact = yes 
endpoint/force_rport = yes 
aor/max_contacts = 1 
aor/remove_existing = yes 
aor/minimum_expiration = 30 

95566
endpoint/callerid = Peter Parker <95566> 
inbound_auth/username = P3t35P4k35$
inbound_auth/password = P3t35P4k35$


Depois que temos o modelo "(!)", configurar um novo endpoint geralmente é tão simples quanto configurar um nome de usuário/senha, pois o objeto endpoint herda do modelo "(!)" criado em pjsip_wizard. Você nem precisará especificar um tipo. Veja os seguintes exemplos:

 
[Parker](user_defaults) 
hint_exten = 95566
endpoint/callerid = Peter Parker <95566>
inbound_auth/username = P3t35P4k35$
inbound_auth/password = P3t35P4k35$

[Diana](user_defaults) 
hint_exten = 95567
endpoint/callerid = Diana de Themyscira <95567>
endpoint/allow = !all,ulaw
inbound_auth/username = D14N4
inbound_auth/password = D14N4
;has_phoneprov = yes ;--> Padrão é não
;phoneprov/MAC = 00:1B:C9:4B:E3:57 ;--> deve especificar se has_phoneprov=yes;
;phoneprov/PROFILE = profile1 ;--> deve especificar se has_phoneprov=yes



4 - Concluindo a configuração básica do PJSIP:

Embora o pjsip_wizard.conf seja um grande facilitador na configuração endpoints PJSIP, configurações globais ou qualquer outra coisa que possa ser necessaria, ainda deve ser realizado e mesmo adicionado (muitas vezes necessario) em /etc/asterisk/pjsip.conf. No escopo de nossa configuração básica, adicione as linhas abaixo ao pjsip.conf para endpoints que estejam atras de NAT.


[global] 
type = global
user_agent = PBX IP
 
[transport-udp-nat] 
type = transport 
protocol = udp 
bind = 0.0.0.0:5060 
local_net = X.X.X.X/24 
external_media_address = X.X.X.X 
external_signaling_address = X.X.X.X 
allow_reload = no

  • Caso o Softswitch PBX IP não esteja em uma rede NAT, você pode remover com segurança (ou comentar) os seguintes parâmetros: external_media_address e external_signaling_address.
  • Com as configurações acima adicionadas aos respectivos arquivos, seu Softswitch PBX IP fazendo uso do modulo chan_pjsip.so, agora deve estar registrado no outro Softswitch PBX IP fazendo uso do modulo chan_sip.so, e o endpoint 94455 em seu telefone IP/Softphone deve estar registrado no seu Softswitch PBX IP que faz uso do modulo chan_pjsip.so.
5Configurar o Dialplan:

Asterisk® SCF™ faz uso dos Dialplans desenvolvidos em /etc/asterisk/extensions.conf, ou extensions.ael, e extensions.lua, para rotear chamadas entre endpoints, e realizar outras tarefas. Para permitir que nosso endpoint 994455 chame os usuários do outro Softswitch PBX IP que usa o modulo chan_sip.so, bem como para enviar quaisquer chamada que chegue ao DID atribuído ao respectivo troco, você precisa abrir extension.conf e adicionar as seguintes linhas de código:

[from-pstn] 
exten => _+55XXXXXXXXXXX,1,Dial(PJSIP/94455) 
exten => _XX9XXXXXXXX,1,Dial(PJSIP/94455) 

[from-internal] 
exten = _119XXXXXXXX,1,Dial(PJSIP/${EXTEN}@srvchansip) 
same = n,Hangup() 

exten = _X.,1,Dial(PJSIP/${EXTEN}@srvchansip) 
same = n,Hangup()

  • [from-pstn] - serve para encaminhar chamadas para a Rede Pública de Telefonia Comutada - RPTC (do inglês - Public Switched Telephone Network ou PSTN), proveniente do Softswitch PBX IP (modulo chan_sip.so) e as envia para o endpoint 94455. O bloco de código [from-pstn] capturará todas as chamadas para CLDs nacional padrão telefonia móvel (11 9 44 55 66 77) e enviara para o endpoint 94455.
  • [from-internal] - serve para encaminhar chamadas para a RPTC/PSTN através do Softswitch PBX IP (modulo chan_pjsip.so). O bloco [from-internal] capturará chamadas para números nacional padrão telefonia móvel e encaminhara para o Softswitch PBX IP (modulo chan_sip.so).
IMPORTANTE! Se você quiser fazer seu tronco baseado em TECH PREFIX para autenticar, isso deve ser implementado no Dialplan.

Por exemplo, se você configurou o TEC PREFIX para "9999" no Softswitch PBX IP (modulo chan_sip.so), seu bloco [from-internal] deve ficar assim:

[from-internal] 
exten = _119XXXXXXXX,1,Dial(PJSIP/9999${EXTEN}@srvchansip) 
same = n,Hangup() 

exten = _X.,1,Dial(PJSIP/9999${EXTEN}@srvchansip) 
same = n,Hangup()

É isso! Você concluiu a configuração dos servidores baseados em Asterisk® SCF™ e agora pode fazer e receber chamadas entre eles.