<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Creaci%C3%B3n_do_dialplan</id>
	<title>Creación do dialplan - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Creaci%C3%B3n_do_dialplan"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Creaci%C3%B3n_do_dialplan&amp;action=history"/>
	<updated>2026-10-25T15:18:56Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Creaci%C3%B3n_do_dialplan&amp;diff=11373&amp;oldid=prev</id>
		<title>Veiga: /* Sala de Conferencias */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Creaci%C3%B3n_do_dialplan&amp;diff=11373&amp;oldid=prev"/>
		<updated>2009-04-15T19:38:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Sala de Conferencias&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;O &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; ou plan de marcado constitúe unha das partes máis importantes de Asterisk. Realmente é nel onde se amosa toda a potencia, versatilidade e flexibilidade que pode chegar a ter unha centralita telefónica software.&lt;br /&gt;
&lt;br /&gt;
O &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; é o centro de Asterisk. Cada díxito que se marca nun terminal recorrerá o &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039;, buscando &amp;quot;qué facer&amp;quot;. O &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; poderíase asimilar a unha táboa de enrutado, de forma que o usuario marca unha secuencia de díxitos ou caracteres e nela se atopan as accións a realizar para a secuencia de marcado.&lt;br /&gt;
&lt;br /&gt;
== Esquema de traballo ==&lt;br /&gt;
&lt;br /&gt;
O &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; de Asterisk atópase no arquivo extensions.conf e está composto por contextos, extensións e prioridades.&lt;br /&gt;
&lt;br /&gt;
As &amp;#039;&amp;#039;&amp;#039;extensións&amp;#039;&amp;#039;&amp;#039; son números (ou caracteres alfanuméricos) onde o usuario pode chamar. Estas extensións, conteñen accións asociadas, que son executadas de xeito secuencial, por orden de &amp;#039;&amp;#039;&amp;#039;prioridade&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Os &amp;#039;&amp;#039;&amp;#039;contextos&amp;#039;&amp;#039;&amp;#039; son agrupacións lóxicas de extensións, e se empregan para dividir o &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; en diversos entes lóxicos. Esta división é necesaria para poder dispor dun plan sostible, escalable e con posibilidades de ofrecer diversos entornos de marcado aillados.&lt;br /&gt;
&lt;br /&gt;
A sintaxis para as extensións dun contexto é a seguinte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; numero de extensión, prioridade, aplicación(argumentos)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ó definir un usuario no &amp;#039;&amp;#039;sip.conf&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;iax.conf&amp;#039;&amp;#039;, asociámoslle un contexto, polo que ese usuario só poderá marcar as extensións incluídas no seu contexto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[proba]&lt;br /&gt;
exten =&amp;gt; 1234,1,NoOp(Isto é unha proba)&lt;br /&gt;
exten =&amp;gt; 1234,n,NoOp(Isto é outra proba)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No exemplo de arriba amósase un sencillo contexto cunha extensión e duas prioridades. Sempre é necesaria a prioridade 1, pero para as seguintes prioridades pódese usar a &amp;quot;n&amp;quot;, que fará que se incremente automáticamente nunha unidade, evitando así ter que face-lo manualmente.&lt;br /&gt;
&lt;br /&gt;
Ó marcar unha extensión vanse executando as aplicacións correspondentes de xeito secuencial, de acordo á súa prioridade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; 1234,1,Aplicación 1&lt;br /&gt;
exten =&amp;gt; 1234,2,Aplicación 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O uso de prioridades numéricas pode dificultar a modificación do &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; nun futuro, xa que si se desexa insertar unha acción no medio, sería necesario modificar a prioridade de todas as seguintes.&lt;br /&gt;
&lt;br /&gt;
Para evitar isto podemos empregar a prioridade &amp;quot;n&amp;quot;, que simplemente indica &amp;quot;a seguinte prioridade&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; 1234,1,Aplicación 1&lt;br /&gt;
exten =&amp;gt; 1234,n,Aplicación 2&lt;br /&gt;
...&lt;br /&gt;
exten =&amp;gt; 1234,n,Aplicación 9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como pode observarse, deste xeito é moito máis sinxelo insertar novas aplicacións en medio, sin necesidade de preocuparnos de cambiar os números de prioridade.&lt;br /&gt;
&lt;br /&gt;
En lugar de ter que expresar  todas as combinacións de extensións posibles, podemos empregar patróns e variables, ó obxecto de dispor dun &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; máis claro e sostible. &lt;br /&gt;
&lt;br /&gt;
Os patróns comezan cun guión baixo &amp;quot;_&amp;quot; e empregan o seguintes caracteres especiais:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X: Calqueira díxito do 0 ó 9&lt;br /&gt;
Z: Calqueira díxito do 1 ó 9&lt;br /&gt;
N: Calqueira díxito do 2 ó 9&lt;br /&gt;
[]: Calqueira díxito que se atope entre os corchetes, por exemplo [123] implica o 1,o 2 e o 3.&lt;br /&gt;
&lt;br /&gt;
. (punto): Calqueira cousa, por exemplo _9. &lt;br /&gt;
Implica calqueira número que comece por 9, sin ter en conta o 9 en si mesmo.&lt;br /&gt;
&lt;br /&gt;
!: Caracter de desambigüación.&lt;br /&gt;
Indica que o procesamento ten que ser detido tan pronto como se atope un patrón axeitado.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empregando os patróns é posible simplificar o &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; e na práctica empréganse patróns como os seguintes:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_[789]XXXXXXXX&amp;#039;&amp;#039;&amp;#039;: Números fixos nacionais (que comecen por 7,8 ou 9 e teñen nove díxitos)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_6XXXXXXXX&amp;#039;&amp;#039;&amp;#039;: Números de móbil  (comezan por 6 e teñen nove díxitos)&lt;br /&gt;
&lt;br /&gt;
== Aplicacións e funcións ==&lt;br /&gt;
&lt;br /&gt;
Ó marcar unha extensión execútase a aplicación asociada á prioridade correspondente. A diferencia das aplicacións, as funcións soamente poden ser empregadas dentro de ditas aplicacións. Vexamos un exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; 2000,1,Dial(SIP/carlos)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ó marcar a extensión 2000 executarase a aplicación &amp;#039;&amp;#039;Dial&amp;#039;&amp;#039;, á que lle indicamos que chame a Carlos, que é un usuario SIP. &lt;br /&gt;
&lt;br /&gt;
Primeiro indicamos a tecnoloxía (SIP/) e despois o nome do usuario que definimos no arquivo correspondente, neste caso &amp;#039;&amp;#039;sip.conf&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As funcións, en cambio execútanse dentro das aplicacións, por exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; 1234,1,NoOp(Estas chamándome dende o : ${CALLERID(num)})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso execútase a aplicación &amp;#039;&amp;#039;Noop&amp;#039;&amp;#039;, que únicamente imprime a mensaxe que se lle pasa como argumento por pantalla, e no seu interior execútase a función &amp;#039;&amp;#039;CALLERID&amp;#039;&amp;#039; con argumento &amp;#039;&amp;#039;num&amp;#039;&amp;#039;, que devolve o número chamante.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 1: Exemplo de dialplan básico&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[a-extensions]&lt;br /&gt;
exten =&amp;gt; 2000,1,Dial(SIP/carlos,60,Tt)&lt;br /&gt;
exten =&amp;gt; 2001,1,Dial(SIP/mendez,60,Tt)&lt;br /&gt;
&lt;br /&gt;
[a-servizos]&lt;br /&gt;
exten =&amp;gt; 1234,1,Playback(tt-monkeys)&lt;br /&gt;
exten =&amp;gt; 1235,1,Dial(IAX2/guest@pbx.digium.com/s@default)&lt;br /&gt;
&lt;br /&gt;
[dende-usuarios]&lt;br /&gt;
include =&amp;gt; a-extensions&lt;br /&gt;
include =&amp;gt; a-servizos&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste exemplo definimos tres contextos: o contexto &amp;#039;&amp;#039;a-extensions&amp;#039;&amp;#039; inclúe as extensións 2000 e 2001, que fan uso da aplicación &amp;#039;&amp;#039;Dial&amp;#039;&amp;#039; para chamar a carlos e a mendez respectivamente. &lt;br /&gt;
&lt;br /&gt;
O contexto &amp;#039;&amp;#039;a-servizos&amp;#039;&amp;#039; contén dous servizos: 1234, que reproduce unha locución de exemplo (o sonido duns monos) e 1235, que fai unha chamada a Digium a través do IAX2.&lt;br /&gt;
&lt;br /&gt;
O contexto &amp;#039;&amp;#039;dende-usuarios&amp;#039;&amp;#039; inclúe os outros dous contextos, e é o que asignaremos ás extensións no sip.conf, de xeito que sexan capaces de marcar todas as extensións incluídas por este contexto.&lt;br /&gt;
&lt;br /&gt;
Podería facerse todo nun só contexto, pero iso derivaría nun &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; pouco sostible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Macros ==&lt;br /&gt;
&lt;br /&gt;
En moitas ocasións atoparémonos con fragmentos do &amp;#039;&amp;#039;&amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039;&amp;#039;&amp;#039; que son idénticos, e nos que soamente cambia un pequeno detalle.&lt;br /&gt;
&lt;br /&gt;
Seguindo a filosofía do &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; da &amp;#039;&amp;#039;&amp;#039;Listaxe 2&amp;#039;&amp;#039;&amp;#039;, teríamos que copiar o mesmo para a extensión 2001,2002,2003, modificando en cada fragmento o protocolo a usar (SIP ou IAX), nome do usuario e o número de extensión. Isto, ademais de ser bastante traballoso, complicaría o día de mañá calquera modificación.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 2: Fragmento dun dialplan&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[a-extensions]&lt;br /&gt;
exten =&amp;gt; 2000,1,Dial(SIP/mendez,20)&lt;br /&gt;
exten =&amp;gt; 2000,n,Goto(2000-${DIALSTATUS},1)&lt;br /&gt;
&lt;br /&gt;
; si está ocupado, reprodúcese a mensaxe correspondente&lt;br /&gt;
exten =&amp;gt; 2000-BUSY,1,VoiceMail(2000,b)&lt;br /&gt;
exten =&amp;gt; 2000-BUSY,n,Hangup&lt;br /&gt;
&lt;br /&gt;
; si non contesta, reprodúcese a mensaxe de &amp;quot;no dispoñible&amp;#039;&lt;br /&gt;
exten =&amp;gt; 2000-NOANSWER,1,VoiceMail(2000,u)&lt;br /&gt;
exten =&amp;gt; 2000-NOANSWER,n,Hangup&lt;br /&gt;
&lt;br /&gt;
; en calqueira outro caso, facemos o mesmo que si non contesta.&lt;br /&gt;
exten =&amp;gt; 2000-.,1,Goto(2000-NOANSWER)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para solucionar este problema, poderemos definir &amp;#039;&amp;#039;&amp;#039;macros&amp;#039;&amp;#039;&amp;#039;, que son o equivalentes a &amp;quot;funcións&amp;quot; ou &amp;quot;subrutinas&amp;quot; das linguaxes de programación. Do mesmo xeito que as funcións, unha macro recibirá uns parámetros que poderemos utilizar dentro da súa definición.&lt;br /&gt;
&lt;br /&gt;
As macros defínense no ficheiro &amp;#039;&amp;#039;extensions.conf&amp;#039;&amp;#039;, como un contexto máis, tendo en conta unha serie de condicións: &lt;br /&gt;
&lt;br /&gt;
# O nome do &amp;quot;contexto&amp;quot; empezará por &amp;quot;macro-&amp;quot; para identificar que se trata dunha macro, e non dun contexto normal.&lt;br /&gt;
# As macros sempre empezarán pola extensión &amp;quot;s&amp;quot;. Ademais, non se permite un &amp;quot;goto&amp;quot; dende outra parte do &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; a un punto diferente da macro que non sexa ó seu inicio.&lt;br /&gt;
# Dentro da definición da macro, os parámetros recibidos son accesibles mediante ${ARG1}, ${ARG2}... E a extensión dende a que se chamou á macro, podémola obter en ${MACRO_EXTEN}.&lt;br /&gt;
&lt;br /&gt;
Para executar unha macro, no &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; temos dispoñible a aplicación &amp;quot;Macro&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; 1234,1,Macro(nome_macro, parametro1, parametro2, parametro3, ...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No exemplo que vemos na &amp;#039;&amp;#039;&amp;#039;Listaxe 3&amp;#039;&amp;#039;&amp;#039; usamos unha macro para o código que tiñamos, saltando á caixa de correos de voz se está ocupado. A esta macro chamarémola &amp;quot;extension-VM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 3: Extension VM&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[macro-extensionVM] &lt;br /&gt;
;esta macro recibirá dous parámetros&lt;br /&gt;
;o primero indica o dispositivo ó que hai que chamar&lt;br /&gt;
;o segundo é o número do buzón de voz ó que desviar a chamada&lt;br /&gt;
exten =&amp;gt; s,1,NoOp(chamada para ${ARG1})&lt;br /&gt;
exten =&amp;gt; s,n,Dial(${ARG1},20)&lt;br /&gt;
exten =&amp;gt; s,n,Goto(s-${DIALSTATUS},1)&lt;br /&gt;
&lt;br /&gt;
; si está ocupado, reprodúcese a mensaxe correspondente&lt;br /&gt;
exten =&amp;gt; s-BUSY,1,VoiceMail(${ARG2},b)&lt;br /&gt;
exten =&amp;gt; s-BUSY,n,Hangup&lt;br /&gt;
&lt;br /&gt;
; si non contesta, reprodúcese a mensaxe de &amp;quot;non dispoñible&amp;quot;&lt;br /&gt;
exten =&amp;gt; s-NOANSWER,1,VoiceMail(${ARG2},u)&lt;br /&gt;
exten =&amp;gt; s-NOANSWER,n,Hangup&lt;br /&gt;
&lt;br /&gt;
; en calqueira outro caso, facemos o mesmo que si non contesta.&lt;br /&gt;
exten =&amp;gt; s-.,1,Goto(s-NOANSWER,1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E adaptamos o contexto &amp;#039;&amp;#039;[a-extensions]&amp;#039;&amp;#039; para que use esta macro para chamar ós usuarios:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[a-extensions]&lt;br /&gt;
exten =&amp;gt; 2000,1,Macro(extensionVM,SIP/mendez,2000)&lt;br /&gt;
exten =&amp;gt; 2001,1,Macro(extensionVM,SIP/carlos,2001)&lt;br /&gt;
exten =&amp;gt; 2002,1,Macro(extensionVM,SIP/laura,2002)&lt;br /&gt;
exten =&amp;gt; 2003,1,Macro(extensionVM,IAX2/juan,2003)&lt;br /&gt;
exten =&amp;gt; 2004,1,Macro(extensionVM,IAX2/maria,2004)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto facilita moitísimo o mantemento do &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039;, e faino ao mesmo tempo máis lexible.&lt;br /&gt;
&lt;br /&gt;
== Gardar información na base de datos ASTDB ==&lt;br /&gt;
&lt;br /&gt;
Asterisk mantén determinada información sobre o seu estado actual nunha base de datos coñecida como &amp;#039;&amp;#039;&amp;#039;AstDB&amp;#039;&amp;#039;&amp;#039;. A información que se almacena nesta base de datos inclúe os datos de rexistro dos usuarios, estado das colas, etc. Isto permite que o sistema poida recuperar esta información en caso de ter que reiniciarse.&lt;br /&gt;
&lt;br /&gt;
A información na &amp;#039;&amp;#039;AstDB&amp;#039;&amp;#039; organízase en familias e identifícanse mediante unha chave que será única dentro da familia. Para cada familia e chave pódese almacenar un valor.&lt;br /&gt;
&lt;br /&gt;
Dende o &amp;#039;&amp;#039;CLI&amp;#039;&amp;#039; dispomos de distintos comandos cos que podemos acceder á información da &amp;#039;&amp;#039;AstDB&amp;#039;&amp;#039;, podendo tanto ler como escribir nela:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;database show &amp;lt;familia&amp;gt; &amp;lt;chave&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Amosa o contido da base de datos, podendo filtrar por familia e chave. Vemos un exemplo na &amp;#039;&amp;#039;Listaxe 4&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;database del  &amp;lt;familia&amp;gt; &amp;lt;chave&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Permite borrar un valor da base de datos.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;database deltree &amp;lt;familia&amp;gt; &amp;lt;árbore-de-chaves&amp;gt;&amp;#039;&amp;#039;&amp;#039;: . Borra toda unha árbore de claves da base de datos. Por exemplo, pode borrar toda a árbore &amp;quot;Registry&amp;quot; da familia &amp;quot;IAX&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;database put &amp;lt;familia&amp;gt; &amp;lt;chave&amp;gt; &amp;lt;valor&amp;gt;&amp;#039;&amp;#039;&amp;#039;: . Permite introducir información na base de datos (ver &amp;#039;&amp;#039;Listaxe 5&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 4: Contido da base de datos AstDB&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBX*CLI&amp;gt; database show&lt;br /&gt;
/IAX/Registry/caracas  : 192.168.15.209:4569:60&lt;br /&gt;
/IAX/Registry/juan    : 192.168.15.2:4570:60&lt;br /&gt;
/SIP/Registry/carlos  : 192.168.15.2:5060:3600:carlos:sip:carlos@192.168.15.2&lt;br /&gt;
&lt;br /&gt;
PBX*CLI&amp;gt; database show iax&lt;br /&gt;
/IAX/Registry/caracas        : 192.158.15.209:4569:60&lt;br /&gt;
/IAX/Registry/juan             : 192.168.15.2:4570:60&lt;br /&gt;
&lt;br /&gt;
PBX*CLI&amp;gt; database show iax registry/juan&lt;br /&gt;
/IAX/Registry/juan       : 192.168.15.2:4570:60&lt;br /&gt;
&lt;br /&gt;
PBX*CLI&amp;gt; database showkey iax/registry/juan&lt;br /&gt;
/IAX/Registry/juan       : 192.168.15.2:4570:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 5: Introducindo información&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBX*CLI&amp;gt; database put familia chave valor&lt;br /&gt;
Updated database successfully&lt;br /&gt;
&lt;br /&gt;
PBX*CLI&amp;gt; database show&lt;br /&gt;
/IAX/Registry/caracas        : 192.168.15.209:4569:60&lt;br /&gt;
/IAX/Registry/caracas        : 192.168.15.2:4570:60&lt;br /&gt;
/IAX/Registry/caracas        : 192.168.15.2:5060:3600:carlos:sip:carlos@192.168.15.2&lt;br /&gt;
/familia/chave               : valor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ler a información que Asterisk garda na base de datos pode resultar interesante para determinadas aplicacións, pero o verdadeiramente interesante desta base de datos é que nós podemos tamén gardar e ler información propia, para utiliza-la dende o &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039;. Para isto dispomos dunha serie de funcións:&lt;br /&gt;
&lt;br /&gt;
Gardar un valor na base de datos:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; s,1,Set( DB(familia/chave) = valor )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ler un valor da base de datos:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; s,1,Set( var = ${DB(familia/chave)})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comprobar se existe un valor para unha familia e chave:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; s,1,GotoIf ($[${DB_EXISTS(familia/chave)} = 0]?s,chamar)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No caso de existir un valor para a familia/chave, &amp;#039;&amp;#039;DB_EXISTS&amp;#039;&amp;#039; garda este valor na variable &amp;#039;&amp;#039;${DB_RESULT}&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Podemos probar a chamar ao número *78 e despois executar database &amp;#039;&amp;#039;show&amp;#039;&amp;#039; no &amp;#039;&amp;#039;CLI&amp;#039;&amp;#039;. Veremos que se gardou un rexistro na base de datos, da forma: &amp;#039;&amp;#039;DND/num_extension&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Agora actualizaremos a nosa macro ex-tensionVM para que teña en conta se o usuario ten activado o &amp;quot;non-molestar&amp;quot;, como podemos ver na &amp;#039;&amp;#039;Listaxe 6&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 6: Actualizando extension VM&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[macro-extensionVM]&lt;br /&gt;
; esta macro recibirá dous parámetros&lt;br /&gt;
; o primeiro indica o dispositivo ó que hai que chamar&lt;br /&gt;
; o segundo é o número do buzón de voz ó que desviar a chamada&lt;br /&gt;
exten =&amp;gt; s,1,NoOp(chamada para ${ARG1})&lt;br /&gt;
&lt;br /&gt;
; si NON ten activado o no-molestar, saltamos a &amp;quot;chamar&amp;quot;&lt;br /&gt;
exten =&amp;gt; s,n,Gotolf($[${DB_EXISTS(DND/${MACRO_EXTEN})} = 0]?s,chamar)&lt;br /&gt;
exten =&amp;gt; s,n(DND),Playback(vm-extension)&lt;br /&gt;
exten =&amp;gt; s,n,Playback(vm-isunavail)&lt;br /&gt;
exten =&amp;gt; s,n,Hangup&lt;br /&gt;
exten =&amp;gt; s,n(chamar),Dial(${ARG1},20)&lt;br /&gt;
exten =&amp;gt; s,n,Goto(s-${DIALSTATUS},1)&lt;br /&gt;
&lt;br /&gt;
; si está ocupado, reprodúcese a mensaxe correspondente&lt;br /&gt;
exten =&amp;gt; s-BUSY,1,VoiceMail(${ARG2},b)&lt;br /&gt;
exten =&amp;gt; s-BUSY,n, Hangup&lt;br /&gt;
&lt;br /&gt;
; si non contesta, reprodúcese a mensaxe de &amp;quot;non dispoñible&amp;quot;&lt;br /&gt;
exten =&amp;gt; s-NOANSWER,1,VoiceMail(${ARG2},u)&lt;br /&gt;
exten =&amp;gt; s-NOANSWER,n,Hangup&lt;br /&gt;
exten =&amp;gt; s-NOMOLESTAR,1,Playback(vm-extension)&lt;br /&gt;
exten =&amp;gt; s-NOMOLESTAR,n,Playback(vm-isunavail)	&lt;br /&gt;
exten =&amp;gt; s-NOMOLESTAR,n,Hangup&lt;br /&gt;
&lt;br /&gt;
; en calqueira outro caso, facemos o mesmo que si non contesta.&lt;br /&gt;
exten =&amp;gt; s-.,1,Goto(s-NOANSWER,1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Menú de voz interactivo ou IVR ==&lt;br /&gt;
&lt;br /&gt;
Un IVR é un menú onde o usuario pode interactuar mediante pulsaciones DTMF (tonos multifrecuencia) co sistema telefónico. As empresas adoitan usar estes menús, reproducindo unha mensaxe de benvida cando reciben unha chamada, e ofrecéndonos despois as típicas opcións de &amp;quot;pulse 1 para falar co departamento de ventas; 2 para falar con contabilidade...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:Exemplo-IVR.png]]&lt;br /&gt;
&lt;br /&gt;
Ésta sería a forma máis sinxela de IVR coñecido tamén como &amp;#039;&amp;#039;&amp;#039;Operadora Automática&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Asterisk ofrécenos todas as ferramentas necesarias para crear dende o &amp;#039;&amp;#039;IVR&amp;#039;&amp;#039; máis simple ata os sistemas máis complexos.&lt;br /&gt;
&lt;br /&gt;
O primeiro que necesitaremos para crear un IVR son os sons que se van a reproducir. Estes deben atoparse no directorio de sonidos do Asterisk, normalmente &amp;#039;&amp;#039;/var/lib/asterisk/sounds/&amp;#039;&amp;#039;, e ter un formato recoñecido por éste.&lt;br /&gt;
&lt;br /&gt;
Xunto con Asterisk se distribúe un xogo de sons estándar en inglés. Existen xogos de voces de gran calidade en castelán, pero normalmente necesitaremos algúns sons personalizados (&amp;quot;grazas por chamar ó Instituto San Clemente&amp;quot;, &amp;quot;pulse 1 para falar co departamento de informática...&amp;quot;, etc.).&lt;br /&gt;
&lt;br /&gt;
Aínda que é posible usar a aplicación Record de Asterisk para gravar as mensaxes , para obter a mellor calidade aconséllase gravalos cunha aplicación especializada ([http://audacity.sourceforge.net/?lang=es Audacity], por exemplo). Neste caso debemos gravar os arquivos a 8KHz e 16 bits.&lt;br /&gt;
&lt;br /&gt;
Para gravar mensaxes dende o &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; emprégase a aplicación &amp;#039;&amp;#039;Record&amp;#039;&amp;#039;, coa sintaxe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Record(nome.formato|silencio|maxDuracion|opcións)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si dentro do nome do arquivo engadimos os caracteres %d, éstes serán sustituídos por un número secuencial, para evitar que sobreescribamos unha gravación existente. Neste caso, a variable &amp;#039;&amp;#039;${RECORDED_FILE}&amp;#039;&amp;#039; conterá o nome final do arquivo. A aplicación Record gravará a mensaxe ata que o usuario pulse a tecla #, ou ben ata que chegue á duración máxima indicada como parámetro ou se detecten tantos segundos de silencio como se indicaron.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[servizos]&lt;br /&gt;
exten =&amp;gt; *77,1,Record(sonido-%d.alaw)&lt;br /&gt;
exten =&amp;gt; *77,n,Playback(beep)&lt;br /&gt;
exten =&amp;gt; *77,n,Playback(${RECORDED_FILE})&lt;br /&gt;
exten =&amp;gt; *77,n,Hangup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para programar os nosos IVR disporemos de algunhas aplicacións interesantes para o &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Playback(sonido)&amp;#039;&amp;#039;&amp;#039;: Reproduce un sonido&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;WaitExten(tempo)&amp;#039;&amp;#039;&amp;#039;: Espera a que o usuario teclee unha opción (ou un número de extensión).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Background(sonido)&amp;#039;&amp;#039;&amp;#039;: Reproduce un son, pero o usuario pode interrumpir a reproducción, tecleando un número de opción. Sería equivalente a empregar as aplicacións Playback y WaitExten de xeito simultáneo.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;GotoIfTime(hora|dias_semana|dias_mes|ano?si_certo:si_falso)&amp;#039;&amp;#039;&amp;#039;: Realiza un salto a outro punto do &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; dependendo da data e a hora. Resulta moi útil para actuar de xeito diferente si estamos en horario de oficina ou non.&lt;br /&gt;
&lt;br /&gt;
Para que non entre nun bucle infinito dispomos de dous tipos de retardo: tempo inter-dixito e tempo de resposta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Set(TIMEOUT(digit)=3)&lt;br /&gt;
Set(TIMEOUT(response)=9)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unha vez que o usuario comeza a teclear unha opción, o tempo máximo permitido entre díxitos será &amp;#039;&amp;#039;TIMEOUT(digit)&amp;#039;&amp;#039;. Si pasa este tempo dende o último díxito tecleado, o sistema considera que o usuario rematou de teclear o número da opción e saltará a esa extensión (ou opción). Si non existe, saltará á extensión &amp;quot;i&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Por outra parte, si o usuario non comeza a teclear unha opción no tempo indicado por &amp;#039;&amp;#039;TIMEOUT(response)&amp;#039;&amp;#039;, o &amp;#039;&amp;#039;IVR&amp;#039;&amp;#039; saltará á extensión &amp;quot;t&amp;quot;. (Ver Listaxe 7).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 7: Programando o IVR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; IVR ó que chegarán as chamadas entrantes&lt;br /&gt;
; A mensaxe de Benvida dice &amp;quot;Grazas por chamar ó IES San Clemente&lt;br /&gt;
; Para falar có departamento de Informática pulse 1, &lt;br /&gt;
; para falar có departamento de Idiomas pulse 2. &lt;br /&gt;
; Se coñece a extensión da persoa&lt;br /&gt;
;  coa que desexa falar, márquea agora&lt;br /&gt;
&lt;br /&gt;
[entrada]	&lt;br /&gt;
exten =&amp;gt; s,1,Set(TIMEOUT(digit)=3)&lt;br /&gt;
exten =&amp;gt; s,n,Set(TIMEOUT(response)=9)        &amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Comprobamos si estamos no horario do instituto&lt;br /&gt;
exten =&amp;gt; s,n,GotoIfTime(09:00-22:30|mon-fri|*|*?dentro_horario)&lt;br /&gt;
exten =&amp;gt; s,n,Playback(estamos-pechados-deixe-mensaxe)&lt;br /&gt;
exten =&amp;gt; s,n,VoiceMail(999,s)&lt;br /&gt;
exten =&amp;gt; s,n,Hangup&lt;br /&gt;
exten =&amp;gt; s,n(dentro_horario),Background(benvida)&lt;br /&gt;
exten =&amp;gt; s,n,WaitExten(10)&lt;br /&gt;
exten =&amp;gt; s,n, Goto (operadora)&lt;br /&gt;
&lt;br /&gt;
; Si elixe a opción 1, mandamos ó usuario á cola de Informatica&lt;br /&gt;
exten =&amp;gt; 1,1,Queue(informatica,t,60)&lt;br /&gt;
exten =&amp;gt; 1,n, Hangup&lt;br /&gt;
&lt;br /&gt;
; Si elixe a opción 2, mandamos ó usuario á cola de Idiomas&lt;br /&gt;
exten =&amp;gt; 2,1,Queue(idiomas,t,60)&lt;br /&gt;
exten =&amp;gt; 2,n,Hangup&lt;br /&gt;
&lt;br /&gt;
; Si elixe unha opción incorrecta, volvemos a darlle as instruccions&lt;br /&gt;
exten =&amp;gt; i,1,Goto(s,1)&lt;br /&gt;
&lt;br /&gt;
; Si non selecciona ningunha opción, o mandamos á cola de operadora&lt;br /&gt;
exten =&amp;gt; t,1,Queue(operadora)&lt;br /&gt;
&lt;br /&gt;
; Ó incluir o contexto a-extensions, permitimos que o usuario&lt;br /&gt;
; teclee un número de extensión directamente&lt;br /&gt;
include =&amp;gt; a-extensions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sala de Conferencias ==&lt;br /&gt;
&lt;br /&gt;
As salas de conferencia permiten que varios usuarios manteñan unha conversación entre eles, como si estiveran reunidos nunha mesma sala.&lt;br /&gt;
&lt;br /&gt;
As posibilidades que ofrece Asterisk para a creación de salas de conferencias son enormes, podendo crear salas nas que unha persoa pode falar mentras todos os demais escoitan, ou ben que todos poidan intervir ó mesmo tempo. &lt;br /&gt;
&lt;br /&gt;
Tamén existe a posibilidade de enmudecer ou expulsar a un usuario dunha sala durante a conferencia, bloquear para que non poidan entrar máis usuarios, gravar a conferencia, etc.&lt;br /&gt;
&lt;br /&gt;
Podemos definir unha serie de salas de xeito estático, no arquivo &amp;#039;&amp;#039;meetme.conf&amp;#039;&amp;#039;.  Este arquivo contén unha sección &amp;#039;&amp;#039;[general]&amp;#039;&amp;#039; cun único parámetro &amp;#039;&amp;#039;audiobuffers&amp;#039;&amp;#039; para indicar a cantidade de buffers que empregará a aplicación para amortiguar o jitter (retardo). &lt;br /&gt;
&lt;br /&gt;
Despois da sección &amp;#039;&amp;#039;[general]&amp;#039;&amp;#039; hay unha sección &amp;#039;&amp;#039;[rooms]&amp;#039;&amp;#039; coa definición das distintas salas de conferencias. Ver na &amp;#039;&amp;#039;&amp;#039;listaxe 8&amp;#039;&amp;#039;&amp;#039; un exemplo do arquivo &amp;#039;&amp;#039;meetme.conf&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Listaxe 8: Arquivo meetme.conf&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[general]&lt;br /&gt;
audiobuffers=5&lt;br /&gt;
&lt;br /&gt;
[rooms]&lt;br /&gt;
; Sala de conferencias n° 100, sin PIN&lt;br /&gt;
conf =&amp;gt; 100&lt;br /&gt;
&lt;br /&gt;
; Sala de conferencias n° 101 con PIN 1234&lt;br /&gt;
conf =&amp;gt; 101,1234&lt;br /&gt;
&lt;br /&gt;
; Sala de conferencias n° 102, con PIN 1234 e PIN de adminstrador 5544&lt;br /&gt;
conf =&amp;gt; 102,1234,5544&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aínda tamén é posible crear salas dinámicamente, por parte dos mesmos usuarios.&lt;br /&gt;
&lt;br /&gt;
A aplicación que empregaremos no &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039; para acceder ás salas de conferencias é &amp;#039;&amp;#039;Meetme&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; xxxx,n,Meetme(numero_de_sala[|opcions[|PIN]]])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As opcións que podemos especificar son as seguintes:&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;a.&amp;#039;&amp;#039;&amp;#039; Entrar en modo Administrador. O administrador pode bloquear a conferencia para que non entren máis participantes. (ver opción &amp;quot;s&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A.&amp;#039;&amp;#039;&amp;#039; Entrar en modo &amp;quot;marcado&amp;quot;. Cando este usuario salga da conferencia, ésta finaliza.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;b.&amp;#039;&amp;#039;&amp;#039; Executa o script AGI indicado en {MEETME_AGI_BACKGROUND}. Por defecto: conf-background.agi só funciona se todas as canles da conferencia son ZAP.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;c.&amp;#039;&amp;#039;&amp;#039; Reprodúcese un aviso indicando cantos usuarios hai na conferencia.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;d.&amp;#039;&amp;#039;&amp;#039; Crea a conferencia dinámicamente.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;D.&amp;#039;&amp;#039;&amp;#039; Crea a conferencia dinámicamente, e asígnalle un PIN.&lt;br /&gt;
&lt;br /&gt;
Ampliemos o noso contexto &amp;#039;&amp;#039;[servizos]&amp;#039;&amp;#039;, cunha extensión para crear e unirse a unha conferencia: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; 800,1,Meetme(,DMIsr)&lt;br /&gt;
exten =&amp;gt; 800,n,hangup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cando un usuario chame á extensión 800, o sistema pediralle que introduza un número de conferencia, terminando con #. O usuario pode asignar o número que desexe (con calquera cantidade de dígitos). &lt;br /&gt;
&lt;br /&gt;
Seguidamente terá que asignar un PIN a esta conferencia, e dicir o seu propio nome. Desta forma créase unha nova conferencia dinámicamente, co número asignado polo usuario (parámetro D).&lt;br /&gt;
&lt;br /&gt;
O usuario que creou a conferencia quedarase conectado, escoitando unha música en espera ata que se conecte un segundo usuario (parámetro M). &lt;br /&gt;
&lt;br /&gt;
Para que os demais usuarios se poidan unir á conferencia soamente teñen que marcar a extensión 800, teclear o número de conferencia que creou o primeiro usuario, e o mesmo PIN. &lt;br /&gt;
&lt;br /&gt;
Cada usuario que se une á conferencia deberá dicir o seu nome. Asterisk usará este nome para reproducir un aviso aos demais usuarios, indicando o nome de quen se une á conferencia, e de quen sae da mesma parámetro I). &lt;br /&gt;
&lt;br /&gt;
Durante a conferencia, cada usuario poderá marcar a tecla * para enmudecer a súa terminal ou adaptar os niveis de volume do audio que envía/recibe (parámetro s).&lt;br /&gt;
&lt;br /&gt;
E por último, a conferencia gravarase nun arquivo co nome &amp;#039;&amp;#039;meetme-conf-rec-&amp;lt;nº conferencia&amp;gt;-&amp;lt;ID unico&amp;gt;.wav&amp;#039;&amp;#039; no directorio &amp;#039;&amp;#039;/var/lib/asterisk/sounds/&amp;#039;&amp;#039;  (parámetro r). &lt;br /&gt;
&lt;br /&gt;
Tamén existe unha aplicación para administrar salas de conferencias desde o mesmo &amp;#039;&amp;#039;dialplan&amp;#039;&amp;#039;. Esta aplicación é &amp;#039;&amp;#039;MeetmeAdmin&amp;#039;&amp;#039; e a súa sintaxis é: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exten =&amp;gt; xxx.n,MeetmeAdmin (nº_conferencia|comando[|usuario]) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta aplicación, xunto coa opción &amp;quot;X&amp;quot; de &amp;#039;&amp;#039;Meetme&amp;#039;&amp;#039;, que permite que o usuario poida saír da conferencia tecleando un número de extensión dun só dígito, seranos moi útil para dar ao administrador da conferencia o poder de expulsar ou silenciar a aqueles usuarios molestos na conferencia.&lt;/div&gt;</summary>
		<author><name>Veiga</name></author>
	</entry>
</feed>