Descubrir equipos cercanos con Processing y bluetoothDesktop

Introducción.

En el presente artículo se describe el proceso de instalación de la librería bluetoothDesktop en GNU/Linux (para Windows es similar) que permite manipular el módulo de Bluetooth del dispositivo donde se ejecuta el sketch y con ella se implementa el procedimiento para detectar dispositivos cercanos que utilicen este protocolo de comunicaciones.

Obtener la librería.

Descargar la versión disponible mas reciente en el sitio web del proveedor.

http://www.extrapixel.ch/processing/bluetoothDesktop/download.html

Instalación de la librería.

Descomprimir el paquete recién descargado.

Mover el directorio bluetoothDesktop/ al directorio de librerías de Processing en ~/sketchbook/libraries/.  El resultado se deberá apreciar de la siguiente manera.
$ ls -l ~/sketchbook/libraries/bluetoothDesktop/

drwxr-xr-x 5 jimezam jimezam 4096 2010-12-08 22:47 examples
-rw-r–r– 1 jimezam jimezam  910 2007-12-17 21:25 howto.txt
drwxr-xr-x 3 jimezam jimezam 4096 2010-12-08 23:09 library
drwxr-xr-x 2 jimezam jimezam 4096 2010-12-08 22:47 src

Remover los siguientes archivos ubicados bajo el directorio ~/sketchbook/libraries/library/.

  • libavetanaBT.so
  • export.txt
  • bluecove-2.0.2-snapshot.jar
  • avetanaBT_readme.txt
  • avetanaBT.jar

Copiar en es mismo directorio los siguientes archivos que pueden obtenerse del sitio web de Bluecove.

  • bluecove-x.x.x.jar
  • bluecove-gpl-x.x.x.jar (requerido para Linux).

El contenido final de ese directorio se aprecia de la siguiente manera.

$ ls -l ~/sketchbook/libraries/bluetoothDesktop/library/

-rw-r–r– 1 jimezam jimezam 547156 2010-12-08 21:27 bluecove-2.1.0.jar
-rw-r–r– 1 jimezam jimezam  89022 2010-12-08 21:26 bluecove-gpl-2.1.0.jar
-rw-r–r– 1 jimezam jimezam   9409 2007-11-14 19:01 bluetoothDesktop.jar

Implementación.

Importar el paquete principal de la librería.

import bluetoothDesktop.*;

Crear un objeto para hacer referencia al dispositivo de Bluetooth.

Bluetooth bluetoothInstance = new Bluetooth(this);

Iniciar el proceso de descubrimiento de dispositivos cercanos.

bluetoothInstance.discover();

Implementar el método deviceDiscoverEvent el cual es llamado cada vez que un nuevo dispositivo Bluetooth es detectado.

void deviceDiscoverEvent(Device dev)
{
    println("Discovering ... name=" + dev.name + "; address=" + dev.address);
}

Implementar el método deviceDiscoveryCompleteEvent el cual es llamado una única vez al terminarse el proceso de descubrimiento.

void deviceDiscoveryCompleteEvent(Device[] devices)
{
  println("I Found " + devices.length+ " devices.");

  for(int i=0; i<devices.length; i++)
  {
    println(i + "# name=" + devices[i].name + "; address=" + devices[i].address);
  }
}

Aplicación de demostración.

Aplicación de demostración - Descubrir dispositivos Bluetooth cercanos
Aplicación de demostración - Descubrir dispositivos Bluetooth cercanos

Enlaces.

Laberinto 0.2 controlado por wiimote

Introducción.

Preparando un mejor ejemplo para el uso del wiimote con Processing decidí actualizar la versión procedimiental del Laberinto que utilicé como demostración en una charla hace un par de meses.

Con esta mejora es posible conectar el wiimote al sketch y controlar con él al caballero en busca de su tesoro mas preciado: la princesa 🙂  Adicionalmente el wiimote vibrará cuando el caballero se encuentre con ella.

El movimiento del caballero es controlado por el d-pad mientras que el botón de inicio (home) lo teletransporta y el botón #1 reinicia el juego.

Implementación.

Como primera instancia es necesario tener instaladas las librerías requeridas para el uso del wiimote con Processing.

A continuación se realizan las siguientes modificaciones al código base del sketch.

Se importa el paquete de las clases relacionadas con el wiimote.

import lll.wrj4P5.*;

Se establece una referencia global al control.

Wrj4P5 wii;

En el setup se establece la conexión con el wiimote.

void setup()
{
    // ...
    wii = new Wrj4P5(this);
    wii.connect();
}
Se implementa el método buttonPressed para manejar los eventos provenientes del control con la lógica que se mencionó anteriormente: d-pad controla la dirección, home teletransporta al jugador y el botón #1 reinicia el juego.
void buttonPressed(RimokonEvent evt, int rid)
{
  if (evt.wasPressed(RimokonEvent.LEFT))
    moverJugador(LEFT);

  if (evt.wasPressed(RimokonEvent.RIGHT))
    moverJugador(RIGHT);

  if (evt.wasPressed(RimokonEvent.DOWN))
    moverJugador(DOWN);

  if (evt.wasPressed(RimokonEvent.UP))
    moverJugador(UP);

  if (evt.wasPressed(RimokonEvent.ONE))
    reset();

  if (evt.wasPressed(RimokonEvent.HOME))
    teletransportarJugador();
}

La verificación del encuentro entre la princesa y el caballero se realiza en el método moverJugador y sucede cuando la nueva ubicación del caballero no es una pared && es un tesoro, en ese momento se ejecuta la siguiente instrucción para hacer vibrar el control.

wii.rimokon.vibrateFor(400);

Enlaces.

Utilizar el wiimote con Processing en Ubuntu 10.10

Introducción.

En el presente artículo se describen las librerías necesarias para acceder a la información proveniente de un wiimote desde sketches desarrollados en Processing y se implementa un sketch simple para verificar su funcionamiento.

Obtener e instalar las librerías requeridas.

Obtener los siguientes archivos.

wrj4P5 (alpha-011) http://sourceforge.jp/projects/wrj4p5/releases/ wrj4P5.jar
Loc (beta-005) http://sourceforge.jp/projects/wrj4p5/releases/ Loc.jar
WiiRemoteJ (1.6) http://www.world-of-cha0s.hostrocket.com/WiiRemoteJ/ WiiRemoteJ v1.6.zip.gz
BlueCove (2.1.0) http://code.google.com/p/bluecove/downloads/list bluecove-gpl-2.1.0.jar
bluecove-2.1.0.jar

Crear el directorio libraries/wrj4P5/library bajo el directorio de los sketches del usuario.  En mi caso, bajo ~/sketchbook.

$ mkdir ~/sketchbook/libraries/wrj4P5/library

Copiar los siguientes archivos a la ruta recién creada.

  1. bluecove-2.1.0.jar
  2. bluecove-gpl-2.1.0.jar (requerido para Linux)
  3. Loc.jar
  4. WiiRemoteJ.jar
  5. wrj4P5.jar

Con las versiones utilizadas el contenido del directorio queda de la siguiente manera.

$ ls -l ~/sketchbook/libraries/wrj4P5/library

-rw-r–r– 1 jimezam jimezam 547156 2010-12-08 21:27 bluecove-2.1.0.jar
-rw-r–r– 1 jimezam jimezam  89022 2010-12-08 21:26 bluecove-gpl-2.1.0.jar
-rw-r–r– 1 jimezam jimezam  34765 2010-12-08 21:44 Loc.jar
-rw-r–r– 1 jimezam jimezam  91091 2009-03-12 12:00 WiiRemoteJ.jar
-rw-r–r– 1 jimezam jimezam  39825 2010-12-08 21:40 wrj4P5.jar

Además es necesario contar (en mi caso) con las siguientes librerías del repositorio de Ubuntu.

  • bluez
  • libbluetooth3
  • libbluetooth3-dev

Crear un sketch de demostración.

Para esto se utiliza el código fuente del sketch MyFirstWii.

Sketch de demostración
Sketch de demostración

Crear un nuevo sketch en el PDE (File > New) y copie el código fuente de demostración.  Ejecute el sketch para probar el código (Sketch > Run).

Para conectar el wiimote al sketch presione al tiempo los botones 1 y 2 del wiimote por un momento.

Conclusiones iniciales.

  • Sería interesante tener mas control e información acerca del proceso de conexión con el wiimote.
  • La lectura de los botones del wiimote funciona muy bien.
  • La lectura del acelerómetro parece ser incorrecta y el cubo de la demostración gira sin control.
  • Será necesario hacer mas pruebas con estas librerías, incluyendo otras versiones de las mismas.

Enlaces.

Instalación de WiiPresent 0.7.5.2 en GNU/Linux Ubuntu 10.04

Introducción.

Casualmente hoy, hace exactamente un año estaba probando la instalación de WiiPresent 0.7.2 en Ubuntu 9.04, recuerdo que fue terrible, identificar cuales eran las librerías necesarias fue una odisea y compilar, instalar y hacer funcionar las versiones correctas fue un caos.  No tengo buenos recuerdos de ese software.

Ahora para honrrar esos recuerdos, hoy 20 de julio, decidí volver a probar con la versión mas reciente de WiiPresent para ver que tanto ha evolucionado.  Por suerte ya no estan presentes los problemas de librerías y todo es fácil de instalar mediante aptitude.

WiiPresent es una aplicación simple pero muy útil que nos permite manipular las funciones mas utilizadas de los programas de presentaciones (OpenOffice Presentations o Microsoft PowerPoint) mediante el wiimote.  Adicionalmente tiene otras funcionalidades que lo complementan de manera elegante, como la capacidad de controlar el ratón con el acelerómetro o el indicar cuanto tiempo ha pasado de presentación mediante los leds del control y la vibración cada 10 minutos.

Desde el punto de vista funcional tiene una cobertura muy específica: dar soporte a la realización de presentaciones; mientras que otros aplicativos de los que he publicado en anteriormente permiten una mayor flexibilidad y configuración.

Instalación.

Instalar las librerías necesarias.

$ sudo aptitude install libcwiimote3 libcwiimote-dev libx11-dev libxtst-dev

Descargar la última versión disponible de WiiPresent de la siguiente ubicación.

http://dag.wieers.com/home-made/wiipresent/

En este caso, la última versión disponible es la 0.7.5.2.

$ wget http://dag.wieers.com/home-made/wiipresent/wiipresent-0.7.5.2.tar.bz2

Descomprmir las fuentes.

$ bzip2 -d wiipresent-0.7.5.2.tar.bz2

$ tar xvf wiipresent-0.7.5.2.tar

Compilar el software.

$ make

Instalar el software.  Este paso es opcional, es posible ejecutar el software desde la misma ubicación donde acaba de ser compilado.

$ sudo make install prefix=”/usr/local”

Ejecutar el software.

Hay varias opciones interesantes que se pueden utilizar al momento de ejecutar la aplicación.

Modo presentación, se reconecta automáticamente si hay algún problema con la conexión.

$ wiipresent —reconnect –verbose

Especifica la dirección del wiimote, de lo contrario es necesario presionar los botones 1 y 2 del mismo para emparentarlo.  La dirección del wiimote se puede obtener mediante el comando hcitool scan.

$ wiipresent –verbose —bluetooth=XXXXXXX

Utiliza el sensor infrarrojo y una barra sensora para mover el cursor.

$ wiipresent –verbose —infrared

Utiliza el acelerómetro para mover el cursor.

$ wiipresent –verbose —tilt

Indica la duración de la presentación.

$ wiipresent –verbose —length=minutos

La mayoría de estas opciones puede combinarse para lograr una mayor interacción con el wiimote.

Manipulación de la presentación.

Estas son las acciones que permite ejecutar WiiPresent para interactuar con la presentación.

Siguiente slide A ó FLECHA_DERECHA
Slide anterior FLECHA_IZQUIERDA
Poner/Quitar pantalla completa BOTON_1
Aumentar/disminuír zoom/volúmen BOTON_+ / BOTON_-
Cambiar entre aplicaciones BOTON_B + FLECHA_DERECHA
Pantalla negra + silencio BOTON_B + BOTON_2
Escritorio siguiente BOTON_B + BOTON_+
Escritorio anterior BOTON_B + BOTON_-

Enlaces.

Instalación de Wiican 0.2.1 en GNU/Linux Ubuntu 10.04

Introducción.

Después de probar hace un tiempo con wiipresent y CWiid ahora he encontrado a un nuevo contendor: Wiican que tiene un poco mas de GUI y varias promesas para la futura versión 0.3, la cual aparentemente está en progreso.  En su propio sitio web se describen de la siguiente forma.

WiiCan assists on configuration and management of your wiimote under GNU/Linux. It tracks bluetooth connectivity and allows to use and create mappings to adapt your wiimote for use on any application.

Esta sencilla aplicación que se integra a la barra de tareas y ha sido desarrollada en Python, permite de igual manera establecer perfiles para relacionar los botones y movimientos del Wiimote con eventos de la interfaz del sistema operativo, para con ellos controlar las diversas aplicaciones que se ejecutan.

La última versión disponible es la 0.2.1 que fue liberada el 2 de febrero del 2010.

Instalación.

Agregar el repositorio de Wiican a Ubuntu.

$ sudo add-apt-repository ppa:wiicanteam/ppa

Actualizar la lista de paquetes conocida.

$ sudo aptitude update

Instalar Wiican desde el nuevo repositorio.

$ sudo aptitude search wiican

Iniciar automáticamente el módulo de udev con el sistema operativo (si aún no se cuenta con él).

$ sudo -i “echo udev >> /etc/modules”

Iniciar manualmente (necesario únicamente por esta vez gracias al paso anterior) el servicio de udev.

$ sudo service udev start

Iniciar la aplicación.

Seleccione el menú Applications > Accessories > Wiican o ejecute el siguiente comando en el shell.

$ /usr/bin/wiican

Uso.

Al ejecutarse la aplicación agrega un nuevo ícono en la barra de tareas.

Ícono de la barra de tareas asociado a Wiican

Si se hace clic izquierdo sobre el ícono de Wiican se obtendrá la posibilidad de desconectar el wiimote (si hubiera uno conectado previamenta) y un listado de los perfiles disponibles.  Inicialmente se cuenta con dos perfiles: uno para controlar el ratón con el acelerómetro y otro para controlar el juego de Neverball.

Opciones del clic izquierdo.

Haga clic sobre uno de los perfiles para activarlo y presione los botones 1 y 2 del wiimote para emparentar el control y utilizar la aplicación.

Si hace clic derecho sobre el ícono de Wiican tendrá acceso a la opción de configuración y a terminar la aplicación.

Opciones del clic derecho

Enlaces.

Descubriendo dispositivos Bluetooth con Java y BlueCove

Introducción.

Después de la fallida búsqueda de una librería para acceder al protocolo Bluetooth desde Mono vuelvo entonces a Java buscando la opción mas portable posible.  Esta vez voy a probar BlueCove que soporta Mac OSX, WIDCOMM, BlueSolei, Windows nativo y Linux con BlueZ.

Instalación.

Descargar las últimas versiones disponibles desde la siguiente ubicación: http://sourceforge.net/project/showfiles.php?group_id=114020

  1. bluecove-*.jar: módulo principal, incluye el soporte para las pilas de Mac OS X, WIDCOMM, BlueSoleil and Microsoft Bluetooth.
  2. bluecove-gpl-*.jar: adiciona el soporte para la pila en Linux.

Descargar estos archivos JAR en una ubicación conocida.

Descubriendo dispositivos Bluetooth.

Para esto se parte de un objeto que implementa DiscoveryListener, él define que se debe hacer cuando cuando se encuentra un nuevo dispostivo y cuando se termina la búsqueda.

        /**
         * The DiscoveryListener interface allows an application to
         * receive device discovery and service discovery events.
         */

        DiscoveryListener listener = new DiscoveryListener()
        {
            /**
             * Called when a device is found during an inquiry.
             */

            public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
            {
                System.out.println("Device " + btDevice.getBluetoothAddress() + " found");

                devicesDiscovered.addElement(btDevice);

                try
                {
                    System.out.println("     name " + btDevice.getFriendlyName(false));
                }
                catch (IOException cantGetDeviceName) {}
            }

            /**
             * Called when an inquiry is completed.
             */

            public void inquiryCompleted(int discType)
            {
                System.out.println("Device Inquiry completed!");

                synchronized(inquiryCompletedEvent)
                {
                    inquiryCompletedEvent.notifyAll();
                }
            }
            // Not used in this example.

            public void serviceSearchCompleted(int transID, int respCode) {}
            public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {}
        };

En este ejemplo, cuando se identifica a un nuevo dispositivo Bluetooth (ver deviceDiscovered) se obtiene su dirección, de ser posible su nombre y se agrega en la lista de dispositivos encontrados.

