<?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/tag/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>Mon, 21 Jun 2010 16:17:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Nossos Medidores Apontam Um Elevado Nível De Gambiarra</title>
		<link>http://www.guax.net/2010/06/nossos-medidores-apontam-um-elevado-nivel-de-gambiarra/</link>
		<comments>http://www.guax.net/2010/06/nossos-medidores-apontam-um-elevado-nivel-de-gambiarra/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 12:44:14 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[gambiarra]]></category>
		<category><![CDATA[haha]]></category>
		<category><![CDATA[POGD]]></category>
		<category><![CDATA[Telephony]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=393</guid>
		<description><![CDATA[Uma transferência assistida no Asterisk gera os seguintes canais e links. newchannel: SIP/192.168.10.252-00000008 newchannel: SIP/1001-00000009 link: SIP/192.168.10.252-00000008 - SIP/1001-00000009 unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009 link: SIP/192.168.10.252-00000008 - SIP/1001-00000009 unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009 link: SIP/192.168.10.252-00000008 - SIP/1001-00000009 unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009 link: SIP/192.168.10.252-00000008 - SIP/1001-00000009 unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009 newchannel: Local/1002@transferencias-aaa8,1 newchannel: Local/1002@transferencias-aaa8,2 newchannel: SIP/1002-0000000a link: Local/1002@transferencias-aaa8,2 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Uma</strong> transferência assistida no Asterisk gera os seguintes canais e links.</p>
<pre>
newchannel: SIP/192.168.10.252-00000008
newchannel: SIP/1001-00000009
link: SIP/192.168.10.252-00000008 - SIP/1001-00000009
unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009
link: SIP/192.168.10.252-00000008 - SIP/1001-00000009
unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009
link: SIP/192.168.10.252-00000008 - SIP/1001-00000009
unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009
link: SIP/192.168.10.252-00000008 - SIP/1001-00000009
unlink: SIP/192.168.10.252-00000008 - SIP/1001-00000009
newchannel: Local/1002@transferencias-aaa8,1
newchannel: Local/1002@transferencias-aaa8,2
newchannel: SIP/1002-0000000a
link: Local/1002@transferencias-aaa8,2 - SIP/1002-0000000a
link: SIP/1001-00000009 - Local/1002@transferencias-aaa8,1
unlink: SIP/1001-00000009 - Local/1002@transferencias-aaa8,1
link: SIP/1001-00000009 - Local/1002@transferencias-aaa8,1
unlink: Local/1002@transferencias-aaa8,2 - Local/1002@transferencias-aaa8,1<ZOMBIE>
hangup: Local/1002@transferencias-aaa8,1<ZOMBIE>
hangup: Local/1002@transferencias-aaa8,2
unlink: SIP/1001-00000009 - SIP/1002-0000000a
newchannel: Transfered/SIP/192.168.10.252-00000008
link: SIP/192.168.10.252-00000008 - SIP/1002-0000000a
hangup: SIP/1001-00000009
hangup: Transfered/SIP/192.168.10.252-00000008<ZOMBIE>
unlink: SIP/192.168.10.252-00000008 - SIP/1002-0000000a
hangup: SIP/1002-0000000a
hangup: SIP/192.168.10.252-00000008
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2010/06/nossos-medidores-apontam-um-elevado-nivel-de-gambiarra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nota: Bilhetagem e CDR</title>
		<link>http://www.guax.net/2010/03/nota-bilhetagem-e-cdr/</link>
		<comments>http://www.guax.net/2010/03/nota-bilhetagem-e-cdr/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 15:51:58 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[cdr]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=316</guid>
		<description><![CDATA[Comecei a brincar novamente com CDR, estava esboçando um daemon para acompanhar o fluxo das ligações e percebi que o buraco é mais embaixo. Explico: A é uma ligação vinda da PSTN e é direcionada para B que é um ramal interno. B transfere a ligação para C, outro ramal interno. A fala com B durante [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei a brincar novamente com CDR, estava esboçando um daemon para acompanhar o fluxo das ligações e percebi que o buraco é mais embaixo. Explico:</p>
<div id="attachment_177" class="wp-caption aligncenter" style="width: 214px"><a href="http://www.guax.net/wp-content/uploads/2009/10/transferencia.png" rel="lightbox[316]"><img class="size-full wp-image-177" title="Transferência" src="http://www.guax.net/wp-content/uploads/2009/10/transferencia.png" alt="" width="204" height="103" /></a><p class="wp-caption-text">Uma ligação com transferência.</p></div>
<p>A é uma ligação vinda da PSTN e é direcionada para B que é um ramal interno. B transfere a ligação para C, outro ramal interno. A fala com B durante 2 minutos, o tempo de atendimento foi de 10 segundos sendo no total 2:10 minutos de ligação. A fala com C por outros 2 minutos e espera 10 segundos também para ser atendido (transferência cega). Temos um total de 4:20 de ligação e 4:00 de conversação.</p>
<p>Até ai tudo bem, só que esses 4 minutos não são o tempo pelo qual A foi bilhetado. Ele foi cobrado por 4:10 de ligação já que somente os primeiros 10 segundos de chamada o canal dele estava em estado não atendido. Essa conta fica mais maluca de ser extraída do CDR do Asterisk se considerar que num sistema de produção de médio porte temos transferências feitas pelo originador, transferências para PSTN e cadeias intermináveis de transbordo em filas e grupos de ramais.</p>
<p>Múltiplas tarifações na mesma ligação são possíveis em conferências por exemplo onde geralmente liga-se para o cliente e transfere para a sala de conferência. Nesse caso todos os canais devem ser tarifados e não somente uma vez o tempo da ligação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2010/03/nota-bilhetagem-e-cdr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>pub: Asterisk novo e remoção do php</title>
		<link>http://www.guax.net/2010/01/pub-asterisk-novo-e-remocao-do-php/</link>
		<comments>http://www.guax.net/2010/01/pub-asterisk-novo-e-remocao-do-php/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 01:02:26 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[guax.net]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pub/]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=283</guid>
		<description><![CDATA[Mais uma atualização no pub/. Atualizei o asterisk para o 1.4.29 e removi o php já que a versão que vem no slackware 13.0+ contém as flags que eu queria. =)]]></description>
			<content:encoded><![CDATA[<p>Mais uma atualização no <a href="http://www.guax.net/pub/">pub/</a>. Atualizei o <a href="http://www.guax.net/pub/slackware/sources/asterisk/">asterisk</a> para o 1.4.29 e removi o php já que a versão que vem no slackware 13.0+ contém as flags que eu queria. =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2010/01/pub-asterisk-novo-e-remocao-do-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Call Flow Diagram</title>
		<link>http://www.guax.net/2009/10/call-flow-diagram/</link>
		<comments>http://www.guax.net/2009/10/call-flow-diagram/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 00:59:15 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[Telephony]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[cdr]]></category>
		<category><![CDATA[desenvolvimento]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=185</guid>
		<description><![CDATA[I was trying to define what information was relevant in a implementation of a Call Detail Record (CDR). Then i realized i need to represent all the possible scenarios a call can perform inside a PBX, so i can determine the relevant data i should store to make reports and even what pieces of the [...]]]></description>
			<content:encoded><![CDATA[<p>I was trying to define what information was relevant in a implementation of a Call Detail Record (CDR). Then i realized i need to represent all the possible scenarios a call can perform inside a PBX, so i can determine the relevant data i should store to make reports and even what pieces of the call must be recorded.</p>
<p>I searched for a diagram that could represent the call flow in a more intuitive way. I didn’t found something that was easy and clear enough for me. So i sketched some small diagrams and developed the following diagram structure that i will use on my documentation about telephony. I am still accepting better suggestions about representing calls in a more clear way.</p>
<p><strong>update:</strong> why? Sometimes we need to draw things to our boss and clients to understand, people usually don&#8217;t have the same data abstraction skills that you have on seeing a lot of CDR&#8217;s rows and messages as audio streams flowing through dialplan logic. I had a good experience to explain what happened to calls using this. So i&#8217;m sharing. =)</p>
<h2>Basic Call Representation</h2>
<p>The first call we can represent is the most basic and common case on telephony. A calls B and that’s everything that happens.</p>
<div id="attachment_191" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.guax.net/wp-content/uploads/2009/10/simple.png" rel="lightbox[185]"><img class="size-full wp-image-191" title="Simple Call" src="http://www.guax.net/wp-content/uploads/2009/10/simple.png" alt="A simple call that connects A to B" width="240" height="80" /></a><p class="wp-caption-text">A simple call that connects A to B</p></div>
<p>As you see those two elements represent communication end-points that we can say are physical channels that comes and goes out from the PBX. Could represent a persons phone or a PSTN or a trunk with another PBX.</p>
<p>The number on the connection line determinate the order the calls were placed on the system. So we can use a dashed line to represent calls that were not answered by our called party (B). By now we have the basic call redirection scenario where the first destination does not answer so the call is made with C instead of B.</p>
<div id="attachment_193" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.guax.net/wp-content/uploads/2009/10/sequence.png" rel="lightbox[185]"><img class="size-full wp-image-193" title="Sequence" src="http://www.guax.net/wp-content/uploads/2009/10/sequence.png" alt="Sequence" width="240" height="160" /></a><p class="wp-caption-text">B don&#39;t answer and the call overflowed to C</p></div>
<p>Another way a call can walk between end-points is when one of these points transfer its party. When this happens we need to keep track of who made the transfer. That is represented by the curved arrow that shows who transfer to who and in what moment.</p>
<div id="attachment_198" class="wp-caption aligncenter" style="width: 350px"><a href="http://www.guax.net/wp-content/uploads/2009/10/xfer.png" rel="lightbox[185]"><img class="size-full wp-image-198" title="Transfer" src="http://www.guax.net/wp-content/uploads/2009/10/xfer.png" alt="B transfer A to C." width="340" height="150" /></a><p class="wp-caption-text">B transfer A to C.</p></div>
<p>Note that transfer can make a communication channel as well between B and C during the transfer operation, the <strong>attended transfer.</strong> In this cases you can represent it textually, since most of people don&#8217;t care about that conversation.</p>
<p>Not all the times calls fallow an specific order. We have situations where many end-points are talking in the same time in the same call, in a conference for example. Conferences are the most common way to unite two calls that starts independently and when it appear in complex scenarios we will need a more complete way to represent the time sequence of call placing, but i will let this for later work. For now we can just represent the connections on a special element and say that all the connections happened at the same time.</p>
<div id="attachment_196" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.guax.net/wp-content/uploads/2009/10/conference.png" rel="lightbox[185]"><img class="size-full wp-image-196" title="Conference" src="http://www.guax.net/wp-content/uploads/2009/10/conference.png" alt="A conference between A, B, C and N more end-points." width="240" height="240" /></a><p class="wp-caption-text">A conference between A, B, C and N more end-points.</p></div>
<h2>Applications and Contextualization</h2>
<p>PBX&#8217;s are known for give some intelligence in call routing. This is the ability to use applications that apply one specific logic on the calls. These can be queues, call groups or even the Interactive Voice Response systems (IVR&#8217;s). The main difference between them is that some may answer the call and make data transmission to the connection party. When the application answer the call is easy to represent it as and special end-point, as we did with conferences. When just routing is involved we need to contextualize a group of calls in the scenario so we can determine the actions taken by the app. We can see those two cases in the next diagram.</p>
<div id="attachment_200" class="wp-caption aligncenter" style="width: 350px"><a href="http://www.guax.net/wp-content/uploads/2009/10/contextualization.png" rel="lightbox[185]"><img class="size-full wp-image-200" title="Contextualization" src="http://www.guax.net/wp-content/uploads/2009/10/contextualization.png" alt="Contextualization" width="340" height="270" /></a><p class="wp-caption-text">Call Contexts</p></div>
<h2>Approach Issues</h2>
<p>One concern i have with this representation is that it could be a little confuse in a first moment about how the call flowed. I didn&#8217;t made the diagram in a standard way by considering that i am not taking a peer point of view, but the macro view of the call flow. In a simpler approach it would be ignored for example in a conference what was the path taken by the other participants, since the most common way to someone to get into a conference is to be transfered to the number that represents it.</p>
<p>I understand some misconceptions can happen since i am trying to represent something that is dynamic in a static view which is the call states along a time period. A snapshot of the PBX in any moment will only show a simple call.</p>
<p>PS. English corrections will be appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2009/10/call-flow-diagram/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>
		<item>
		<title>SlackBuild: Asterisk</title>
		<link>http://www.guax.net/2009/07/slackbuild-asterisk/</link>
		<comments>http://www.guax.net/2009/07/slackbuild-asterisk/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 02:36:12 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[Slackbuilds]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[slackbuild]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=39</guid>
		<description><![CDATA[Está no pub/ a minha modificação do SlackBuild do slackbuilds.org para Asterisk. Esse script faz a automatização da compilação e geração do pacote para asterisk 1.4.26. Dentre as modificações, além da atualização da versão, estão: Remoção da geração dos arquivos de configuração de exemplo do asterisk. (make samples) &#8211; uma modificação na configuração do slackbuild [...]]]></description>
			<content:encoded><![CDATA[<p>Está no <a href="http://www.guax.net/pub/">pub/</a> a minha modificação do SlackBuild do slackbuilds.org para Asterisk. Esse script faz a automatização da compilação e geração do pacote para asterisk 1.4.26. Dentre as modificações, além da atualização da versão, estão:</p>
<ul>
<li>Remoção da geração dos arquivos de configuração de exemplo do asterisk. (make samples) &#8211; uma modificação na configuração do slackbuild traz esses arquivos de volta.</li>
<li>Compilação usando make -j2</li>
<li>Plataforma i686 como padrão</li>
<li>Inclusão automática da app_pickup2</li>
</ul>
<p>Para download siga o caminho dourado até <a href="http://www.guax.net/pub/slackware/packages/">pub/slackware/packages/</a> ou <a href="http://www.guax.net/pub/slackware/sources/asterisk/">pub/slackware/sources/asterisk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2009/07/slackbuild-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capturas por grupo no Asterisk</title>
		<link>http://www.guax.net/2009/07/capturas-por-grupo-no-asterisk/</link>
		<comments>http://www.guax.net/2009/07/capturas-por-grupo-no-asterisk/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 20:56:54 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agi]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=11</guid>
		<description><![CDATA[Um dos problemas que enfrentamos em sistemas com Asterisk é a captura por grupo. Elas não funcionam quando se tem tecnologias diferentes em ramais e/ou se usa driver de canais de terceiros. Administrar isso se torna uma tarefa monstruosa e épica caso seu sistema seja muito grande, já que apesar de macros e modelos nos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.asterisk.org/"><img class="aligncenter size-full wp-image-24" title="Asterisk" src="http://www.guax.net/wp-content/uploads/2009/07/Asterisk_logo1.png" alt="Asterisk" width="120" height="70" /></a>Um dos problemas que enfrentamos em sistemas com <a href="http://www.asterisk.org/" target="_blank">Asterisk</a> é a captura por grupo. Elas não funcionam quando se tem tecnologias diferentes em ramais e/ou se usa driver de canais de terceiros. Administrar isso se torna uma tarefa monstruosa e épica caso seu sistema seja muito grande, já que apesar de macros e modelos nos arquivos de configuração de tecnologias você precisa administrar vários deles, tarefa esta que se torna especialmente dolorosa em sistemas integrados com ramais espelhados em banco de dados.</p>
<p>Uma solução que eu implementei com sucesso até agora é a implementação manual de um sistema de capturas usando um script AGI e a app <a href="http://www.voip-info.org/wiki/view/Asterisk+cmd+Pickup" target="_blank">Pickup</a> presente por padrão no Asterisk.</p>
<p>A aplicação Pickup efetua capturas de ligações recebendo como parâmetro uma extensão em um contexto. Esse tipo de captura não me ajuda em nada na maioria das vezes mas a app Pickup tem uma boa carta na manga: o contexto <strong><em>PICKUPMARK</em></strong>.</p>
<p>Quando o contexto passado como parâmetro para a aplicação é PICKUPMARK a aplicação vai procurar ligações que contenham a variável de canal definida como o conteúdo do exten.  Ex: Pickup(desenvolvimento@PICKUPMARK) irá procurar ligações que contenham a variável PICKUPMARK definida como &#8216;desenvolvimento&#8217;.</p>
<p>Para marcar e  capturar é necessário encontrar o real realizador da chamada e resolver seu grupo, para isso eu uso um script <a href="http://www.voip-info.org/wiki/view/Asterisk+AGI" target="_blank">AGI</a> que faz a identificação do grupo de captura baseado no callerid do originador da chamada.</p>
<pre>;Configuração para extensão de captura
exten =&gt; _*8,1,AGI(resolv_pickup_group.php,${CALLERID(num)})
exten =&gt; _*8,n,<strong>Pickup(${PICKUPGROUP}@PICKUPMARK)</strong>
exten =&gt; _*8,n,Hangup</pre>
<p>O funcionamento desse AGI é muito simples, o que ele faz é uma consulta no banco de dados onde estão configurados meus ramais e retornar o grupo de captura referente ao ramal passado como parâmetro.</p>
<p>Usa-se o mesmo script para definir o grupo da ligação quando uma ligação é efetuada para o ramal, não esqueça de executar isso antes de cada dial para o ramal que se deseja ter essa feature ativa.</p>
<pre>;Configuração para extensão de captura
exten =&gt; _X.,1,AGI(resolv_pickup_group.php,${CALLERID(num)})
exten =&gt; _X.,n,<strong>Set(__PICKUPMARK=${PICKUPGROUP})</strong>
exten =&gt; _X.,n,Dial(${EXTEN},60,twk)
exten =&gt; _X.,n,Hangup</pre>
<p>Perceba o pulo do gato: ao atribuir a variável eu estou <strong>usando dois _ (underlines)</strong> antes do nome da variável para determinar herença infinita na variável. Assim não é necessário defini-la como variável global e sem isso a captura não funciona quando se tem ligações concorrentes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2009/07/capturas-por-grupo-no-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
