Posts tagged as:

Fedora

Medición del Ancho de Banda en Linux

by Jorge Machin on August 10, 2008 · 0 comments

in Fedora, Linux

Un programa muy útil para saber cuanto ancho de banda esta gastando nuestra computadora es vnstat, el cual se puede instalar en Fedora usando yum:

yum install vnstat

Si lo desea compilar de los fuentes, los puede obtener de: http://humdi.net/vnstat/.

Una vez instalado creamos la base de datos para la interfaz que queramos medir, por lo general eth0:

vnstat -u -i eth0

Si se instaló compilandolo a mano, se crea además un cron que se ejecuta cada cinco minutos para llenar la base de datos:

0-55/5 * * * * /usr/bin/vnstat -u

O bien, se quita el comentario (#) en /etc/cron.d/vnstat para habilitarlo si se instaló con yum.

Después de un tiempo, podemos consultar nuestro gasto del dia con:

vnstat -d

O el mensual

vnstat -m

{ 0 comments }

Bluetooth en Linux

by Jorge Machin on July 28, 2007 · 0 comments

in Fedora, Linux, Videojuegos

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:

/usr/sbin/hciconfig -a

hci0:   Type: USB
        BD Address: 11:11:11:11:11:11 ACL MTU: 678:8 SCO MTU: 48:10
        UP RUNNING PSCAN ISCAN
        RX bytes:1987 acl:0 sco:0 events:57 errors:0
        TX bytes:723 acl:0 sco:0 commands:52 errors:0
        Features: 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF PARK
        Link mode: SLAVE ACCEPT
        Name: 'Linux home'
        Class: 0x120104
        Service Classes: Networking, Object Transfer
        Device Class: Computer, Desktop workstation
        HCI Ver: 1.2 (0x2) HCI Rev: 0x1fe LMP Ver: 1.2 (0x2) LMP Subver: 0x1fe
        Manufacturer: Integrated System Solution Corp. (57)

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:

[renato@linux renato]# hcitool scan
Scanning ...
        XX:XX:XX:XX:XX:XX       Palm Jorge Machin
        XX:XX:XX:XX:XX:XX       Telefono Jorge Machin
        XX:XX:XX:XX:XX:XX       Nintendo RVL-CNT-01

Applets de gnome:

próximamente

Wii Remote en Linux:

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:

import sys
sys.path.append('.')

import os

from wmd.Common import *
from wmd.Config import CFG
from wmd.UI.UIManager import UIManager
from wmd.Wiimote.WMManager import WMManager
from wmd.EVDispatcher import EVDispatcher
from wmd.MotionSensing import MSManager
from wmd.Pointer import POManager
from wmd.CommandMapper import 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)

   def ev_buttons( self, ev ):

      button = ev[0]
      state  = ev[1]

      # This code is only for mnemonics reasons:

      keyctrl = 9

      key1 = 10
      key2 = 11
      key3 = 12
      key4 = 13
      key5 = 14
      key6 = 15
      key7 = 16
      key8 = 17
      key9 = 18

      keyq = 24
      keyw = 25
      keye = 26
      keyr = 27
      keyt = 28
      keyy = 29
      keyu = 30
      keyi = 31
      keyo = 32
      keyp = 33
 
      keya = 38
      keys = 39
      keyd = 40
      keyf  = 41
      keyg = 42
      keyh = 43
      keyj  = 44
      keyk = 45
      keyl  = 46

      keyz = 52
      keyx = 53
      keyc = 54
      keyv = 55
      keyb = 56
      keyn = 57
      keym = 58

      keyspace = 65

      if state == "DOWN":

         if button == "+":
            os.popen2("xsendkeycode "+str( keyg )+" 1")
         elif button == "-":
            os.popen2("xsendkeycode "+str( keyf )+" 1")
         elif button == "H":
            os.popen2("xsendkeycode "+str( keyctrl )+" 1")
         elif button == "1":
            os.popen2("xsendkeycode "+str( keyspace )+" 1")
         elif button == "2":
            os.popen2("xsendkeycode "+str( keyc )+" 1")
         elif button == "U":
            os.popen2("xsendkeycode "+str( keyw )+" 1")
         elif button == "D":
            os.popen2("xsendkeycode "+str( keys )+" 1")
         elif button == "L":
            os.popen2("xsendkeycode "+str( keya )+" 1")
         elif button == "R":
            os.popen2("xsendkeycode "+str( keyd )+" 1")

      elif state == "UP":

         if button == "+":
            os.popen2("xsendkeycode "+str( keyg )+" 0")
         elif button == "-":
            os.popen2("xsendkeycode "+str( keyf )+" 0")
         elif button == "H":
            os.popen2("xsendkeycode "+str( keyctrl )+" 0")
         elif button == "1":
            os.popen2("xsendkeycode "+str( keyspace )+" 0")
         elif button == "2":
            os.popen2("xsendkeycode "+str( keyc )+" 0")
         elif button == "U":
            os.popen2("xsendkeycode "+str( keyw )+" 0")
         elif button == "D":
            os.popen2("xsendkeycode "+str( keys )+" 0")
         elif button == "L":
            os.popen2("xsendkeycode "+str( keya )+" 0")
         elif button == "R":
            os.popen2("xsendkeycode "+str( keyd )+" 0")

cf = CFG

ev = EVDispatcher(cf)

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.

{ 0 comments }