Mi Brain-Training Personal

Para que no se me olviden las cosas…

Cuando todo funciona

Hoy es un día de esos en los que me siento especialmente feliz. No podían haber ocurrido mejores cosas en los dos últimos días.

Para empezar bien la semana, mi novia ha encontrado trabajo. Venir a Holanda conmigo era ‘fácil’, pero encontrar un trabajo no tanto. Piden Holandés hasta para ser el ayudante del becario. Ha estudiado Holandés día y noche y su esfuerzo ha obtenido el merecido resultado. ¡Enhorabuena!

Por si eso no fuera poco, hoy han aceptado mi charla para el Amoocon 2010, así que ¡vuelvo a Rostock! Éste año han aumentado la duración y los temas de las charlas, quedando en una oferta muy interesante que podéis consultar aquí: http://www.amoocon.de/2010 ¡Michael Widenius viene a hablar sobre MariaDB!

Mi charla se titula “ICE: the ultimate way for beating NAT in SIP” y en ella explicaré con detalle el problema que el NAT supone en SIP y cómo ICE puede solucionarlo. Comentaré también cual ha sido el proceso necesario para hacer que tanto OpenSIPS como MediaProxy funcionen correctamente en escenarios con ICE.

Esto es todo, un post corto para deciros lo contento que estoy, que los 140 caracteres de Twitter se me quedaban cortos. ;)

VoIPathon: 24 horas seguidas de VoIP Users Conference

Éste viernes la VoIP Users Conference, de la que ya hablamos algunos posts, cumple 3 años. Comenzó llamándose Asterisk Users Conference, pero pasado un tiempo el nombre se cambió por el actual, abarcando un campo más amplio.

Con motivo de su tercer cumpleaños, el viernes tendrá lugar el VoIPathon, una sesión de ¡24 horas! Así que nadie tiene excusa para no entrar un ratito y simplemente escuchar, no es obligatorio hablar ;)

Podéis consultar la hora de comienzo en vuestro país en ésta web: http://voipathon.org/dates-and-times/

La conferencia tendrá lugar en Talkshoe, así que también es una buena ocasión para probar cuantos participantes simultáneos aguanta. ;) Por supuesto, en G722.

WeAreVoipathon520

¡No tenéis excusa! ¡Todos al VUC el viernes!

Cómo usar Spotify durante más de 14 días en el extranjero

Aquí comienza una entrada al más puro estilo Brain-Training, vamos, para que no se me olvide. ;)

Supongamos que nos encontramos viviendo en un país en el que Spotify no funciona (como por ejemplo Holanda) pero que tenemos una cuenta creada en uno que sí (por ejemplo España). Al de 14 días no podremos volvernos a conectar a Spotify salvo que paguemos el premium, algo que no me apetecía nada…

Aprovechando que tengo un server con GNU/Linux funcionando en Bilbo al que tengo acceso por SSH empecé a pensar en la menra más fácil posible para usarlo y saltarme ésta restricción, que Spotify resetea el contador a 0 cuando te vuelves a conectar desde el país de origen de tu cuenta. La idea era usar Squid a modo de proxy web y SSH para tunelizar el asunto o algo así, pero había algo que no terminaba de encajarme así que recurrí al sabio consejo de Miguel Angel Nieto y aquí tenéis la solución (¡mil gracias MA!) :

  • Instalamos Squid en el server y lo configuramos para que nos admita la conexión desde la IP pública en la que estamos. Para ello añadimos las siguientes líneas al fichero /etc/squid3/squid.conf:

acl kasa src aquí_tu_ip_pública/32
http_access allow kasa

  • Ahora tunelizaremos las peticiones al servidor Squid remoto por SSH:

ssh -L 3128:localhost:3128 root@servidor_remoto

  • Ya solo nos queda configurar Spotify para que use el proxy:

spotify_proxy

Recordad que solo es necesario hacer esto una vez, luego el ‘contador’ vuelve a 0 y tenemos otros 14 días. :)

Mikel Jimenez, frikón de las redes, también me ha propuesto otra solución, en éste caso usando OpenVPN. No la he utilizado en este caso, pero es perfectamente válida:

  • Unimos los dos hosts mediante una VPN. Digamos que hostA está en Holanda y hostB en España.
  • Una vez el túnel está levantado, añadimos una ruta estática en hostA para llegar a hostB a través de nuestro router.
  • Eliminamos la ruta por defecto en hostA y añadimos una nueva ruta por defecto, que será el extremo del túnel que tenemos con hostB.
  • En hostB nos aseguramos de enrutar los paquetes procedentes del túnel hacia Internet.

Con esta configuración lo que habremos hecho es tunelizar todas las conexiones que hagamos desde hostA, para que salgan a través de hostB, por lo que a efectos prácticos, nos estaríamos conectando a Internet desde España. :)

¡Mil gracias a los dos!

Moraleja: vayas donde vayas, deja un host encendido con GNU/Linux y SSH abierto, nunca de sabe… ;)

Jugando con Python en Android

Prácticamente todo lo que hay para Android esta hecho en Java, pero para los que nos dejó de molar hay alternativa: Android Scripting Environment.

ASE es una aplicación de Google gracias a la cual podemos instalar diversos lenguajes de scripting como Python, Perl, Lua, etc… Hasta ahora parece que la tenían un poco abandonada, pero han sacado dos versiones en la última semana, y por fin funciona sin tener que hacer nada a mano :)

Para instalarla basta con acceder a la web y bajarse el apk. Una vez instalamos la aplicación nos da la opción de instalar los diversos intérpretes, así que escogemos Python ;) Además del propio intérprete se instalan varios scripts de demostración para empezar a jugar.

Happy coding!

4448535314_8f4d1998ca_o

4447762215_cc5b507710_o

4448540138_4649853595_o

Building Telephony Systems with OpenSIPS 1.6

Hoy os voy a comentar la impresión que me he llevado tras leer el libro “Building Telephony Systems with OpenSIPS 1.6” de Flavio E. Goncalves. Si Manwe si, ya se que para ti esto no cuenta como libro pero bueno. ;)

Al igual que la versión anterior (Building Telephony Systems with OpenSER) la idea del libro es introducir al lector en la configuración de OpenSIPS e ir avanzando poco a poco e ir integrando más servicios.

Aunque saber algo SIP es más que recomendable, el libro comienza con una introducción a SIP, y a lo largo de los capítulos se muestran capturas con ngrep, para poder entender como afecta la configuración de OpenSIPS a los mensajes SIP y su procesamiento.

La estructura es muy acertada, ya que se comienza con una configuración muy básica sin tan siquiera autenticación, para terminar con una configuración que incluye autenticación en MySQL, tratamiento de NAT, accounting en RADIUS, …

  • Capítulo 1: Introduction to SIP: Una breve introducción a SIP, SDP y RTP para conocer los aspectos básicos de los protocolos involucrados.
  • Capítulo 2: Introduction to OpenSIPS: Introducción a las características de OpenSIPS  y la estructura del fichero de configuración.
  • Capítulo 3: OpenSIPS installation: Detalle de la instalación de OpenSIPS en una Debian compilando OpenSIPS desde los ficheros fuente.
  • Capítulo 4: Script and routing basics: Configuración básica de OpenSIPS (sin auntenticación ni nada) y explicación más detallada de la estructura del fichero de configuración.
  • Capítulo 5: Adding authentication with MySQL: Partiendo de la configuración del capítulo 4 se añade autenticación de usuarios utilizando MySQL como backend.
  • Capítulo 6: Graphical user interfaces for OpenSIPS: Éste capítulo me ha parecido bastante interesante, ya que se exponen las 2 GUIs que actualmente hay para OpenSIPS: serMyAdmin y OpenSIPS-CP (que acaban de estrenar versión), y teniendo en cuenta que a muchos les tira para atrás el hecho de no poder administra el proxy con algo gráfico… Aunque el verdadero poder siempre estará en la consola ;)
  • Capítulo 7: Connectivity to PSTN: Configuraciones para la interconexión de OpenSIPS con la PSTN. Routing dinámico, grupos de usuarios, permisos, …
  • Capítulo 8: Media Services integration: Integración de OpenSIPS (recordemos que es un proxy, no entiende de audio) con servidores de media como Asterisk, con ejemplos de configuración e integración con Asterisk en RealTime.
  • Capítulo 9: SIP NAT traversal: El capítulo que todos los recién llegados a OpenSIPS querrán leer. :) Explicación de cómo “arreglar” el NAT con RTPProxy. A ver si para la próxima edición se puede incluir también MediaProxy ;)
  • Capítulo 10: Accounting and billing: Configuración de OpenSIPS para hacer accounting en MySQL y FreeRADIUS.
  • Capítulo 11: Monitoring tools: Explicación de algunas herramientas de configuración y diagnóstico como sipsak o SIPp.

He resumido mucho, así que os recomiendo que si queréis empezar a aprender OpenSIPS os lo compréis (no es caro) y lo pongáis en vuestra mesita de noche, justo al lado del RFC3261. ;)

643cc7cfopengfx

OpenSIPS estrena diseño

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 que no habrá sido fácil decidir reescribirlo, ya que supone mucho esfuerzo, pero seguramente sea lo mejor para un futuro.

