A diferencia de Linux, los controladores de Bluetooth en Windows no son libres y el sistema operativo no los incluye. Cuando se compra un adaptador USB Bluetooth, el mismo hardware viene acampañado con un disco compacto con el software necesario. El primero que compré decía que era un KY-BT100 de Integrated System Solution Corp e incluía el programa BlueSoleil 1.6 de la compañía IVT Corporation.
BlueSoleil 1.6 de IVT Corporation
BlueSoleil es un programa muy completo, que permite:
- Transmitir archivos, mensajes, fotos con celulares con palms u otras computadoras.
- Conectar impresoras, dispositivos como mandos de juegos, ratones e incluso usar el celular o la palm como ratón.
- Compartir la salida a internet con otros dispositivos.
Desafortunadamente los miedos que expresaba en el post de Bluetooth en Linux aumentaron al darme cuenta que no podía actualizar la versión 1.6 de 2004 (que no funciona en Windows Vista) a la actual porque la dirección BD del adaptador es inválida. Por lo tanto, no tengo ningún soporte, ni respaldo a futuro porque los señores de IVT Corporation consideran que la compañía que fabrica el adaptador se está pirateando el software; pero tampoco te quieren vender la versión actual.
Para evitarme problemas, mejor compré otro de la marca Zonet; el cual incluye la licencia de uso de la versión 2.6.08, la cual funciona perfectamente en Windows XP y en Windows Vista.
Control Wii Remote
Para sorpresa de muchos de los amantes de los videojuegos de PC, el control Wii Remote (Wiimote para los cuates) se comunica siguiendo fielmente el estándar para dispositivos de interfase humana de Bluetooth, por lo que los hackers no tardaron en desarrollar los programas accesorios para buscar la misma experiencia de usuario de los juegos de Nintendo en nuestras computadoras caseras (No es muy recomendable hacerlo en las del trabajo).
Jugando Half Life 2 con el controll Wiimote
El programa que hace la magia se llama GlovePIE y fue desarrollado para emular el comportamiento del teclado, ratón y joystick desde dispositivos que no tienen esa funcionalidad; de hecho, originalmente fue concebido para darle soporte a un guante de realidad virtual llamado Essential Reality P5 Glove. GlovePie se apoya en el stack de Bluetooth de Microsoft y en un programa emulador de joystick llamado Paralel Port Joystick o PPJoy que debe de estar instalado previamente.
Para dirigir el movimiento del wiimote al joystick virtual, al ratón y al teclado, se debe escribir en GlovePie, un pequeño script en un lenguaje similar al Basic. Por ejemplo, el siguiente script me sirvió para el juego de Half Life 2 de Valve:
Hasta el momento de hacer este experimento, nunca he jugado con una consola Wii, por lo que no puedo certificar que la experiencia sea la misma. Algunos comentarios en sitios de conocedores dicen que el stack de bluetooth de Microsoft no soporta toda la funcionalidad que tiene el wiimote y a mi me falta la barra sensora de los leds infrarojos para usar la función de señalamiento (aunque construir una parece muy simple). Sin embargo, funciona bien y es realmente divertido jugar con el control.
Actualmente, muchos dispositivos personales como palms y celulares incluyen entre sus funcionalidades el poder interconectarse por medio de la tecnología inalámbrica Bluetooth. Afortunadamente, hay muy pocas cosas de que preocuparse, porque al menosd desde Fedora 7 tiene soporte completo de bluetooth por medio de la pila de protocolos para Linux Bluez.
Como utilizo un servidor Dell para trabajar con Linux, este no incluía alguna interfaz Bluetooth de fábrica; por lo que la solución más sencilla y económica para agregarle esta capacidad fue comprar un adaptador USB Bluetooth.
Una vez enchufado (sin necesidad de reiniciar la máquina), se puede revisar su presencia con el siguiente comando:
[root@linux renato]# /sbin/lsusb
Bus 002 Device 001: ID 0000:0000
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 002: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter
Bus 003 Device 001: ID 0000:0000
Bus 001 Device 004: ID 045e:0084 Microsoft Corp.
Bus 001 Device 005: ID 413c:2003 Dell Computer Corp.
Bus 001 Device 001: ID 0000:0000
Utilerías de línea de comando:
El paquete bluez-utils contiene todas las herramientas que necesitamos para obtener o configurar nuestros dispositivos bluetooth. Algunas de ellas son:
- hciconfig
- hcitool
- hciattach
- hcid
- l2ping
hciconfig
Este comando se utiliza para configurar y obtener información de los adaptadores Bluetooth que tenemos conectados (obviamente, por lo general es uno). Para obtener la información de nuestro adaptador hacemos lo siguiente:
Desafortunadamente, desde aquí pude ver que no es muy recomendable el adaptador que compré porque de fábrica le programaron una dirección BD inválida a todos sus adaptadores Bluetooth: 11:11:11:11:11:11. Esto es realmente raro porque la compañía china que lo produjo si aparece registrada ante la IEEE y desafortunado porque se supone que esa dirección es única y puede haber conflictos si se usan dos o más de estos dispositivos al mismo tiempo. Aunque el adaptador funciona correctamente, algo en mi interior me dice que compré un producto pirata o que fue retirado del mercado por esa razón.
En http://standards.ieee.org/regauth/oui/index.shtml se puede consultar el identificador OUI en la base de datos de la IEEE, el cual se utiliza en las primeras tres cifras de la dirección BD. Curiosamente los identificadores de mi celular y del wiimote si aparecen, pero no así la de mi palm. ¡Benditas estandarizaciones!
hcitool
Siguiendo con cosas menos tristes, el comando para encontrar dispositivos Bluetooth a nuestro alredor es:
Para poder usar el control remoto de la consola de juegos wii de Nintendo (aka wiimote), se puede usar un script de python llamado WMD (Wiiwanna Motte Dammiit!) desarrollado por Francois A. Bradet y amigos. El funcionamiento consiste esencialmente en direccionar los comandos del wiimote al teclado y al ratón para poderlo usar en los juegos existentes en Linux.
Prerequisitos
Para poderlo instalar, es necesario tener los siguientes programas previamente instalados:
- Las librerias de desarrollo de BlueZ
yum install bluez-libs-devel
- Librería pybluez para python
wget http://org.csail.mit.edu/pybluez/release/pybluez-src-0.14.tar.gz
tar -xvzf pybluez-0.14.tar.gz
cd pybluez-0.14
python setup.py install
- python-xlib
yum install python-xlib
Para evitar errores se recomienda aumentar el tamaño del buffer del socket cambiando:
recv = self.socket.recv(2048)
a lo siguiente
recv = self.socket.recv(4096)
en el archivo /usr/lib/python2.5/site-packages/Xlib/protocol/display.py.
Instalación:
La versión más actualiza de GDM se baja por medio de svn:
svn co https://svn.forthewiin.org/wmd/trunk/ wmd-trunk
Aquí no se compila nada porque son programas escritos en python. Para probar que todo este funcionando correctamente o para usar el wiimote como un ratón se hace los siguiente:
[renato@linux wmd-trunk]#/sbin/modprobe uinput [renato@linux wmd-trunk]# xhost + [renato@linux wmd-trunk]# python WMD.py
uinput: Attempting to autodetect device file
uinput: /dev/misc/uinput isn't a usable uinput device file
uinput: autodetection chose /dev/input/uinput as uinput device file
uinput: Trying to open /dev/input/uinput as control device
uinput: Writing WIIMOTE_UUD
uinput: Registering 31 events
uinput: Creating device
uinput: initialized and ready
CONNECTING
Looking for Wiimote services at address 00:17:AB:36:09:52
Failure. We have not found that Wiimote.
Now trying to discover a willing Wiimote, please activate your Wiimote within 5 seconds.
Found 2 Bluetooth Devices!
Found a Wiimote at address XX:XX:XX:XX:XX:XX
Looking for Wiimote services at address XX:XX:XX:XX:XX:XX
Victory! We have found that Wiimote!
We are now connected to Wiimote at address XX:XX:XX:XX:XX:XX
CONNECTED
Cuando aparezca el letrero "Now trying to discover a willing Wiimote, please activate your Wiimote within 5 seconds." se debe presionar al mismo tiempo los botones 1 y2 del wiimote o bien presionar el botón sync que se encuentra en el compartimiento de las pilas para poner al wiimote en modo detectable.
Probando Unreal Tournament 2004 con el wiimote
Desafortunadamente, el WMD parece estar muy enfocado a ser un "ratón inalámbrico" y el código está bastante desordenado y confuso (el mismo autor lo reconoce) por lo que para usarlo en alguna aplicación es necesario invertir algo de tiempo en el código fuente para ver como funciona. Danigm, un usuario de Linux y amante de los comics, se tomó la molestia de escarbar en el código de WMD para hacer un tutorial donde incluye un esqueleto de como se podrían manejar las clases de WMD con una utilería UNIX (xsendkeycode) para usar el teclado con el control Wii.
Xsendkeycode se encuentra dentro del paquete lineakd, si no lo tiene instalado se puede recurrir a yum:
yum install lineakd
Para jugar Unreal Tournament 2004, modifique ligeramente el ejemplo de Danigm para que quedara de la siguiente forma:
importsys sys.path.append('.')
importos
from wmd.Commonimport * from wmd.Configimport CFG from wmd.UI.UIManagerimport UIManager from wmd.Wiimote.WMManagerimport WMManager from wmd.EVDispatcherimport EVDispatcher from wmd.MotionSensingimport MSManager from wmd.Pointerimport POManager from wmd.CommandMapperimport CommandMapper
class unrealManager:
def__init__(self, cf, ms, ev ): self.cf = cf self.ev = ev self.ms = ms self.ev.subscribe( WM_BT, self.ev_buttons)
ms = MSManager( cf, ev )# Motion analysis
po = POManager( cf, ev )# Handles the pointer, receives WM_IR, sends out ABS_POS absolute position reports
um = unrealManager( cf, ms, ev )# Motion analysis
cm = CommandMapper( cf, ev )
# Handles the Wiimote; connects to it, manages wiimote state and mode, parses wiimote reports
wm = WMManager(cf, ev)
if wm.connect()and wm.setup():
cycles = wm.main_loop()
wm.disconnect()
Obviamente el script le falta bastante trabajo pero seguramente puede servir de guía para programar otros juegos en Linux o para que alguien con más paciencia lo mejore.
¿Hay algo más?
Todo este rollo fue únicamente con fines didácticos porque no suelo jugar en Linux aunque hay buenos juegos. Sin duda dejé muchas cosas sin ver, como el manejo de los infrarrojos del wiimote y su bocinita; pero para mí fue suficiente y ya tengo una buena idea de como funcionan estos juguetes. Quizás regrese un día que me sienta nostálgico o por alguna razón tenga la necesidad; para entonces seguramente habrá mejores programas y utilerías... o tal vez sea cuando el Bluetooth pase a ser pieza de museo.
Otro programa recomendado
Wminput es un programa escrito en C para hacer la interfase con el wiimote. Es un programa interesante porque muchas de las distribuciones ya lo tienen en su repositorio, por lo que vale la pena revisarlo. Si no lo encuentra en su repositorio favorito, puede obtener las fuentes y más información en: www.cwiid.org.
DeterK 1.0 era un programa de utilería para ingeniería civil que realizaba cálculos de estructuras de concreto y de elementos metálicos para edificios. En el caso de estructuras de concreto obtenía la geometría y el calibre de las varillas a utilizar. Estaba programado en Borland C++ 5.0, usaba OWL para el manejo de ventanas y BDE para el manejo de bases de datos. Podía importar y exportar archivos a otros programas de Ingeniería civil incluyendo al STAAD.
Cálculo de un estacionamiento
Lo escribí a principios de 1996 en la vida en la que trabajaba en una constructora. Fue mi primer programa relativemente complejo en C++, donde desarrollé y apliqué técnicas de programación profesionales para reducir el número de errores en la programación, realizar cambios de forma rápida y autodocumentables.
Cabe aclarar que en esa época era más talachudo programar, porque había menos librerías libres y poca información en Internet; por lo que prácticamente había que hacerlo todo desde cero. Por ejemplo, la librería de 3D la tuve que programar, pero me sirvió bastante como ejercicio. Poco tiempo después conocí Direct-X y OpenGL, pero al cambiar de trabajo tuve menos necesidad de utilizar este tipo de librerias hasta varios años después.
Igual que muchas cosas de las que hay en este blog: "para antes de que se me pierda o se destruya"
Nota: No soy muy afecto a tomar fotos de aquí, pero conforme vaya teniendo; las iré colocando en este post. Gracias a todos los de mi familia que han donado fotos para este post.