quarta-feira, 10 de outubro de 2018

Asterisk 16 já está disponível: Nós testamos e adoramos!

                     Figura 01: Fonte - Marketing Sangoma, site oficial.

Aproveitando o evento Astricon, a versão 16.0.0 do Asterisk foi publicada entre um grande número de seguidores, usuários e desenvolvedores, uma versão que estamos esperando há muito tempo, já que as versões Asterisk 14 e Asterisk 15 eram ambas versões Standard (veja figura 02). Muitos desenvolvedores e usuários estão esperando por uma versão LTS há mais de 3 anos.

Figura 02: Fonte: Sangoma Asterisk Version

Na Astricon de 2014 foi anunciada a última versão do LTS: Asterisk 13 e desde então choveu muito. Naquela época, o PJSIP foi oficialmente publicado em uma versão LTS (em um Asterisk orientado para produção/certified) e os primeiros traços de uma nova interface chamada ARI (Asterisk Rest Interface), mas que ainda estava um pouco em sua infância. Por essa razão, esperávamos que a próxima versão LTS incorporasse esses novos recursos muito mais estabilizados e orientados para ambientes de produção/certified, por isso, quando soubemos que o Asterisk 15 não seria uma versão LTS, muitos de nós mantiveram o mel em nossos lábios sabendo que teríamos que esperar pelo menos mais um ano para aprender e apreciar a gentileza que temos lido e ouvido por tanto tempo.

Após a compra da Digium pela Sangoma, muitos usuários estavam ansiosos para participar da Astricon e ver o que poderia mudar, então a razão para participar da Astricon não é mais apenas para ver as notícias em que a equipe de desenvolvimento do Asterisk estava trabalhando, se não também para ver a atmosfera exultante por parte da Sangoma para ser, pela primeira vez, o organizadora de um evento conhecido mundialmente como o Astricon.

Deixando de lado os motivos do negócio, ele vinha seguindo a versão do Asterisk 16 há algum tempo e esperava que, mais cedo ou mais tarde, aparecesse disponível. Depois de ver a data em que lançaram as versões RC (Release Candidate) ficou claro que eles aproveitariam o evento Astricon para anunciar a versão do Asterisk 16.0.0 e ser capaz de celebrá-lo com todos os desenvolvedores, e este tem sido o caso.

As mudanças mais importantes da nova versão? A primeira coisa que fizemos foi baixá-lo e ver o que há de novo! E aqui vai...

PJSIP: No Asterisk 13, o PJSIP já era funcional, embora seja verdade que, para algumas coisas, eles ainda não tinham documentação suficiente e você tinha que ir ao código-fonte para entender o que eles estavam fazendo e por quê. Apenas nas versões mais recentes do Asterisk 13 adicionarão alguns recursos que não estavam bem nas primeiras versões e essa foi uma das primeiras razões pelas quais esperávamos que o Asterisk 16 aparecesse o mais rápido possível.

WebRTC: O Asterisk 14 e o Asterisk 15 quase nasceram com uma ideia em mente: oferecer suporte ao WebRTC para o Asterisk, portanto, no Asterisk 16, o suporte do WebRTC deve estar praticamente pronto. Infelizmente, o WebRTC não é tão simples quanto um "enable = yes", então vou ter que investigar como fazê-lo funcionar. Felizmente, o pessoal da Digium e muitos outros têm muita documentação sobre como trabalhar com o WebRTC e com o Asterisk.

Melhorias nas mensagens de texto - IM: Embora pareça estranho, o famoso "ConfBridge" para criar salas de conferência agora o mesmo dará suporte a texto, permitindo que os participantes enviem textos e sejam recebidos por todos os participantes da conferência.

Grande melhoria em termos de Videoconferência: o Asterisk 15 introduziu um grande número de melhorias em termos de videoconferência e multi videoconferências, então o Asterisk atuaria como um hub de streams de vídeo para que um participante de um vídeo ConfBridge pudesse selecionar quem quer ver mas a coisa mais importante é que o núcleo do Asterisk suportará melhor os fluxos de vídeo, fornecendo melhor desempenho em casos de multi videoconferência (usando, por exemplo, o WebRTC).

Adeus às Macros: Nem tudo vai ser adicionado ... também há coisas que vão embora, como o uso de Macros, que no Asterisk 13 já estava obsoleto e no Asterisk 16 está praticamente desativado por padrão. Muitos dialplan são baseados em Macros, então a transição para este novo sistema Dialplan exigirá uma revisão muito profunda.

Gerenciamento de chamadas SIP aprimorado: O Asterisk 16 também melhorará o desempenho do gerenciamento de chamadas, o que implicará em uma redução no consumo: processador e memória, o que será muito apreciado em sistemas com alto volume de chamadas, especialmente ao trabalhar com o PJSIP.

Tudo isso junta mesmo o melhor de todas as versões. Novas opções, novas adições, novos recursos, mais estabilidade, menos bugs e, claro, algo que, embora possa parecer bobo, eu adoro, que é, finalmente, ter uma versão estável (LTS) do Asterisk com um número par! Algo ao qual estamos acostumado com as versões do kernel do Linux. E confesso que sempre achei estranho ver que as versões "LTS" do Asterisk eram impares!

Na ausência de poder estar no Astricon e poder desfrutar deste grande evento, não poderíamos receber esta nova versão de outra forma senão instalá-lo e ver que realmente funciona assim, ao contrário de muitas outras formas, fizemos a instalação a partir do zero do Asterisk 16.0.0 e encontramos algumas mudanças que, felizmente, foram fáceis de resolver.

Tivemos problemas com a versão do Asterisk 16.0.0 no CentOS 7, Ubuntu 15, 16, 17 e 18 server. Mas é ótimo ver que com um Debian 8 (Jessie) você pode instalar o Asterisk 16 de boas! (infelizmente as versões do Asterisk estão mais associadas às versões do Linux do que gostaríamos).

Analisamos alguns aplicativos comuns que usamos todos os dias e vimos novas opções, novas melhorias e mudanças que envolvem correções de bugs ou melhorias de desempenho. Mais opções implicam mais possibilidades, então o Asterisk 16 pode ser a melhor versão do Asterisk LTS até agora!

Agora só temos que continuar verificando o que há de novo e ver o quanto queremos mudar nossas versões antigas do Asterisk 11 LTS e do Asterisk 13 LTS para este novo sistema, então, o que acha de você baixar essa versão fantástica, fazer seus testes e nos dizer o que você pensa?

      Figura 03: Fonte - Asterisk 16 & FreePBX 15 Now Available


quinta-feira, 7 de junho de 2018

Asterisk Versão Certificada

O Asterisk versão certificada é uma filial do Asterisk suportada pela Digium para clientes SLA comerciais com direito a certas ofertas de suporte. Como outros ramos do Asterisk, ele é fornecido sob licença GPLv2 e pode ser usado livremente por qualquer pessoa, até mesmo usuários e outros clientes que não sejam clientes SLA da Digium.

As liberações são feitas em intervalos maiores, entre 2 e 4 vezes por ano, em oposição ao ciclo de uma vez por mês dos lançamentos principais do Asterisk; e têm curadoria para minimizar a mudança e oferecer suporte a janelas de garantia de qualidade mais longas. Isso permite que os clientes de SLA minimizem a incerteza de aceitar atualizações de código grandes ou frequentes. Cada release do Asterisk certificado começa como um lançamento de ponto principal do Asterisk selecionado, que passa por um processo de teste interno rigoroso e estendido. Na conclusão do processo de teste, uma nova liberação é feita e os clientes de SLA podem começar a receber suporte, conforme determinado pelos contratos de suporte, nessa liberação.

Lançamentos de Asterisk certificado são feitos contra a base de código atual do Asterisk LTS, atualmente 13, não contra versões Standard do Asterisk, por exemplo. 10 ou 12, e representam um instantâneo da versão principal do Asterisk LTS, ramificado e mantido com correções de erros do cliente SLA. Cada versão é versionada de acordo com: asterisk-MainlineBranchPoint-certX, por ex. asterisk-13.1-cert2, em que MainlineBranchPoint indica o ponto de liberação do Asterisk no qual ocorreu a ramificação e X representa a versão de correção da correção de bugs de uma versão específica do Asterisk certificado. Versões de correção de bugs do Asterisk certificado são feitas para a duração dos contratos de suporte ao cliente; e, após 1.8, novas versões do Asterisk certificado foram feitas contra as versões 11 e 13 LTS do Asterisk. Essa programação fornece aos clientes a flexibilidade de migrar de um release para outro, com suporte sobreposto entre as principais versões do Asterisk certificado.


domingo, 6 de maio de 2018

ARA - Como armazenar corretamente os dados de uma chamada.


CDR (Call Data Redord) contém informaões sobre todas as chamadas que o Asterisk tratou, incluindo aquelas que falharam. Para a manutenção de sistemas de telefonia, uma das mais importantes fontes de informação sobre mau funcionamento, e para iniciar o diagnostico para responder sobre o mau funcionamento é sem via de duvidas o CDR!

No artigo de hoje vou estar respondendo a varias  perguntas que me é feita em comunidades pelo Telegram, bate papos casuais e principalmente em sala de aula. Vou estar discutindo aqui como é o procedimento no meu ver, correto para guardar o CDR do Asterisk no Bando de Dados MySQL! Uma vez com o CDR em um Bando de Dados, poderemos visualizá-los posteriormente por meio de uma interface Web. Como vamos estar falando sobre armazenamento de dados mais detalhado, eu suponho que você tenha conhecimento de ARA (Asterisk Realtime Architecture). Para que você possa aproveitar este artigo você já deve ter uma Appliance rodando com MySQL, Asterisk, Apache2, PHP e phpMyAdmin. Como todos sabem sou fá de carteirinha do Debian, e estou escrevendo este artigo sobre Debian 9 Stretch e Asterisk 13.1.

Para ficar claro o entendimento eu vou estar usando o nome do projeto do Asterisk, asteriskcdrdb, mas você fique a vontade para depois de entender como é a logica do CDR adaptar ao seu Bando de Dados.

1 - Crie um banco de dados com a estrutura:


001SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
002SET time_zone = "+00:00";
003
004/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
005/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
006/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
007/*!40101 SET NAMES utf8 */;
008
009--
010-- Banco de Dados: `asteriskcdrdb`
011--
012CREATE DATABASE IF NOT EXISTS `asteriskcdrdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
013USE `asteriskcdrdb`;
014
015-- --------------------------------------------------------
016
017--
018-- Estrutura da tabela `cdr`
019--
020
021DROP TABLE IF EXISTS `cdr`;
022CREATE TABLE IF NOT EXISTS `cdr` (
023`id` int(10) NOT NULL,
024  `calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
025  `clid` varchar(80) NOT NULL DEFAULT '',
026  `src` varchar(80) NOT NULL DEFAULT '',
027  `realsrc` varchar(80) NOT NULL,
028  `dst` varchar(80) NOT NULL DEFAULT '',
029  `realdst` varchar(80) NOT NULL DEFAULT '',
030  `dcontext` varchar(80) NOT NULL DEFAULT '',
031  `channel` varchar(80) NOT NULL DEFAULT '',
032  `dstchannel` varchar(80) NOT NULL DEFAULT '',
033  `lastapp` varchar(80) NOT NULL DEFAULT '',
034  `lastdata` varchar(80) NOT NULL DEFAULT '',
035  `duration` int(11) NOT NULL DEFAULT '0',
036  `billsec` int(11) NOT NULL DEFAULT '0',
037  `disposition` varchar(45) NOT NULL DEFAULT '',
038  `amaflags` int(11) NOT NULL DEFAULT '0',
039  `remoteip` varchar(60) NOT NULL DEFAULT '',
040  `accountcode` varchar(20) NOT NULL DEFAULT '',
041  `hangupcause` varchar(50) NOT NULL,
042  `peerip` varchar(50) NOT NULL,
043  `recvip` varchar(50) NOT NULL,
044  `useragent` varchar(50) NOT NULL,
045  `uri` varchar(50) NOT NULL,
046  `fromuri` varchar(50) NOT NULL,
047  `peeraccount` varchar(20) NOT NULL DEFAULT '',
048  `uniqueid` varchar(32) NOT NULL DEFAULT '',
049  `userfield` varchar(255) NOT NULL DEFAULT '',
050  `did` varchar(50) NOT NULL DEFAULT '',
051  `linkedid` varchar(32) NOT NULL DEFAULT '',
052  `sequence` int(11) NOT NULL DEFAULT '0',
053  `filename` varchar(255) DEFAULT 'none',
054  `recordingfile` varchar(255) DEFAULT NULL
055) ENGINE=InnoDB AUTO_INCREMENT=21758 DEFAULT CHARSET=utf8;
056
057--
058-- Gatilhos `cdr`
059--
060DROP TRIGGER IF EXISTS `t_cdr`;
061DELIMITER //
062CREATE TRIGGER `t_cdr` BEFORE INSERT ON `cdr`
063 FOR EACH ROW BEGIN
064 IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.realdst != '') THEN
065  SET NEW.dst = NEW.realdst;
066 END IF;
067END
068//
069DELIMITER ;
070
071-- --------------------------------------------------------
072
073--
074-- Estrutura da tabela `cel`
075--
076
077DROP TABLE IF EXISTS `cel`;
078CREATE TABLE IF NOT EXISTS `cel` (
079`id` int(11) NOT NULL,
080  `eventtype` varchar(30) NOT NULL,
081  `eventtime` datetime NOT NULL,
082  `cid_name` varchar(80) NOT NULL,
083  `cid_num` varchar(80) NOT NULL,
084  `cid_ani` varchar(80) NOT NULL,
085  `cid_rdnis` varchar(80) NOT NULL,
086  `cid_dnid` varchar(80) NOT NULL,
087  `exten` varchar(80) NOT NULL,
088  `context` varchar(80) NOT NULL,
089  `channame` varchar(80) NOT NULL,
090  `src` varchar(80) NOT NULL,
091  `dst` varchar(80) NOT NULL,
092  `channel` varchar(80) NOT NULL,
093  `dstchannel` varchar(80) NOT NULL,
094  `appname` varchar(80) NOT NULL,
095  `appdata` varchar(80) NOT NULL,
096  `amaflags` int(11) NOT NULL,
097  `accountcode` varchar(20) NOT NULL,
098  `uniqueid` varchar(32) NOT NULL,
099  `linkedid` varchar(32) NOT NULL,
100  `peer` varchar(80) NOT NULL,
101  `userdeftype` varchar(255) NOT NULL,
102  `eventextra` varchar(255) NOT NULL,
103  `userfield` varchar(255) NOT NULL
104) ENGINE=InnoDB AUTO_INCREMENT=207114 DEFAULT CHARSET=utf8;
105
106--
107-- Índices de tabelas salvas
108--
109
110--
111-- Índice da tabela `cdr`
112--
113ALTER TABLE `cdr`
114 ADD PRIMARY KEY (`id`), ADD KEY `calldate` (`calldate`), ADD KEY `src` (`src`), ADD KEY `dst` (`dst`), ADD KEY `accountcode` (`accountcode`), ADD KEY `uniqueid` (`uniqueid`), ADD KEY `dcontext` (`dcontext`), ADD KEY `clid` (`clid`), ADD KEY `did` (`did`), ADD KEY `id` (`id`);
115
116--
117-- Índice da tabela `cel`
118--
119ALTER TABLE `cel`
120 ADD PRIMARY KEY (`id`), ADD KEY `uniqueid_index` (`uniqueid`), ADD KEY `linkedid_index` (`linkedid`);
121
122--
123-- AUTO_INCREMENT para tabelas salvas
124--
125
126--
127-- AUTO_INCREMENT para tabela `cdr`
128--
129ALTER TABLE `cdr`
130MODIFY `id` int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=21758;
131--
132-- AUTO_INCREMENT para tabela `cel`
133--
134ALTER TABLE `cel`
135MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=207114;
136/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
137/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
138/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