El nuevo diseño se basa en el patrón reactor 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 core y el routing engine.

  • 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.

new_design-routing-internal

  • Routing Engine: Encargado de gestionar la lógica de enrutado a alto nivel.

new_design-routing-external

Otro importante cambio con respecto al diseño actual es la posibilidad de utilizar varios routing engines con un solo core, de manera que cada routing engine implemente un funcionamiento diferente, pero un único core se encargue del procesamiento SIP a bajo nivel.

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:

  • 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.
  • 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, la lógica podrá escribirse en un lenguaje “de verdad” como Python, 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?!

Éste post es solo un resumen del documento que podéis ver aquí. Os recomiendo echarle un vistazo, veremos que tal sale la cosa dentro de unos 12 meses. :)

Si tenéis alguna duda, mañana viernes 5 de Marzo el tema central de la VoIP Users Conference 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 ‘Building Telephony Systems with OpenSIPS 1.6′).

¿Te lo vas a perder?

Por último me gustaría felicitar al equipo de ‘arquitectos’ que ha diseñado el nuevo OpenSIPS: Bogdan Iancu, Anca Vamanu, Andrei Dragus y Dan Pascu, OpenSIPS 2.0, here we go!

ICE, ¿la solución definitiva al NAT en SIP?

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 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.

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 relay como MediaProxy o RTPProxy, sin realizar ninguna configuración exótica en el servidor. La inteligencia está en los terminales.

¿Cómo funciona?

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 draft, que aunque es bastante denso describe el mecanismo completo.

Paso 1: Obtención de candidatos

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:

  • Host candidates: candidatos que representan tarjetas de red del sistema, incluyendo enlaces VPN etc.
  • 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.

Paso 2: Aplicar prioridades

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 host ha de ser más prioritario que uno de tipo relayed, 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.

Al finalizar este paso se construye el SDP que será enviado. Veamos un ejemplo:

v=0
o=- 3476345811 3476345811 IN IP4 192.168.99.53
s=sipsimple 0.12.0
c=IN IP4 192.168.99.53
t=0 0
m=audio 60770 RTP/AVP 103 102 9 0 8 117 3 101
a=rtcp:60771 IN IP4 62.131.6.55
a=rtpmap:103 speex/16000
a=rtpmap:102 speex/8000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:117 iLBC/8000
a=fmtp:117 mode=20
a=rtpmap:3 GSM/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ice-ufrag:3e0cc9fc
a=ice-pwd:19d32c8c
a=candidate:Sc0a86335 1 UDP 1862270975 62.131.6.55 60770 typ srflx raddr 192.168.99.53 rport 48649
a=candidate:Hc0a86335 1 UDP 1694498815 192.168.99.53 48649 typ host
a=candidate:Ha45450a 1 UDP 1694498815 10.69.69.10 48649 typ host
a=candidate:Sc0a86335 2 UDP 1862270974 62.131.6.55 60771 typ srflx raddr 192.168.99.53 rport 48868
a=candidate:Hc0a86335 2 UDP 1694498814 192.168.99.53 48868 typ host
a=candidate:Ha45450a 2 UDP 1694498814 10.69.69.10 48868 typ host
a=sendrecv

Paso 3: Iniciación

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.

Paso 4: Obtención de candidatos (llamado)

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 host y server reflexive. Una vez se obtienen los candidatos, se aplican prioridades y se construye el SDP que será enviado.

Paso 5: Información

El llamado responde al INVITE con una respuesta (provisional o definitiva) y en su SDP habrá incluido sus candidatos.

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.

Paso 6: Verificación

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).

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 binding requests. El agente remoto contestará con la IP y el puerto desde los que ha recibido dicha binding request y así el agente que ha enviado la petición sabrá que el test ha sido satisfactorio y marcará el candidato como válido.

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 server reflexive candidate publicado y el origen del binding request que mandará. Entonces se crea un nuevo candidato de tipo peer reflexive, 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?

Paso 7: Coordinación

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 stream en el SDP: un componente para el RTP y otro para el RTCP.

El agente controlador (habitualmente el que realiza la llamada) elegirá un candidato. A éste proceso se le llama nominación. Para validar éste candidato se envía otra binding request (STUN) pero en esta ocasión se incluye un flag. Ambos agentes utilizarán el par de candidatos que ha pasado las pruebas de conectividad y que además esté nominado.

Recordemos que todo éste proceso ha sido realizado por los agentes utilizando paquetes STUN entre si, sin ninguna interacción por parte del servidor.

Paso 8: Comunicación

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.

Paso 9: Confirmación

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 proxys. Para que los proxys o las middle-boxes 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).

¡Qué way!, esto funciona, ¿no?

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 media relay.

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: a=ice-missmatch. Mal tema. ¡Hay que solucionarlo!

“Arreglando” la negociación ICE con OpenSIPS y MediaProxy

Para solucionar éste problema ha sido necesario modificar OpenSIPS y MediaProxy (los componentes con los que trabajo actualmente, pero lo mismo puede hacerse para Kamailio/SIP-Router y RTPProxy).

Resumiendo un poco (tenéis una explicación más completa aquí) lo que sucederá es que OpenSIPS añadirá un nuevo candidato de tipo relayed 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 “dejar pasar” las pruebas de conectividad STUN, por lo que al modificar el INVITE inicial y su correspondiente respuesta habremos “engañado” a los agente insertando un nuevo candidato.

Mediante un parámetro es posible controlar la prioridad del candidato que OpenSIPS insertará, afectando así al resultado de la negociación.

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 “quita de en medio”. También he probado ha hablar con audio de router a router entre un NAT simétrico y otro de tipo port restricted. How f*c*i*g cool is that?

¡Quiero probarlo!

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 :) Los clientes SIP con soporte ICE (draft versión 19) son PJSIP, SIPSIMPLE client (su core es PJSIP) y Blink (su core es SIPSIMPLE).

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.

Actualmente no hay ninguna versión (release) de OpenSIPS que incluya el parche para “solucionar” el problema de ICE, así que podéis parchear manualmente como se menciona aquí o podéis utilizar el servicio gratuito SIP2SIP, que ya dispone de todo lo necesario (parches para OpenSIPS y última versión de MediaProxy).

Conclusiones

Tras estar un mes con éste tema por fin he podido comprobar que funciona. 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.

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.

¡Joder que largo me ha quedado esto! Para más información podéis leer el draft y echarle un ojo a ésta presentación.

Happy ICE skating! ;)

Undervolted Kernel: ahorrando batería en Android

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 vamos a ver cómo instalar un undervolted kernel en un Nexus One (si dispones de otro terminal Android busca un undervolted kernel adaptado a él).

El concepto de un undervolted kernel 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!

Necesitamos tener instalada la ROM 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:

wget http://kmobs.scepterr.info/kernels/zImage33UV.zip
unzip zImage33UV.zip -d uvkernel
(reiniciamos el androide en modo fastboot)
./fastboot flash zimage uvkernel/zImage33UV
./fastboot reboot
(una vez ha arrancado normal)
./adb remount
./adb push uvkernel/b*.ko /system/lib/modules
./adb reboot

Happy undervolting!

VoIP en Android

¡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): SIPdroid. 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.

CAP201002122158

Skype

Suponiendo que también consideremos Skype VoIP, es curioso que la aplicación oficial solo soporte chat mientras que Fring y Nimbuzz 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.

CAP201002122150

Fring cargando…

CAP201002122200

Fring permite chat y llamadas de voz

Que aplicaciones NO utilizar

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 arreglo toda nuestra privacidad es vulnerada además de que el retardo es mayor, dado que nuestra llamada tiene que rebotar en sus servidores.

El combo: ENUMdroid + SIPdroid

Si no has leído el post sobre ENUM ¡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: ENUMdroid.

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:

CAP201002122147

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 Maps 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. :)

Más ENUM

No mola tanto como ENUMdroid (todavía) pero mere la pena mencionar ENUM Discoverer. Tuve la ocasión de presenciar una presentación sobre ésta aplicación en la fiesta anual organizada por la ISOC 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 custom 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…

Otras aplicaciones

En la búsqueda también me he encontrado con AsteriskDialer, 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?

CAP201002132109

Interfaz principal

CAP2010021321091

Configuración

Conclusión

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 :)

Njoy!

PD: Las capturas las he hecho con drocap2, porque hacerlas con el ADB es un coñazo. ;)

¿Qué es y para qué sirve ENUM?

Ú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 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 SRV hasta cual es su servidor SIP. Con ENUM hacemos la consulta DNS (de tipo NAPTR) en base a un numero de telefono y podremos obtener informacion como una URI SIP, información de geolocalización, blog, twitter, … 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?

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… 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.

¿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).

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 ;) Para ver qué información tiene asociado ese número de telefono haremos una consulta DNS de tipo NAPTR al arbol e164.arpa:

enum

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 ;)

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).

En el siguiente post comentaré que utilidad podemos darle a ENUM desde un móvil con Android, stay tuned!

Unos links de interés:

http://es.wikitel.info/wiki/Enum
http://en.wikipedia.org/wiki/Enum

http://www.e164.org/
https://secure.dns-hosting.info/enum_lookup.phtml