<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Guax &#187; asterisk</title>
	<atom:link href="http://www.guax.net/category/asterisk/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.guax.net</link>
	<description>“…is like having your brains smashed out by a slice of lemon wrapped round a large gold brick.”</description>
	<lastBuildDate>Sat, 07 Aug 2010 22:12:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Asterisk Trick nº 3: Usando Read para URA&#8217;s</title>
		<link>http://www.guax.net/2010/03/asterisk-trick-n%c2%ba-3-usando-read-para-uras/</link>
		<comments>http://www.guax.net/2010/03/asterisk-trick-n%c2%ba-3-usando-read-para-uras/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 01:18:42 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[dialplan]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[ura]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=304</guid>
		<description><![CDATA[URA&#8217;s (IVR em inglês) são muito comuns em ambientes com Asterisk. E são normalmente construídas usando a aplicação WaitExten e vários contextos para controle do fluxo. A aplicação WaitExten recebe uma entrada vinda do usuário via DTMF e direciona para a extensão correspondente a essa entrada. Essa não é a melhor abordagem por não permitir [...]]]></description>
			<content:encoded><![CDATA[<p>URA&#8217;s (IVR em inglês) são muito comuns em ambientes com Asterisk. E são normalmente construídas usando a aplicação WaitExten e vários contextos para controle do fluxo. A aplicação WaitExten recebe uma entrada vinda do usuário via DTMF e direciona para a extensão correspondente a essa entrada. Essa não é a melhor abordagem por não permitir uma forma fácil de validar a entrada do usuário e de manter consistência no desvio do fluxo da aplicação. Contextos são legais mas se usados sem moderação você acaba com um nível de complexidade tão grande dentro do seu Dialplan que torna a tarefa de debugar e manter o código algo homérico. Lembre-se que uma URA geralmente é um bloco de código que dificilmente será separado ou usado em partes, se sua URA for complexa o suficiente para isso você precisa de uma reavaliação mental antes de arquitetar o sistema telefônico que seus clientes e usuários terão que passar antes de serem atendidos. Afinal pessoas usam o telefone para falar com pessoas, mas esse é papo para outro post.</p>
<p>Veja um bom exemplo de como usar o Read para ler um digito do usuário:</p>
<pre>
exten => _XX.,1,Wait(2)
exten => _XX.,n,Read(OPCAO,bem_vindo_menu,1,,,4)
exten => _XX.,n,GotoIf($["${OPCAO}"!=""]?executa)
exten => _XX.,n,Set(OPCAO=0)
exten => _XX.,n(executa),Goto(${OPCAO},1)
</pre>
<p>A idéia aqui é poder mexer com a entrada do usuário a vontade, sem ter que ser redirecionado para algum lugar logo após alterar o EXTEN ou sem ter que ficar copiando o EXTEN após o waitexten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2010/03/asterisk-trick-n%c2%ba-3-usando-read-para-uras/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asterisk Tricks nº 2: Arquivos de Som</title>
		<link>http://www.guax.net/2010/03/asterisk-tricks-n%c2%ba-2-arquivos-de-som/</link>
		<comments>http://www.guax.net/2010/03/asterisk-tricks-n%c2%ba-2-arquivos-de-som/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 16:21:36 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=302</guid>
		<description><![CDATA[Dica do guax para o Asterisk segunda edição. Como colocar aquivos de som no formato WAV que o Asterisk consegue entender e tocar. O Asterisk só consegue tocar arquivos no Playback, Read e outras aplicações do tipo que tenham as seguintes caracteristicas: Channels : 1 Sample Rate : 8000 Precision : 16-bit Sample Encoding: 16-bit [...]]]></description>
			<content:encoded><![CDATA[<p>Dica do guax para o Asterisk segunda edição. Como colocar aquivos de som no formato WAV que o Asterisk consegue entender e tocar.</p>
<p>O Asterisk só consegue tocar arquivos no Playback, Read e outras aplicações do tipo que tenham as seguintes caracteristicas:</p>
<pre>Channels       : 1
Sample Rate    : 8000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM</pre>
<p>Ou seja, 8khz mono 16-bit Signed Integer PCM. Para converter um audio de outro formato para esse vamos usar a aplicação sox. O comando é basicamente:</p>
<pre>$ sox arquivo_origem.wav -r 8000 -c 1 -e signed-integer -b 16 arquivo_destino_convertido.wav</pre>
<p>O que cada parâmetro desses faz é:</p>
<ul>
<li>-r 8000 Muda a freqüência para 8khz</li>
<li>-c 1 Converte para mono (1 canal)</li>
<li>-e signed-integer Muda o encoding para PCM signed</li>
<li>-b 16 Em conjunto com o de cima faz com que o PCM seja 16 bits.</li>
</ul>
<p>Pronto, agora esse arquivo já pode ser colocado no seu /var/lib/asterisk/sounds/ e ser tocado normalmente. <img src='http://www.guax.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2010/03/asterisk-tricks-n%c2%ba-2-arquivos-de-som/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk Trick nº 1: GotoIf</title>
		<link>http://www.guax.net/2010/03/asterisk-trick-n%c2%ba-1-gotoif/</link>
		<comments>http://www.guax.net/2010/03/asterisk-trick-n%c2%ba-1-gotoif/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 14:41:29 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[dialplan]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=296</guid>
		<description><![CDATA[Dica do dia para o Asterisk. A aplicação GotoIf tem uma sintaxe que pode ser considerada pegadinha de newbie. Veja: exten =&#62; _X.,1,GotoIf($["${VARIAVEL}"=""]?labeltrue:labelfalse) exten =&#62; _X.,n(labeltrue),Noop(Acao a ser executada caso true) exten =&#62; _X.,n(labelfalse),Noop(Acao a ser executada caso false) Observe que é muito parecido com um operador ternário da maioria das linguagens de programação. Dicas: [...]]]></description>
			<content:encoded><![CDATA[<p>Dica do dia para o Asterisk. A aplicação GotoIf tem uma sintaxe que pode ser considerada pegadinha de newbie. Veja:</p>
<pre>exten =&gt; _X.,1,GotoIf($["${VARIAVEL}"=""]?labeltrue:labelfalse)
exten =&gt; _X.,n(labeltrue),Noop(Acao a ser executada caso true)
exten =&gt; _X.,n(labelfalse),Noop(Acao a ser executada caso false)</pre>
<p>Observe que é muito parecido com um operador ternário da maioria das linguagens de programação. Dicas:</p>
<ol>
<li>Não coloque nenhum espaço separando as condicionais, ? e : do contrário ele não lerá &#8220;labeltrue&#8221; mas &#8220;(ESPAÇO)labeltrue(ESPAÇO)&#8221;</li>
<li>Em nenhuma hipotese coloque a variavel sem as &#8221; (aspas duplas) caso a variável seja nula ou não definida você ganha um erro do interpretador e não será levado ao labelfalse</li>
<li>Perceba que $[] delimita que ali está ocorrendo uma comparação ou qualquer operação que retornará 1 ou 0, true ou false.</li>
<li>No lugar das labels &#8220;labeltrue&#8221; e &#8220;labelfalse&#8221; você pode colocar o índice da prioridade sem problema nenhum, nesse caso 2 e 3 respectivamente. Eu prefiro usar label já que ela move junto com minhas edições. E é bem mais legível.</li>
</ol>
<p><strong>Dica adicional:</strong> <cite>&#8220;Sempre escreva seu código como se o cara que vai dar manutenção é um maníaco homicida que sabe onde você mora&#8221; </cite>&#8211; Dicas do Visual Studio</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2010/03/asterisk-trick-n%c2%ba-1-gotoif/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CDR no Asterisk, nada bom :(</title>
		<link>http://www.guax.net/2009/08/cdr-no-asterisk-nada-bom/</link>
		<comments>http://www.guax.net/2009/08/cdr-no-asterisk-nada-bom/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 19:16:27 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[agi]]></category>
		<category><![CDATA[cdr]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[haha]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=55</guid>
		<description><![CDATA[O Call Detail Record no Asterisk PBX é feito por um modulo homônimo que aceita diversos backends para persistencia dos dados em SGDB's, csv, odbc, etc. Sua força está na sua simplicidade quanto ao uso, já vem por padrão no Asterisk e funciona muito bem para a maioria dos casos. Mas nem tudo são flores, dentre seus problemas mais graves estão: inconsistencia na gravação do status da ligação em transferencias cegas, ligações que deveriam ser ANSWER estão NOANSWER. Nenhuma confiabilidade nos dados de transferencia assistida. O campo 'uniqueid' NÃO É UNICO.

Ainda há o fato da tabela do banco de dados ter uma estrutura travada e não mapeavel, o que faz com que a customização da mesma seja um processo doloroso e até mesmo inviável.

O que fazer?]]></description>
			<content:encoded><![CDATA[<p>O <strong>Call Detail Record</strong> no Asterisk PBX é feito por um modulo <span>homônimo que aceita diversos backends para persistencia dos dados em SGDB&#8217;s, csv, odbc, etc. Sua força está na sua simplicidade quanto ao uso, já vem por padrão no Asterisk e funciona muito bem para a maioria dos casos. Mas nem tudo são flores, dentre seus problemas mais graves estão: inconsistencia na gravação do status da ligação em transferencias cegas, ligações que deveriam ser ANSWER estão NOANSWER. Nenhuma confiabilidade nos dados de transferencia assistida. O campo &#8216;<strong>uniqueid</strong>&#8216; <strong>NÃO É UNICO</strong>.</span></p>
<p style="text-align: center;"><span> </span></p>
<div id="attachment_65" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.guax.net/wp-content/uploads/2009/08/59e2jw.jpg" rel="lightbox[55]"><img class="size-full wp-image-65 " title="Nelson" src="http://www.guax.net/wp-content/uploads/2009/08/59e2jw.jpg" alt="Asterisk sobre Você" width="240" height="224" /></a><p class="wp-caption-text">Asterisk sobre Você</p></div>
<p><span>Ainda há o fato da tabela do banco de dados ter uma estrutura travada e não mapeavel, o que faz com que a customização da mesma seja um processo doloroso e até mesmo inviável.</span></p>
<p><span><strong>O que fazer? </strong>Fazer um só pra você horas. Todo bom nerd que se prese <span style="text-decoration: line-through;">acha</span> sabe que pode fazer melhor. Então vamos ver como poderemos criar nosso próprio cdr com ajudinha de alguns AGI&#8217;s.</span></p>
<p><span>Um script AGI que você executa após cada tentativa de Dial() e que grava automaticamente informações como DIALSTATUS, BILLSEC, DUURATION se mostra mais eficiente já que pode-se adaptar a gravação do log conforme a sua estrutura de controle de ligações.</span></p>
<p><span>Até ai tudo bem, podemos fazer o controle de ligações simples com as informações que eu bem entender, mas ainda nos resta as ligações que passam por filas de atendimento e ligações que são transferidas.</span></p>
<p><strong><span>Filas:</span></strong><span> Aqui temos um problema, a forma nativa de executar um AGI dentro da app_queue não é satisfatória já que ela executa o script somente quando a ligação é atendida pelo membro da fila. Assim perdemos o status das primeiras ligações caso elas tenham sido recusadas e as informações são as mesmas que colcoar o agi para executar depois da execução do Queue() no dialplan.</span></p>
<p><span>Podemos nesse caso, implementar uma Queue via AGI ou Monitorar o Queue log em busca dessas informações.</span></p>
<p><span>A solução mais elegante ao meu ver é modificar a aplicação do Queue para que ao invés de implementar o dial diretamente seja possível direcionar para um contexto, assim é possível monitorar todo o comportamento da ligação e da fila em geral. (entra na TODO list)<br />
</span></p>
<p><span><strong>Transferencias:</strong> As transferencias é um problema simples de resolver, ao setar a variavel global </span><strong>TRANSFER_CONTEXT</strong> para um contexto qualquer você consegue executar seu AGI lá dentro e resolver esse problema, com um pouco de esforço ainda se pode gerar uma estrutura complexa e bonita com árvore de chamada para não perder os dados da ligação geral e ainda ter o status da ligação primária.</p>
<p><span>Sempre há a possibilidade de se esperar pela próxima versão, não testei a versão 1.6 do asterisk ainda. Mas até onde fui informado ela teria solucionado esses bugs. Mas ainda sobra a rigidez estrutural.</span></p>
<p><span><strong>update:</strong> encontrei uma boa discussão sobre o assunto e sobre esses problemas em uma lista de discussão da Digium: </span><a href="http://lists.digium.com/pipermail/asterisk-dev/2008-November/035305.html" target="_blank">http://lists.digium.com/pipermail/asterisk-dev/2008-November/035305.html</a></p>
<p><strong>update2:</strong> nessa discussão tem uma documentação que resume algumas coisas e explana outras, vale a leitura: <a href="http://svn.digium.com/svn/asterisk/team/murf/RFCs/" target="_blank">http://svn.digium.com/svn/asterisk/team/murf/RFCs/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2009/08/cdr-no-asterisk-nada-bom/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
