Sockets Bluetooth

Iniciado por oPen syLar, 27 Mayo 2012, 04:19 AM

0 Miembros y 1 Visitante están viendo este tema.

oPen syLar

Hace un par de semanas trabajo sobre un pequeño proyecto basado en OpenOBEX..Y bueno me ha recordado viejos tiempos cuando echaba mis primeras lineas con las BlueZ y empezaba a jugar con algunas distro GNU/Linux... Eso ya hace bastante tiempo.. Y ahora los retomo =)

El tema de los Bluetooth es algo poco visto.. Poco se habla.. Es raro.. Muchas implementaciones de sus protocolos se ven muy inestables.. Bueh ya vendrán una que otra tool que nos quite el sueño.. O quien quita.. Actualicen la suite Bludiving para ponernos a jugar un rato.. Que no tiene actividad desde el 2006 =S ...

Aca les traigo un pequeño código de como se manejan los sockets bajo Bluetooth.. Si han manejado sockets en alguna vez de su vida verán que no es nada complejo.. y varían en ciertas lineas y ciertos flags.. Pero del resto es la misma wea..Un socket() por aqui un connect() por alla.. Blablabla..

Necesitaran..


las librerias de desarrollo bluez
(En Debian creo que se llaman bluez-devel) o algo así..

En Arch simplemente se llama bluez



#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <errno.h>
#include <stdio.h>

int main(int argc, char *argv[])
{

if(argc!=2)
{
printf("\nSolo acepta 1 parametros...\n%s 00:11:22:33:44:55:66\n\n", argv[0]);

return 1213;
}

/*
- Para socket Bluetooth se cambia el tipico AF_INET por
AF_BLUETOOTH (AF_ = Address Family)
 
- SOCK_STREAM = Especificamos que queremos un flujo confiable (estilo TCP)

- SOCK_DGRAM u otro flag no esta permitido en sockets RFCOMM
*/
int sck=socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

//Podemos establecer sockets a nivel Bluetooth
if(sck!=-1)
{
/*
Seteamos los parametros para la conexion
sockaddr_rc es una variante de sockaddr_in.. Esta variante
esta definida en rfcomm.h
*/
struct sockaddr_rc remote;


bdaddr_t addrs;

/*
str2ba convierte una MAC Address en tipo char a tipo bdaddr
Necesario para pasarselo a connect()
*/
str2ba(argv[1], &addrs);

//Seteamos el Address Family
remote.rc_family = AF_BLUETOOTH;

//seteamos el canal SDP
remote.rc_channel = 1;

//Mac Address en formato bdaddr_t
remote.rc_bdaddr = addrs;

//Conectamos si connect() devuelve 0 entonces la conexion habra fallado

if(connect(sck, (struct sockaddr *)&remote, sizeof(remote))<0)
{
////Sino connect()a pintar una paloma.. =D
printf("[!] connect() FAIL.! [%s]\n", strerror(errno));
}

close(sck);
}

//Sino.. Pintar otra una paloma.. =D
else
puts("[!] Who.? socket() FAIL.. o.0");
}


Complilan con


gcc `pkg-config --libs --cflags openobex` -g `pkg-config --cflags --libs bluez` main.c


O bien...


gcc -g -lbluetooth  main.c -o oPen; ./oPen


Claro no piensen que una llamada a send() ya podrán enviar ficheros.. Así sin mas.. El tema de los protocolos Bluetooth es bastante amplio este es un pequeño post de como hacer conexiones simples a través de sockets Si lo que quieren es enviar un fichero por OBEX pues.. Podrán utilizar OpenOBEX que ya esta bastante difundido entre los SO incluyendo MS Windows x) Espero armar otra pequeña entrada para los transportadores sobre OpenOBEX pronto.. Saludos
Siempre habra 2 verdades, la que quieres creer y la que no aceptaras