Wiimote y Bluetooth

Como comenta Queltosh, estamos trabajando en programar desde linux el mando de la Nintendo Wii. De momento tengo varias cositas hechas, pero de poca importancia, principalmente la detección y conexión de los mandos que halla. La siguiente porción de código es la que se encarga de la detección:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
static int search_wiimotes()
{
    inquiry_info *ii = NULL;
    int max_rsp, num_rsp;
    int dev_id, sock, len, flags;
    int i;
    char addr[19] = { 0 };
    char name[248] = { 0 };
 
    dev_id = hci_get_route(NULL);
    sock = hci_open_dev( dev_id );
    if (dev_id < 0 || sock < 0) {
        perror("opening socket");
        exit(1);
    }
 
    len  = 4;
    max_rsp = 255;
    flags = IREQ_CACHE_FLUSH;
    ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
 
    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
    if( num_rsp < 0 ) perror("hci_inquiry");
 
    for (i = 0; i < num_rsp; i++) {
        ba2str(&(ii+i)->bdaddr, addr);
        memset(name, 0, sizeof(name));
        if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), name, 0) < 0)
	        strcpy(name, "[unknown]");
        if( !strcmp( name, "Nintendo RVL-CNT-01" ) ) {
        	strcpy( _wii_handlers[_wii_counter].addr, addr );
        	_wii_counter ++;
        }
    }
 
    free( ii );
    close( sock );
 
    return 0;
}

Con el código anterior se detectan hasta un máximo de 255 dispositivos Bluetooth y luego seleccionamos los que sean Wiimotes.

Una vez hemos detectado todos los Wiimotes, procedemos a conectarnos a ellos. Pues en este punto surje un problema: algunas implementaciones de la biblioteca Bluez (o de la pila de Bluetooth, no estoy seguro), tienen un fallo y no dejan realizar la conexión, diciendo que la clave no es correcta. Parece ser que el fallo ya está solucionado en versiones posteriores, pero en la que trae Ubutu Edgy (la que uso para las pruebas) no :'(. Así que a esperar toca.

Para los que quieran el código que hace la conexión con un Wiimote:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 * Crea una conexión con un wiimote.
 * @param addr Dirección del wiimote
 */
static int wii_internal_connect( char addr[19] )
{
	struct sockaddr_l2 loc_addr;
	int fd_in, fd_out;
 
	fprintf( stderr, "Conectando a: %s\n", addr );
 
	fd_in = socket( AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP );
	if( fd_in < 0 ) return -1;
 
	str2ba( addr, &loc_addr.l2_bdaddr );
	loc_addr.l2_family = AF_BLUETOOTH;
	loc_addr.l2_psm = htobs( 0x13 );
 
	if( connect( fd_in, (struct sockaddr *)&loc_addr, sizeof(loc_addr) ) < 0 ) {
		close( fd_in );
		return -1;
	}
 
	fd_out = socket( AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP );
	if( fd_out < 0 ) {
		close( fd_in );
		return -1;
	}
 
	str2ba( addr, &loc_addr.l2_bdaddr );
	loc_addr.l2_family = AF_BLUETOOTH;
	loc_addr.l2_psm = htobs( 0x11 );
 
	if( connect( fd_out, (struct sockaddr *)&loc_addr, sizeof(loc_addr) ) < 0 ) {
		close( fd_out );
		close( fd_in );
		return -1;
	}
 
 
	_wii_handlers[_wii_counter].in  = fd_in;
	_wii_handlers[_wii_counter].out = fd_out;
	_wii_counter ++;
 
	return 0;
}

Un comentario en “Wiimote y Bluetooth

  1. “estamos trabajando en programar desde linux el mando de la Nintendo Wii”

    o

    “estamos trabajando en programar linux desde el mando de la Nintendo Wii”

    una sutil diferencia….aunque creo que es posible que consigamos ambas cosas :-)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *