public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [Bluez-devel] Problems with my own inquiry
@ 2007-06-15 16:09 Fernando Unzu
  2007-06-16  7:29 ` Marcel Holtmann
  0 siblings, 1 reply; 5+ messages in thread
From: Fernando Unzu @ 2007-06-15 16:09 UTC (permalink / raw)
  To: bluez-devel

Hello,
I have an application that works with the bluetooth, scanning and sending =

content with other devices..., and now, when I'm trying to make irt work in =

other distribution, it fails.

And I don't know what it is wrong.
The problem is in my Inquiry function (this is a function to make an inquir=
y =

and check the result for not to repeat devices...).
The hci_inquiry function makes an inquiry, and the value Max_Num_Responses =
is =

the number of responses, and I need the number of different devices found. =

Because of that, I have done this inquiry:

int inquiry (char *aux_mac[], int num_dev, int duration){
	struct timeval time;
	long time_orig, time_dest;
	int i, sock;
	unsigned char buf[HCI_MAX_FRAME_SIZE];
	struct sockaddr_hci addr;
	struct hci_filter filter;
	unsigned char cmd[] =3D {0x01, 0x01, 0x04, 0x05, 0x33, 0x8B, 0x9E, 0x08, 0=
x0A};
	int cmd_len =3D sizeof(cmd);
	int encore =3D 1, num_exec=3D 0;
	char *mac=3D (char *)malloc(18);
	int terminado=3D 0, encontrados=3D 0;
	=

	sock =3D socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
	if (sock=3D=3D -1)
		return -1;
	hci_filter_clear(&filter);
	hci_filter_set_ptype(HCI_EVENT_PKT, &filter);
	hci_filter_set_event(EVT_CMD_STATUS, &filter);
	hci_filter_set_event(EVT_INQUIRY_RESULT, &filter);
	hci_filter_set_event(EVT_INQUIRY_COMPLETE, &filter);

	if (setsockopt(sock, SOL_HCI, HCI_FILTER, &filter, sizeof(filter))=3D=3D -=
1)
		return -1;

	addr.hci_family =3D AF_BLUETOOTH;
//Esto coge el segundo bluetooth si est=E1 a 1
	addr.hci_dev =3D 0;

	if (bind(sock, (struct sockaddr *)&addr, sizeof(addr))=3D=3D -1){
		debug_printf(D_PRUEBA,"Error al hacer bind del inquiry\n");
		return -1;
	}
	gettimeofday (&time, NULL);
	time_orig=3D time.tv_sec;
	while (!terminado){				//No se por que, este inquiry solo hace 10 escaneos=
, =

asi que vuelvo a llamarlo hasta
		if (send (sock, cmd, cmd_len, 0)=3D=3D -1){	//que cumplo con los disposit=
ivos =

deseados
			debug_printf(D_PRUEBA,"Error al hacer send del inquiry\n");
			return -1;
		}
printf ("Envio un inquiry\n");
		do {
			memset (buf, 0, sizeof(buf));
			if (recv (sock, buf, sizeof(buf), 0)=3D=3D -1){
				debug_printf(D_PRUEBA,"Error al hacer receive del inquiry\n");
				return -1;
			}
printf ("buf[1]=3D %d;   EVT_CMD_STATUS=3D %d; EVT_INQUIRY_RESULT=3D %d; =

EVT_INQUIRY_COMPLETE=3D%d\n", buf[1], EVT_CMD_STATUS, EVT_INQUIRY_RESULT, =

EVT_INQUIRY_COMPLETE);
			switch (buf[1]) {
				case EVT_CMD_STATUS:
printf ("Entro en EVT_CMD; %d\n", buf[1]);
					if (buf[3]) {
						//debug_printf(D_PRUEBA,"Error\n");
						encore =3D 0;
						num_exec=3D 255;
					}
					break;
				case EVT_INQUIRY_RESULT:
				case EVT_INQUIRY_RESULT_WITH_RSSI:
printf ("Entro en EVT_INQUIRY_RESULT; %d\n", buf[1]);
					sprintf (mac, "%02x:%02x:%02x:%02x:%02x:%02x", buf[9], buf[8], buf[7], =

buf[6], buf[5], buf[4]);
					for (i=3D 0; i< 18; i++)
						if (!(isdigit (mac[i])) && !(strcmp (&mac[i], ":")=3D=3D 0))
							mac[i]=3D toupper (mac[i]);
					if (!mac_existe (aux_mac, encontrados, mac)){
						strcpy (aux_mac[encontrados], mac);
						encontrados++;
					}
					break;
				case EVT_INQUIRY_COMPLETE:
printf ("Entro en EVT_INQUIRY_COMPLETE; %d\n", buf[1]);
					encore=3D 0;
					num_exec+=3D 1;
					break;
				default:
printf ("Entro en \"default\"; %d\n", buf[1]);
					break;
			}
			gettimeofday (&time, NULL);
			time_dest=3D time.tv_sec;
			if (encontrados=3D=3D num_dev || ((time_dest- time_orig)> duration)){
				terminado=3D 1;
				encore=3D 0;
			}
		} while (encore);
		encore=3D 1;
	}

	close (sock);
	return encontrados;
}

int mac_existe (char *aux_mac[], int encontrados, char *mac){
	int i;
	for (i=3D 0; i< encontrados; i++){
		if (strcmp (aux_mac[i], mac)=3D=3D 0)
			return 1;
	}
	return 0;
}


In my PC, a Ubuntu dapper (6.06), the output, a valid output is:
(first, search for 1 device, then for 2, then for 3...)
#Buscando max 1 dispositivos
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
#Encontrados 1 dispositivos
#Buscando max 2 dispositivos
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
Envio un inquiry
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
#Encontrados 2 dispositivos
#Buscando max 3 dispositivos
Envio un inquiry
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 2;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_RESULT; 2
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15

This is a normal work, whit INQUIRY_RESULT and COMMAND_STATUS, but in the n=
ew =

PC (a debian etch, buiilt by DebianLive) where I want to install the =

application the output is like this:

#Buscando max 1 dispositivos
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
#Encontrados 0 dispositivos
#Buscando max 1 dispositivos
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
Envio un inquiry
buf[1]=3D 15;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; =

EVT_INQUIRY_COMPLETE=3D1
Entro en EVT_CMD; 15
buf[1]=3D 1;   EVT_CMD_STATUS=3D 15; EVT_INQUIRY_RESULT=3D 2; EVT_INQUIRY_C=
OMPLETE=3D1
Entro en EVT_INQUIRY_COMPLETE; 1
#Encontrados 0 dispositivos

All the time the only events that receive are INQUIRY_COMPLETE and =

COMMAND_STATUS, but with hcidump I have seen that really the bluetooth scan=
s =

ok (the only difference with the other system is that the scans are with =

RSSI, and in the OK system are without RSSI).

HCI sniffer - Bluetooth packet analyzer ver 1.32
device: hci0 snap_len: 1028 filter: 0xffffffff
< HCI Command: Inquiry (0x01|0x0001) plen 5
    lap 0x9e8b33 len 8 num 10
> HCI Event: Command Status (0x0f) plen 4
    Inquiry (0x01|0x0001) status 0x00 ncmd 1
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a68 class 0x3e0100 rssi -29
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -33
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a68 class 0x3e0100 rssi -30
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -33
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a68 class 0x3e0100 rssi -30
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a68 class 0x3e0100 rssi -28
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -31
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:80:5A:46:8A:1E mode 1 clkoffset 0x6b7e class 0x100000 rssi -27
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a68 class 0x3e0100 rssi -26
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:80:5A:46:8A:1E mode 1 clkoffset 0x6b7e class 0x100000 rssi -26
> HCI Event: Inquiry Complete (0x01) plen 1
    status 0x00
< HCI Command: Inquiry (0x01|0x0001) plen 5
    lap 0x9e8b33 len 8 num 10
> HCI Event: Command Status (0x0f) plen 4
    Inquiry (0x01|0x0001) status 0x00 ncmd 1
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a68 class 0x3e0100 rssi -32
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a67 class 0x3e0100 rssi -29
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a67 class 0x3e0100 rssi -36
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -29
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:4B:88 mode 0 clkoffset 0x2a67 class 0x3e0100 rssi -32
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -30
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:80:5A:46:8A:1E mode 1 clkoffset 0x6b7e class 0x100000 rssi -26
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -28
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:80:5A:46:8A:1E mode 1 clkoffset 0x6b7e class 0x100000 rssi -26
> HCI Event: Inquiry Result with RSSI (0x22) plen 15
    bdaddr 00:10:60:AE:61:C8 mode 1 clkoffset 0x513f class 0x3e0100 rssi -45
> HCI Event: Inquiry Complete (0x01) plen 1
    status 0x00



Anybody can help me...?

I haven't no idea why are happening that.

Thanks everybody for reading all the message, i know it's long, jeje.

And sorry for my english,
Fernando Unzu

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-06-20  0:43 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-15 16:09 [Bluez-devel] Problems with my own inquiry Fernando Unzu
2007-06-16  7:29 ` Marcel Holtmann
2007-06-18  7:38   ` Fernando Unzu
2007-06-19 14:31     ` Marcel Holtmann
2007-06-20  0:43     ` Simon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox