WURFL (Wireless Universal Resource File) es una base de datos en formato XML que contiene características de dispositivos móviles,
es un proyecto libre y colaborativo creado por Lucca Passani. Para poderlo utilizar en nuestros proyectos existen API's en diversos lenguajes como Java, PHP, Python o Perl que permiten el parseo del archivo XML.
Esta herramienta la conocí hace ya casi un año, cuando comencé a introducirme en la onda del desarrollo web para móviles en aplicaciones relativamente sencillas. Cuando me la explicaron brevemente y observé su aplicación, fue cuando conocí también el problema por el cuál surgió esta herramienta, sencillamente conocer las capacidades de los dispositivos móviles para poder adaptar el contenido que se entrega tanto en forma física (archivos) como visual (sitio web/wap).
Wurfl como el resto de la herramientas de su tipo, basan su funcionalidad en el parámetro llamado "UserAgent" de los dispositivos móviles, útil para poder determinar las características del mismo. Tomando el UA se puede consultar la base de datos de WURFL y poder conocer cosas importantes como ancho y alto de su pantalla, si es que soporta la reproducción de archivos en formato de audio MP3, que tipo de vídeos soporta, tipo de lenguaje estándar soportado para visualizar sitios web, etc.
En este post vamos a dar un breve introducción al uso de WURFL usando la
librería creada en PHP por Andrea Trasatti, no se emocionen yo también pensé que era nena :P, sin mas choro vamos a comenzar. Para nuestro ejemplo práctico ocupamos los siguientes requerimientos:
* Sistema Operativo Ubuntu GNU/Linux.
* Servidor Web Apache2.
* PHP 5 con soporte para parsear XML.
* Firefox 3
Vamos a nuestro DocumentRoot y creamos una carpeta inicial para hacer las pruebas:
duke12@duke12:/var/www/tests$ mkdir wurfl && cd wurfl
Descargamos la libreria de PHP para utilizar WURFL:
duke12@duke12:/var/www/tests/wurfl$ wget http://downloads.sourceforge.net/wurfl/wurfl_php_tools_21.zip
Descomprimimos el archivo zip:
duke12@duke12:/var/www/tests/wurfl$ unzip wurfl_php_tools_21.zip
Los archivos importantes son wurfl_parser.php, wurfl_class.php y wurfl_config.php, el propio nombre nos dice mucho de su funcionalidad.
Continuamos, vamos a crear una carpeta llamada "data", descargamos al famoso wurfl.xml y su parche para browsers web dentro de la carpeta data:
duke12@duke12:/var/www/tests/wurfl/data$ wget http://wurfl.sourceforge.net/wurfl.xml
duke12@duke12:/var/www/tests/wurfl/data$ wget http://wurfl.sourceforge.net/web_browsers_patch.xml
Editamos el archivo wurfl_config.php y modificamos la constante DATADIR para ubicar la carpeta que contiene nuestro archivo wurfl.xml, en nuestro ejemplo queda:
define("DATADIR", 'data/');
Este archivo contiene directivas generales que podemos configurar para el uso de WURFL, por mencionar algunas encontramos aquellas que nos permiten habilitar (recomendado 100%) o deshabilitar el cache que va desde la creación de arreglos por grupos de dispositivos o en su caso archivos por dispositivos generalizados, también encontramos directivas de direccionamiento donde le especificamos a la librería donde se encuentran los archivos XML, ubicar la propia clase, el parseador y demás, también podemos habilitar el log más no se recomienda para aplicaciones en producción.
Muy bien ahora actualizaremos nuestro cache usando PHP CLI con la siguiente ejecución:
duke12@duke12:/var/www/tests/wurfl$ php update_cache.php
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:10:55 -0500 [duke12 11053][update_cache] Forced cache update started
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:10:59 -0500 [duke12 11053][parse] No XML patch file defined
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:11:01 -0500 [duke12 11053][update_cache] Updating multicache dir
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:11:01 -0500 [duke12 11053][update_cache] Done updating cache
Parser load time:0.0189509391785
Vamos al ejemplo ultra-mega-básico del uso de wurfl para comprobar que la librería esta bien configurada, creamos el archivo prueba1_wurfl.php dentro de nuestra carpeta de prueba y colocamos el siguiente código:
1
<?php
2 require_once('wurfl_config.php');
3 require_once(WURFL_CLASS_FILE);
4
5 $wurflObj = new wurfl_class();
6
7 $ua = $_SERVER['HTTP_USER_AGENT'];
8
9 $wurflObj->GetDeviceCapabilitiesFromAgent($ua);
10
11 if ( $wurflObj->getDeviceCapability('is_wireless_device') ) {
12 echo 'El UA:'.$ua.'<br /> Es dispositivo movil';
13 } else {
14 echo 'El UA:'.$ua.'<br /> No es dispositivo movil';
15 }
16 ?>
17
Expliquemos que onda con este script, la primeras líneas incluyen al archivo de configuración y posteriormente el archivo de la clase, paso siguiente se crea el objeto de la clase en la variable $wurflObj, utilizamos este objeto para invocar el método getDeviceCapabilitiesFromAgent() usando el header de PHP que contiene el UserAgent del dispositivo o navegador $_SERVER['HTTP_USER_AGENT'], la librería crea en este momento un mega-arreglo que contiene las características del dispositivo detectado.
Para conocer esas características se utiliza el método getDeviceCapability('nombre_caracteristica'), en nuestro ejemplo preguntamos a WURFL si es un dispositivo wireles o móvil. Podemos instalar el plugin
"Modify Headers" para Firefox y podemos ver los resultados que se obtienen si jugamos con el UserAgent:
* Con el UserAgent propio del navegador vamos a la url http://localhost/tests/wurfl/prueba1_wurfl.php:
* Simulando a un NokiaN95:
De esta manera es como podemos detectar si el dispositivo que accesa nuestra pagina web es móvil o no y así poder entregar una pagina de acuerdo a sus características.
Ahora veamos otro ejemplo para conocer otro tipo de características de los móviles. Tenemos el siguiente código en el archivo prueba2_wurfl.php, los comentarios contienen una breve explicación:
1
<?php
2 require_once('wurfl_config.php');
3 require_once(WURFL_CLASS_FILE);
4
5 //*** Comenzamos creando el objeto de la clase. ***//
6 $wurflObj = new wurfl_class();
7
8 $ua = $_SERVER['HTTP_USER_AGENT'];
9
10 //*** Obtenemos las capacidades usando el UserAgent ***//
11 $wurflObj->GetDeviceCapabilitiesFromAgent($ua);
12
13 if ( $wurflObj->getDeviceCapability('is_wireless_device') ) {
14
15 //*********** Info del Producto ********************//
16 $marca = $wurflObj->getDeviceCapability('brand_name');
17 $modelo = $wurflObj->getDeviceCapability('model_name');
18 $perfil_ua = $wurflObj->getDeviceCapability('uaprof');
19 $navegador = $wurflObj->getDeviceCapability('mobile_browser');
20
21 //********** Multimedia Basica *************************
22 $soporta_jpg = $wurflObj->getDeviceCapability('jpg') ? 'Si' : 'No';
23 $soporta_gif = $wurflObj->getDeviceCapability('gif') ? 'Si' : 'No';
24 $soporta_mp3 = $wurflObj->getDeviceCapability('mp3') ? 'Si' : 'No';
25 $soporta_video = $wurflObj->getDeviceCapability('video_3gpp') ? 'Si' : 'No';
26
27 //********** Lenguaje de Marcado ***********************
28 $nivel_xhtml = $wurflObj->getDeviceCapability('xhtml_support_level');
29 $leng_preferente = $wurflObj->getDeviceCapability('preferred_markup');
30
31 //********** Pantalla **********************************
32 $ancho = $wurflObj->getDeviceCapability('resolution_width');
33 $alto = $wurflObj->getDeviceCapability('resolution_height');
34
35 //******************* Desplegamos ***********************
36 echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
37 <html><head><title>Probando Wurfl</title>
38 <meta content="text/html; charset=UTF-8" http-equiv="content-type">
39 </head><body>';
40 echo "El UserAgent: <b>$ua</b> <br /> tiene las siguientes caracteristicas basicas: <br /><br />";
41 echo '<b>[Información del producto]</b><br />';
42 echo 'Marca: '.$marca.'<br />';
43 echo 'Modelo: '.$modelo.'<br />';
44 echo 'Navegador: '.$navegador.'<br />';
45 echo "Perfil del Agente: <a href='$perfil_ua'> $perfil_ua </a><br /><br />";
46
47 echo '<b>[Multimedia Básica]</b><br />';
48 echo 'Soporta JPG: '.$soporta_jpg.'<br />';
49 echo 'Soporta GIF: '.$soporta_gif.'<br />';
50 echo 'Soporta MP3 '.$soporta_mp3.'<br />';
51 echo 'Soporta Video: '.$soporta_video.'<br /><br />';
52
53 echo '<b>[Lenguaje de Marcado]</b><br />';
54 echo 'Soporta XHTML Nivel: '.$nivel_xhtml.'<br />';
55 echo 'Lenguaje Preferente: '.$leng_preferente.'<br /><br />';
56
57 echo '<b>[Pantalla]</b><br />';
58 echo 'Ancho: '.$ancho.'<br />';
59 echo 'Alto: '.$alto.'<br />';
60
61 echo '</body></html>';
62
63 } else {
64 echo 'El UA:'.$ua.'<br /> No es dispositivo movil';
65 }
66 echo '</body></html>';
67 ?>
Aquí podemos apreciar el resultado de jugar con el userAgent = "Nokia5200/2.0 (06.03) Profile/MIDP-2.0 Configuration/CLDC-1.1"
Con este ejemplo podemos observar que Wurfl es de gran utilidad cuando desarrollamos web para móviles para poder determinar que tipo de pagina puedo entregar al navegador de ese dispositivo, empezando por determinar el lenguaje de marcado estándar, el tipo de imágenes que puede desplegar, un idea del tamaño de pantalla, y más cosillas que le querramos colgarle.
Las debilidades de estas librerías PHP para usar Wurfl son principalmente el uso de archivos (E/S en disco) para generar el cache necesario, así como los recursos para parsear el XML.
Existen alternativas que intentan mejorar las deficiencias encontradas en esta versión de Wurfl + PHP, y algunas herramientas q se basan en Wurfl para diversas funcionalidades, tal es el caso de TeraWurfl y de WALL, de quienes hablaremos en otra ocasión, x el momento es todo --> Seguimos en la resistencia!