public static final Vector<RemoteDevice> devicesDiscovered = new Vector<RemoteDevice>();

Para ejecutar finalmente la búsqueda de dispositivos de acuerdo con el comportamiento definido anteriormente, se crea un objeto sobre el cual se sincronizarán las próximas acciones.

final Object inquiryCompletedEvent = new Object();

synchronized(inquiryCompletedEvent)
{
         // The search code ...
}

Con él se inicia la búsqueda de dispositivos accediendo al Agente Descubridor del Dispositivo Local.

boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, listener);

Finalmente se verifica que la búsqueda haya comenzado exitosamente y se espera para garantizar su ejecución.

     if (started)
     {
          System.out.println("Starting Device Discovery process ...");

          /**
           * Wait for Discovery Process end
           */

          inquiryCompletedEvent.wait();

          System.out.println("There was " + devicesDiscovered.size() +  " device(s) found");
     }

Compilación & ejecución.

Para compilar y posteriormente ejecutar el programa de demostración es necesario garantizar que el JAR de bluecove, descargado inicialmente, se encuentre en el CLASSPATH.  También es necesario recordar que si la plataforma objetivo es Linux, es necesario incluír además el JAR de bluecove-gpl.

Para compilar se utiliza un comando preparado de la siguiente manera.

javac -cp ../lib/current/bluecove-2.1.0.jar:../lib/current/bluecove-gpl-2.1.0.jar RemoteDeviceDiscovery.java

Debe tenerse en cuenta que para la compilación se está suponiendo que los archivos JAR se encuentran en el directorio ../lib/current y que corresponden con la versión 2.1.0.   Además se está realizando en Linux, motivo por el cual el separador de directorios es : en lugar del ; utilizado por Windows.  Es necesario que adapte el comando según sus características específicas.

Para interpretar se utiliza un comando similar, preparado de la siguiente manera.

java -cp ../lib/current/bluecove-2.1.0.jar:../lib/current/bluecove-gpl-2.1.0.jar RemoteDeviceDiscovery

La salida de la aplicación.

La aplicación de demostración deberá imprimir por salida estándar la información de los dispositivos Bluetooth que se encuentren cerca durante el tiempo que dure la búsqueda.  Algo similar a lo siguiente.

BlueCove version 2.1.0 on bluez
Starting Device Discovery process …
Device 001ADE8BF510 found
name Jimezam Phone
Device 0017AE39DCB0 found
name Nintendo RVL-CNT-01

Device Inquiry completed!
There was 2 device(s) found
BlueCove stack shutdown completed

En la respuesta anterior se puede apreciar que la aplicación detectó exitosamente a mi teléfono celular y a un Wiimote que pasaba por allí.

Enlaces.

"Reparando" el módulo de Bluetooth de un Dell Vostro 1400

Introducción.

Mi portátil, un Dell Vostro 1400, incluye un módulo de Bluetooth (Dell Truemobile 355 Bluetooth + EDR).  Cuando recibí el portátil hace poco mas de un año funcionaba perfectamente en Windows Vista Home Premium.  Tiempo después reinstalé el sistema operativo desde el DVD (no del quick restore) para tener un espacio particionado e instalar Linux.  En Vista siguió funcionando pero en Linux no aparecía el módulo.  En ese momento no le puse mucho cuidado.

Hace un par de semanas necesité el Bluetooth y, después de dos meses sin utilizar Windows, tuve que reiniciar este sistema operativo.  Rápidamente noté dos cosas: había instalado el SP1 y el módulo de Bluetooth no aparecía por ningún lado.

Hice todos las pruebas y experimentos que se me ocurrieron e intenté instalar de nuevo el driver pero siempre terminaba diciendo: presione Fn+F2 para activar el módulo y este como si no existiera.  También revisé el setup del BIOS y decía que si estaba instalado y que se encontraba activo, sin embargo nada funcionaba.  Pensé que el módulo había pasado a mejor vida.

Conversación con el soporte Dell.

Con todo apuntando a un problema de hardware contacté por correo electrónico al soporte de Dell a quien le conté mi problema y las pruebas que había realizado.  Este fue nuestro diálogo a lo largo de una semana.

Soporte Dell.
Verifique que el switch se encuentre en On.
Presione Fn+F2 para activar el módulo.
Remueva el driver y vuélvalo a instalar.

Yo.
Siempre ha estado en On.
Fn+F2 no hace nada.
No puedo remover el driver porque el módulo no aparece en la lista de dispositivos.
(No le había dicho en el requerimiento que todo esto ya estaba probado ?)

Soporte Dell.
Usted no puede utilizar el módulo porque se encuentra desactivado desde el BIOS.  Siga estos pasos para activarlo e instale el driver después.

Yo.
Verifiqué el driver (otra vez) y está activo.  Realicé los pasos que sugiere para cargar los valores del BIOS por defecto y todo sigue igual, consecuentemente no puedo instalar el driver.
(No le había dicho en el requerimiento que todo esto ya estaba probado ?)

Soporte Dell.
Debe ser un problema del sistema operativo.  Hágale copia de seguridad a todo y reinstálelo con Dell Factory Image Restore que le va a borrar todo lo que tenga en el disco duro destruyéndole las particiones que tenía.

Yo.
Agradezco su [intento de] colaboración pero reinstalar mi equipo no es una opción en este momento, mucho menos con el Image Restore ya que utilizo varios sistemas operativos diferentes de Windows, en este momento, además de Windows Vista, tengo una partición para Linux Ubuntu y el  software mencionado no permite su instalación al no permitir manipular el tamaño de las particiones.

De igual manera considero que el problema no es de software ya que el módulo no funciona en Windows ni en Linux.  Yo podría reinstalar Windows Vista desde DVD si ustedes me garantizan que el problema no es de hardware y que yo no estoy perdiendo mi tiempo reinstalando el sistema operativo, el montón de software que utilizo y copiando/restaurando mi información.

Lo que no hace uno mismo, no se hace bien.

Aburrido y decepcionado con la respuesta del soporte técnico: reinstale Windows 😛  Decidí realizar una nueva búsqueda.  Esta vez con mayor suerte encontré que Anando en su blog había tenido este mismo problema y me dió unas muy buenas luces para encontrar su solución.

[Aparentemente] el problema radica en que el módulo se enciende y apaga internamente a través de software y que después de apagado es completamente inaccesible hasta que se vuelva a encender nuevamente.

Digo aparentemente porque supuestamente el switch de la red controla todos los módulos instalados (así está configurado el BIOS), tanto Bluetooth como WIFI, y a pesar de estar en On, el módulo no estaba activo.  De igual manera, por qué el sistema operativo/driver no lo activan por sus propios medios ?

Gracias al post de Anando, continué mi búsqueda en los foros de la comunidad Dell donde encontré que la pequeña aplicación (sólo 153KB) R159805.EXE resuelve mi problema activando el módulo Bluetooth sin necesidad de reinstalar inútilmente todo el sistema operativo.

Después de esto el sistema operativo, tanto Windows como Linux, reconocen el módulo e instalan el software necesario.  Preferí utilizar el controlador proporcionado por Dell en lugar del instalado automáticamente por Windows e instalé la pila proporcionada por el instalador R140135.EXE.  Ahora funciona perfecto.

Conclusiones.

El servicio de soporte técnico de Dell fue muy amable y diligente, sus respuestas fueron puntuales cada 24 horas, sin embargo su falta de técnica y precisión es enorme.  Esto no es tan grave como uno consideraría si se tiene en cuenta que el servicio es utilizado también por personas que no tienen ninguna experiencia técnica y que probablemente estén mas confundidos que uno.  Sin embargo deja mucho que desear el hecho que me hayan solicitado volver a hacer las pruebas que ya había hecho y cuyos resultados ya había informado, mas aún, reinstalar el sistema operativo cuando muy posiblemente, y la solución final me dió la razón, era una opción inoficiosa y muy dispendiosa para mi.

Me queda una duda amarga: cuánto tiempo y esfuerzos nos hubiera tomado encontrar la solución si yo no hubiera sido un ingeniero proactivo ?

Como mencioné, entiendo bastante la forma como el servicio de soporte llevó el caso, la mayoría de las veces el motivo del problema acostumbra a ser algo muy simple, lo que me parece realmente molesto es que este caso ya le había sucedido a otras personas con este mismo módulo, estaba documentado en los foros de la misma empresa y, gracias a todos los dioses, había una aplicación para implementar su solución inmediata y que aparentemente es desconocida por los amigos del soporte.

Enalces.