<?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>Mi Brain-Training Personal</title>
	<atom:link href="http://www.saghul.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.saghul.net/blog</link>
	<description>Para que no se me olviden las cosas...</description>
	<lastBuildDate>Thu, 04 Mar 2010 23:06:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OpenSIPS estrena diseño</title>
		<link>http://www.saghul.net/blog/2010/03/05/opensips-estrena-diseno/</link>
		<comments>http://www.saghul.net/blog/2010/03/05/opensips-estrena-diseno/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 23:06:09 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[OpenSIPS]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1095</guid>
		<description><![CDATA[Y no es que hayan cambiado el CSS de la web. OpenSIPS va a ser reescrito por completo a partir del diseño que fue publicado hace unos días.
OpenSIPS tiene ya más de 7 años, tiempo en el que ta tecnología ha ido cambiado y han ido surgiendo necesidades y problemas que antes no había. Intuyo [...]]]></description>
			<content:encoded><![CDATA[<p>Y no es que hayan cambiado el CSS de la web. <a href="http://www.opensips.org" target="_blank">OpenSIPS</a> va a ser reescrito por completo a partir del diseño que <a href="http://www.opensips.org/Development/NewDesignDescription" target="_blank">fue publicado hace unos días</a>.</p>
<p>OpenSIPS tiene ya más de 7 años, tiempo en el que ta tecnología ha ido cambiado y han ido surgiendo necesidades y problemas que antes no había. Intuyo que no habrá sido fácil decidir reescribirlo, ya que supone mucho esfuerzo, pero seguramente sea lo mejor para un futuro.</p>
<p>El nuevo diseño se basa en el patrón <a href="http://en.wikipedia.org/wiki/Reactor_pattern" target="_blank">reactor</a> asíncrono, gracias al cual no habrá problemas de bloqueo entre los procesos de OpenSIPS, algo que actualmente si que puede suceder al hacer operaciones como consultas a BBDD, etc. Además, habrá dos importantes partes: el <em>core</em> y el <em>routing engine</em>.</p>
<ul>
<li>SIP core: El encargado de realizar el procesamiento de SIP a bajo nivel. Su arquitectura se basa en capas, cada una de las cuales decidirá si tiene que hacerse cargo del mensaje SIP o delegará la tarea a la capa siguiente.</li>
</ul>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/03/new_design-routing-internal.png"><img class="size-medium wp-image-1096 aligncenter" title="new_design-routing-internal" src="http://www.saghul.net/blog/wp-content/uploads/2010/03/new_design-routing-internal-300x214.png" alt="new_design-routing-internal" width="300" height="214" /></a></p>
<ul>
<li>Routing Engine: Encargado de gestionar la lógica de enrutado a alto nivel.</li>
</ul>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/03/new_design-routing-external.png"><img class="size-medium wp-image-1097 aligncenter" title="new_design-routing-external" src="http://www.saghul.net/blog/wp-content/uploads/2010/03/new_design-routing-external-300x214.png" alt="new_design-routing-external" width="300" height="214" /></a></p>
<p>Otro importante cambio con respecto al diseño actual es la posibilidad de utilizar varios <em>routing engines</em> con un solo <em>core</em>, de manera que cada <em>routing engine</em> implemente un funcionamiento diferente, pero un único <em>core</em> se encargue del procesamiento SIP a bajo nivel.</p>
<p>Hasta ahora, la lógica de OpenSIPS se definía en un fichero cfg en una sintaxis similar a C, pero con el nuevo diseño tendremos dos opciones para definir el funcionamiento de nuestro servidor:</p>
<ul>
<li>Librería: La funcionalidad será una o varias capas adicionales del core, por lo que será compilada junto a el y formará parte del mismo ejecutable.</li>
<li>Aplicación externa: Una aplicación externa será la encargada de realizar las operaciones de rutado comunicándose con el core. Al ser una identidad externa, <strong>la lógica podrá escribirse en un lenguaje &#8220;de verdad&#8221; como Python</strong>, de manera que la flexibilidad a la hora de configurar el servidor es la que te ofrezca el lenguaje que escojas. How cool is that?!</li>
</ul>
<p>Éste post es solo un resumen del documento que podéis ver <a href="http://www.opensips.org/Development/NewDesignDescription" target="_blank">aquí</a>. Os recomiendo echarle un vistazo, veremos que tal sale la cosa <strong>dentro de unos 12 meses</strong>. <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Si tenéis alguna duda, <strong>mañana viernes 5 de Marzo</strong> el tema central de la <a href="http://vuc.me" target="_blank">VoIP Users Conference</a> será el diseño de OpenSIPS, y como invitados estarán Bogdan-Andrei Iancu (CEO en Voice-System), Adrian Georgescu (CEO en AG Projects) y Flavio Golcalves (autor de &#8216;Building Telephony Systems with OpenSIPS 1.6&#8242;).</p>
<p>¿Te lo vas a perder?</p>
<p>Por último me gustaría felicitar al equipo de &#8216;arquitectos&#8217; que ha diseñado el nuevo OpenSIPS: Bogdan Iancu, Anca Vamanu, Andrei Dragus y Dan Pascu, OpenSIPS 2.0, here we go!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/03/05/opensips-estrena-diseno/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ICE, ¿la solución definitiva al NAT en SIP?</title>
		<link>http://www.saghul.net/blog/2010/02/28/ice-%c2%bfla-solucion-definitiva-al-nat-en-sip/</link>
		<comments>http://www.saghul.net/blog/2010/02/28/ice-%c2%bfla-solucion-definitiva-al-nat-en-sip/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 11:42:14 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Blink]]></category>
		<category><![CDATA[ICE]]></category>
		<category><![CDATA[MediaProxy]]></category>
		<category><![CDATA[NAT]]></category>
		<category><![CDATA[OpenSIPS]]></category>
		<category><![CDATA[PJSIP]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[SIPSIMPLE]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1085</guid>
		<description><![CDATA[Tras estar varias semanas trabajando en éste tema me he decidido a escribir un (largo) post comentando qué es y cómo funciona esto del ICE, ya que no es algo que se esté utilizando demasiado desafortunadamente.
Introducción
Interactive Connection Establishment (ICE) define un protocolo de actuación gracias al cual dos dispositivos SIP son capaces de mantener una sesión [...]]]></description>
			<content:encoded><![CDATA[<p>Tras estar varias semanas trabajando en éste tema me he decidido a escribir un (largo) post comentando qué es y cómo funciona esto del <a href="http://tools.ietf.org/html/draft-ietf-mmusic-ice-19" target="_blank">ICE</a>, ya que no es algo que se esté utilizando demasiado desafortunadamente.</p>
<p><strong>Introducción</strong></p>
<p><a href="http://tools.ietf.org/html/draft-ietf-mmusic-ice-19" target="_blank">Interactive Connection Establishment</a> (ICE) define un protocolo de actuación gracias al cual dos dispositivos SIP son capaces de mantener una sesión multimedia salvando todas las dificultades que el NAT pueda poner de por medio. Aún se encuentra en estado de draft (la última es la revisión 19), pero está en la cola para obtener un número de RFC.</p>
<p>ICE permite que los dispositivos involucrados en la sesión SIP prueben distintos medios o rutas para comunicarse entre sí y acuerden uno común. Gracias a ICE es posible que dos terminales que se encuentran en la misma LAN envíen el tráfico RTP de manera local, en lugar de utilizar un <em>relay</em> como <a href="http://mediaproxy.ag-projects.com/" target="_blank">MediaProxy</a> o <a href="http://www.rtpproxy.org/" target="_blank">RTPProxy</a>, sin realizar ninguna configuración exótica en el servidor. La inteligencia está en los terminales.</p>
<p><strong>¿Cómo funciona?</strong></p>
<p>ICE es un proceso bastante complejo que consta de 9 pasos que intentaré simplificar aquí. Para obtener una información más completa os recomiendo leeros el <em>draft</em>, que aunque es bastante denso describe el mecanismo completo.</p>
<p><strong>Paso 1: Obtención de candidatos</strong></p>
<p>En éste primer paso el llamante obtiene todos los candidados que pueda para posteriormente añadirlos al SDP. Lo habitual es que disponga de dos tipos de candidatos:</p>
<ul>
<li>Host candidates: candidatos que representan tarjetas de red del sistema, incluyendo enlaces VPN etc.</li>
<li>Server reflexive candidates: candidatos obtenidos al realizar consultas a un servidor STUN. Lo habitual es obtener un único candidato de éste tipo con tu propia dirección IP pública.</li>
</ul>
<p><strong>Paso 2: Aplicar prioridades</strong></p>
<p>Tras obtener la lista de candidatos se aplican prioridades, de manera que unos candidatos se prefieran frente a otros. Por ejemplo, la especificación indica que un candidato <em>host</em> ha de ser más prioritario que uno de tipo <em>relayed</em>, es decir, se prefiere mandar el audio por la LAN que a través de un servidor externo que encamina nuestro audio, lo cual tiene bastante sentido.</p>
<p>Al finalizar este paso se construye el SDP que será enviado. Veamos un ejemplo:</p>
<p><code>v=0<br />
o=- 3476345811 3476345811 IN IP4 192.168.99.53<br />
s=sipsimple 0.12.0<br />
c=IN IP4 192.168.99.53<br />
t=0 0<br />
m=audio 60770 RTP/AVP 103 102 9 0 8 117 3 101<br />
a=rtcp:60771 IN IP4 62.131.6.55<br />
a=rtpmap:103 speex/16000<br />
a=rtpmap:102 speex/8000<br />
a=rtpmap:9 G722/8000<br />
a=rtpmap:0 PCMU/8000<br />
a=rtpmap:8 PCMA/8000<br />
a=rtpmap:117 iLBC/8000<br />
a=fmtp:117 mode=20<br />
a=rtpmap:3 GSM/8000<br />
a=rtpmap:101 telephone-event/8000<br />
a=fmtp:101 0-15<br />
a=ice-ufrag:3e0cc9fc<br />
a=ice-pwd:19d32c8c<br />
a=candidate:Sc0a86335 1 UDP 1862270975 62.131.6.55 60770 typ srflx raddr 192.168.99.53 rport 48649<br />
a=candidate:Hc0a86335 1 UDP 1694498815 192.168.99.53 48649 typ host<br />
a=candidate:Ha45450a 1 UDP 1694498815 10.69.69.10 48649 typ host<br />
a=candidate:Sc0a86335 2 UDP 1862270974 62.131.6.55 60771 typ srflx raddr 192.168.99.53 rport 48868<br />
a=candidate:Hc0a86335 2 UDP 1694498814 192.168.99.53 48868 typ host<br />
a=candidate:Ha45450a 2 UDP 1694498814 10.69.69.10 48868 typ host<br />
a=sendrecv</code></p>
<p><strong>Paso 3: Iniciación</strong></p>
<p>En este paso simplemente se envía el INVITE al usuario correspondiente con el SDP creado en el paso 2. SIP atravesará el NAT mediante los mecanismos tradicionales (rport, etc.) por lo que no hay que hacer tratamiento de NAT para el SDP.</p>
<p><strong>Paso 4: Obtención de candidatos (llamado)</strong></p>
<p>Al recibir el INVITE con la oferta en el SDP, el llamado comienza a obtener sus propios candidatos de la misma manera que lo hizo el llamante. Una vez más, lo habitual es obtener candidatos <em>host</em> y <em>server reflexive</em>. Una vez se obtienen los candidatos, se aplican prioridades y se construye el SDP que será enviado.</p>
<p><strong>Paso 5: Información</strong></p>
<p>El llamado responde al INVITE con una respuesta (provisional o definitiva) y en su SDP habrá incluido sus candidatos.</p>
<p>NOTA: Aunque puede tener sentido enviar la respuesta en una respuesta provisional (18X) SIP no especifica como actuar ante la recepción de múltiples respuestas 18X con SDP, por lo que si encima añadimos ICE al asunto lo mas probable es que no podamos establecer la comunicación. En todas las pruebas que he hecho (y han sido muchas) la negociación ICE no lleva más de 2 segundos, por lo que hacerla tras el 200 OK no es un problema IMHO.</p>
<p><strong>Paso 6: Verificación</strong></p>
<p>Cada agente (llamado y llamante) involucrado en la comunación empareja sus candidatos con los candidatos remotos para formar parejas de candidatos. Éstas parejas serán evaluadas por orden de prioridad descendente por el agente controlador. Por simplificar, diremos que el agente controlador siempre el el llamante (esto puede variar, pero en casos bastante peculiares, que creo que añadirían demasiada confusión al tema).</p>
<p>En éste momento ambos agentes comienzan a realizar pruebas de conectividad cada 20ms. Éstas pruebas se llevan a cabo mediante paquetes especiales STUN que contienen <em>binding requests</em>. El agente remoto contestará con la IP y el puerto desde los que ha recibido dicha <em>binding request</em> y así el agente que ha enviado la petición sabrá que el test ha sido satisfactorio y marcará el candidato como válido.</p>
<p>Si uno de los agentes involucrados en la sesión se encuentra tras un NAT simétrico, esto será detectado al ver la diferencia entre el <em>server reflexive candidate</em> publicado y el origen del <em>binding request</em> que mandará. Entonces se crea un nuevo candidato de tipo <em>peer reflexive</em>, que contiene la IP y puerto donde estará el RTP (los test de conectividad de hacen enviando paquetes STUN a los puertos donde posteriormente habrá RTP). Gracias a esto es posible que un usuario tras NAT simétrico y otro tras un NAT no simétrico hablen entre si con audio de router a router. Increíble, ¿no?</p>
<p><strong>Paso 7: Coordinación</strong></p>
<p>Tras la negociación ambos agentes involucrados en ella han de terminar con un par de candidatos válidos por cada componente. Lo habitual es tener dos componentes por cada <em>stream</em> en el SDP: un componente para el RTP y otro para el RTCP.</p>
<p>El agente controlador (habitualmente el que realiza la llamada) elegirá un candidato. A éste proceso se le llama <em>nominación</em>. Para validar éste candidato se envía otra <em>binding request</em> (STUN) pero en esta ocasión se incluye un <em>flag</em>. Ambos agentes utilizarán el par de candidatos que ha pasado las pruebas de conectividad y que además esté nominado.</p>
<p>Recordemos que todo éste proceso ha sido realizado por los agentes utilizando paquetes STUN entre si, sin ninguna interacción por parte del servidor.</p>
<p><strong>Paso 8: Comunicación</strong></p>
<p>Ahora que ambos agentes saben cómo comunicarse, ya pueden enpezar ha hablar, y tenemos garantizado que habrá audio bidireccional, ya que las pruebas de conectividad se realizan en ambas direcciones.</p>
<p><strong>Paso 9: Confirmación</strong></p>
<p>Aunque toda la negociación ha tenido lugar entre los agentes es posible (y habitual) que haya otros agentes en el medio de la señalización, como por ejemplo <em>proxys</em>. Para que los <em>proxys</em> o las <em>middle-boxes</em> entre el llamado y el llamante estén al tanto de lo sucedido, se enviará un re-INVITE o un UPDATE con el resultado de la negociación en el caso de que el candidato seleccionado no sea el candidato por defecto (las líneas c y m del SDP).</p>
<p><strong>¡Qué way!, esto funciona, ¿no?</strong></p>
<p>Pues, para variar, no. Lo habitual para el tratamiento de NAT consiste en que el proxy modifica el SDP si detecta NAT e indica como origen del RTP y RTCP un servidor que hará las veces de <em>media relay</em>.</p>
<p>Al modificar el SDP, no habrá ningún candidato que corresponda a la IP y puerto de las líneas c y m del SDP, por lo que al recibir un INVITE así el otro extremo nos responderá con ésto en su SDP: <em>a=ice-missmatch</em>. Mal tema. ¡Hay que solucionarlo!</p>
<p><strong>&#8220;Arreglando&#8221; la negociación ICE con OpenSIPS y MediaProxy</strong></p>
<p>Para solucionar éste problema ha sido necesario modificar <a href="http://www.opensips.org" target="_blank">OpenSIPS</a> y MediaProxy (los componentes con los que trabajo actualmente, pero lo mismo puede hacerse para Kamailio/SIP-Router y RTPProxy).</p>
<p>Resumiendo un poco (tenéis una explicación más completa <a href="http://mediaproxy.ag-projects.com/wiki/ICE" target="_blank">aquí</a>) lo que sucederá es que OpenSIPS añadirá un nuevo candidato de tipo <em>relayed</em> cuando modifique el SDP, de manera que corresponda con la IP y puerto de las líneas c y m. MediaProxy es ahora capaz de &#8220;dejar pasar&#8221; las pruebas de conectividad STUN, por lo que al modificar el INVITE inicial y su correspondiente respuesta habremos &#8220;engañado&#8221; a los agente insertando un nuevo candidato.</p>
<p>Mediante un parámetro es posible controlar la prioridad del candidato que OpenSIPS insertará, afectando así al resultado de la negociación.</p>
<p>Ahora sí, ¡funciona! puedo hablar con audio P2P en mi LAN aunque fuerce el uso de MediaProxy, porque al detectar una negociación ICE satisfactoria MediaProxy se &#8220;quita de en medio&#8221;. También he probado ha hablar con audio de router a router entre un NAT simétrico y otro de tipo <em>port restricted</em>. How f*c*i*g cool is that?</p>
<p><strong>¡Quiero probarlo!</strong></p>
<p>No tan rápido vaquero. Nos falta hablar de el tema más importante: los clientes SIP. Sólo conozco tres (en esencia uno) que implemente ICE correctamente. Y cuando digo correctamente es que me he leído el draft, el código y he probado que funciona <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Los clientes SIP con soporte ICE (draft versión 19) son <a href="http://www.pjsip.org/" target="_blank">PJSIP</a>, <a href="http://sipsimpleclient.com/" target="_blank">SIPSIMPLE client</a> (su core es PJSIP) y <a href="http://icanblink.com/" target="_blank">Blink</a> (su core es SIPSIMPLE).</p>
<p>Si alguien descubre o está desarrollando un cliente SIP que cumpla la especificación ICE (draft 19) me encantaría probar la interoperabilidad con él.</p>
<p>Actualmente no hay ninguna versión (release) de OpenSIPS que incluya el parche para &#8220;solucionar&#8221; el problema de ICE, así que podéis parchear manualmente como se menciona <a href="http://mediaproxy.ag-projects.com/wiki/ICE" target="_blank">aquí</a> o podéis utilizar el servicio gratuito <a href="http://sip2sip.info" target="_blank">SIP2SIP</a>, que ya dispone de todo lo necesario (parches para OpenSIPS y última versión de MediaProxy).</p>
<p><strong>Conclusiones</strong></p>
<p>Tras estar un mes con éste tema por fin he podido comprobar que <strong>funciona</strong>. No obstante, es triste ver que hay muy pocas implementaciones de ICE y que solo una funcione. Es cuanto menos sorprendente que softphones de pago de supuesto prestigio digan que soportan ICE y en el SDP se vea claramente no de la manera correcta.</p>
<p>Hay que agradecer a Benny Prijono y el equipo de PJSIP el buen trabajo que han realizado al respecto acudiendo en enumerosas ocasiones al SIPit para mejorar su SIP stack.</p>
<p>¡Joder que largo me ha quedado esto! Para más información podéis leer el <a href="http://tools.ietf.org/html/draft-ietf-mmusic-ice-19" target="_blank">draft</a> y echarle un ojo a <a href="http://www.jdrosen.net/papers/ice-basic-tutorial.pdf" target="_blank">ésta presentación</a>.</p>
<p>Happy ICE skating! <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/02/28/ice-%c2%bfla-solucion-definitiva-al-nat-en-sip/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Undervolted Kernel: ahorrando batería en Android</title>
		<link>http://www.saghul.net/blog/2010/02/26/undervolted-kernel-ahorrando-bateria-en-android/</link>
		<comments>http://www.saghul.net/blog/2010/02/26/undervolted-kernel-ahorrando-bateria-en-android/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 08:25:54 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[NexusOne]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1088</guid>
		<description><![CDATA[Una de las cosas que a mucha gente le preocupa sobre los teléfonos móviles es la duración de la batería. Teniendo en cuenta que cada vez son capaces de realizar más funciones, las baterías duran menos, aunque éstas hayan mejorado mucho en los últimos años.
Para mejorar la duración de la batería en nuestro terminal Android [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas que a mucha gente le preocupa sobre los teléfonos móviles es la duración de la batería. Teniendo en cuenta que cada vez son capaces de realizar más funciones, las baterías duran menos, aunque éstas hayan mejorado mucho en los últimos años.</p>
<p>Para mejorar la duración de la batería en nuestro terminal Android vamos a ver cómo instalar un <em>undervolted kernel</em> en un Nexus One (si dispones de otro terminal Android busca un undervolted kernel adaptado a él).</p>
<p>El concepto de un <em>undervolted kernel</em> es sencillo: consiste en mantener el procesador trabajando a la velocidad original, pero utilizando menos voltaje para ello. Al utilizar menos voltaje, obtendremos una mayor duración de la batería. Esto no es posible con todos los terminales, pero con el Nexus One al menos si, así que ¡vamos a ello!</p>
<p>Necesitamos tener <a href="http://www.saghul.net/blog/2010/01/31/root-y-custom-rom-en-el-nexus-one/" target="_blank">instalada la ROM</a> CyanogenMod 5.0.3.1, y los pasos a seguir son sencillos: descargar el kernel, flashearlo desde fastboot, reiniciar el terminal y habilitar el módulo de WiFi:</p>
<p><code>wget http://kmobs.scepterr.info/kernels/zImage33UV.zip<br />
unzip zImage33UV.zip -d uvkernel<br />
(reiniciamos el androide en modo fastboot)<br />
./fastboot flash zimage uvkernel/zImage33UV<br />
./fastboot reboot<br />
(una vez ha arrancado normal)<br />
./adb remount<br />
./adb push uvkernel/b*.ko /system/lib/modules<br />
./adb reboot</code></p>
<p>Happy undervolting!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/02/26/undervolted-kernel-ahorrando-bateria-en-android/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>VoIP en Android</title>
		<link>http://www.saghul.net/blog/2010/02/14/voip-en-android/</link>
		<comments>http://www.saghul.net/blog/2010/02/14/voip-en-android/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 15:15:13 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Adroid]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[ENUM]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1074</guid>
		<description><![CDATA[¡Hola amigos del androide y de la VoIP!
Hoy os voy a contar un poco como veo el panorama de aplicaciones relacionadas con VoIP en Android, tras llevar jugando unas semanas  
SIP
Hay unos cuantos softphones SIP, pero en realidad solo uno es el que vale (hay otros que a su vez son medio-forks de éste): [...]]]></description>
			<content:encoded><![CDATA[<p>¡Hola amigos del androide y de la VoIP!</p>
<p>Hoy os voy a contar un poco como veo el panorama de aplicaciones relacionadas con VoIP en Android, tras llevar jugando unas semanas <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>SIP</strong></p>
<p>Hay unos cuantos softphones SIP, pero en realidad solo uno es el que vale (hay otros que a su vez son medio-forks de éste): <a href="http://www.cyrket.com/p/android/org.sipdroid.sipua/" target="_blank">SIPdroid</a>. Se integra perfectamente con la agenda de contactos y funciona en segundo plano. Imprescindible. La calidad de audio es bastante buena (soporta los codecs G711a y G711u) e incluso soporta vídeo en H263 (vale, no es H264, pero ¡funciona!). Como punto negativo, comentar que no dispone de soporte para más de una cuenta SIP, pero el autor comenta que lo añadirá. Cuando lo haga será el softphone SIP definitivo para Android.</p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122158.jpg"><img class="size-medium wp-image-1075 aligncenter" title="CAP201002122158" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122158-180x300.jpg" alt="CAP201002122158" width="180" height="300" /></a></p>
<p><strong>Skype</strong></p>
<p>Suponiendo que también consideremos Skype VoIP, es curioso que la aplicación <em>oficial</em> solo soporte chat mientras que <a href="http://www.cyrket.com/p/android/com.fring/" target="_blank">Fring</a> y <a href="http://www.cyrket.com/p/android/com.nimbuzz/" target="_blank">Nimbuzz</a> también soportan voz. Solo he probado Fring, pero el resultado es muy bueno. Funciona en background y la calidad de audio hablando por WiFi es buena. Como algunos sabréis Fring (y creo que Nimbuzz también) soporta SIP, leed el siguiente apartado.</p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122150.jpg"><img class="size-medium wp-image-1077 aligncenter" title="CAP201002122150" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122150-180x300.jpg" alt="CAP201002122150" width="180" height="300" /></a></p>
<p style="text-align: center; "><em>Fring cargando&#8230;</em></p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122200.jpg"><img class="size-medium wp-image-1078 aligncenter" title="CAP201002122200" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122200-180x300.jpg" alt="CAP201002122200" width="180" height="300" /></a></p>
<p style="text-align: center; "><em>Fring permite chat y llamadas de voz</em></p>
<p><strong>Que aplicaciones NO utilizar</strong></p>
<p>Como he comentado antes, Fring también soporta SIP, pero NO utilicéis Fring con vuestra cuenta SIP. Fring intercepta todas las comunicaciones SIP y las hace pasar por sus servidores para supuestamente ayudar con el NAT. ¿Qué majos eh? A cambio de ese <em>arreglo</em> toda nuestra privacidad es vulnerada además de que el retardo es mayor, dado que nuestra llamada tiene que rebotar en sus servidores.</p>
<p><strong>El combo: ENUMdroid + SIPdroid</strong></p>
<p>Si no has leído el <a href="http://www.saghul.net/blog/2010/02/08/%C2%BFque-es-y-para-que-sirve-enum/" target="_blank">post sobre ENUM</a> ¡corre a leerlo! Bien, ahora que sabes lo que es ENUM vamos a ver una aplicación muy interesante que nos permitirá integrar ENUM con la agenda de contactos y demás aplicaciones: <a href="http://www.cyrket.com/p/android/uk.nominet.android.phone/" target="_blank">ENUMdroid</a>.</p>
<p>Si por ejemplo llamamos al número Rumano que comenté en el post sobre ENUM se realizará la consulta correspondiente y en un par de segundos nos saldrá una ventana como ésta:</p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122147.jpg"><img class="size-medium wp-image-1079 aligncenter" title="CAP201002122147" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002122147-180x300.jpg" alt="CAP201002122147" width="180" height="300" /></a></p>
<p>Como veis se muestra toda la información contenida la respuesta ENUM. Al seleccionar las URLs se abrirá el navegador, al pinchar en la URL de geolocalización (es una URL de Google Maps acortada) se abrirá la aplicación <a href="http://www.cyrket.com/p/android/com.google.android.apps.maps/" target="_blank">Maps</a> con una chincheta en la posición correspondiente y al pinchar en la URI SIP se abrirá SIPdroid y comenzará ha hacer la llamada. Yo a eso lo llamo integración, y me encanta. <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Más ENUM</strong></p>
<p>No mola tanto como ENUMdroid (todavía) pero mere la pena mencionar <a href="http://enumdiscoverer.nl/" target="_blank">ENUM Discoverer</a>. Tuve la ocasión de presenciar una presentación sobre ésta aplicación en la fiesta anual organizada por la <a href="http://isoc.nl/" target="_blank">ISOC</a> Holandesa y he de decir que el concepto es bueno, aunque habría que pulirlo un poco. A diferencia de ENUMdroid, ENUM Discoverer funciona en segundo plano haciendo consultas periódicamente y actualizando la agenda de contactos con la información que encuentra. ENUM permite agregar servicios <em>custom</em> como Twitter, Facebook, etc. y ENUM Discoverer permite es capaz de visualizarlos, pero al no ser registros estándar dudo que mucho gente los añada. Por otro lado, ENUM Discoverer no está en el Android Market, es necesario bajarse el apk de la web, y eso echará para atrás a más de uno&#8230;</p>
<p><strong>Otras aplicaciones</strong></p>
<p>En la búsqueda también me he encontrado con <a href="http://www.cyrket.com/p/android/nl.f00d.android.asteriskdialer/" target="_blank">AsteriskDialer</a>, una aplicación para hacer un simple Originate a través del Manager de Asterisk. Al menos soporta SSL, aunque ¿quién quiere hacer un originate si puedes llamar directamente por SIP?</p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002132109.jpg"><img class="size-medium wp-image-1080 aligncenter" title="CAP201002132109" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP201002132109-180x300.jpg" alt="CAP201002132109" width="180" height="300" /></a></p>
<p style="text-align: center; "><em>Interfaz principal</em></p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP2010021321091.jpg"><img class="size-medium wp-image-1081 aligncenter" title="CAP2010021321091" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/CAP2010021321091-180x300.jpg" alt="CAP2010021321091" width="180" height="300" /></a></p>
<p style="text-align: center; ">Configuración</p>
<p><strong>Conclusión</strong></p>
<p>Como habréis visto hay bastante con lo que jugar, ¡y encima funciona! así que en general estoy contento, sobre todo por la integración que muestran las aplicaciones. Si me he dejado alguna que consideráis importante dejad un comentario, siempre mola descubrir alguna nueva <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Njoy!</p>
<p>PD: Las capturas las he hecho con <a href="http://www.cyrket.com/p/android/com.gmail.nagamatu.drocap2/" target="_blank">drocap2</a>, porque hacerlas con el ADB es un coñazo. <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/02/14/voip-en-android/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>¿Qué es y para qué sirve ENUM?</title>
		<link>http://www.saghul.net/blog/2010/02/08/%c2%bfque-es-y-para-que-sirve-enum/</link>
		<comments>http://www.saghul.net/blog/2010/02/08/%c2%bfque-es-y-para-que-sirve-enum/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 07:58:59 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[ENUM]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1064</guid>
		<description><![CDATA[Últimamente he estado jugando un poco con ENUM, y casualmente la semana pasada también lo comentamos en Asterisk-ES, así que me he animado a escribir un post al respecto.
DISCLAIMER: No soy un super-mega-experto conocedor de la tecnologia en sí, pero la he utilizado y la entiendo, espero que os sea util  
ENUM o tElephone NUMber [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente he estado jugando un poco con <a href="http://www.ietf.org/rfc/rfc3761.txt" target="_blank">ENUM</a>, y casualmente la semana pasada también lo comentamos en <a href="http://groups.google.com/group/asterisk-es/browse_thread/thread/6c9f425f530c4a4/cb69206c74f3e358?lnk=gst&amp;q=enum#cb69206c74f3e358" target="_blank">Asterisk-ES</a>, así que me he animado a escribir un post al respecto.</p>
<p>DISCLAIMER: No soy un super-mega-experto conocedor de la tecnologia en sí, pero la he utilizado y la entiendo, espero que os sea util <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>ENUM o tElephone NUMber mapping es un sistema que nos permite utilizar el sistema DNS para hacer consultas en base a numeros de telefono. Ein?! Normalmente hacemos consultas DNS sobre un dominio para saber cual es la IP a la que apunta, su servidor de correo, o si usa <a href="http://en.wikipedia.org/wiki/SRV_record" target="_blank">SRV</a> hasta cual es su servidor SIP. Con ENUM hacemos la consulta DNS (de tipo <a href="http://en.wikipedia.org/wiki/NAPTR_record" target="_blank">NAPTR</a>) en base a un numero de telefono y podremos obtener informacion como una URI SIP, información de geolocalización, blog, twitter, &#8230; Lo interesante es que podemos obtener una URI SIP a la que podemos llamar en lugar de al número, por lo que el coste de la llamada quedaría reducido a 0. How cool is that?</p>
<p>Como siempre que hay algo gratis involucrado, surgen los problemas: ¿quién llena las bases de datos ENUM? ¿está la gente interesada? ¿y las grandes telcos? Seguramente el principal problema de la no expansion de ENUM sea que es un servicio que no se puede cobrar, por lo que es algo que se hace pero que no retorna un beneficio ni inmediato ni directo. Por otro lado, para poder introducir tus datos en ENUM es necesario contactar con la autoridad responsable y demostrar que tal número es tuyo. El proceso implica demostrar mediante facturas, etc. que eres el usuario de dicho número, pero esto no es como darte de alta en Twitter, y la gente no suele querer perder el tiempo&#8230; Ademas, las grandes operadoras obviamente no quieren que la gente use ENUM, porque entonces no facturarias las llamadas que gracias a ENUM se hacen por SIP.</p>
<p>¿Entonces quién usa ENUM? ENUM tiene un árbol publico (e164.arpa) pero nadie te impide tener tu propio árbol ENUM privado, por lo que es posible utilizar ENUM internamente dentro de un ITSP por ejemplo, de manera que antes de sacar la llamada de un cliente a PSTN podemos consultar en ENUM si la llamada es para otro usuario de nuestra red, y enrutarla a coste 0 (esto se puede hacer de muchas maneras, ENUM es una de ellas).</p>
<p>Bueno, tras la brasa inicial vamos a ver si algo de lo que he dicho es verdad. Para ello vamos a ver un ejemplo real, con el siguiente numero: +40317105163. Se trata de un DID de Rumania que apunta a la cuenta SIP de mi trabajo asi que absteneos de intentar venderme viagra a las 4 de la mañana <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Para ver qué información tiene asociado ese número de telefono haremos una consulta DNS de tipo NAPTR al arbol e164.arpa:</p>
<p style="text-align: center; "><a href="http://www.saghul.net/blog/wp-content/uploads/2010/02/enum.png"><img class="size-full wp-image-1065 aligncenter" title="enum" src="http://www.saghul.net/blog/wp-content/uploads/2010/02/enum.png" alt="enum" width="417" height="322" /></a></p>
<p>Como se puede apreciar en la imagen la consulta devuelve 4 resultados: una URI SIP, dos direcciones web y una dirección de geolocalización. Al parecer esto del ENUM no es del todo mentira <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>El Capitán Obvio me ha dicho que esto no tiene sentido a menos que la gente introduzca ahí su número, y claro está que no es algo que muchos particulares estén dispuestos a hacer, pero para empresas, y mas concretamente las del sector de las comunicaciones y/o VoIP podria resultar interesante (en realidad para los que les llaman).</p>
<p>En el siguiente post comentaré que utilidad podemos darle a ENUM desde un móvil con Android, stay tuned!</p>
<p>Unos links de interés:</p>
<p><a href="http://es.wikitel.info/wiki/Enum" target="_blank">http://es.wikitel.info/wiki/Enum</a><br />
<a href="http://en.wikipedia.org/wiki/Enum" target="_blank">http://en.wikipedia.org/wiki/Enum</a></p>
<p><a href="http://www.e164.org/" target="_blank">http://www.e164.org/</a><br />
<a href="https://secure.dns-hosting.info/enum_lookup.phtml" target="_blank">https://secure.dns-hosting.info/enum_lookup.phtml</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/02/08/%c2%bfque-es-y-para-que-sirve-enum/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Root y custom ROM en el Nexus One</title>
		<link>http://www.saghul.net/blog/2010/01/31/root-y-custom-rom-en-el-nexus-one/</link>
		<comments>http://www.saghul.net/blog/2010/01/31/root-y-custom-rom-en-el-nexus-one/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 20:40:59 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Nexus One]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1056</guid>
		<description><![CDATA[Muy buenas amigos del androide,
Hoy haremos el Nexus One un poco menos &#8220;aburrido&#8221;   El Market tiene muchas aplicaciones, sí, pero no somos root, no podemos hacer tethering, ni tener OpenVPN&#8230; ¡asi que toca flashear!
Para poder tener una mayor libertado sobre nuestro terminal y poder flashear cualquier ROM primero flashearemos una recovery image, de [...]]]></description>
			<content:encoded><![CDATA[<p>Muy buenas amigos del androide,</p>
<p>Hoy haremos el Nexus One un poco menos &#8220;aburrido&#8221; <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  El Market tiene muchas aplicaciones, sí, pero no somos root, no podemos hacer tethering, ni tener OpenVPN&#8230; ¡asi que toca flashear!</p>
<p>Para poder tener una mayor libertado sobre nuestro terminal y poder flashear cualquier ROM primero flashearemos una <em>recovery image</em>, de manera que podamos hacer una copia de seguridad de todo el firmware y jugar sobre seguro. El asunto es que para poder instalar esta recovery image será necesario desbloquear el bootloader, algo que invalida la garantía, así que si no os importa ese pequeño detalle seguimos adelante. <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>En este post haremos lo siguiente: desbloquear el bootloader, flasear la ROM CyanogenMod 5.0 beta3 y por ultimo flashear una nueva imagen del kernel que permite direccionar más RAM, de manera que el terminal se movera mas &#8216;fresco&#8217;. No será necesario hacer nada especial para hacernos root en el terminal, ya que la ROM que vamos a instalar ya lo trae de serie. ¡Vamos al lio!</p>
<p><strong>Descargar el software necesario</strong></p>
<ul>
<li><a href="http://www.romraid.com/paul/fastboot.zip" target="_blank">Fastboot</a></li>
<li><a href="http://rapidshare.com/files/330696493/recovery-RA-nexus-v1.5.3.img" target="_blank">Recovery Image</a></li>
<li><a href="http://n0rp.chemlab.org/android/nexus/experimental/update-cm-5.0-N1-beta3-signed.zip">ROM CyanogenMod 5.0 beta3</a></li>
<li><a href="http://www.mediafire.com/file/25jmynjjnmz/gapps-passion-ERD79-signed.zip" target="_blank">Aplicaciones de Google</a></li>
<li><a href="http://n0rp.chemlab.org/android/nexus/testing/zImage-2.6.29.6-highmem" target="_blank">Kernel 2.6.29.6-highmem</a></li>
</ul>
<p><strong>Desbloquear el bootloader</strong></p>
<p>Con el terminal apagado, mantenemos pulsado el trackball y pulsamos el boton de encendido para entrar en el menu del bootloader. Una vez alli utilizaremos la herramienta fastboot para desbloquear el bootloader:</p>
<p><code>./fastboot-linux oem unlock</code></p>
<p>Al ejecutar el comando nos saldra una ventana advirtiendonos de las consecuencias. El Capitán Obvio nos ordena que aceptemos.</p>
<p>El zip de fastboot tambien contiene los binarios para Windows y Mac, usad el que corresponda.</p>
<p><strong>Instalar el Recovery Image</strong></p>
<p>Flasheamos la imagen de recovery con fastboot (tenemos que estar en el menu del bootloader igual que antes):</p>
<p><code>./fastboot-linux devices (nos aseguramos de que nuestro androide es detectado)<br />
./fastboot-linux flash recovery recovery-RA-nexus-v1.5.3.img</code></p>
<p><strong>Instalar la ROM CyanogenMod 5.0 beta3</strong></p>
<p>Primero tenemos que copiar los ficheros zip de la ROM de Cyanogen y las aplicaciones de Google a la raiz de la tarjeta SD.</p>
<p>Llegado este punto lo mejor es hacer un backup completo del terminal, seleccionando la opción &#8220;Nand backup&#8221;.</p>
<p>Antes de proceder a flashear nada es necesario que hagamos un <em>wipe</em> del terminal (al loro, que se borra TODO). Para ello iniciamos el terminal en el menu del bootloader y seleccionamos la opción recovery y luego &#8220;Wipe data/factory reset&#8221;.</p>
<p>Una vez hecho el wipe podemos proseguir a flashear, primero la ROM de Cyanogen y luego las aplicaciones de Google. Para ello utilizaremos la opción &#8220;Flash zip from sdcard&#8221;.</p>
<p><strong>¡Más RAM por favor!</strong></p>
<p>El Nexus One tiene mucha RAM, pero nunca hay demasiada RAM <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  asi que vamos a instalar un nuevo kernel con soporte para direccionar más memoria, de manera que podamos tener más aplicaciones abiertas simultánemente sin que se nos ralentice el  sistema.</p>
<p><code>./fastboot-linux flash zimage zImage-2.6.29.6-highmem</code></p>
<p>Yo he notado muchísima diferencia, así que os lo recomiendo.</p>
<p>Bueno, esto es todo por hoy, en el proximo post hablaremos de VoIP en Android, stay tuned!</p>
<p style="text-align: center;"><img class="size-full wp-image-1058 aligncenter" title="4320083024_b298b49378_m" src="http://www.saghul.net/blog/wp-content/uploads/2010/01/4320083024_b298b49378_m.jpg" alt="4320083024_b298b49378_m" width="180" height="240" /></p>
<p>Fuentes:</p>
<p>http://android.modaco.com/content/google-nexus-one-nexusone-modaco-com/299241/05-jan-1-5-3-ra-nexus-recovery-image/<br />
http://android.modaco.com/content/google-nexus-one-nexusone-modaco-com/299078/how-to-unlock-the-bootloader-on-your-nexus-one/<br />
http://n0rp.chemlab.org/android/nexus/testing/<br />
http://forum.xda-developers.com/showthread.php?t=623496</p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/01/31/root-y-custom-rom-en-el-nexus-one/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Parallel forking, RFC3326 y los p*t*s fabricantes</title>
		<link>http://www.saghul.net/blog/2010/01/29/parallel-forking-rfc3326-y-los-pts-fabricantes/</link>
		<comments>http://www.saghul.net/blog/2010/01/29/parallel-forking-rfc3326-y-los-pts-fabricantes/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 22:23:40 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Parallel Forking]]></category>
		<category><![CDATA[RFC3261]]></category>
		<category><![CDATA[RFC3326]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1045</guid>
		<description><![CDATA[Una de las cool features que SIP soporta desde un principio es el Parallel Forking. La idea es sencilla, podemos tener nuestra cuenta de usuario registrada desde diversas ubicaciones y cuando nos manden un INVITE el proxy se encargará de mandarlo a todas las ubicaciones a la vez, y el que primero conteste la llamada [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las <em>cool features</em> que SIP soporta desde un principio es el <strong>Parallel Forking</strong>. La idea es sencilla, podemos tener nuestra cuenta de usuario registrada desde diversas ubicaciones y cuando nos manden un INVITE el proxy se encargará de mandarlo a todas las ubicaciones a la vez, y el que primero conteste la llamada se la queda. De esta manera solo tenemos que gestionar una identidad,en lugar de tener varias cuentas SIP en plan &#8220;saghul_laptop&#8221; y &#8220;saghul_hardphone&#8221;.</p>
<p>Como no podía ser de otra manera Asterisk no soporta parallel forking, pero veremos más delante cómo algo tiene que decir en el tema del post.</p>
<p>En el diagrama de abajo podéis ver el flujo SIP de una llamada de Alice a Bob a través de un proxy (las respuestas provisionales se han omitido para simplificar):</p>
<p style="text-align: center;"><a href="http://www.saghul.net/blog/wp-content/uploads/2010/01/parallel_forking1.png"><img class="size-full wp-image-1050 aligncenter" title="parallel_forking" src="http://www.saghul.net/blog/wp-content/uploads/2010/01/parallel_forking1.png" alt="parallel_forking" width="487" height="447" /></a></p>
<p style="text-align: center; ">
<p>Bob se encuentra registrado en 2 ubicaciones, por lo que los dos terminales comienzan a sonar. Bob contesta en la oficina, por lo que el proxy genera un CANCEL al INVITE que va a casa, para que el terminal deje de sonar. Hasta aquí todo va bien, pero al volver a casa Bob verá que tiene X llamadas perdidas, llamadas que en realidad ha atendido desde la oficina. ¿Cómo solucionamos esto? ¡El <a href="http://www.rfc-editor.org/rfc/rfc3326.txt" target="_blank">RFC3326</a> viene al rescate!</p>
<p>E RFC3326 define una nueva cabecera para el método CANCEL: &#8220;Reason&#8221;. Mediante esta cabecera podemos indicar al terminal la causa de la cancelación:</p>
<p><code>Reason: SIP ;cause=200 ;text="Call completed elsewhere"</code></p>
<p>De esta manera el terminal puede saber si el CANCEL ha sido debido a que el llamante ha decidido cancelar la llamada o si ha sido el proxy el que ha generado el CANCEL porque la llamada ha sido contestada en otra ubicación. ¿A que mola?</p>
<p>OpenSIPS añade esta cabecera a los CANCEL que genera desde la versión 1.6 y Kamailio si no lo hace ya lo hará pronto (he visto esta <em>feature request</em> propuesta por un tal ibc <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Sorprendentemente ¡Asterisk también soporta esto! Es decir, si haces un Dial(SIP/saghul&amp;SIP/manwe&amp;SIP/ibc) los CANCEL generados para los que no cojan la llamada tendrán esta cabecera presente. Es el parallel forking de los pobres, pero mola que Asterisk lo soporte.</p>
<p>¿Cual es el problema entonces? Pues que <strong>los fabricantes no implementan este RFC</strong>, que tiene 8 páginas, ¡8 jodidas páginas! Por lo que veo Snom es el único que lo soporta desde su versión 7 del firmware, así que si alguien lo prueba que me lo comente pliz <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Y si encontráis otro terminal que lo implemente ¡comentad también!</p>
<p>Sin la implementación de este RFC el <em>parallel forking</em> pierde todo el carisma e incluso puede que gente lo vea como algo molesto. Por lo que a mi respecta voy a implementar el soporte para esto en cierto softphone, pero manda huevos que mi Cisco 7960 de Jack Bauer no lo haga&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/01/29/parallel-forking-rfc3326-y-los-pts-fabricantes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nexus One: primeras impresiones</title>
		<link>http://www.saghul.net/blog/2010/01/24/nexus-one-primeras-impresiones/</link>
		<comments>http://www.saghul.net/blog/2010/01/24/nexus-one-primeras-impresiones/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 14:05:58 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Nexus One]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1040</guid>
		<description><![CDATA[Como algunos sabéis por Twitter, aprovechando la jugada de la ITEXPO me he agennciado el juguete de moda: un Nexus One. Tras unos días jugando con el voy a comentar un poco el feeling que he tenido en diversos aspectos. Es obvio que el Nexus One ha sido diseñado para competir con el iPhone, y [...]]]></description>
			<content:encoded><![CDATA[<p>Como algunos sabéis por <a href="http://twitter.com/saghul" target="_blank">Twitter</a>, aprovechando la jugada de la <a href="http://www.tmcnet.com/voip/conference/" target="_blank">ITEXPO</a> me he agennciado el juguete de moda: un Nexus One. Tras unos días <em>jugando</em> con el voy a comentar un poco el <em>feeling</em> que he tenido en diversos aspectos. Es obvio que el Nexus One ha sido diseñado para competir con el iPhone, y como casualmente también tengo uno, no puedo evitar compararlos <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Proceso de compra</strong></p>
<p>Un 10 para Google. Hice el pedido un domingo por la tarde y el martes a las 9 de la mañana ya tenía el jueguete. Puedes seguir vía web por dónde va tu paquete, joder ¡solo falta el DNI de las personas que lo manipulan! ¡Y encima con mi nombre inscrito detrás! Me lo trajeron sin problemas al hotel, así que si váis de viaje a Estados Unidos por más de dos días no dudéis ni un segundo <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Unboxing y primer contacto</strong></p>
<p>Al abrir la caja te encuentras con un embalaje bastante similar el iPhone, sencillo, sin manual. Cuando te compras un Nokia u otro móvil te viene con un super-manual de 100 páginas que no se lee nadie. Cuando te compras un iPhone o un Nexus One no viene manual. Porque no hace falta. Es tan fácil de usar que no necesitas manual, y eso aunque a alguno le parezca un <em>bug</em> es  una <em>feature</em>.</p>
<p>El feeling del terminal es muy bueno: no pesa, parece consistente y robusto&#8230; pero le falta algo. Es dificil de explicar, pero podría decirse que veo el Nexus One como diseñado por un ingeniero mientras que el iPhone esta diseñado por alguien con más arte, por decirlo de alguna manera. No obstante, no echarás de menos tu iPhone, créeme.</p>
<p><strong>Pantalla</strong></p>
<p>Aunque la pantalla del N1 es solo 0,2 pulgadas más grande que la de el iPhone da la sensación de ser mucho más grande. Las fuentes son muy claras (de hecho es la que uso en mi desktop, ttf-droid) y se puede visualizar mucha más información que en el iPhone. Parece como si tuviera el doble de resolución o algo. :-O</p>
<p><strong>Aplicaciones</strong></p>
<p>Queridos señores de Apple, más vale que el iPhone OS 4.0 tenga multi-tasking, porque sino&#8230; El hardware del N1 es muy potente (procesador a 1GHz y 512MB de RAM) por lo que puedes tener muchas aplicaciones abiertas a la vez y ni te enteras. Personalmente siempre tengo un softphone SIP y un cliente de Jabber funcionando, y no tiene sentido abrir las aplicaciones solo cuando tu quieras hacer una llamada o mandar un mensaje, tienes que poder recibir llamadas&#8230;</p>
<p><strong>&#8220;Apertura&#8221;</strong></p>
<p>Vale, el iPhone funciona con un sistema operativo propietario y el N1 con uno libre, pero me he encontrado con las mismas trabas en ambos casos: si quieres hacer cosas <em>diferentes</em> con tu N1 tienes que ser root, y para eso tienes que realizar un proceso (habrá otro post <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) que invalida la garantía. Lo mismo que hacer el famoso <em>jailbreak</em>, así que no por utilizar un sistema operativo libre tienes todo el control sobre el terminal&#8230; ¿got root?</p>
<p><strong>Concluyendo&#8230;</strong></p>
<p>No os rallo más, pero si tenéis la oportunidad de haceros con uno (566$ libre) cogedlo, además ¡ser un <em>early adopter </em>siempre<em> </em>mola! <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  He dejado unas fotos <a href="http://www.flickr.com/photos/saghul/sets/72157623273645670/" target="_blank">aquí en Flickr</a>.</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/saghul/sets/72157623273645670/"><img class="size-full wp-image-1041 aligncenter" title="4299794413_7ffcaf1c1e_m" src="http://www.saghul.net/blog/wp-content/uploads/2010/01/4299794413_7ffcaf1c1e_m.jpg" alt="4299794413_7ffcaf1c1e_m" width="240" height="161" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2010/01/24/nexus-one-primeras-impresiones/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>El viernes es día de VoIP Users Conference</title>
		<link>http://www.saghul.net/blog/2009/12/19/el-viernes-es-dia-de-voip-users-conference/</link>
		<comments>http://www.saghul.net/blog/2009/12/19/el-viernes-es-dia-de-voip-users-conference/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 23:11:44 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[VoIP]]></category>
		<category><![CDATA[VUC]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1037</guid>
		<description><![CDATA[Hoy voy a hablaros un poco de este evento que tiene lugar cada viernes llamado VoIP Users Conference o VUC.
Todos los viernes a las 18:00 (hora de Bilbo) tiene lugar el VUC. Consiste en una conferencia de audio a la que cualquiera se puede unir. Esta multiconferencia la dirige Randy Resnick (al que tuve ocasion de [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy voy a hablaros un poco de este evento que tiene lugar cada viernes llamado <a href="http://vuc.me" target="_blank">VoIP Users Conference</a> o VUC.</p>
<p>Todos los viernes a las 18:00 (hora de Bilbo) tiene lugar el <strong>VUC</strong>. Consiste en una conferencia de audio a la que cualquiera se puede unir. Esta multiconferencia la dirige Randy Resnick (al que tuve ocasion de conocer en el <a href="http://www.saghul.net/blog/tag/amoocon/" target="_blank">AMOOCON</a>) y obviamente trata de VoIP. Cada día hay algun invitado que habla sobre un tema en concreto, por ejemplo hoy Alex Balashov ha hablado sobre Kamailio/OpenSER.</p>
<p>Tras una hora de conversación con en invitado (cualquiera puede participar haciendo preguntas u aportaciones) da comienzo la parte mas distendida en la que la gente simplemente comenta temas de actualidad relacionados con VoIP, como eventos, nuevos productos, etc.</p>
<p>La conferencia se hospeda en el servicio <a href="http://www.zipdx.com/" target="_blank">ZipDx</a> y es posible unirse mediante SIP, Skype o la PSTN. Aunque la hora no es la mejor del mundo, os recomiendo que os paséis por allí un dia, siempre se comenta algo interesante y se pasa un rato entretenido escuchando o hablando sobre VoIP. Además de por VoIP, tambien mola conectarse al canal de <a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat" target="_blank">IRC</a> del VUC (#vuc) ya que alli tiene lugar una conversación paralela en la que la gente comenta lo hablado en la conferencia o simplemente chatea sobre VoIP.</p>
<p>La duración es indeterminada, de hecho el record esta en ¡8 horas! Así que si os encontráis aburridos un viernes por la tarde conectaos al VUC!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2009/12/19/el-viernes-es-dia-de-voip-users-conference/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asterisk 1.6 y las nuevas fuentes de timing</title>
		<link>http://www.saghul.net/blog/2009/12/15/asterisk-1-6-y-las-nuevas-fuentes-de-timing/</link>
		<comments>http://www.saghul.net/blog/2009/12/15/asterisk-1-6-y-las-nuevas-fuentes-de-timing/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 20:43:29 +0000</pubDate>
		<dc:creator>saghul</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[DAHDI]]></category>
		<category><![CDATA[MeetMe]]></category>
		<category><![CDATA[Timing]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.saghul.net/blog/?p=1029</guid>
		<description><![CDATA[Como sabréis no es que yo sea super-fan pro Asterisk 1.6 precisamente, pero por fin he probado algo que me ha gustado, así que voy a comentarlo por estos lares.
Antes de ponernos manos a la obra un poco de teoria rápida. Todo el mundo parece saber que necesitas tener una tarjeta o el driver dummy de DAHDI en Asterisk, [...]]]></description>
			<content:encoded><![CDATA[<p>Como sabréis no es que yo sea super-fan pro Asterisk 1.6 precisamente, pero por fin he probado algo que me ha gustado, así que voy a comentarlo por estos lares.</p>
<p>Antes de ponernos manos a la obra un poco de teoria rápida. Todo el mundo parece saber que necesitas tener una tarjeta o el driver dummy de DAHDI en Asterisk, pero no todos saben porque. Asterisk necesita una fuente de timing para lo siguiente:</p>
<ul>
<li>Generar el audio saliente. Asterisk utiliza la fuente de tiempo disponible a la hora de enviar los paquetes de audio saliente. En ausencia de una fuente de tiempo fiable Asterisk puede utilizar el audio entrante como referencia, pero si el audio entrante viene con <em>jitter</em> por ejemplo, el saliente tambien lo tendrá, por lo que no es una buena idea ir por la vida sin una fuente fiable de tiempo.</li>
<li>IAX trunking. El IAX trunking es un método gracias al cual Asterisk puede ahorrarnos algo de ancho de banda en un enlace entre dos servidores ya que si tenemos 10 llamadas entre el servidor A y el servidor B nos ahorramos mandar 9 de las 10 cabeceras. Para que esto funcione correctamente la temporizacion ha de ser precisa, por lo que necesitaremos una fuente fiable de tiempo. ¿Pero quién usa IAX? Esto en realidad no nos interesa. <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<p>Alguno pensara que me he olvidado de MeetMe. Pues no. MeetMe necesita DAHDI por otra razón: el motor de conferencias que usa MeetMe se encuentra en DAHDI. Podría decirse que MeetMe es un <em>wrapper</em> de la aplicación de conferencias de DAHDI. Por lo tanto, <strong>MeetMe siempre dependerá de DAHDI</strong>, aunque ya veremos que hay algunas alternativas.</p>
<p style="text-align: center;"><img class="size-full wp-image-1031 aligncenter" title="2283676770_6b53f8b77f_m" src="http://www.saghul.net/blog/wp-content/uploads/2009/12/2283676770_6b53f8b77f_m.jpg" alt="2283676770_6b53f8b77f_m" width="240" height="180" /></p>
<p><strong>Las mejoras de Asterisk 1.6.2 en cuanto a timing</strong></p>
<p>Asterisk dispone de un API genérico de timing desde la version 1.6.1. La idea es disponer de diversos módulos que provean a Asterisk de una fuente de tiempo fiable, siendo DAHDI un simple módulo más. En Asterisk 1.6.2 tenemos lo siguiente módulos de timing:</p>
<ul>
<li>res_timing_dahdi (desde Asterisk 1.6.1): Utiliza DAHDI como fuente de tiempo. Si no tenemos tarjetas podemos utilizar este módulo junto a dahdi_dummy para tener timing fiable.</li>
<li>res_timing_pthread (desde Asterisk 1.6.1): Utiliza la librería POSIX pthread para obtener el timing. Su rendimiento no es el tan bueno como el de DAHDI, pero tiene una ventaja importante: <strong>es portable</strong>. Con ésta fuente de tiempo es posible utilizar IAX trunking en FreeBSD o MacOSX por ejemplo. How cool is that?! <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>res_timing_timerfd (nuevo en Asterisk 1.6.2): É<strong>ste es el bueno</strong>. Utiliza TimerFD, un nuevo mecanismo del Kernel de Linux (&gt;= 2.6.27) para proporcionar timing. También necesita de una version reciente de glibc (&gt;= 2.8) pero a cambio nos ofrece una fuente de tiempo muy fiable y sin DAHDI. dahdi_dummy, te quedan dos telediarios. <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p><strong>Sustituyendo MeetMe</strong></p>
<p>Hasta ahora he comentado el nuevo API de timing, pero no hemos solucionado el que MeetMe dependa de DAHDI. Obviamente no podemos utilizar MeetMe así que tenemos un par de alternativas:</p>
<ul>
<li><a href="http://sourceforge.net/projects/appkonference/" target="_blank">AppKonference</a>: Digamos que es un MeetMe con esteroides. Soporta VAD y video y no necesita DAHDI. El único problema (si es que lo consideramos un problema) es que no es una aplicación oficial.</li>
<li>ConfBridge: Se trata de una nueva aplicación que incluye Asterisk 1.6.2 perteneciente al nuevo API de bridging. No he hecho unas pruebas demasiado intensas, pero de momento no he tenido problemas.</li>
</ul>
<p><strong>Habilitar el timing interno</strong></p>
<p>Para terminar, tenemos que habilitar el timing interno en Asterisk. Para ello editamos el fichero asterisk.conf y descomentamos la opción <em>internal_timing=yes</em> de la sección <em>[opcions]</em>.</p>
<p>Esto es todo por hoy, es una buena excusa para probar Asterisk 1.6 ¿no? <img src='http://www.saghul.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.saghul.net/blog/2009/12/15/asterisk-1-6-y-las-nuevas-fuentes-de-timing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
