<?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>Asterisk &#124; Seduccion &#124; 10000 Horas</title>
	<atom:link href="http://10000horas.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://10000horas.com</link>
	<description>10000 horas se necesitan para alcanzar la maestria en algo.</description>
	<lastBuildDate>Fri, 09 Dec 2011 15:08:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Revisando las opciones de Text To Speech.</title>
		<link>http://10000horas.com/asterisk/2011/12/09/revisando-las-opciones-de-text-to-speech/</link>
		<comments>http://10000horas.com/asterisk/2011/12/09/revisando-las-opciones-de-text-to-speech/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 13:57:27 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[AGI]]></category>
		<category><![CDATA[diphone]]></category>
		<category><![CDATA[festival]]></category>
		<category><![CDATA[festival.init]]></category>
		<category><![CDATA[festvox]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google translator]]></category>
		<category><![CDATA[google tts]]></category>
		<category><![CDATA[guadalinex]]></category>
		<category><![CDATA[silvia]]></category>
		<category><![CDATA[text to speech]]></category>
		<category><![CDATA[tts]]></category>

		<guid isPermaLink="false">http://2.213</guid>
		<description><![CDATA[Tenia programado escribir en dos partes, sobre ASR y ahora sobre TTS (serian las dos cara de la moneda). Siguiendo con la linea de programacion con AGI, ahora se me ocurre la opcion de dotar de un servicio de Text &#8230; <a href="http://10000horas.com/asterisk/2011/12/09/revisando-las-opciones-de-text-to-speech/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tenia programado escribir en dos partes, sobre ASR y ahora sobre TTS (serian las dos cara de la moneda).</p>
<p><a href="http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/">Siguiendo con la linea de programacion con AGI</a>, ahora se me ocurre la opcion de dotar de un servicio de Text To Speech a nuestro Asterisk, del nivel AT&amp;T Natural Voices utilizando el mismo sistema que aplicamos con nuestro sistema ASR en el anterior mensaje (como es un servicio con un modelo ASP evidentemente no tendremos problemas de licencias siempre y cuando ese sistema permanezca en activo). Lo malo, claro esta, que si ese servicio se modifica (la URL por ejemplo), nos quedamos sin &#8220;negocio&#8221;. Por eso que es conveniente si el sistema lo utilizamos en produccion y somos capaces de rentabilizarlo, pasar a un sistema de TTS local en nuestro sistema.</p>
<p>Para mantenernos en una linea open source, tenemos la opcion de Festival, el problema es que es de muy baja calidad comparado a soluciones de pago o la que voy a proponer aqui, a traves del TTS de Google</p>
<p><strong>Texto a Voz con Google TTS</strong></p>
<p><a href="http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/">Vamos manos a la obra partiendo de la base AGI</a> voy a obviar que se hicieron todos los pasos del mensaje anterior para instalar lo necesario (php-curl, y php-agi lo mas importante), hacemos lo siguiente:</p>
<p>Primero vamos a descargar un sistema para convertir de MP3 a WAV.<br />
# aptitude install lame</p>
<p>Vamos a crear un Script PHP en /var/lib/asterisk/agi-bin/ podemos llamarlo por ejemplo asterisk-tts.php:</p>
<p><em>#!/usr/bin/php -q</em><br />
<em>&lt;?php</em></p>
<p><em>require_once(&#8216;phpagi-2.20/phpagi.php&#8217;);</em></p>
<p><em>$agi = new AGI();</em></p>
<p><strong># Necesitamos pasarle la Cadena de Texto desde el Asterisk, y la recogemos con esta variable.</strong><br />
<em>$traduccion = $argv[1];</em></p>
<p><strong># Aqui descargamos el fichero Mp3 haciendo pensar a Google que somos un Navegador</strong><br />
<em>shell_exec(&#8220;wget &#8211;header=&#8217;User-Agent:Mozilla/4.0&#8242; &#8216;http://translate.google.com/translate_tts?tl=es&amp;q=&#8221;.$traduccion.&#8221;&#8216; -O /var/lib/asterisk/sounds/google-tts.mp3&#8243;);<br />
</em><strong># Y convertimos el fichero con &#8220;lame&#8221; a wav que es reconocible por Asterisk</strong><br />
<em>shell_exec(&#8220;lame -h &#8211;decode /var/lib/asterisk/sounds/google-tts.mp3 /var/lib/asterisk/sounds/google-tts.wav&#8221;);</em></p>
<p><em>$retString = &#8220;Fin de la conversion&#8221;;</em><br />
<em>$agi-&gt;verbose($retString);</em></p>
<p><em>?&gt;</em></p>
<p>Finalmente creamos una extension en nuestro DialPlan para que haga esta &#8220;gestion&#8221;:</p>
<p>exten =&gt; 2000,1,Answer()<br />
same =&gt; n,Set(TTSVAR = &#8220;Lo que queramos convertir&#8221;)<br />
same =&gt; n,AGI(asterisk-tts.php,${TTSVAR})<br />
same =&gt; n,Playback(google-tts)<br />
same =&gt; n,Hangup()</p>
<p>Y ya esta, recargamos el dialplan como siempre, y marcando la extension 2000 oiremos con una voz muy sensual: &#8220;Lo que queramos convertir&#8221; &#8230; o algo asi <img src='http://10000horas.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como veis la dificultad de implantacion es nula, y eso es lo que mas me ha gustado de AGI, que no hace falta estar creando aplicaciones en C-Arcaico y recompilando el Asterisk con la app_c_arcaico y podemos tener una funcionalidad semejante (aunque no nativa y para los mas sibaritas, con menos rendimiento en terminos de picosegundos). Lo que tampoco tengo muy claro es que Google este feliz que esten utilizando su TTS masivamente, aunque estoy seguro que ya habra por ahi algun Call-Center que lo este haciendo. Si tienen experiencia me gustaria que me lo comentaran.</p>
<p><strong>Texto a Voz con Festival TTS</strong></p>
<p>Ahora os voy a explicar como hacer lo mismo, pero con el sistema TTS Festival en local, que os comente antes, y asi podeis comparar que os gusta mas:</p>
<p>Festival TTS digamos que fue desarrollado por una universidad e incorporado nativamente en Asterisk, asi que eso simplifica bastante las cosas ya que existe una Aplicacion especifica para el tratamiento de Texto a Voz directamente para el dial Plan (el modulo app_festival.so). Primero tenemos que comprobar si lo tenemos preparado.</p>
<p>Desde el CLI&gt; module show like festival</p>
<p>Si aparece algo asi como app_festival.so y &#8220;1 modules loaded&#8221;, entonces ya lo tenemos, sino, nos toca recompilar Asterisk y en la parte de make menuselect tenemos que seleccionar el app_festival antes de hacer el &#8220;make &amp;&amp; make install&#8221;</p>
<p>Ahora vamos a instalar festival</p>
<p>#aptitude install festival</p>
<p>Y ahora necesitamos voces en Español. Yo vivo en Andalucia ahora mismo, asi que barriendo para casa tenemos las que usa la junta de andalucia en la forja de Guadalinex:<br />
<a href="http://forja.guadalinex.org/frs/?group_id=21">http://forja.guadalinex.org/frs/?group_id=21</a></p>
<p>Vamos a descargar las de Silvia, para comparar el grado de sensualidad con respecto a Isabel de Google, todo sea por motivar a nuestros clientes varones.</p>
<p># wget http://forja.guadalinex.org/frs/download.php/154/festvox-sflpc16k_1.0-1_all.deb<br />
#dpkg -i  festvox-sflpc16k_1.0-1_all.deb<br />
Y borramos el fichero de configuracion de festival que crea automaticamente, para poder utilizar mejor, el generico de Festival.<br />
#rm /etc/festival.scm</p>
<p>La voz queda automaticamente instalada en la ruta:<br />
/usr/share/festival/voices/spanish/JuntaDeAndalucia_es_sf_diphone</p>
<p>Ahora necesitamos <a href="http://www.voip-info.org/wiki/view/Asterisk+festival+installation">modificar el archivo de configuracion de Festival</a> por defecto ubicado en /usr/share/festival/festival.scm al final del fichero agregamos:</p>
<p><em>(set! voice_default &#8216;voice_JuntaDeAndalucia_es_sf_diphone)</em><br />
<em>(define (tts_textasterisk string mode)</em><br />
<em>(let ((wholeutt (utt.synth (eval (list &#8216;Utterance &#8216;Text string)))))</em><br />
<em>(utt.wave.resample wholeutt 8000)</em><br />
<em>(utt.wave.rescale wholeutt 5)</em><br />
<em>(utt.send.wave.client wholeutt)))</em><br />
<em>(set! server_access_list &#8216;(&#8220;localhost\.localdomain&#8221; &#8220;localhost&#8221;))</em></p>
<p>Con esto, nos permitira por un lado utilizar la voz de Silvia y por otro lado arrancar el servidor Festival</p>
<p>Ahora necesitamos configurar el servidor Festival, bajamos los ficheros de desarrollo de festival<br />
#aptitude install festival-dev</p>
<p>Y copiamos el fichero de autoarranque de festival a nuestro /etc/init.d para que arranque automaticamente el servidor cada vez que iniciemos nuestra maquina Asterisk:<br />
#cp  /usr/share/doc/festival/examples/festival.init /etc/init.d/festival<br />
#chmod +x /etc/init.d/festival</p>
<p>Antes de arrancar el servidor de Festival, necesitamos añadir una linea en /etc/default/festival:<br />
RUN_FESTIVAL = yes</p>
<p>Y ahora si podemos arrancar el servidor Festival con exito:<br />
/etc/init.d/festival start</p>
<p>Y para que arranque cada vez que iniciamos el sistema:<br />
#ln -s /etc/init.d/festival /etc/rcS.d/S99festival</p>
<p>Ya esta todo casi listo, solo nos queda la parte mas facil, crear una extension en el DialPlan para ejectuar la aplicacion Festival<br />
exten=&gt; 3000,1,Answer()<br />
same =&gt; n,Festival(Lo que queramos convertir)<br />
same =&gt; n,Hangup()</p>
<p>Recargamos el dialplan como siempre y si marcamos la extension 3000, tendremos a Silvia dandonos el resultado.</p>
<p>Algunas cosas curiosas que he observado.<br />
La version 1.0-1 de Guadalinex para Pedro parece que esta mal empaquetada. Instala sobre la version de Silvia (es_sf) en vez de (es_pa)<br />
Se puede resolver de varias formas, una es, bajando las fuentes  (Archivos de desarrollo de la voz de Pedro) en el directorio correspondiente /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone</p>
<p>Necesitamos desempaquetar tambien el .deb de Pedro con el comando &#8220;ar&#8221; (#ar x festvox-palpc16k_1.0-1_all.deb)<br />
Y luego descomprimir data.tar.gz y a traves de la estructura de directorios llegar a &#8230;/usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group<br />
Cambiamos el nombre al fichero que hay y lo copiamos a un nuevo directorio group dentro de nuestro directorio de Pedro antes creado<br />
#mkdir /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group<br />
#mv  sflpc16k.group /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group/palpc16k.group<br />
O lo ideal si a  alguien le interesa que arregle ese fichero deb, no voy a ser yo, porque no me gusta demasiado.</p>
<p>Si tuviera que elegir personalmente un fichero para Festival en Español, eligiria de hecho, el fichero por defecto de festvox en español (el_diphone) que es el que mejor se entiende para mi gusto, aunque es voz masculina asi que no podriamos comparar bien para este ejemplo.<br />
Se puede descargar y configurar siguendo los mismos pasos que antes, pero en el idioma por defecto poner &#8220;voice_el_diphone&#8221;<br />
# aptitude install festvox-ellpc11k</p>
<p>Ahora puestos a comparar entre Festival TTS y Google TTS, creo que no hay color, pero para gustos los colores. Espero vuestras experiencias en el mundo del TTS.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/12/09/revisando-las-opciones-de-text-to-speech/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/12/09/revisando-las-opciones-de-text-to-speech/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://translate.google.com/translate_tts?tl=es&amp;amp" length="0" type="audio/mpeg" />
		</item>
		<item>
		<title>Un AGI Legendario: Publicacion en Twitter mediante ASR</title>
		<link>http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/</link>
		<comments>http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 22:57:39 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[access token]]></category>
		<category><![CDATA[AGI]]></category>
		<category><![CDATA[agi-bin]]></category>
		<category><![CDATA[asr]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[automatic speech recognition]]></category>
		<category><![CDATA[consumer key]]></category>
		<category><![CDATA[consumer secret]]></category>
		<category><![CDATA[flac]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google asr]]></category>
		<category><![CDATA[logger.conf]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[php-agi]]></category>
		<category><![CDATA[reconocimiento de voz automatico]]></category>
		<category><![CDATA[RVA]]></category>
		<category><![CDATA[tweet]]></category>
		<category><![CDATA[twiiter oauth]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[twitter keys]]></category>
		<category><![CDATA[verbose]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://2.204</guid>
		<description><![CDATA[Para muchos, hoy es un dia de fiesta en España, pero para mi, es mi, es como el dia oficial de Asterisk, y me siento especialmente inspirado. Y aprovechando el momento estuve planteando alguna aplicacion curiosa que hacer con AGI. &#8230; <a href="http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Para muchos, hoy es un dia de fiesta en España, pero para mi, es mi, es como el dia oficial de Asterisk, y me siento especialmente inspirado. Y aprovechando el momento estuve planteando alguna aplicacion curiosa que hacer con AGI.</p>
<p>Echando la mirada atras, <a href="http://10000horas.com/asterisk/2011/11/19/advanced-asterisk-days-4-y-5/" target="_blank">durante el penultimo dia del Asterisk Advanced</a>, tuvimos una breve introduccion al AGI (Asterisk Gateway Interface), y porque no decirlo, a mi me resulto de lo mas interesante del curso. Siempre habia sabido que existia tanto AMI como AGI pero hasta ese momento no me &#8220;atrevi&#8221; a profundizar, sea por desconocimiento, y por complejidad aparente.</p>
<p>De hecho, concretamente en ese mensaje del Dia 4 del curso, no publique nada acerca de estos interfaces de Asterisk, porque me resultaban lo suficientemente interesantes e importantes como para minimo dedicarle uno o varios mensajes a los mismos.</p>
<p>Y aqui va el primero. Durante el curso, la practica basicamente se trataba, de llamando a una extension, esta ejecutaba un script PHP a traves de AGI y se publicaba un tweet generico con cierta informacion en un usuario especifico para el curso (por interes todos van aqui: <a href="http://twitter.com/#!/agilabtest">http://twitter.com/#!/agilabtest</a>)</p>
<p>Realmente la practica lo daba todo bastante &#8220;masticado&#8221;, los scripts hechos, y exactamente lo que era necesario para que funcionara, y lo que habia que modificar en el DialPlan.</p>
<p>Pero ahora, aprovechando esta idea, se me ocurrio ir un paso mas alla y ademas de poder explicarlo todo un poco mas en detalle, ampliar la funcionalidad a algo muy interesante: Poder escribir un tweet en nuestro Twitter, llamando a traves de una extension, y diciendo lo que queremos escribir, con un sistema de Automatic Speech Recognition, ASR, o Reconocimiento de Voz Automatico, y lo mejor de todo, sin coste alguno (¿es posible?). Hoy me quede con la cita <strong>&#8220;Everything is possible, even impossible is: <span style="text-decoration: underline;">I&#8217;m possible</span>&#8220;</strong> y tambien aporto su granito.</p>
<p>En primer lugar vamos a &#8220;preparar&#8221; el sistema con algunos componentes basicos.</p>
<p>Por un lado necesitamos una libreria para poder trabajar con PHP a traves de AGI, llamada PHP-AGI. Es posible su descarga desde aqui:<br />
<a href="http://phpagi.sourceforge.net/">http://phpagi.sourceforge.net/</a></p>
<p>Para este ejemplo yo recomiendo la version 2.2X puesto que si en un futuro saliera una version superior es posible que el script aqui realizado ya dejara de funcionar<br />
La descargamos  <a href="http://sourceforge.net/projects/phpagi/files/phpagi/2.20/phpagi-2.20.tgz/download">http://sourceforge.net/projects/phpagi/files/phpagi/2.20/phpagi-2.20.tgz/download</a></p>
<p>Y descomprimimos aqui: /var/lib/asterisk/agi-bin/<br />
#mv ./phpagi-2.20.tgz /var/lib/asteirsk/agi-bin/<br />
#cd /var/lib/asteirsk/agi-bin/<br />
#tar -xvf phpagi-2.20.tgz</p>
<p>Ahora por otro lado necesitamos un script en php escificamente creado para &#8220;operar&#8221; con Twitter,  (de hecho es generico, serviria incluso para desarrollar nuestras propias aplicaciones en php en relacion a Twitter).  Aqui hay varias librerias para Twitter: <a href="https://dev.twitter.com/docs/twitter-libraries#php">https://dev.twitter.com/docs/twitter-libraries#php</a> .</p>
<p>Pero la que nos interesa para este caso es la siguiente: <a href="http://classes.verkoyen.eu/twitter_oauth">http://classes.verkoyen.eu/twitter_oauth</a></p>
<p>La descargamos:</p>
<p>#mkdir twitter-oauth<br />
#cd twitter-ouath<br />
#wget https://github.com/tijsverkoyen/TwitterOAuth/zipball/2.1.2 -O twitter-oauth.zip<br />
#unzip twitter-oauth.zip<br />
Nos crea un directorio con un nombre sacado de GitHub asi que entramos en ese directorio<br />
# cd  &lt;directorio-recien-creado&gt;<br />
# cp twitter.php ../../twitter.php</p>
<p>Asi ya tenemos el script este en nuestro directorio AGI-BIN</p>
<p>Estos scripts utilizan PHP-CURL, asi que, si no lo tenemos instalado es un buen momento para hacerlo:<br />
#aptitude install php5-curl</p>
<p>Tambien nos va a hacer falta un conversor de WAV a FLAC para el Reconocimiento de Voz Automatico. En este caso, instalamos SOX si es que no lo tenemos ya.<br />
#aptitude install sox</p>
<p>Antes de crear el script, necesitamos algo muy importante. Las claves del API de Twitter para el desarrollo de aplicaciones. De hecho necesitamos crear y autorizar una aplicacion en Twitter que va a ser con la que va a operar nuestro Script. Para ello entramos en:<br />
<a href="https://dev.twitter.com/user/login?destination=home">https://dev.twitter.com/user/login?destination=home</a></p>
<p>Accedemos con nuestra cuenta de Twitter. Le damos a &#8220;Create an app&#8221;. Ponemos un nombre, una descripcion y una web, si no teneis web, pues poned http://www.10000horas.com para promocionarla !<br />
Despues creamos la aplicacion. Ya en la aplicacion nos vamos a &#8220;Settings&#8221; y tenemos que picar la opcion: &#8220;Read, Write and Access direct messages&#8221;. Considerad que vamos a escribir directamente en nuestro tweeter por tanto es fundamental que este permiso este &#8220;activado&#8221;.</p>
<p>Finalmente necesitamos todas las claves para el script a continuacion y apuntarlas. Son las siguientes<br />
1. Consumer key<br />
2. Consumer secret<br />
Abajo picamos en &#8220;Create my access Token&#8221; y apareceran dos claves mas:<br />
3. Access token<br />
4. Access token secret<br />
Fijaros que abajo del todo ponga Access Level: Read, write, and direct messages, si pone otra cosa, teneis que fijar el tipo de acceso como comente antes, y volver a recrear las claves.</p>
<p>Y ahora nos toca crear dentro de AGI-BIN el script que vamos a ejecutar desde la Aplicacion AGI en el Dialplan</p>
<p>En este caso creamos un fichero llamamosle por ejemplo agitwitter.php, con el siguiente contenido (gran parte esta extraido del contenido del script ofrecido en las practicas del Asterisk Advanced, por eso hemos utilizado el script Twitter-Oauth de Tijs Verkonyen, en vez de cualquier otro, una cuestion de ahorro de tiempo).</p>
<p><em>#!/usr/bin/php -q</em></p>
<p><em>&lt;?php</em></p>
<p><strong># Aqui cargamos el script twitter.php y el phpagi que descargamos antes.</strong><br />
<em>require_once(&#8216;twitter.php&#8217;);</em><br />
<em>require_once(&#8216;phpagi-2.20/phpagi.php&#8217;);</em></p>
<p><strong># Creamos un nuevo objeto tipo AGI </strong><br />
<em>$agi = new AGI();</em><br />
<em>$agi-&gt;answer();</em></p>
<p><strong># Aqui ponemos las credeciales que obtuvimos antes, en el mismo orden<br />
# Estas que aparecen aqui son las de un usuario que cree de pruebas <a href="http://twitter.com/#!/pruebasadvanced">http://twitter.com/#!/pruebasadvanced</a><br />
</strong><em>$consumerKey = &#8216;xIpIGMm3kP610xh1sJVDCA&#8217;;<br />
</em><em>$consumerSecret = &#8216;vBT8eufZInFTPt02tGZeNdrb7o3YFDspCmtknS48JxY&#8217;;<br />
</em><em>$accessToken = &#8217;414849063-IUB9SgA2fVr6vgk6zpYoJWAxwolGmlyA8qw361Z8&#8242;;<br />
</em><em>$accessTokenSecret = &#8216;ofo0kZrUTIXWJ1tul8zazifrNEhc0qTabzqHBADctvA&#8217;;</em></p>
<p><strong># Aqui viene lo mejor del mensaje. Con estas lineas conseguimos un reconocimiento automatico de voz gracias a un servicio que pocos conocen</strong><br />
<strong># y que ofrece el equipo de Google gratuitamente (al menos hasta lo que yo se).<br />
# Creditos por ofrecerme este descubrimiento a <a href="http://www.ardumania.es/">http://www.ardumania.es</a></strong></p>
<p><strong># Primero convertimos el fichero que generamos desde Asterisk a formato FLAC (que es el que admite Google)</strong><em><br />
shell_exec(&#8220;sox  <em>/var/lib/asterisk/sounds/<em>twitter.wav <em><em>/var/lib/asterisk/sounds/<em>twitter.flac&#8221;);</em></em></em></em></em></em></p>
<p><strong># Despues lanzamos una peticion a Google para que nos convierta el fichero FLAC en texto, nos devuelve una cadena de texto formato JSON</strong><em><br />
$linea = shell_exec(&#8220;wget &#8211;post-file /var/lib/asterisk/sounds/twitter.flac &#8211;header=&#8217;Content-Type: audio/x-flac; rate=8000&#8242; -O &#8211; &#8216;http://www.google.com/speech-api/v1/recognize?lang=es_ES&#8217;&#8221;);</em></p>
<p><strong># Convertimos esa cadena JSON gracias a PHP en un objeto directamente</strong><em><br />
$obj = json_decode($linea);</em></p>
<p><strong># Y conociendo la estructura exacta de ese objeto (contiene mucha mas informacion interesante, como la &#8220;calidad&#8221; de la conversion), sacamos el texto ya convertido</strong><em><br />
$tweet = $obj-&gt;{&#8220;hypotheses&#8221;}[0]-&gt;{&#8220;utterance&#8221;};</em></p>
<p><strong># Ya en adelante simplemente lo que hacemos es utilizando las funciones del script Twitter-Oauth publicamos en Twitter nustro Tweet</strong><em><br />
try </em><br />
<em>{</em><br />
<em> $t = new Twitter($consumerKey, $consumerSecret);</em><br />
<em> $t-&gt;setOAuthToken($accessToken);</em><br />
<em> $t-&gt;setOAuthTokenSecret($accessTokenSecret);</em></p>
<p><em> $retArray = $t-&gt;statusesUpdate($tweet);</em><br />
<em> $retString = &#8220;SUCCESS: Tweet id &#8221; . $retArray['id_str'] . &#8221; posted at &#8221; . $retArray['created_at'];</em><br />
<em>}</em><br />
<em>catch(Exception $e) </em><br />
<em>{</em><br />
<em> $retString = &#8220;FAILURE: &#8221; . $e-&gt;getMessage();</em><br />
<em>}</em></p>
<p><strong># Para terminar reportamos a Asterisk el resultado (si tenemos activada la opcion verbose en nuestro CLI podremos ver el mensaje de exito si salio bien la cosa</strong><em><br />
$randNum = rand(1000, 9999);</em><br />
<em>$retString .= &#8220;. ID &#8221; . $randNum;</em><br />
<em>$agi-&gt;verbose($retString);</em><br />
<em>$agi-&gt;hangup();</em></p>
<p><em>?&gt;</em><br />
Ahora una vez que tenemos el script PHP listo, solo nos falta editar nuestro DialPlan para ejecutarlo. En este caso he creado una extension minima para que podamos obtener el resultado que estamos buscando</p>
<p>exten =&gt; 1000,1,Answer()<br />
same =&gt; n,Record(twitter.wav)<br />
same =&gt; n,AGI(agitwitter.php)<br />
same =&gt; n,Hangup()</p>
<p>Recargamos nuestro dialplan (CLI&gt; dialplan reload) y listo!</p>
<p>Un tema muy importante para que todo esto funcione y que creo que a estas alturas sobra decir: <strong>ES FUNDAMENTAL TENER ACCESO A INTERNET EN NUESTRA MAQUINA ASTERISK</strong></p>
<p>Esa es la unica &#8220;contrapartida&#8221; de poder tener un ASR gratuito y de maxima calidad&#8230; creo que en muchos casos es asumible. En otro caso tendremos que plantearnos otras alternativas de reconocimiento de voz automatico como por ejemplo Verbio recomendado por Avanzada 7 o LumenVox recomendado por Digium (que son de pago y nada baratos), o buscarnos la vida con CMUSphinx que es OpenSource y no esta mal (aunque  de momento es muy inferior tanto al ASR de Google y a los dos de pago).</p>
<p>Ahora desde nuestro telefono solo nos queda hacer esa llamada de cortesia a  la extension 1000, suena el tono de hablar, decimos lo que queramos publicar en nuestro tweet (sobra decir que cuanto mas claro hablemos mejor, y si decimos palabra a palabra mejor aun para mejorar el reconocimiento, aunque el ASR de Google para mi gusto es el mejor del mundo y es capaz incluso de reconocer las frase hecha sin demasiada vocalizacion con un amplio numero de aciertos). Despues de hablar pulsamos la Almohadilla (#) para guardar el fichero de Voz (twitter.wav) y finalmente esperamos a que Asterisk haga el resto.</p>
<p>Entramos en nuestro Twitter&#8230; y voila! Nuestro mensaje recien escrito (si todo fue bien, sino, como comente, recomiendo activar en el fichero /etc/asterisk/logger.conf para CLI (console =&gt;) la posibilidad de verbose, asi podemos ver los resultados que nos devuelve el script PHP y si hay error, lo que captura el &#8220;catch&#8221; del script PHP).</p>
<p>Esta vez que con un solo mensaje he matado dos pajaros de un tiro: explicacion de una implementacion de ASR en Asterisk y el funcionamiento de AGI utilizando PHP (que hay que reconocer que a dia de hoy desde que salio PHP5 es el lenguaje de programacion interpretado que mas me gusta, aunque todo esto tambien se podria haber realizado en otros como Ruby On Rails o Python, si os fijasteis en la pagina de scripts para Twitter habia para varios lenguajes).</p>
<p>Y como siempre, y una vez mas, que cualquier comentario sera ampliamente bienvenido! Espero que les sea de provecho.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/12/08/un-agi-legendario-publicacion-en-twitter-mediante-asr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Montando un Sistema Asterisk Autonomo I</title>
		<link>http://10000horas.com/asterisk/2011/12/08/montando-un-sistema-asterisk-autonomo-i/</link>
		<comments>http://10000horas.com/asterisk/2011/12/08/montando-un-sistema-asterisk-autonomo-i/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 12:43:42 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[asterisk advanced]]></category>
		<category><![CDATA[asterisk realtime]]></category>
		<category><![CDATA[freepbx]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[odbc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[sip]]></category>
		<category><![CDATA[sip.conf]]></category>
		<category><![CDATA[sippeers]]></category>
		<category><![CDATA[sip_buddies]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://2.191</guid>
		<description><![CDATA[Durante el curso de Asterisk Advanced, una de las cuestiones que surgieron con los compañeros, era el tema de la &#8220;practicidad&#8221; eventual que podia surgir a la hora de decidir montar una interfaz grafica a pesar de que muchos hayan &#8230; <a href="http://10000horas.com/asterisk/2011/12/08/montando-un-sistema-asterisk-autonomo-i/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Durante el <a href="http://10000horas.com/asterisk/2011/11/13/volviendo-a-asterisk-casi-1-ano-despues/">curso de Asterisk Advanced</a>, una de las cuestiones que surgieron con los compañeros, era el tema de la &#8220;practicidad&#8221; eventual que podia surgir a la hora de decidir montar una interfaz grafica a pesar de que muchos hayan criticado, es el simple hecho que otorga un &#8220;sistema&#8221; para que manos inexpertas (bajo nuestra aprobacion y previamente formados), puedan tomar el control de nuestro Asterisk sin nuestra supervision constante.</p>
<p>Evidentemente<a href="http://www.sinologic.net/blog/2011-11/mejor-editar-archivos-conf-que-interfaz-web/" target="_blank"> surgen algunas inconveniencias</a>, que son inevitables en este tipo de situaciones, pero en las manos adecuadas, pueden ser mas pros que contras (por ejemplo explicandole a un equipo tecnico o IT funcionalidades basicas de Asterisk como crear nuevas extensiones para poder cursar llamadas. De esto se trata la idea de montar un sistema Autonomo (al menos autonomamente de nuestra persona).</p>
<p>Un paso mas alla, viendo el sistema RealTime de Asterisk, se me ocurrio la -evidente- idea de crear una micro interfaz grafica (por ejemplo basada en web con PHP como sera el caso que exponga a continuacion), para gestionar esos aspectos de Asterisk especificos, y poder definitivamente, tomando esto como ejemplo generico, poder obviar todas esas interfaces graficas (ejemplo FreePBX) para siempre.</p>
<p>Lo que me planteo de ejemplo ahora: Activar RealTime para los &#8220;peers&#8221; SIP de nuestro Asterisk y crear la interfaz grafica web en PHP para Crear y Borrar estas extensiones (La funcion de editar seria Borrar y volver a crear para este ejemplo sencillo, aunque realmente no seria nada dificil de implementar)</p>
<p>Como ya comente en su momento en otro mensaje, el montaje de un sistema RealTime es verdaderamente secuencial, <a href="http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-3/" target="_blank">es mas ya lo hicimos en las practicas durante Asterisk Advanced en detalle</a>.</p>
<p><span style="text-decoration: underline;">En primer lugar</span>, obviamente necesitamos tener instalado un sistema de gestion de bases de datos como MySQL, tambien un servidor web como Apache, y los modulos de PHP para el mismo. En este caso, como ya vimos antes, LAMP es lo ideal. Asi que ejecutamos <strong>tasksel </strong>y lo instalamos (LAMP Server, Ubuntu/Debian)</p>
<p>Tambien necesitamos las librerias de ODBC puesto que vamos a utilizarlas con Asterisk:</p>
<p># aptitude install unix-odbc<br />
# aptitude install libmyodbc</p>
<p><span style="text-decoration: underline;">En segundo lugar</span>, configuramos la base de datos y la tabla donde volcar los usuarios SIP:</p>
<p>- Creamos un fichero por ejemplo en /tmp/ llamado por ejemplo sip_buddies.sql con esta informacion (se puede encontrar mas informa acerca de la tabla asociada a los peers SIP  aqui). Atencion al ultimo campo que coloreo en Rojo. Muy importante que lo agreguéis manualmente para lo que vamos a tratar de hacer a continuacion</p>
<p>CREATE TABLE `sip_buddies` (<br />
`id` int(11) NOT NULL auto_increment,<br />
`name` varchar(80) NOT NULL default &#8221;,<br />
`host` varchar(31) NOT NULL default &#8221;,<br />
`nat` varchar(5) NOT NULL default &#8216;no&#8217;,<br />
`type` enum(&#8216;user&#8217;,'peer&#8217;,'friend&#8217;) NOT NULL default &#8216;friend&#8217;,<br />
`accountcode` varchar(20) default NULL,<br />
`amaflags` varchar(13) default NULL,<br />
`call-limit` smallint(5) unsigned default NULL,<br />
`callgroup` varchar(10) default NULL,<br />
`callerid` varchar(80) default NULL,<br />
`cancallforward` char(3) default &#8216;yes&#8217;,<br />
`canreinvite` char(3) default &#8216;yes&#8217;,<br />
`context` varchar(80) default NULL,<br />
`defaultip` varchar(15) default NULL,<br />
`dtmfmode` varchar(7) default NULL,<br />
`fromuser` varchar(80) default NULL,<br />
`fromdomain` varchar(80) default NULL,<br />
`insecure` varchar(4) default NULL,<br />
`language` char(2) default NULL,<br />
`mailbox` varchar(50) default NULL,<br />
`md5secret` varchar(80) default NULL,<br />
`deny` varchar(95) default NULL,<br />
`permit` varchar(95) default NULL,<br />
`mask` varchar(95) default NULL,<br />
`musiconhold` varchar(100) default NULL,<br />
`pickupgroup` varchar(10) default NULL,<br />
`qualify` char(3) default NULL,<br />
`regexten` varchar(80) default NULL,<br />
`restrictcid` char(3) default NULL,<br />
`rtptimeout` char(3) default NULL,<br />
`rtpholdtimeout` char(3) default NULL,<br />
`secret` varchar(80) default NULL,<br />
`setvar` varchar(100) default NULL,<br />
`disallow` varchar(100) default &#8216;all&#8217;,<br />
`allow` varchar(100) default &#8216;g729;ilbc;gsm;ulaw;alaw&#8217;,<br />
`fullcontact` varchar(80) NOT NULL default &#8221;,<br />
`ipaddr` varchar(15) NOT NULL default &#8221;,<br />
`port` smallint(5) unsigned NOT NULL default &#8217;0&#8242;,<br />
`regserver` varchar(100) default NULL,<br />
`regseconds` int(11) NOT NULL default &#8217;0&#8242;,<br />
`lastms` int(11) NOT NULL default &#8217;0&#8242;,<br />
`username` varchar(80) NOT NULL default &#8221;,<br />
`defaultuser` varchar(80) NOT NULL default &#8221;,<br />
`subscribecontext` varchar(80) default NULL,<br />
`useragent` varchar(20) default NULL,<br />
<span style="color: #ff0000;"><strong>`useradmin`  int(1) NOT NULL DEFAULT &#8217;0&#8242;,</strong></span><br />
PRIMARY KEY (`id`),<br />
UNIQUE KEY `name` (`name`),<br />
KEY `name_2` (`name`)<br />
) ENGINE=MyISAM ROW_FORMAT=DYNAMIC;</p>
<p><strong>#mysql -p</strong><br />
Entramos con nuestra password<br />
mysql&gt; create database asterisk;<br />
mysql&gt; use asterisk;<br />
mysql&gt; source /tmp/sip_buddies.sql</p>
<p><span style="text-decoration: underline;">En tercer lugar</span> vamos a configurar los ficheros basicos de Asterisk para poder trabajar con el conector ODBC</p>
<p>/etc/asterisk/extconfig.conf</p>
<p>[settings]<br />
sippeers =&gt; odbc,asterisk ,sip_buddies</p>
<p>/etc/asterisk/res_odbc.conf</p>
<p>[asterisk]<br />
enabled =&gt; yes<br />
pre-connect =&gt; yes<br />
dsn =&gt; asterisk<br />
username =&gt; root<br />
password =&gt; (el password que le pusimos al usuario de la base de datos mysql root durante la configuracion de LAMP)</p>
<p>/etc/odbc.ini</p>
<p>[asterisk]<br />
Description = ODBC para MySQL<br />
Driver = MySQL<br />
Server = localhost<br />
Database = asterisk<br />
Socket = <a href="file:///C:/var/run/mysqld/mysqld.sock">/var/run/mysqld/mysqld.sock</a></p>
<p>/etc/odbcinst.ini</p>
<p>[MySQL]<br />
Description = MySQL ODBC MyODBC Driver<br />
Driver = /usr/lib/odbc/libmyodbc.so<br />
Setup = /usr/lib/odbc/libodbcmyS.so</p>
<p>Con esto vamos al CLI de Asterisk<br />
# asterisk -r<br />
CLI&gt; odbc show</p>
<p>Y si vemos &#8220;Connected: Yes&#8221; entonces ya esta preparado</p>
<p><span style="text-decoration: underline;">En cuarto lugar</span> vamos a configurar los usuarios SIP:</p>
<p>Para ello creamos un fichero temporal por ejemplo /tmp/usuarios_sip_buddies.sql con la siguiente info:</p>
<p>INSERT INTO sip_buddies (`name`, `host`, `nat`, `type`, `cancallforward`, `canreinvite`, `context`, `md5secret`, `qualify`, `disallow`, `allow`, `fullcontact`, `ipaddr`, `port`, `regseconds`, `lastms`, `username`, `defaultuser`)<br />
VALUES (&#8216;ext10&#8242;, &#8216;dynamic&#8217;, &#8216;no&#8217;, &#8216;friend&#8217;, &#8216;yes&#8217;, &#8216;yes&#8217;, &#8216;extensiones&#8217;, &#8216;e8a325cb599ad4b6eb95d79aa4506ed2&#8242;, &#8216;yes&#8217;, &#8216;all&#8217;, &#8216;g729;ilbc;gsm;ulaw;alaw&#8217;, &#8221;, &#8221;, &#8217;0&#8242;,&#8217;0&#8242;, &#8217;0&#8242;, &#8221;, &#8221;)</p>
<p>Importante, el ultimo valor a 1, y la clave sera 1234 en formato md5 evidentemente se deberia cambiar.</p>
<p>Ahora como antes lo ejecutamos desde el interfaz de comandos de MySQL</p>
<p>#mysql -p<br />
mysql&gt; use asterisk;<br />
mysql&gt; source /etc/usuarios_sip_buddies.sql</p>
<p>Finalmente necesitamos editar el fichero sip.conf con una configuracion minima. Por ejemplo:</p>
<p>/etc/asterisk/sip.conf</p>
<p>[general]<br />
language = es</p>
<p>Desde este mismo momento ya tenemos el usuario sip ext10 con la clave 1234 listo para funcionar. Podemos probarlo con cualquier telefono SIP.</p>
<p>Puede parecer muchisima historia comparado a configurar un fichero sip.conf, pero con la practica y unas plantillas, esta gestion se realiza en 5 minutos y ahora viene la &#8220;potencia&#8221;.</p>
<p><strong>El script PHP:</strong></p>
<p>Voy a crear un solo fichero PHP al estilo monolitico para que funcione y nada mas. Evidentemente sera bastante mejorable y ya esta en nuestras manos con unos conocimientos basicos de programacion PHP (y obviamente adaptable a cualquier otro lenguaje de programacion con el que nos sintamos mas comodos)</p>
<p>Lo primero vamos a crear algunos directorios dentro del lugar donde tengamos publicado el servidor web apache, por defecto /var/www<br />
# cd /var/www<br />
# mkdir asterisk<br />
# cd asterisk<br />
# mkdir sip<br />
# cd sip</p>
<p>Ahora vamos a crear un fichero index.php con el siguiente contenido:</p>
<p><em> <span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;">&lt;?php</span></em></p>
<pre><em>// Conexion a la base de Datos</em>

<em>$base = "asterisk";</em>
<em>$host = "localhost";</em>
<em>$user = "root";</em>
<em>$password = "nuestra_contraseña_sql";</em>
<em>$conexion = mysql_connect($host,$user,$password);</em>
<em>$result = mysql_select_db($base,$conexion) or die ("Error en la Conexion a BD");</em>

<em>session_start();</em>

<em>// Si no estamos logeados</em>

<em>if (!$_SESSION['login'])</em>
<em>{</em>
<em> if(isset($_POST['loginsubmit']))</em>
<em> {</em>
<em> $usuario = $_POST['usuario'];</em>
<em> $password = $_POST['password'];</em>

<em> if((!$usuario) || (!$password))</em>
<em> {</em>
<em> echo "Error 1&lt;br&gt;";</em>
<em> exit();</em>
<em> }</em>
<em> $password = $usuario.":asterisk:".$password;</em>
<em> $password = md5($password);</em>
<em> $query = mysql_query("SELECT * FROM sip_buddies WHERE name='$usuario' AND md5secret = '$password' AND useradmin = '1'");</em>
<em> if (mysql_num_rows($query) &gt; 0)</em>
<em> {</em>
<em> session_register('login');</em>
<em> $_SESSION['login'] = '1';</em>
<em> }</em>
<em> else</em>
<em> echo "Error 2&lt;br&gt;&lt;br&gt;";</em>

<em> echo "&lt;a href='index.php'&gt;Home&lt;/a&gt;";</em>
<em> }</em>
<em> else</em>
<em> {</em>
<em> echo "&lt;form method='post' action='?'&gt;";</em>
<em> echo "Usuario: &lt;input name='usuario' type='text'&gt;&lt;br&gt;";</em>
<em> echo "Contrase&amp;ntilde;a: &lt;input name='password' type='password'&gt;&lt;br&gt;";</em>
<em> echo "&lt;input type='submit' name='loginsubmit'&gt;";</em>
<em> echo "&lt;/form&gt;";</em>
<em> }</em>

<em>}</em>
<em>// Si ya estamos logeados</em>

<em>else</em>
<em>{</em>
<em> // Salida del Sistema</em>
<em> if(isset($_REQUEST['exit']))</em>
<em> {</em>
<em> session_destroy();</em>

<em> if(!session_is_registered('login'))</em>
<em> echo "&lt;a href='index.php'&gt;Home&lt;/a&gt;";</em>

<em> }</em>
<em> // Insercion de un nuevo Registro</em>
<em> elseif(isset($_POST['insertsubmit']))</em>
<em> {</em>
<em> $sipuser = $_POST['sipuser'];</em>
<em> $sippass = $_POST['sippass'];</em>
<em> $sippass = $sipuser.":asterisk:".$sippass;</em>
<em> $sippass = md5($sippass);</em>
<em> $query = mysql_query("INSERT INTO sip_buddies (`name`, `host`, `nat`, `type`, `cancallforward`, `canreinvite`, `context`, </em>
<em> `md5secret`, `qualify`, `disallow`, `allow`, `fullcontact`, `ipaddr`, `port`, `regseconds`, `lastms`, `username`, `defaultuser`) </em>
<em> VALUES ('$sipuser', 'dynamic', 'no', 'friend', 'yes', 'yes', 'extensiones', '$sippass', 'yes', 'all', 'g729;ilbc;gsm;ulaw;alaw', '', '', </em>
<em> '0','0', '0', '', '')");</em>

<em> echo "&lt;a href='index.php'&gt;Home&lt;/a&gt;&lt;br&gt;";</em>
<em> echo "&lt;a href='index.php?exit'&gt;Exit&lt;/a&gt;";</em>
<em> }</em>
<em> // Borrado de un Registro</em>
<em> elseif(isset($_POST['deletesubmit']))</em>
<em> {</em>
<em> $sipid = $_POST['sipid'];</em>
<em> $query = mysql_query("DELETE FROM sip_buddies WHERE id = '$sipid'");</em>

<em> echo "&lt;a href='index.php'&gt;Home&lt;/a&gt;&lt;br&gt;";</em>
<em> echo "&lt;a href='index.php?exit'&gt;Exit&lt;/a&gt;";</em>
<em> }</em>
<em> // Formularios de Insercion y Borrado</em>
<em> else</em>
<em> {</em>
<em> echo "Insertar Registro:&lt;br&gt;"; </em>
<em> echo "&lt;p&gt;&lt;form method='post' action='?'&gt;";</em>
<em> echo "Usuario: &lt;input name='sipuser' type='text'&gt;&lt;br&gt;";</em>
<em> echo "Contrase&amp;ntilde;a: &lt;input name='sippass' type='password'&gt;&lt;br&gt;";</em>
<em> echo "&lt;input type='submit' name='insertsubmit' value='Insertar'&gt;";</em>
<em> echo "&lt;/form&gt;&lt;/p&gt;";</em>

<em> echo "&lt;table border='1'&gt;";</em>
<em> echo "&lt;tr&gt;&lt;td colspan ='2' align='center'&gt;SIP Peers Activos&lt;/td&gt;&lt;/tr&gt;";</em>
<em> echo "&lt;tr&gt;&lt;td&gt;Usuario&lt;/td&gt;&lt;td&gt;Borrar&lt;/td&gt;&lt;/tr&gt;"; </em>

<em> $query = mysql_query("SELECT * FROM sip_buddies WHERE type = 'friend'");</em>
<em> $rows = mysql_num_rows($query);</em>
<em> for ($i=0;$i&lt;$rows;$i++)</em>
<em> {</em>
<em> $sippeersarray = mysql_fetch_array($query);</em>
<em> $sipuser = $sippeersarray['name'];</em>
<em> $sipid = $sippeersarray['id'];</em>

<em> echo "&lt;tr&gt;";</em>
<em> echo "&lt;td&gt;".$sipuser."&lt;/td&gt;";</em>
<em> echo "&lt;td&gt;";</em>
<em> echo "&lt;form method='post' action='?'&gt;";</em>
<em> echo "&lt;input type=hidden name='sipid' value='$sipid'&gt;";</em>
<em> echo "&lt;input type=submit name='deletesubmit' value='Borrar'&gt;";</em>
<em> echo "&lt;/form&gt;";</em>
<em> echo "&lt;/td&gt;"; </em>
<em> echo "&lt;/tr&gt;";</em>

<em> } </em>
<em> echo "&lt;/table&gt;"; </em>
<em> echo "&lt;a href='index.php?exit'&gt;Exit&lt;/a&gt;";</em>

<em> }</em>
<em>}</em>

<em>?&gt;</em></pre>
<p>Y eso es todo, ahora podemos acceder a traves de un navegador a la direccion:</p>
<p>http://ip_nuestro_servidor_asterisk/asterisk/sip/</p>
<p>Y aparecera para introducir un usuario y contraseña. Siguiendo el ejemplo seria Usuario: ext10,  Contraseña: 1234</p>
<p>Asi accederiamos a la micro interfaz para Crear y Borrar extensiones.</p>
<p>Evidentemente este codigo tiene bastantes deficiencias &#8220;tecnicas&#8221;, por ejemplo se podria intentar realizar una tecnica de Inyeccion de Codigo SQL para logearnos como el usuario administrador por las &#8220;bravas&#8221;, y ya conociendo la estructura, hasta darnos de alta un usuario Administrador para acceder siempre. Pero la idea basica era poder ejemplificar lo que queria mostrar con este articulo, que con solo seguir unos pasos de 5 minutos o menos, y tener este script PHP listo para ser &#8220;insertado&#8221; en el servidor web, tendriamos una interfaz totalmente Autonoma para nuestro cliente, equivalente a la que &#8220;instalamos&#8221; en mensajes anteriores, <a href="http://10000horas.com/asterisk/2011/02/28/meetme-in-a-box-web-meetme-conferencias-de-audio-de-altos-vuelos/" target="_blank">para la gestion de salas de conferencias MeetMe.</a></p>
<p>Ademas esta claro este codigo se podria mejorar para añadir la posibilidad de editar extensiones, o incluso configurar mas parametros de las extensiones (o tener dos interfaces, una de administrador para nosotros mismos, y otra para los usuarios), asi no tendriamos que andar &#8220;trasteando&#8221; directamente en el interfaz MySQL si modificamos regularmente las extensiones.</p>
<p>Con esto, ya empiezan a haber motivos para poder ir planteandonos dar un primer paso y dar fin a las interfaces graficas de Asterisk!.</p>
<p>Tengo que reconocer que este mensaje me ha llevado componerlo mas tiempo del previsto originalmente. Toda mejora al codigo, o sugerencia como siempre, sera ampliamente agradecida a traves de los comentarios.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/12/08/montando-un-sistema-asterisk-autonomo-i/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/12/08/montando-un-sistema-asterisk-autonomo-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como conseguir llamadas al minimo precio via SIP</title>
		<link>http://10000horas.com/asterisk/2011/11/27/como-conseguir-llamadas-al-minimo-precio-via-sip/</link>
		<comments>http://10000horas.com/asterisk/2011/11/27/como-conseguir-llamadas-al-minimo-precio-via-sip/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 17:35:12 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[cheapvoip]]></category>
		<category><![CDATA[did]]></category>
		<category><![CDATA[did barato]]></category>
		<category><![CDATA[easyvoip]]></category>
		<category><![CDATA[netelip]]></category>
		<category><![CDATA[omv]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[proxy movil]]></category>
		<category><![CDATA[simyo]]></category>
		<category><![CDATA[sip]]></category>
		<category><![CDATA[sip trunk]]></category>
		<category><![CDATA[telsome]]></category>
		<category><![CDATA[voztele]]></category>
		<category><![CDATA[yoigo]]></category>

		<guid isPermaLink="false">http://2.185</guid>
		<description><![CDATA[Ya sabeis que una de las famosas ventajas del mundo SIP es la posibilidad de conseguir llamadas muy baratas gracias a los diversos proveedores SIP que hay en el mercado. La dificultad radica la mayor parte del tiempo, en localizar &#8230; <a href="http://10000horas.com/asterisk/2011/11/27/como-conseguir-llamadas-al-minimo-precio-via-sip/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ya sabeis que una de las famosas ventajas del mundo SIP es la posibilidad de conseguir llamadas muy baratas gracias a los diversos proveedores SIP que hay en el mercado.</p>
<p>La dificultad radica la mayor parte del tiempo, en localizar ese proveedor SIP que ofrezca en un momento determinado la mejor tarifa.</p>
<p>Resulta que existe una web, que mantiene bastante actualizadas, las mejores tarifas, para muchos proveedores SIP, para practicamente todos los paises y todos los tipos de llamadas a los mismos (a moviles y a fijos).</p>
<p>Lo interesante de todo esto, es la posibilidad de configurar multiples proveedores y a la vez enrutar las llamadas segun el destino de las mismas por uno o por otro en funcion de nuestra necesidad.</p>
<p>La pagina web de la que estamos hablando es: http://backsla.sh/betamax</p>
<p>Si observais en el momento en que escribo este mensaje, el mejor operador es EasyVOIP. No todos los proveedores de la lista ofrecen la posibilidad de conectarse via SIP a los servicios, (por ejemplo CheapVOIP no lo permite, solo llamadas a traves de su dialer). En este caso Easy VOIP ofrece llamadas a operadores moviles en España a solo 0,04 dolares el minuto sin establecimiento de llamada (del orden de los 0,03 centimos de euro). No existe ni un solo operador en España que ofrezca este nivel de competitividad. Ni siquiera existe una tarifa plana que pueda competir, lo mas cercano, las tarifas Leon de Orange que son las menos restrictivas a nivel de tiempos. Los OMV (Operadores Moviles Virtuales) al cursar llamadas a traves de los operadores principales (Orange, Movistar, Vodafone o Yoigo), todos imponen el establecimiento de llamada, que para llamadas relativamente cortas (menos de 15 minutos), supone un sobrecoste excesivo (por tanto entramos en restricciones).</p>
<p>Luego hay tarifas baratas, por tramos horarios, numeros preferidos, etc, etc, pero igual entramos en restricciones. Todo esto lo podemos sintetizar en un operador SIP. Hoy en dia con las conexiones a Internet, es practicamente despreciable la baja calidad de la señal (latencias de entre 50 a 70ms con un jitter inferior a 10ms), y por simultaneidad de canales precisamente es el caudal simetrico ya empieza a sobrar (es relativamente facil conseguir caudales de 2Mbits simetricos). Pongamos uno de los peores casos, el codec ULAW G.711, 64kbits/s duplex. En 2 Mbits simetricos tenemos accesible un &#8220;troncal&#8221; de 32 llamadas simultaneas, podria decirse, semejante a un Primario E1.</p>
<p>Pero si decidimos gastarnos un dinerillo en unas cuantas licencias G.729 (algo muy interesante sinceramente, ya que reducimos gracias a la compresion, hasta 4 veces el caudal de ULAW), es decir 8 kbits/s, por tanto tendriamos acceso a un &#8220;troncal&#8221; de hasta 128 llamadas simultaneas, o lo mas clasico en estos casos, dedicar, 512kbits simetricos al trafico VoIP para conseguir ese &#8220;primario de voz&#8221;, mediante politicas QoS, y tener accesible el resto del caudal para aplicativos internos de la empresa en segundo o tercer nivel.  Una licencia G.729 para un canal concurrente, vale solo 10 dolares. Si hablamos de 32, 320 dolares al cambio poco menos de 250 euros es una suma totalmente asumible, mas considerando, que es lo que puede llegar a valer un Primario E1, para una PYME durante solo 1 mes de uso (y descontando el trafico).</p>
<p>Y lo mas interesante, se que proveedores SIP como EasyVOIP soportan este codec.</p>
<p><a href="http://10000horas.com/asterisk/2010/08/26/introduciendo-un-proveedor-sip-parte-1/">Como ya comente en entradas anteriores</a>, nos encontramos un gran problema que lidiar: el trafico entrante. Necesitamos proveedores que nos permitan tener DID y trafico entrante sin pedir &#8220;nada a cambio&#8221; (o que curses llamadas obligatoriamente a traves de ellos). Esta tarea aun no la tengo resuelta, puesto que sobre todo en el ambito casero lo que es a quien va principalmente orientados estos proveedores SIP, lo primordial es llamar barato, pero todos &#8220;tenemos&#8221; una linea movil a los que ser llamados, o una linea fija de Telefonica&#8230;</p>
<p>Netelip sigue ofreciendo servicios de llamadas de bastante bajo nivel. Telsome, tambien tiene unas tarifas aceptables, pero la calidad es intermedia. Llama la atencion que hasta EasyVOIP operador extranjero ofrece mejor calidad que estas dos operadores IP Españolas. Asi que VozTelecom sigue siendo la mejor opcion todavia aun a costa de ser un poco caros.</p>
<p>VozTele ofrecia dos canales entrante por 9 euros al mes, y luego cada DID por 4 euros aparte. Esto es una configuracion ejemplo: 4 DID + 2 canales entrantes = 25 euros al mes. Por ejemplo un proveedor mundial de DID, DIDWW ofrece un canal entrante por cada DID contratado, peor servicio, por 5 euros de SETUP y 5 euros al mes. 5 x 4 = 20 euros. En este caso nos ahorrariamos 5 euros pero con inferior servicio.</p>
<p>Evidentemente, es totalmente &#8220;injusto&#8221; que cursemos llamadas por un operador externo del que las recibimos ya que no ofrecemos la oportunidad de &#8220;ganar&#8221; al segundo. Por eso todavia estas soluciones mixtas para mi criterio son una asignatura pendiente.</p>
<p>Vuelvo a dejar abierto este tema por si alguien tiene ideas mejores, o propuestas para poder entrar a ser planteadas. Desde luego aun teniendo estas dos soluciones separadas siguen siendo de resultado mucho mas baratas que &#8220;quedarse&#8221; en la PSTN o en los operadores moviles. De hecho podrian conseguirse telefonos moviles para llamadas entrantes a coste 0 (por ejemplo con OMV) e introducirlos en nuestra PBX a traves de un enlace movil o un modem 3G que permita funciones de Voz (como hicieron en las &#8220;practicas&#8221; los de chan_sebi).</p>
<p><strong>Proxy Movil</strong></p>
<p>Y justamente de esta idea, se me ocurre diseñar un &#8220;Proxy Movil&#8221; aprovechando las tarifas corporativas (llamadas a numeros internos de la empresa ilimitadas, a coste 0, con &#8220;tarifas planas para este proposito, de solo 3 euros&#8221;. Dado que realmente consumir 1000 minutos que es lo que ofrecen la mayoria de las tarifas planas es bastante complejo, ¿Que ocurriria si utilizaramos varias de estas lineas de 1000 minutos unidas, para tener una suma pongamos de 5000 minutos, a repartir entre 25 lineas corporativas?</p>
<p>Asi a desglose economico:</p>
<p>30 (+9 tracks entrantes) x 3 euros = 117 euros<br />
9000 minutos x 0,03 centimos (EasyVOIP) = 270 euros<br />
Total = 387 euros al mes</p>
<p>Son 300 minutos por linea. La tarifa plana mas barata, no baja de 20 euros, Leon 24 , 300 minutos por 24 euros al mes = 30 x 24 = 720 euros al mes.</p>
<p>Ahorro de mas de 300 euros al mes por aplicar esta filosofia. Y las posibilidades que ofrece son muy amplias (por ejemplo, coste nulo para llamadas salientes, por ejemplo, alguien nos llama a nuestra PBX a la operadora, y la operadora quiere transferir a uno de esos 30 telefonos de la empresa, al cursarse por uno de los 9 tracks, saldria gratuita la llamada, y podriamos aplicar FailOver). El unico problema: el contrario, en la llamada entrante, si el track esta ocupado no se me ocurre aplicar un metodo de failover al siguiente track puesto que la llamada se cursa contra la operadora, a no ser que se aplique un sistema de desvio de llamada &#8220;si comunica&#8221; rotativo entre todos las lineas del track. <span style="text-decoration: underline;">Curioso experimento</span></p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/27/como-conseguir-llamadas-al-minimo-precio-via-sip/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/27/como-conseguir-llamadas-al-minimo-precio-via-sip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test para ver el nivel en Asterisk y Digium Certified Asterisk Administrator</title>
		<link>http://10000horas.com/asterisk/2011/11/20/test-para-ver-el-nivel-en-asterisk-y-digium-certified-asterisk-administrator/</link>
		<comments>http://10000horas.com/asterisk/2011/11/20/test-para-ver-el-nivel-en-asterisk-y-digium-certified-asterisk-administrator/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 14:33:34 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[asterisk advanced]]></category>
		<category><![CDATA[asterisk fast start]]></category>
		<category><![CDATA[dcaa]]></category>
		<category><![CDATA[dcap]]></category>
		<category><![CDATA[examen dcaa]]></category>

		<guid isPermaLink="false">http://2.178</guid>
		<description><![CDATA[Después del curso, y segun nos habian comentado durante el mismo, en la actualidad existen dos tipos de titulaciones en Asterisk. Digium Certified Asterisk Professional (dCAP), que es la mas popular y el que realmente te da acceso a un mundo &#8230; <a href="http://10000horas.com/asterisk/2011/11/20/test-para-ver-el-nivel-en-asterisk-y-digium-certified-asterisk-administrator/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Después del curso, y segun nos habian comentado durante el mismo, en la actualidad existen dos tipos de titulaciones en Asterisk.</p>
<p>Digium Certified Asterisk Professional (dCAP), que es la mas popular y el que realmente te da acceso a un mundo laboral que tenga relacion con Asterisk. Pero por otro lado existe otro, aun no demasiado reconocido, con validez 4 años, llamado Digium Certified Asterisk Administrator (dCAA)</p>
<p>El examen consta de 60 preguntas, y un tiempo total para su realizacion de 11 minutos y 20 segundos (10 segundos por pregunta aproximadamente). No restan los fallos, pero hay que aprobar con un 80% de preguntas correctas, y es un formulario de tipo selección unica. No se cuantos intentos te dan, ni si se puede hacer en mas tiempo, porque eventualmente, lo aprobe a la primera y en el tiempo acordado. Para mi criterio, creo que es una prueba de nivel mas para el dCAP, tanto para probar los conocimientos obtenidos a traves de un curso Asterisk Fast Start (como el que vimos el año pasado), por lo que realmente tras un Asterisk Advanced, el aprobado deberia ser asegurado.</p>
<p>Otra cosa curiosa es que al aprobar te da un certificado como este, con validez de 4 años:</p>
<p><a href="http://10000horas.com/asterisk/files/2011/11/DCAA.jpg"><img class="size-medium wp-image-179 alignnone" title="DCAA" src="http://10000horas.com/asterisk/files/2011/11/DCAA-300x226.jpg" alt="" width="300" height="226" /></a></p>
<p>&nbsp;</p>
<p>Como creo que realmente el examen es una prueba de nivel, tras terminarlo trate de revisar mis respuestas señaladas (lo que es cierto que en solo poco mas de 11 minutos hay que intentar responder bastante rapido y a veces casi aleatoriamente, una vez marcada la respuesta y pulsado &#8220;siguiente&#8221;, ya no hay marcha atras para corregir, y al suspender no tengo muy claro si permiten volver a realizar el examen ipso-facto). Y aprovechando esto, decidi traducirlo y responderlo a modo de primer entrenamiento cara al proximo dCAP:</p>
<ol>
<li><strong>¿Qué hace el comando “make config” durante la instalación de Asterisk?</strong><br />
a) Instala scripts que harán que Asterisk se arranque al inicio en las distribuciones soportadas por Asterisk<br />
b) Inicia una sesión interactiva para que el administrador pueda configurar detalles sobre  los usuarios PBX<br />
c) Instala ficheros de configuración en /etc/Asterisk<br />
d) Nada, make config no es un comando valido en este contexto</li>
<li><strong>¿Porque DTMF utiliza dos tonos?</strong><br />
a)      Para mejorar el reconocimiento sobre un solo tono<br />
b)      Ninguna razón en particular, es solo una decisión de estilo<br />
c)       Para conseguir un audio superior<br />
d)      No lo hace, se utiliza un solo tono</li>
<li><strong>En el contexto de Asterisk, ¿que significa CDR?</strong><br />
a)      Customer Data Resource<br />
b)      Call Detail Record<br />
c)       Channel Data Review<br />
d)      Channel Driver Resource</li>
<li><strong>¿Para cuál de los siguientes casos, Asterisk no utiliza SDP?</strong><br />
a)      Renegociar el códec de audio utilizado en la llamada SIP mientras se encuentra activa<br />
b)      Configurar parámetros iniciales de los medios en una llamada SIP<br />
c)       Poner una llamada SIP en espera<br />
d)      Colgar una llamada SIP</li>
<li><strong>¿Qué comando de CLI puede usarse para ver la configuración actual del Dialplan de Asterisk?</strong><br />
a)      module show extensións.conf<br />
b)      core print Dialplan<br />
c)       module show pbx_config<br />
d)      dialplan show</li>
<li><strong>¿Cuál de los siguientes no es un driver de canal en Asterisk?</strong><br />
a)      CDR<br />
b)      SIP<br />
c)       Local<br />
d)      IAX</li>
<li><strong>¿Qué fichero es utilizado para configurar los drivers del kernel para dispositivos DAHDI?</strong><br />
a)      /etc/dahdi/dahdi.config<br />
b)      /etc/dahdi/system.conf<br />
c)       /etc/dahdi/chan_dahdi.conf<br />
d)      /etc/dahdi.conf</li>
<li><strong>¿Con que protocolo VOIP es utilizado RTP?</strong><br />
a)      IAX2<br />
b)      DAHDI<br />
c)       SIP<br />
d)      Zaptel</li>
<li><strong>¿Qué ocurre cuando mandamos el comando a Asterisk “restart gracefully”?</strong><br />
a)      Asterisk deja de recibir llamadas, y reinicia cuando las llamadas activas llegan a 0<br />
b)      Asterisk continua recibiendo llamadas, y reinicia cuando las llamadas activas llegan a 0<br />
c)       Nada. Esto no es un comando valido de Asterisk<br />
d)      Asterisk reinicia inmediatamente</li>
<li><strong>¿Cuál es la localización por defecto de la música en espera de Asterisk?</strong><br />
a)      /var/lib/asterisk/moh<br />
b)      /var/lib/Asterisk/holdmusic<br />
c)       /var/log/Asterisk/musiconhold<br />
d)      /etc/asterisk/musiconhold</li>
<li><strong>¿Cuál de las siguientes afirmaciones es mas cierta con respecto al registro de un dispositivo en el contexto VOIP?</strong><br />
a)      El registro permite a Asterisk saber dónde deben ir las llamadas destinadas al dispositivo<br />
b)      El registro es necesario para que el teléfono pueda chequear el Buzon de Voz<br />
c)       El registro es principalmente utilizado para asociar a una persona con un dispositivo<br />
d)      El registro es requerido para que solo los usuarios autentificados puedan hacer llamadas</li>
<li><strong>¿Cuál es la diferencia entre las aplicaciones VoiceMail y VoiceMailMain en Asterisk?</strong><br />
a)      VoiceMailMain se utiliza para grabar una mensaje de alguien, y VoiceMail se utiliza para que una persona escuche los mensajes recibidos<br />
b)      VoiceMail se utiliza para grabar una mensaje de alguien, y VoiceMailMain se utiliza para que una persona escuche los mensajes recibidos<br />
c)       VoiceMail es utilizado cuando los mensajes son guardados en una base de datos o en una almacen IMAP, VoiceMailMain es utilizando cuando los mensajes han sido guardados en el disco duro<br />
d)      Nada de lo anterior, las dos aplicaciones son intercambiables</li>
<li><strong>¿Cuál es el ancho de banda requerido para una llamada bidireccional con G.711?</strong><br />
a)      ~160Kbps<br />
b)      ~80Kbps<br />
c)       ~64Kbps<br />
d)      ~8Kbps</li>
<li><strong>¿Cuál de los siguientes, no es una cadena de llamada valida en Asterisk?</strong><br />
a)      Dial(SIP/100,30)<br />
b)      Dial(30,SIP/100)<br />
c)       Dial(SIP/100)<br />
d)      Dial(SIP/100&amp;SIP/200)</li>
<li><strong>Sobre configuraciones de red ¿Qué es la latencia?</strong><br />
a)      El retraso desde que un paquete es enviado  hasta que es retrasmitido<br />
b)      El retraso desde que un paquete es trasmitido hasta que es recibido<br />
c)       El retraso causado por la transcodificacion de audio?<br />
d)      El retraso entre la marcación y el timbre</li>
<li><strong>¿Qué configuración prevendrá Asterisk de negociar entre dos canales SIP de enviarse RTP directamente entre ambos?</strong><br />
a)      canreinvite = no<br />
b)      trunk = no<br />
c)       canreinvite = yes<br />
d)      canreinivite = never</li>
<li><strong>¿Para que sirve el comando ‘!’ en la línea de comandos de Asterisk?</strong><br />
a)      Para nada. El comando ‘!’ no es un comando valido en el CLI de Asterisk<br />
b)      Rejecuta el comando anterior de nuevo<br />
c)       Ejecuta un comando Shell de Linux<br />
d)      Confirma que deseas ejecutar el comando especificado</li>
<li><strong>¿Cuál de las siguientes estrategias NO puede utilizarse en Asterisk con colas?</strong><br />
a)      Llamar al agente disponible que haya recibido más llamadas<br />
b)      Llamar a todos los agentes a la vez<br />
c)       Llamar a un agente aleatorio<br />
d)      Llamar al agente disponible que haya recibido menos llamadas</li>
<li><strong>¿Qué es un ‘call file’ en Asterisk?</strong><br />
a)      Un fichero de comandos que inicia una llamada saliente<br />
b)      Un fichero temporal que se crea en /dev/ para un canal activo en Asterisk<br />
c)       Un fichero con registros CDR para facturación<br />
d)      Un fichero generado por cada buzon de voz para almacenar información como CallerID, hora, etc</li>
<li><strong>¿Cuál de las siguientes aplicaciones NO esta por defecto en un Dialplan de Asterisk</strong><br />
a)      Hold()<br />
b)      Dial()<br />
c)       Hangup()<br />
d)      Playback()</li>
<li><strong>¿Cuál de los siguientes codecs puede ser utilizado por Asterisk para grabar un mensaje del buzon de voz en Asterisk?</strong><br />
a)      OGG<br />
b)      MP3<br />
c)       GSM<br />
d)      G.729</li>
<li><strong>¿Cuál de las siguientes líneas en el extensions.conf NO tiene un error de sintaxis?</strong><br />
a)      exten =&gt; 1,n,Dial,SIP/6000<br />
b)      exten =&gt; 1,n,(dial),Dial(SIP/6000)<br />
c)       exten =&gt; 1,n(dial,Dial(SIP/6000)<br />
d)      exten =&gt; 1,n(dial),Dial(SIP/6000)</li>
<li><strong>¿Cuál de los siguientes puerto(s) debe ser redirigido en un firewall para permitir que el trafico RTP pueda alcanzar Asterisk?</strong><br />
a)      5060<br />
b)      8000-10000<br />
c)       12000-20000<br />
d)      Aquellos puertos especificados en el archivo de configuración de Asterisk rtp.conf</li>
<li><strong>¿Cuál de las siguientes extensiones especiales NO está reconocida por Asterisk?</strong><br />
a)      fax<br />
b)      i<br />
c)       T<br />
d)      r</li>
<li><strong>¿Cuál es la ubicación por defecto para los archivos de sonido de Asteirsk?</strong><br />
a)      /var/log/asterisk/sounds<br />
b)      /etc/asterisk<br />
c)       /var/lib/asterisk/sounds/<br />
d)      /usr/lib/Asterisk/sounds/</li>
<li><strong>¿Cuál de los siguientes, incluirá el contexto [local] en otro contexto?</strong><br />
a)      #include =&gt; local<br />
b)      Switch =&gt; local<br />
c)       context =&gt; local<br />
d)      include =&gt; local</li>
<li><strong>¿Cuál de los siguientes es el mensaje inicial enviado por un PRI cuando se realiza una llamada saliente?</strong><br />
a)      CONNECT<br />
b)      SETUP<br />
c)       DIAL<br />
d)      INVITE</li>
<li><strong>¿Cuál es el máximo numero de participantes posibles en una sala de conferencias de Meetme de Asterisk?</strong><br />
a)      30<br />
b)      1000<br />
c)       240<br />
d)      No hay limite</li>
<li><strong>¿Cuál de los siguientes comandos creara una conexión CLI a una instancia de Asterisk corriendo en el transfondo?</strong><br />
a)      asterisk<br />
b)      asterisk –x<br />
c)       asterisk –r<br />
d)      Asterisk –vvvvvgc</li>
<li><strong>¿Cuál de los siguientes representa la forma correcta de dereferenciar una variable en Asterisk?</strong><br />
a)      {$VARIABLE}<br />
b)      $__VARIABLE<br />
c)       $[VARIABLE]<br />
d)      ${VARIABLE}</li>
<li><strong>¿Qué hara la siguiente línea del DialPlan?</strong><br />
exten =&gt; 1000,1,GotoIf($[${EXTEN}&gt;1000]?hangup:continue)<br />
a)      Continua hacia la prioridad continue porque la expresión es falsa<br />
b)      Nada, es una línea invalida de Dialplan<br />
c)       Continua con la prioridad hangup porque la expresión es cierta<br />
d)      Cuelga la llamada, porque la expresión es cierta y el comando cuando es verdadero es el cuelgue</li>
<li><strong>¿Cuál de los siguientes NO es un códec de audio?</strong><br />
a)      G.711<br />
b)      H.323<br />
c)       G.729<br />
d)      GSM</li>
<li><strong>¿Cuál de los siguientes modelos describe exactamente la sintaxis exacta de un Dialplan?</strong><br />
a)      exten =&gt; contexto,extensión,prioridad<br />
b)      exten =&gt; extension, prioridad, aplicacion<br />
c)       extension =&gt; prioridad, etiqueta, aplicación<br />
d)      exten =&gt; extension, prioridad, etiqueta, aplicación</li>
<li><strong>¿Cuál de los siguientes no es una variable de canal automáticamente ajustada por Asterisk?</strong><br />
a)      CONTEXT<br />
b)      UNIQUEID<br />
c)       CHANNEL_NAME<br />
d)      TIMESTAMP</li>
<li><strong>¿Qué puerto(s) pueden ser redirigidos en un firewall para permitir que el trafico SIP llegue a Asterisk?</strong><br />
a)      1000-2000<br />
b)      443<br />
c)       5060<br />
d)      22</li>
<li><strong>¿Qué método de señalización debe utilizar un dispositivo FXS?</strong><br />
a)      Session Initiation Protocol<br />
b)      ISDN<br />
c)       Foreign eXchange Office<br />
d)      Foreign eXchange Subscriber</li>
<li><strong>¿Qué es DUNDi?</strong><br />
a)      Un registro global de ITSPs<br />
b)      Un módulo de driver de canal en Asterisk<br />
c)       Una herramienta para simplificar el enrutamiento de multiples sitios<br />
d)      Una marca de PBX de Australia</li>
<li><strong>¿Cómo se utiliza SDP en Asterisk?</strong><br />
a)      SDP no se utiliza en Asterisk<br />
b)      Para transportar los medios  en una llamada SIP<br />
c)       Para inivitar a un individuo a una llamada SIP<br />
d)      Para negociar/describir los medios en una llamada SIP</li>
<li><strong>Por defecto, ¿dónde se almacenan los ficheros de log en Asterisk?</strong><br />
a)      /etc/asterisk/logs<br />
b)      /var/lib/Asterisk/logs<br />
c)       /usr/log/asterisk<br />
d)      /var/log/Asterisk</li>
<li><strong>¿Qué fichero de configuración de Asterisk especifica los puertos utilizados por los medios en una llamada SIP?</strong><br />
a)      ports.conf<br />
b)      rtp.conf<br />
c)       sip.conf<br />
d)      media.conf</li>
<li><strong>¿Qué hara la siguiente línea de dialplan?</strong><br />
<strong>exten =&gt; s,1,Set(COUNT=$[${COUNT}+1])</strong><br />
a)      Nada, es una línea invalida para el Dialplan<br />
b)      Almacenar la cadena “$[${COUNT}+1]” en una variable llamada COUNT<br />
c)       Poner el valor de COUNT  a 1, porque la expresión se evalua como verdadera<br />
d)      Limpiar el valor de la variable COUNT  a su valor anterior mas 1</li>
<li><strong>¿Cuál de las siguientes aplicaciones del Dialplan hara que Asteirsk NO “escuche” una entrada DTMF?</strong><br />
a)      Read()<br />
b)      Wait()<br />
c)       Background()<br />
d)      WaitExten()</li>
<li><strong>¿En que fichero de configuración se manejan los huecos de parking de llamadas?</strong><br />
a)      callparking.conf<br />
b)      extensions.conf<br />
c)       parkinglots.conf<br />
d)      features.conf</li>
<li><strong>¿Cómo se utiliza la aplicación Record en Asterisk?</strong><br />
a)      Para monitorizar otro canal en tiempo real<br />
b)      Para imprimir contenidos de un registro de base de datos en el CLI de Asterisk<br />
c)       Para crear un fichero de sonido en el disco con el audio recibido de un canal activo<br />
d)      Para reproducir los contenidos de un registro de base de datos en un canal de Asterisk utilizando un convertidor de texto a voz.</li>
<li><strong>¿Cuál de los siguientes no es un soporte de CDR valido por defecto en Asterisk?</strong><br />
a)      Hoja de cálculo de Excel<br />
b)      Archivos .csv<br />
c)       Servidor RADIUS<br />
d)      Base de datos Relacional</li>
<li><strong>¿Qué opción de configuración del sip.conf debe realizarse para permitir que un dispositivo se registre contra Asterisk?</strong><br />
a)      host = dynamic<br />
b)      host = unknown<br />
c)       address = any<br />
d)      ipaddress = dynamic</li>
<li><strong>¿Bajo qué licencia de software libre está disponible Asterisk?</strong><br />
a)      LGPL<br />
b)      BSD<br />
c)       GPLv2<br />
d)      GPLv3</li>
<li><strong>¿En cuál de los órdenes siguientes, los códecs consumen de menos ancho de banda a mayor ancho de banda?</strong><br />
a)      GSM, G.711, G.729<br />
b)      G729, G.711, GSM<br />
c)       G.711, GSM, G.729<br />
d)      G.729, GSM, G.711</li>
<li><strong>¿Cuál de los siguientes NO es una forma para generar una llamada de otra forma que no sea un teléfono?</strong><br />
a)      A través del Asterisk Manager Interface<br />
b)      A través de un fichero creado específicamente y copiado en /var/spool/asterisk/outgoing<br />
c)       A través de Asterisk Realtime Architecture<br />
d)      A través de un comando de CLI “console dial”</li>
<li><strong>En un sistema típico Linux, ¿Cuál de los siguientes comandos NO se utiliza para saber la carga media del sistema?</strong><br />
a)      Utilizando la herramienta “load”<br />
b)      Viendo los contenidos de /proc/loadavg<br />
c)       Utilizando la herramienta “top”<br />
d)      Utilizando la herramienta “uptime”</li>
<li><strong>¿Cuál de los siguientes, NO es un método de almacenaje valido para un buzón de voz en un sistema Asterisk sin modificar?</strong><br />
a)      En la RAM<br />
b)      Via IMAP<br />
c)       Via ODBC<br />
d)      En el sistema de archivos</li>
<li><strong>¿Sobre qué usuario debería funcionar Asterisk?</strong><br />
a)      root<br />
b)      asterisk<br />
c)       nadie<br />
d)      Asterisk debería ser lanzado desde cualquier usuario</li>
<li><strong>En Asterisk, ¿Cuál es la diferencia entre formato y códec?</strong><br />
a)      El formato describe el protocolo usado, y el códec describe los medios usados<br />
b)      El formato traduce los medios guardados en disco, y el códec traduce los medios a ser trasmitidos en el canal<br />
c)       El formato describe los medios entrantes y el códec  describe los medios salientes<br />
d)      El formato describe los medios de video, y el códec describe los medios de audio</li>
<li><strong>¿Qué archivo de configuración controla los “paths” del sistema que Asterisk utiliza para guardar los modulos, CDR, y logs?</strong><br />
a)      files.conf<br />
b)      directory.conf<br />
c)       asterisk.conf<br />
d)      logger.conf</li>
<li><strong>¿Cuál de los siguientes NO es una aplicación de Asterisk comúnmente usada para propósitos de Debug?</strong><br />
a)      Jitter<br />
b)      Echo<br />
c)       Milliwatt<br />
d)      NoOp</li>
<li><strong>¿Cuál de los siguientes NO es cierto acerca de Asterisk y DAHDI?</strong><br />
a)      Asterisk y DAHDI están disponibles bajo licencias Open Source<br />
b)      Asterisk y DAHDI trabajan juntos para ofrecer interfaces físicas a un sistema PBX<br />
c)       Asterisk y DAHDI están patrocinados y mantenidos por Digium<br />
d)      Asterisk y DAHDI solo son compatibles cuando los mismos números de versión son utilizados para ambos</li>
<li><strong>¿Cuál de los siguientes NO es un fichero de configuración estándar para Asterisk?</strong><br />
a)      pri.conf<br />
b)      chan_dahdi.conf<br />
c)       sip.conf<br />
d)      iax.conf</li>
<li><strong>¿Qué es el “jitter”?</strong><br />
a)      La latencia entre dos puntos VOIP<br />
b)      Cambios en el volumen/ganancia provocados por la transcodificación<br />
c)       Variaciones en la latencia entre dos puntos VOIP<br />
d)      El eco en los enlaces VOIP</li>
<li><strong>¿Cuál de los siguientes es la sintaxis correcta para configurar un canal SIP que solo permita el códec GSM?</strong><br />
a)      disallow = all, allow = all<br />
b)      deny=ulaw,alaw,g729,g723<br />
c)       allow =gsm<br />
d)      permit = gsm, deny = all</li>
<li><strong>¿Cuál es la diferencia entre las salidas de “verbose” y “debug” en el Asterisk CLI?</strong><br />
a)      La salida Verbose es acerca de los canales, y la salida Debug es acerca de otras partes de Asterisk<br />
b)      La salida Verbose, suelen ser mensajes de estado útiles para administradores mientras que la salida Debug suelen ser mensajes útiles para desarrolladores<br />
c)       No existe diferencia. Ambos tipos de salida de consola son lo mismo.<br />
d)      La salida <span style="text-decoration: underline;">Debug</span>, suelen ser mensajes de estado útiles para administradores mientras que la salida Verbose suelen ser mensajes útiles para desarrolladores</li>
</ol>
<p>A continuación, las soluciones que yo creo que son las correctas. Me gustaría que alguien experimentado las revisase tambien, y comentase cuales cree que pueden estar mal, o de las que tengo dudas, que opina al respecto:</p>
<p>Solución 1: a)<br />
Solución 2: a)<br />
Solución 3: b)<br />
Solución 4: Creo que la d)<br />
Solución 5: d)<br />
Solución 6: a)<br />
Solución 7: d)<br />
Solución 8: c)<br />
Solución 9: a)<br />
Solución 10: a)<br />
Solución 11: Me resulta un poco ambigua la pregunta, pero la más cierta quizá, la c)<br />
Solución 12: b)<br />
Solución 13: c)<br />
Solución 14: b)<br />
Solución 15: b)<br />
Solución 16: a)<br />
Solución 17: c)<br />
Solución 18: a)<br />
Solución 19: a)<br />
Solución 20: a)<br />
Solución 21: c)<br />
Solución 22: d)<br />
Solución 23: d)<br />
Solución 24: d)<br />
Solución 25: c)<br />
Solución 26: d)<br />
Solución 27: b)<br />
Solución 28: b)<br />
Solución 29: c)<br />
Solución 30: d)<br />
Solución 31: a)<br />
Solución 32: b)<br />
Solución: 33: b)<br />
Solución 34: c)<br />
Solución 35: c)<br />
Solución 36: c)<br />
Solución 37: c)<br />
Solucion 38: d)<br />
Solución 39: d)<br />
Solución 40: b)<br />
Solución 41: d)<br />
Solución 42: b)<br />
Solución 43: d)<br />
Solución 44: c)<br />
Solución 45: a)<br />
Solución 46: a)<br />
Solución 47: c)<br />
Solución 48: d)<br />
Solución 49: c)<br />
Solución 50: a)<br />
Solución 51: a)<br />
Solución 52: b)<br />
Solución 53: a)<br />
Solución 54: c)<br />
Solución 55: a)<br />
Solución 56: d)<br />
Solución 57: a)<br />
Solución 58: c)<br />
Solución 59: c)<br />
Solución: 60: b)</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/20/test-para-ver-el-nivel-en-asterisk-y-digium-certified-asterisk-administrator/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/20/test-para-ver-el-nivel-en-asterisk-y-digium-certified-asterisk-administrator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Asterisk. Days 4 y 5</title>
		<link>http://10000horas.com/asterisk/2011/11/19/advanced-asterisk-days-4-y-5/</link>
		<comments>http://10000horas.com/asterisk/2011/11/19/advanced-asterisk-days-4-y-5/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 21:44:37 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Basicos]]></category>
		<category><![CDATA[Introduccion]]></category>
		<category><![CDATA[Telefonia Analogica]]></category>
		<category><![CDATA[astdb]]></category>
		<category><![CDATA[asterisk advanced]]></category>
		<category><![CDATA[BRI]]></category>
		<category><![CDATA[conclusiones]]></category>
		<category><![CDATA[crc4]]></category>
		<category><![CDATA[dahdi]]></category>
		<category><![CDATA[dcap]]></category>
		<category><![CDATA[euroisdn]]></category>
		<category><![CDATA[fax]]></category>
		<category><![CDATA[hylafax]]></category>
		<category><![CDATA[isdn]]></category>
		<category><![CDATA[pri]]></category>
		<category><![CDATA[primario]]></category>
		<category><![CDATA[pstn]]></category>
		<category><![CDATA[rdsi]]></category>
		<category><![CDATA[sip]]></category>
		<category><![CDATA[span]]></category>

		<guid isPermaLink="false">http://2.173</guid>
		<description><![CDATA[Ya entrando en la recta final, continuamos con el tema de ayer de conexiones de tarjeteria y PSTN. Primero van los conceptos teoricos sobre los tipos de sistemas digitales de telefonia Americanos (T1), Europeos (E1), las señalizaciones, los canales, servicios &#8230; <a href="http://10000horas.com/asterisk/2011/11/19/advanced-asterisk-days-4-y-5/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ya entrando en la recta final, continuamos con el tema de ayer de conexiones de tarjeteria y PSTN.</p>
<p>Primero van los conceptos teoricos sobre los tipos de sistemas digitales de telefonia Americanos (T1), Europeos (E1), las señalizaciones, los canales, servicios implementados como RDSI (ISDN), codificacion de las señales&#8230; realmente son temas que para un caso en concreto de uso hay que tenerlos claros.</p>
<p>Un ejemplo practico seria la interconexion duplex entre una centralita Asterisk y una Alcatel con tarjeteria en ambos lados. Para la comunicación de mensajes a nivel de servicios digitales, se implementa un protocolo de señalización llamado Q.931, pero mas concretamente de un protocolo variante especifico para esta funcionalidad de interconexión de centralitas, llamado Q.SIG.</p>
<p>Ahora vamos a la parte practica de configuracion, hay que considerar que existen dos tipos de configuraciones, la especifica para Estados Unidos y otra para Europa, en este caso voy a intentar de ir planteando las dos, porque cara a Digium la que se utiliza es la EEUU, pero para nuestros casos practicos seguramente sea la Europea.</p>
<p>Configuracion del /etc/dahdi/system.conf</p>
<p>Primero tenemos que configurar cada uno de los puertos</p>
<p>span = &lt;numero_del_puerto&gt;,&lt;fuente_de_sincronizacion&gt;,&lt;line_built_out&gt;,</p>
<p>Ejemplo americano:</p>
<p>span = 1,1,0,esf,b8zs</p>
<p>Ejemplo europeo:</p>
<p>span = 1,1,0,ccs,hdb3,crc4<br />
- El 1 primero, es el numero del canal</p>
<p>- El 1 es para ser receptor de la fuente, y el 0 para ser el emisor<br />
- El siguiente 0, es para no amplificar la señal si los cables son normales, o 1 si son demasiado largos (el cable que nos llega del operador esta en una ubicación muy apartada de donde esta nuestro equipo)<br />
- ESF/CCS, las señalizaciones, americana y europea respectivamente<br />
- B8ZS, y HDB3 son las codificaciones<br />
- Finalmente CRC4, el sistema de control de errores</p>
<p>Luego se configuran, los bchan (canales de datos) y el dchan (canal de señalizacion)</p>
<p>bchan = 1-23<br />
dchan = 24</p>
<p>- En modo americano</p>
<p>bchan = 1-15,17-31</p>
<p>dchan = 16</p>
<p>- En modo europeo</p>
<p>Y luego el loadzone = es/us y defaultzone=es/us es especialmente importante cuando se tratan de tarjetas digitales.</p>
<p>En el fichero /etc/dahdi/modules, hay que levantar el modulo especifico de la tarjeta de T1/E1 llamado wcte12x (primario con 1 puerto T1/E1 o wct4xxp (2 o 4 puertos T1/E1), y si hablamos de puertos BRI seria el modulo wcb4xxp</p>
<p>Finalmente se configura el chan_dahdi.conf muy parecido a las tarjetas analogicas Podemos empezar a amplicar elsistema de “contextos” para este fichero de configuracion.</p>
<p>[channels]</p>
<p>[Primarios]<br />
callerid=asreceived<br />
contexto=llamadas_entrantes<br />
signaling= //Aqui va la configuracion especifica de los primarios, hay opciones como pri_cpe (si recibimos de un operador) o pri_net (si somos los emisores de la señal)<br />
switchtype = //Otro especifico, teoricamente existen multiples tipos de primarios, la red National, la red de AT&amp;T en estados unidos, o la unificada de Europa EuroISDN, los valores posibles, “national”, “euroisdn”, etc. Y en el caso que estemos interconectando dos centralitas, por ejemplo a la Alcatel que hablabamos antes, pues aquí se pone “qsig”<br />
dahdichan=1-23 //los canales de datos que antes configuramos en el system.conf, caso Americano<br />
dahdichan=1-15,17-31 //los canales caso Europeo<br />
group = 1 //esto es practico para no tener que estar definiendo un canal en el extensions.conf para cada canal, se utiliza un “generico” que se aplica al “grupo de canales”, y se define como gX (siendo X el numero del grupo). Para este ejemplo una opcion seria: DAHDI/g1</p>
<p>Ademas un tema importante de los grupos es que se pueden configurar los mecanismos de selección de canal dentro del grupo. Se pueden aplicar distintas tecnicas de selección, como la secuencial empezando por el canal primero, por el final, metodo round-robin, etc. Esto se configura, al configurar el tipo de grupo en el extensions.conf. Antes puse DAHDI/g1, pero podria ser G1, r1 y R1 (la r es el metodo Round Robin)</p>
<p>Una gran diferencia con respecto a las lineas analogicas, es que las llamadas no entran a la extension start del dialplan, sino entran al telefono (DID) al que es llamado por tanto en el dialplan la extension “entrante” se define con el numero del DID</p>
<p>Ejemplos:</p>
<p>exten =&gt; 919191919,1,Dial(SIP/mitelefono)</p>
<p>exten =&gt; 929292929,1,Dial(SIP/tutelefono)</p>
<p>Pero esto ya lo vimos cuando trabajabamos con el Gateway de puertos BRI, Epygi, que tenia un mecanismo muy similar aunque se configurara externamente.</p>
<p><strong>- Fax en Asterisk</strong></p>
<p>A raiz de la version 1.8 mejoro bastante el soporte “nativo” para FAX con respecto a las versiones anteriores, tanto a nivel Passthrough por el protocolo T.38, como utilizando la maquina Asterisk como gestora de FAX. Pero realmente para esto segundo, el soporte de FAX por Asterisk es limitado o de pago si queremos utilizarlo en produccion. Aquí hay una <a href="http://www.enesoluciones.com/wordpress/2011/01/envio-y-recepcion-de-faxes-con-asterisk-1-8/">explicacion detallada del tema</a></p>
<p>En nuestro caso ya explicamos como tener un sistema completo y libre <a href="http://10000horas.com/asterisk/2011/01/29/preparando-nuestro-sistema-de-fax-en-asterisk-hylafax-iaxmodem/">utilizando Hylafax con el IAXModem</a> bastante efectivo. A raiz del mensaje de Enesoluciones (ahora Fundacion Guadalux) pense que el sistema nuevo de Asterisk sustituiria el Hylafax brutalmente, pero parece que no va a ser asi de momento,por el tema este de las licencias de pago que hablaba (aunque al parecer Digium ofrece una unica licencia gratuita para solo 1 llamada concurrente, que seguramente en muchas instalaciones para PYMES sea suficiente).</p>
<p><strong>- Asterisk Database (AstDB)</strong></p>
<p>Asterisk implementa un sistema de bases de datos muy sencillo para almacenar informacion relativamente poco compleja. Es mas comodo que tener que andar trabajando con conectores ODBC y demas historias siempre y cuando busquemos aplicaciones concretas donde haga falta almacenar valores y acceder a ellos facilmente, pero especificamente del propio sistema de configuracion de Asterisk (ejemplo las Listas Negras de llamantes, familia blacklist)</p>
<p>Las funciones de lectura y escritura son extremadamente sencillas (totalmente integradas en el sistema Asterisk). Basicamente son usos de la aplicación Set y manejo de variables pero con la funcion DB() cubriendo esta nueva “variable”.</p>
<p>La variable esta compuesta por familia/clave/valor por ejemplo users/mitelefono/SIP/mitelefono</p>
<p>En este caso la clave mitelefono dentro de la familia, users, tendra el valor SIP/mitelefono (que por ejemplo es el canal SIP que utiliza nuestro telefono SIP).</p>
<p>Ejemplos:</p>
<p>Asignar a un registro de la base de datos: Set(DB(users/mitelefono)=&#8217;SIP/mitelefono&#8217;)</p>
<p>Consultar el registro: ${DB(users/mitelefono)}</p>
<p>Con todo esto parece que podemos “recortar” en variables globales dentro de los ficheros de configuracion basicamente. A lo mejor seria interesante montar algo serio que utilice esto a mayor escala como lo que comentaba esto de los Blacklist, aunque realmente tampoco tendra mucho misterio, algunas lineas. Me lo apunto como futura practica.</p>
<p><strong>- Ultimo dia. 5: Seguridad en Asterisk</strong></p>
<p>Para finalizar, y dar cierre al Asteirsk Advanced, el ultimo dia se trataron multiples temas relacionados con la seguridad en Asterisk</p>
<p>Sobre este tema tengo que hacer un comentario: justamente, ahora que estoy bastante desconectado del mundo &#8220;tecnologico&#8221; a nivel profesional, no tengo tanto acceso como antes a tarjeterias, equipos de trabajo y demas historias que me hacian el mundo facil en el progreso Asterisk.  Pero concretamente acerca de la seguridad en Asterisk, supuestamente el sistema mas &#8220;peligroso&#8221; en el que montar un Asterisk es abierto a Internet. Por ello en las proximas entradas, voy a estar focalizando en esta idea, ya que mi forma de &#8220;progresar&#8221; de ahora en adelante va a ser montando una maquina Asterisk en Casa y ofreciendo servicios concretos a individuales, a mi empresa (de forma altruista) y a otras empresa que quiza pudieran interesarme por el potencial (¿patrocinio o algo asi?) que pudieran ofrecerme (especialmente por los recursos economicos que pudieran aportar al tema).</p>
<p>El tema de seguridad en Asterisk tomaba dos perspectivas: el tipo de securizacion que habia que tomar en consideracion por niveles de &#8220;inseguridad&#8221; (desde el montaje de una maquina aislada de la red, hasta el montaje de una maquina publicado a internet), y por otro lado, todos la securizacion de todos los componentes del sistema (desde los accesos a la propia maquina hardware, pasando por el sistema operativo, hasta el mismo dialplan).</p>
<p><strong>- Conclusiones y Consideraciones Finales sobre el Curso</strong></p>
<p><a href="http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-2/" target="_blank">Como comentaba el segundo dia</a> debo determinar y concluir que el curso ha satisfecho mis expectativas, ya que realmente el interes de hacer un curso de este calibre, no ha suele ser tanto, la cantidad de informacion recibida, sino la posibilidad de &#8220;expandir&#8221; conceptos acerca de la especialidad en concreto que viene a tratarse, a traves de los profesores y los compañeros. Hay que considerar que el precio realmente no cubre solo las horas de enseñanza, sino tambien las horas de &#8220;relacion&#8221;. Es cierto que para &#8220;conectar&#8221; con otros individuales especialistas o no especialistas en un sector, no es realmente necesario hacer un curso, y que para el aprendizaje por ese precio se podrian llegar a conseguir incluso, horas de enseñanza particulares por internet pactando con algun profesional un precio por hora (algun dCAP) sin excesiva dificultad. Pero mas alla de estas dos posibilidades, y la primera en particular, tambien hay que considerar que el perfil de alumno que va a un curso de este tipo, no suele ser de &#8220;<a href="http://es.wikipedia.org/wiki/Lurker" target="_blank">Lurker</a>&#8221; ya que al costar (bastante) dinero, suelen ser o aportes profesionales (empresas que quieren formar a sus trabajadores especialistas), o aportes personales (autonomos o como yo esta vez, especialmente interesados en el sector).</p>
<p>Proxima parada: <span style="text-decoration: underline;">Examen dCAP</span>. No se donde sera, pero desde hoy ya toca empezar a practicar y estudiar como el que mas. Segun parece, por los alumnos que se presentaron, el nivel del examen practico ha aumentado a practicamente al doble de dificultad que las ultimas convocatorias, y sobre el teorico no pude enterarme, ya que tuvimos que irnos a comer porque el examen se alargaba demasiado.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/19/advanced-asterisk-days-4-y-5/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/19/advanced-asterisk-days-4-y-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk Advanced. Day 3</title>
		<link>http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-3/</link>
		<comments>http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-3/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 18:48:36 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Basicos]]></category>
		<category><![CDATA[Introduccion]]></category>
		<category><![CDATA[Telefonia Analogica]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[asterisk ad]]></category>
		<category><![CDATA[cdr]]></category>
		<category><![CDATA[cel]]></category>
		<category><![CDATA[dahdi]]></category>
		<category><![CDATA[dialplan]]></category>
		<category><![CDATA[digium]]></category>
		<category><![CDATA[fxo]]></category>
		<category><![CDATA[FXS]]></category>
		<category><![CDATA[ground start]]></category>
		<category><![CDATA[kewl start]]></category>
		<category><![CDATA[loop start]]></category>
		<category><![CDATA[macros]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[tarjeta analogica]]></category>
		<category><![CDATA[tarjetas analogicas]]></category>
		<category><![CDATA[vanced]]></category>

		<guid isPermaLink="false">http://2.169</guid>
		<description><![CDATA[Hoy voy a hacer una prueba, escribir un articulo durante la clase a modo “Inline”. Seguramente salga un articulo demasiado extenso pero al menos, lo máximo completo. - Teoría de Macros en el DialPlan En primer lugar un tema que &#8230; <a href="http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-3/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoy voy a hacer una prueba, escribir un articulo durante la clase a modo “Inline”. Seguramente salga un articulo demasiado extenso pero al menos, lo máximo completo.</p>
<p><strong>- Teoría de Macros en el DialPlan</strong></p>
<p>En primer lugar un tema que no hemos visto hasta la fecha y es crucial para configuraciones de dialplan repetitivas, las Macros.</p>
<p>Dos conceptos basicos</p>
<p>Las macros se componen del contexto del Macro [macro-&lt;nombredelmacro&gt;]</p>
<p>Solo tienen una extension, la “s”<br />
exten =&gt; s,1,Answer()<br />
same =&gt; n,Hangup</p>
<p>Por otro lado, las Macros se ejecutan desde el Plan de Marcacion, como una aplicación cualquiera con el formato Macro(&lt;nombredelmacro&gt;, &lt;argumento1&gt;, &lt;argumento2&gt;, etc)</p>
<p>Luego dentro del contexto Macro para poder utilizar esos argumentos llamados se utilizan las variables especificas de las macros ${ARG1}, ${ARG2}, etc</p>
<p>Ejemplo:</p>
<p>[extensiones]<br />
exten =&gt; 100,1,Macro(prueba,SIP/mitelefono, 30)</p>
<p>[macro-prueba]<br />
exten =&gt; s,1,Dial(${ARG1},${ARG2})</p>
<p>Aparte disponemos de variables especificas de las Macro. ${MACRO_CONTEXT}, ${MACRO_EXTEN} y ${MACRO_PRIORITY}. Sirven para saber dentro de la macro, que contexto, que extensión y que prioridad llamó a la Macro.</p>
<p>Un ejemplo, si utilizamos un Buzon de Voz, que coincide con el numero de extension pues podriamos utilizar ${MACRO_EXTEN}:</p>
<p>[extensiones]<br />
exten =&gt; 100,1,Macro(prueba,SIP/mitelefono, 30)</p>
<p>[macro-prueba]<br />
exten =&gt; s,1,Dial(${ARG1},${ARG2})<br />
exten =&gt; n,VoiceMail(${MACRO_EXTEN})</p>
<p>A partir de aquí ya podemos dar “rienda suelta” a la imaginacion y poder simplificar nuestro trabajo de escritura de tareas repetitivas.</p>
<p><strong>- Asterisk Realtime</strong></p>
<p>Ya conocemos esto de artículos anteriores, c<a href="http://10000horas.com/asterisk/2011/02/28/meetme-in-a-box-web-meetme-conferencias-de-audio-de-altos-vuelos/">omo el uso del Web-MeetMe</a> (configuraciones de salas de conferencia directamente desde la Web, a través de bases de datos en “tiempo real” (realtime).</p>
<p>Pero ahora una visión un poco mas práctica de como se trabaja con Realtime, ya que realmente el Web-Meetme siguiendo los pasos venia prácticamente preparado paso por paso y no podíamos entender que estaba haciendo realmente a nivel interno.</p>
<p>La utilidad de Realtime sobre configuraciones en ficheros de texto, es simplemente el hecho de poder introducir modificaciones constantes de una forma ultra-rapida (mediante un interfaz web por ejemplo que acceda a la base de datos).</p>
<p>Un ejemplo tipico: en la web vemos el listado de usuarios, con un boton para borrarlos cuando los damos de baja, y luego un mini formulario en el que ponemos el usuario y la contraseña y damos de alta una extensión inmediatamente. No habria que estar accediendo al servidor, accediendo al fichero de texto, editándolo, guardando, recargando el modulo, etc&#8230;</p>
<p>En configuraciones estáticas (situaciones en las que rara vez se cambia una extension por ejemplo), es poco practico por que puede salir mas caro el collar que el perro. Pero si un dia nos da por diseñar una interfaz web sencilla, y una base de datos (fichero .sql) que precargue nuestros valores default, podriamos implementar esto en tiempo record y podríamos tenerlo siempre presente en todas nuestras instalaciones (quizá algún día lo plantee esto como un articulo, muchos temas ya tengo pendientes conforme avanzamos en el mundo de Asterisk).</p>
<p>Un primer inconveniente que encontramos, es que Asterisk pretende centralizar todas las conexiones a bases de datos a traves de una capa de abstraccion como ODBC, es decir que los conectores directos nativos como MySQL y PostgreSQL tienden a su desaparicion. Para los no demasiado experimentados en el mundo ODBC esto podria ser un inconveniente a corto plazo.</p>
<p>Si recuerdan, <a href="http://10000horas.com/asterisk/2011/02/28/meetme-in-a-box-web-meetme-conferencias-de-audio-de-altos-vuelos/">el Web-Meetme lo hacia todo a traves de ODBC</a> asi que este problema lo salvan (lo que no salvan que Meetme tiende a desaparcer tambien en favor de ConfBridge (nueva aplicación para conferencias sin necesidad de timing, tambien hablaremos de ella en un futuro).</p>
<p>Ahora sobre la configuración los ficheros involucrados</p>
<p>En primer lugar /etc/asterisk/extconfig.conf necesitamos añadir una linea del tipo<br />
&lt;nombredelaconfiguracion&gt; =&gt; &lt;driver&gt;,&lt;nombrebasededatos&gt;,&lt;nombretabla&gt;</p>
<p>En el caso ejemplo del Web-Meetme era:<br />
meetme =&gt; odbc,meetme, booking</p>
<p>El segundo fichero es el /etc/asterisk/res_config.conf</p>
<p>[nombrebasededatos]<br />
enabled =&gt; yes // Esta activada la conexion<br />
dsn =&gt; el Data Source Name del driver ODBC<br />
pre-connect =&gt; yes // La conexión se ejecuta al arrancar Asterisk<br />
username =&gt; usuario de la base de datos // En caso que conectemos por Puerto a la base de Datos, como en bases remotas<br />
password =&gt; password de la base de datos // Lo mismo que lo anterior</p>
<p>En el ejemplo que estamos siguiendo:</p>
<p>[meetme]<br />
dsn =&gt; meetme (este es el contexto que creamos antes en el sistema)<br />
username =&gt; asterisk (supuestamente va a ser nuestro usuario para asuntos de Asterisk y servidor de base de datos)<br />
password =&gt; asterisk (o la que le pusiéramos)<br />
pre-connect =&gt; yes<br />
enabled =&gt; yes</p>
<p>Ahora la configuracion del driver odbc en el sistema, /etc/odbc.ini</p>
<p>[meetme]<br />
Description = ODBC para MySQL // Una descripcion cualquiera<br />
Driver = MySQL // El driver ODBC que utilizamos, en este caso para MySQL por el tema ese que va a tender a desaparecer que comentábamos antes<br />
Server = localhost // Servidor donde esta la base de datos<br />
Database = meetme // Nombre de la base de datos con la que trabajaremos<br />
Port = 3306 // Puerto de la base de datos<br />
User = asterisk // En caso que conectemos por puerto en vez de por Socket<br />
Password = asterisk // En caso que conectemos por Socket<br />
Socket = <a href="file:///C:/var/run/mysqld/mysqld.sock">/var/run/mysqld/mysqld.sock</a> // Por aquí conectamos por Socket</p>
<p>Y finalmente /etc/odbcinst.ini</p>
<p>[MySQL]<br />
Description = MySQL ODBC MyODBC Driver<br />
Driver = /usr/lib/odbc/libmyodbc.so // librería ODBC del Driver MySQL<br />
Setup = /usr/lib/odbc/libodbcmyS.so // librería ODBC de Configuración MySQL</p>
<p>Solo quedaria configurar la tabla y base de datos y ya preparado.</p>
<p>Algunas consideraciones adicionales: para reducir el numero de peticiones a cache, el fichero de configuracion del modulo que estamos convirtiendo en “RealTime” introducimos la siguiente variable: <strong>rtcachefriends=yes</strong></p>
<p>De aquí pueden surgir multiples ideas prácticas que me gustaria probar personalmente y dedicar un articulo especifico con mis resultados, como por ejemplo, crear una funcion en func_odbc.conf para consultar algo especifico de una base de datos externa para tratarlo a traves del DialPlan, como por ejemplo consultar el telefono de un Cliente.</p>
<p><strong>- CDR y CEL</strong></p>
<p>Esta parte trata sobre como se gestiona CDR (Registro de Detalles de Llamada) y la nueva implementación mas detallada del registro CEL, en el que es posible ver a nivel de flujo de llamada de DialPlan, no solo a nivel de canal. La verdad es que es meramente informativa con informacion sobre los campos que se utilizan, y algunas aplicaciones de dialplan para edicion, pero realmente merece un articulo bastante amplio para poder entrar en detalle incluso algun mecanismo para extraer informacion como vimos <a href="http://10000horas.com/asterisk/2011/01/16/obteniendo-un-control-exhaustivo-de-llamadas-con-cdr-stats/">en el articulo de CDR-Stats,</a> una gran aplicación para poder visualizar los datos de forma bastante generica (y recuerdo que quede en montar un software para analizar llamadas pero mas en detalle para un proposito en concreto).</p>
<p><strong>- El mundo de las Tarjetas Analogicas</strong></p>
<p>Ya dedique varios articulos a este tema cuando empece a trabajar con la tarjeta TDM410P <a href="http://10000horas.com/asterisk/2010/08/20/combate-analogico-primer-asalto/">como el siguiente</a> y <a href="http://10000horas.com/asterisk/2011/01/16/combate-analogico-segundo-asalto/">la segunda parte del mismo</a>.</p>
<p>Algunos conceptos novedosos y no vistos hasta la fecha:</p>
<p>Sobre la tecnologia Analogica, existen tres posibles de sistemas de señalizacion, (en el fichero chan_dahdi.conf) ground start (en desuso), loop start (tambien en desuso) y kewl start (sistema mas utilizado en la actualidad, 99% de los casos).</p>
<p>Otra novedad que trae la version 1.8 es la posibilidad de crear contextos en el chan_dahdi.conf y tener por ejemplo un contexto generico [channels] donde especificar ciertos argumentos especificos de la tecnologia analogica (que eran los que soliamos definir antes del channel =&gt; cuando utilizabamos un modulo FXO</p>
<p>Ejemplo:</p>
<p>[channnels]<br />
usecallerid = yes<br />
transfer = yes</p>
<p>…</p>
<p>[telefono-analogico]<br />
callerid = “Telefono Analogico” &lt;1001&gt;<br />
context= extensiones<br />
signaling = fxo_ks<br />
dahdichan = &lt;el_canal_que_definimos_en_/etc/dahdi/system.conf&gt;</p>
<p>[linea-analogica]<br />
callerid=asreceived<br />
context = llamadas_entrantes<br />
signaling = fks_ks<br />
dahdichan = &lt;el_canal_que_definimos_en_/etc/dahdi/system.conf&gt;</p>
<p>Pero luego, en el Dialplan tenemos que seguir definiendo en canal a la vieja usanza (DAHDI/1, DAHDI/2, etc&#8230;)</p>
<p>Dato importante de las lineas extrantes analogicas, es que hay que mandarlas a un contexto en el DialPlan (por ejemplo, llamadas_entrantes) y dentro de ese contexto, poner la extension “s” (start) ya que es imposible reconocer hacia donde pretende ir esa llamada por las limitaciones de la “analogia”.</p>
<p>Mañana parece que seguiremos con el tema de las conexiones de Tarjeteria, pero esta vez con una nueva que no hemos visto hasta la fecha, una tarjeta de Primarios.</p>
<p>Espero vuestros comentarios sobre como quedo esta &#8220;modalidad&#8221; de blogging inline. Para mi particularmente resulto mas comoda porque en los huecos libres podia ir escribiendo, y no tener que hacer todo el texto ya a deshoras y ademas tambien ha servido un poco con &#8220;apuntes personales&#8221; de lo visto para revisiones futuras (como realmente es el blog entero para mi personalmente).</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-3/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk Advanced. Day 2</title>
		<link>http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-2/</link>
		<comments>http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-2/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 23:43:17 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Basicos]]></category>
		<category><![CDATA[Introduccion]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[asterisk advanced]]></category>
		<category><![CDATA[call files]]></category>
		<category><![CDATA[chanspy]]></category>
		<category><![CDATA[curso asterisk]]></category>
		<category><![CDATA[dmtf]]></category>
		<category><![CDATA[extenspy]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[pitch]]></category>
		<category><![CDATA[same]]></category>
		<category><![CDATA[transfer]]></category>

		<guid isPermaLink="false">http://2.164</guid>
		<description><![CDATA[Pasado el primer dia &#8220;introductorio&#8221; se empiezan a ver conceptos y aplicaciones mas interesantes para nuestro sistema Asterisk. Una de las conclusiones que he sacado en favor del curso, algo que personalmente me suele costar bastante sacar de la mayoria &#8230; <a href="http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-2/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pasado el primer dia &#8220;introductorio&#8221; se empiezan a ver conceptos y aplicaciones mas interesantes para nuestro sistema Asterisk. Una de las conclusiones que he sacado en favor del curso, algo que personalmente me suele costar bastante sacar de la mayoria de los cursos que he ido, es que la verdadera utilidad del curso no reside en el material que puedes encontrar en cualquier pagina medianamente buena que trate sobre asterisk como www.voip-info.org, sino realmente en la cantidad de aplicaciones practicas que surgen a raiz de la experiencia del profesor, y tambien de los compañeros del curso.</p>
<p>Realmente Asterisk, exceptuando la idea basica de una centralita, o del concepto generico de &#8220;quiero montar un callcenter&#8221; o &#8220;quiero montar una centralita para mi empresa&#8221;, sin ideas practicas de calidad, es totalmente inutil. Pero es cuando las ideas empiezan a ebuillar cuando se pueden empezar a pensar en infinidad de aplicaciones para la vida diaria que pueden resultar extremadamente utiles.</p>
<p>Por eso mas que escribir sobre teoria que se ha visto, y puede consultarse como dije, en VoipInfo, voy a comentar algunas que fueron surgiendo:</p>
<p>- Sistemas de Monitorizacion de llamadas</p>
<p>Seguramente todo buen conocedor de Asterisk (que no es mi caso) sepa, que existen aplicaciones para la grabacion de llamadas. Pero ya que el canal de llamadas puede ser &#8220;escuchado&#8221; para ser grabado en un fichero de audio, tambien podria ser &#8220;escuchado&#8221; en tiempo Real. Ahi es donde entran las aplicaciones &#8220;Espias&#8221; como ExtenSpy y ChanSpy. Dos aplicaciones muy faciles de utilizar en un dialplan:</p>
<p>exten =&gt; 100,1,Answer()<br />
exten =&gt; 100,n,ChanSpy()<br />
exten =&gt; 100,n,Hangup ()</p>
<p>Y simplemente accediendo a la extension 100, tenemos &#8220;barra libre&#8221; para escuchar todos las conversaciones en el canal SIP de nuestra maquina Asterisk pasando de una a otra desde el telefono a traves del boton &#8220;*&#8221;</p>
<p>- Generacion de llamadas Automaticas</p>
<p>Por otro lado, algo tambien muy interesante, es la posibilidad de generar llamadas automaticas a traves de un fichero de &#8220;llamada&#8221; que se introduce en un directorio que esta siendo constantemente &#8220;monitorizado&#8221; por un demonio de Asterisk que lo ejecuta, y procesa los comandos de la llamada.</p>
<p>Esto por ejemplo puede ser util, a traves de un script autoejecutado en el arranque del sistema, cuyo procedimiento sea, si por ejemplo se cae un servicio critico del servidor, y tenemos instalado un minimo asterisk en ese servidor al que hemos conectado una extension SIP nuestra para alertas, hacemos que cree un fichero de llamada a medida y lo movemos al directorio que comentaba antes ( el directorio exacto es /var/spool/asterisk/outgoing). En este caso, lo que haria seria generar la llamada a nuestra extension alertandonos que el servicio se cayo. Muy practico porque eventualmente todos sabemos que el telefono suele ser de prioridad nivel maxima mientras que el correo electronico (como aplicaciones tipo Nagios que generan y envian correos de alerta), suele ser de prioridad media o medio baja dependiendo el caso. O perfectamente podriamos combinar sistemas como Nagios y Asterisk para diseñar un sistema de alertas mediante mensajes de voz a un telefono provenientes del servidor.</p>
<p>El formato de estos ficheros de llamada es muy sencillo. Un fichero de texto con los posibles siguientes comandos:</p>
<p>Channel: SIP/mi_telefono //El canal a traves del que se cursara la llamada<br />
Application: Playback //Queremos que ejecute la aplicacion Playback para reproducir un mensaje automatico a voluntad<br />
Data: windows-server-caido //El fichero de audio que vamos a lanzar con la aplicacion Playback, en este caso tiene que encontrarse en el correspondiente directorio de sonidos de Asterisk en un formato permitido para su reproduccion por ejemplo windows-server-caido.wav<br />
Codecs: g729, ulaw, gsm // Codecs permitidos por el canal<br />
MaxRetries: 3 // Numero de intentos que se tratara de realizar la accion con exito</p>
<p>- Edicion y personalizacion del Features.conf</p>
<p>Por otro lado, tambien hoy se vio el fichero de configuracion, features.conf, en el que basicamente se definen la utilidad de las pulsaciones de botones DMTF y como seran interpretados por las aplicaciones que conllevan especialmente servicios de llamada como Dial y Queues.</p>
<p>Basicamente ya es sabido que existen en ese fichero una serie de definicios por defecto para realizar &#8220;Features&#8221; (Caracteristicas) como la transferencia de llamadas, el Parking de llamadas, etc, que quiza comente mas en detalle en un futuro.</p>
<p>Pero siguiendo con la linea practica, un ejemplo que se probo en la clase, fue la posibilidad de crear &#8220;Features&#8221; a medida, como por ejemplo, mapear dos combinaciones de teclas para subir y bajar el Pitch del canal de audio (para los entendidos en efectos de sonido, es la escala de frecuencia). Esto quiere decir que por ejemplo si tenemos a un operador en la oficina que tiene una voz muy aguda, y queremos dotarle de una voz mas grave sin tener que prescindir de esta persona para llamadas determinadas, le podemos configurar en su telefono la posibilidad de bajar 4 o 5 puntos el nivel de frecuencia, y sonaria tal y como deseamos para el receptor de la llamada. Asunto resuelto, ya tenemos un locutor de radio instantaneo a coste 0.</p>
<p>¿Como se consigue este efecto?</p>
<p>Primero en features.conf bajo el contexto [applicationmap] definimos algo asi:</p>
<p>pitchUp =&gt; #1,self/both,Set(PITCH_SHIFT(both)=high)<br />
pitchDown =&gt; #2,self/both,Set(PITCH_SHIFT(both)=low)</p>
<p>Con esto decimos que para conseguir alcanzar la caracteristicas &#8220;pitchUp&#8221; pulsando almohadilla + 1 subimos la frecuencia (tonalidades agudas) y al pulsar # + 2 bajamos la frecuencia (tonalidades graves)</p>
<p>Ahora para que esto sea aplicable a una aplicacion de llamada, es necesario modificar una variable general de Asterisk llamada __DYNAMIC_FEATURES (atencion a las dos _ del comienzo de la variable).</p>
<p>exten =&gt; 100,1,Set(__DYNAMIC_FEATURES=pitchUp#pitchDown)<br />
exten =&gt; 100,n,Dial(SIP/mitelefono)<br />
exten =&gt; 100,n,Hangup()</p>
<p>Ahora al llamar a la extension 100 y contactar con ese canal ahi definido, ambos interlocutores de la conversacion podran manipular su voz pulsando las combinaciones de teclas anteriormente descritas. Todo un lujo de goce y disfrute para la conversacion.</p>
<p>- Importante Novedad de la version 1.8 de Asterisk</p>
<p>Finalmente para terminar, aun a sabiendas que me quedan mil cosas en el tintero que podria escribir, quiero comentar algo nuevo que ha surgido en las ultimas versiones de Asterisk y SIMPLIFICA los Dialplans una burrada.</p>
<p>Hablo de &#8220;SAME&#8221;. Esto simplamente permite el hecho de poder obviar el exten =&gt; junto al numero de extension que vamos repitiendo en un flujo de llamada para una extension concreta</p>
<p>Antes:</p>
<p>exten =&gt; _6XX32XZ1X,1,NoOp()<br />
exten =&gt;  _6XX32XZ1X,n,Dial(${Troncal}/${EXTEN})<br />
exten =&gt; _6XX32XZ1X,n,Hangup</p>
<p>Ahora:</p>
<p>exten =&gt; _6XX32XZ1X,1,NoOp()<br />
same =&gt; n,Dial(${Troncal}/${EXTEN})<br />
same =&gt; n,Hangup</p>
<p>Definitivamente MUY comodo. Gracias al iluminado por implementar esta mejora.</p>
<p>Eso es todo por hoy, mañana espero, mucho mas.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-2/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/16/asterisk-advanced-day-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk Advanced. Day 1</title>
		<link>http://10000horas.com/asterisk/2011/11/14/asterisk-advanced-day-1/</link>
		<comments>http://10000horas.com/asterisk/2011/11/14/asterisk-advanced-day-1/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 19:41:04 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Introduccion]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[asterisk advanced]]></category>
		<category><![CDATA[dcap]]></category>
		<category><![CDATA[digium]]></category>
		<category><![CDATA[sip]]></category>

		<guid isPermaLink="false">http://2.162</guid>
		<description><![CDATA[Primer dia del Asterisk Advanced. Se han visto por lo general temas basicos introductorios del sistema. Todo aquel que hubiera realizado un Fast Start, puede sobrellevar este dia sin despeinarse. Muchos conceptos teoricos sobre Asterisk, curiosidades, producto Digium y alguna &#8230; <a href="http://10000horas.com/asterisk/2011/11/14/asterisk-advanced-day-1/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Primer dia del Asterisk Advanced. Se han visto por lo general temas basicos introductorios del sistema. Todo aquel que hubiera realizado un Fast Start, puede sobrellevar este dia sin despeinarse. Muchos conceptos teoricos sobre Asterisk, curiosidades, producto Digium y alguna terminologia basica en lo referente al protocolo SIP. Nada que merezca por mi parte la pena destacar.</p>
<p>Configurar una extension, un pequeño IVR (como ya hemos visto en anteriores entradas de este blog), y una comunicacion con un proveedor SIP. Me hubiera gustando poder volver a escribir un buen articulo en representacion al dia de hoy, pero no hay suficiente material interesante, que no haya sido visto hasta la fecha.</p>
<p>Solo una cosa tengo que reconocer. Estos meses de inactividad me han hecho olvidar gran parte del sistema de configuracion, y porque no decirlo, esta clase me ha servido para poner un poco al dia mi actividad mental asteriskera, para volver un poco a la carga.</p>
<p>Seguiremos informando!</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/14/asterisk-advanced-day-1/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/14/asterisk-advanced-day-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Volviendo a Asterisk casi 1 Año despues</title>
		<link>http://10000horas.com/asterisk/2011/11/13/volviendo-a-asterisk-casi-1-ano-despues/</link>
		<comments>http://10000horas.com/asterisk/2011/11/13/volviendo-a-asterisk-casi-1-ano-despues/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 22:43:14 +0000</pubDate>
		<dc:creator>SirLouen</dc:creator>
				<category><![CDATA[Introduccion]]></category>
		<category><![CDATA[advanced]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[dcap]]></category>
		<category><![CDATA[digium]]></category>
		<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://2.157</guid>
		<description><![CDATA[Mucho ha llovido (no tanto en realidad) desde la ultima vez que publique algo en este Blog. Pensaba que seria mas costante y no dejaria de publicar cosas a lo largo del tiempo, pero se ve que los avatares de &#8230; <a href="http://10000horas.com/asterisk/2011/11/13/volviendo-a-asterisk-casi-1-ano-despues/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mucho ha llovido (no tanto en realidad) desde la ultima vez que publique algo en este Blog. Pensaba que seria mas costante y no dejaria de publicar cosas a lo largo del tiempo, pero se ve que los avatares de la vida te obligan a tener que dejar cosas de lado como esta por muy interesantes que resulten.</p>
<p>El tema es que mañana, 14 de noviembre, empieza el curso en Malaga <a href="http://avanzada7.com/noticia/118/Curso+oficial+Digium%C2%AE+Asterisk+Advanced+%2814-18+de+Noviembre%29" target="_blank">Asterisk Advanced </a>y se me ocurrio la genial idea de apuntarme para volver a coger el ritmo. Ya por entonces <a href="http://10000horas.com/asterisk/2010/06/13/comenzando-la-andadura-en-el-mundo-de-asterisk/" target="_blank">cuando empezaba mi andadura,</a> el evento que motivo mi &#8220;carrera asteriskera&#8221; fue el curso Fast Start (que publicidad a Avanzada 7 mas desmedida!) pero ahora, creo que ya ha llegado el momento de empezar a tomar un curso mas serio, y empezar a plantear una alternativa &#8220;profesional&#8221; con vistas puestas en el certificado Digium CAP (dCAP). Esta vez no voy a hacer el examen porque no tengo muy claro que vaya a aprobar mas sabiendo que hace mucho tiempo que no toco una maquina Asterisk.</p>
<p>Pero esperemos que este curso ya me sirva de lanzadera para llegar al siguiente objetivo. Por ahora tratare de ir resumiendo los proximos 5 dias de mi andadura por el curso (alerta SGAE!) por si pudieran servir de experiencia para cualquiera que como yo quiera plantearse dar el paso a alcanzar el dCAP.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/es_ES/all.js#appId=193207750701524&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://10000horas.com/asterisk/2011/11/13/volviendo-a-asterisk-casi-1-ano-despues/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://10000horas.com/asterisk/2011/11/13/volviendo-a-asterisk-casi-1-ano-despues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: 10000horas.com @ 2012-02-07 05:42:25 -->
