Archivos mensuales: enero 2007

Caida de MSN Messenger

Supongo que a muchos os ha ocurrido que ayer por la noche, por mucho que escribiesies por el messenger (da igual desde qué aplicación), vuestros mensajes nunca obtenían contestación. Creo que fue algo generalizado. Lo peor de todo es que se podía ver a los contactos y sus estados, pero no podías comunicarte… ¿Qué se siente al volverse mudo y sordo digitalmente? Supongoq que algo parecido.

Creo, que para casos así, lo mejor es disponer de otras alternativas, tipo google talk (tanto la versión web como de escritorio), jabber, etc. Si esto lo complementas con programas multicuenta (Gaim, Kopete, etc.), se convierte en algo, hasta estupido, da igual que se caiga una red, vas a poder siguir hablando con tus amigos por las otras.

Ya sabéis, todos a instalarse el Gaim y a crearse cuentas en jabber.org ;-)

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;
}