2 - Edite o arquivo /etc/asterisk/cdr_mysql.conf

01[global]
02usegmtime=no
03cdrzone=America/Sao_Paulo
04
05[columns]
06alias start => calldate
07alias realdst => realdst
08alias remoteip => remoteip
09alias start => calldate
10alias hangupcause => hangupcause
11alias peerip => peerip
12alias recvip => recvip
13alias fromuri => fromuri
14alias useragent => useragent
15alias filename => filename
16alias realsrc => realsrc

Na seção [global], não há dados de conexão, já que gravamos dados no MySQL através do driver ODBC.

3 - Edite o arquivo /etc/asterisk/cdr_adaptive_odbc.conf


01[cdr_adaptive_connection]
02connection=asteriskcdrdb
03table=cdr
04usegmtime=no
05alias start => calldate
06alias realdst => realdst
07alias remoteip => remoteip
08alias start => calldate
09alias hangupcause => hangupcause
10alias peerip => peerip
11alias recvip => recvip
12alias fromuri => fromuri
13alias useragent => useragent
14alias filename => filename
15alias realsrc => realsrc


4 - Edite o arquivo /etc/asterisk/cdr_odbc.conf

1[global]
2dsn=asteriskcdrdb
3loguniqueid=yes
4dispositionstring=yes
5table=cdr
6usegmtime=no
7hrtime=yes
8newcdrcolumns=yes


5 - Crie a MACRO para CDR Estendido (Extended CDR):

1;CDR Estendido
2[macro-cdr-extended]
3exten => s,1,NoOp("Extended CDR")
4 same => n,Set(CDR(hangupcause)=${HANGUPCAUSE})
5 same => n,Set(CDR(peerip)=${CHANNEL(peerip)})
6 same => n,Set(CDR(recvip)=${CHANNEL(recvip)})
7 same => n,Set(CDR(uri)=${CHANNEL(uri)})
8 same => n,Set(CDR(fromuri)=${CHANNEL(from)})
9 same => n,Set(CDR(useragent)=${CHANNEL(useragent)})
 same => n,MacroExit()

Agora para que funcione de maneira correta os contextos que você quer ter ARA Exentend CDR, voce invoca nossa macro.