This commit is contained in:
Matthias Ringwald 2015-07-08 15:38:41 +02:00
commit c53e70f81c

View File

@ -127,27 +127,27 @@ static char * flags[] = {
*/ */
/* LISTING_START(GAPLEAdvDataParsing): Parsing advertising data */ /* LISTING_START(GAPLEAdvDataParsing): Parsing advertising data */
char * dump_advertisement_data(uint8_t * adv_data, uint8_t adv_size){ void dump_advertisement_data(uint8_t * adv_data, uint8_t adv_size){
ad_context_t context; ad_context_t context;
for (ad_iterator_init(&context, adv_size, adv_data) ; ad_iterator_has_more(&context) ; ad_iterator_next(&context)){ for (ad_iterator_init(&context, adv_size, adv_data) ; ad_iterator_has_more(&context) ; ad_iterator_next(&context)){
uint8_t data_type = ad_iterator_get_data_type(&context); uint8_t data_type = ad_iterator_get_data_type(&context);
uint8_t size = ad_iterator_get_data_len(&context); uint8_t size = ad_iterator_get_data_len(&context);
uint8_t * data = ad_iterator_get_data(&context); uint8_t * data = ad_iterator_get_data(&context);
if (data_type > 0 && data_type < 0x1B){ if (data_type > 0 && data_type < 0x1B){
printf("%s: ", ad_types[data_type]); printf(" %s: ", ad_types[data_type]);
} }
int i; int i;
// Assigned Numbers GAP // Assigned Numbers GAP
switch (data_type){ switch (data_type){
case 0x01: // Flags case 0x01: // Flags
// show only first octet, ignore rest // show only first octet, ignore rest
printf("\n");
for (i=0; i<8;i++){ for (i=0; i<8;i++){
if (data[0] & (1<<i)){ if (data[0] & (1<<i)){
printf("Flags bit nr. %d : %s\n", i, flags[i]); printf("%s; ", flags[i]);
} }
} }
break; break;
case 0x02: // Incomplete List of 16-bit Service Class UUIDs case 0x02: // Incomplete List of 16-bit Service Class UUIDs
@ -156,35 +156,29 @@ char * dump_advertisement_data(uint8_t * adv_data, uint8_t adv_size){
for (i=0; i<size;i+=2){ for (i=0; i<size;i+=2){
printf("%02X ", READ_BT_16(data, i)); printf("%02X ", READ_BT_16(data, i));
} }
printf("\n");
break; break;
case 0x04: // Incomplete List of 32-bit Service Class UUIDs case 0x04: // Incomplete List of 32-bit Service Class UUIDs
case 0x05: // Complete List of 32-bit Service Class UUIDs case 0x05: // Complete List of 32-bit Service Class UUIDs
for (i=0; i<size;i+=4){ for (i=0; i<size;i+=4){
printf("%04X ", READ_BT_32(data, i)); printf("%04X ", READ_BT_32(data, i));
} }
printf("\n");
break; break;
case 0x06: // Incomplete List of 128-bit Service Class UUIDs case 0x06: // Incomplete List of 128-bit Service Class UUIDs
case 0x07: // Complete List of 128-bit Service Class UUIDs case 0x07: // Complete List of 128-bit Service Class UUIDs
case 0x15: // List of 128-bit Service Solicitation UUIDs case 0x15: // List of 128-bit Service Solicitation UUIDs
printUUID128(data); printUUID128(data);
printf("\n");
break; break;
case 0x08: // Shortened Local Name case 0x08: // Shortened Local Name
case 0x09: // Complete Local Name case 0x09: // Complete Local Name
for (i=0; i<size;i++){ for (i=0; i<size;i++){
printf("%c", (char)(data[i])); printf("%c", (char)(data[i]));
} }
printf("\n");
break; break;
case 0x0A: // Tx Power Level case 0x0A: // Tx Power Level
printf("%d dBm\n", *(int8_t*)data); printf("%d dBm", *(int8_t*)data);
break; break;
case 0x12: // Slave Connection Interval Range case 0x12: // Slave Connection Interval Range
printf("\n"); printf("Connection Interval Min = %u ms, Max = %u ms", READ_BT_16(data, 0) * 5/4, READ_BT_16(data, 2) * 5/4);
printf("Minimum Connection Interval %u ms\n", READ_BT_16(data, 0) * 5/4);
printf("Maximum Connection Interval %u ms\n", READ_BT_16(data, 2) * 5/4);
break; break;
case 0x16: // Service Data case 0x16: // Service Data
printf_hexdump(data, size); printf_hexdump(data, size);
@ -192,14 +186,13 @@ char * dump_advertisement_data(uint8_t * adv_data, uint8_t adv_size){
case 0x17: // Public Target Address case 0x17: // Public Target Address
case 0x18: // Random Target Address case 0x18: // Random Target Address
print_bd_addr(data); print_bd_addr(data);
printf("\n");
break; break;
case 0x19: // Appearance case 0x19: // Appearance
// https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml // https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
printf("%02X\n", READ_BT_16(data, 0) ); printf("%02X", READ_BT_16(data, 0) );
break; break;
case 0x1A: // Advertising Interval case 0x1A: // Advertising Interval
printf("%u ms\n", READ_BT_16(data, 0) * 5/8 ); printf("%u ms", READ_BT_16(data, 0) * 5/8 );
break; break;
case 0x3D: // 3D Information Data case 0x3D: // 3D Information Data
printf_hexdump(data, size); printf_hexdump(data, size);
@ -212,10 +205,12 @@ char * dump_advertisement_data(uint8_t * adv_data, uint8_t adv_size){
case 0x10: // Device ID case 0x10: // Device ID
case 0x11: // Security Manager TK Value (16B) case 0x11: // Security Manager TK Value (16B)
default: default:
printf("Unknown Advertising Data Type\n"); printf("Unknown Advertising Data Type");
break; break;
} }
printf("\n");
} }
printf("\n");
} }
/* LISTING_END */ /* LISTING_END */
@ -252,7 +247,7 @@ static void handle_hci_event(uint8_t packet_type, uint8_t *packet, uint16_t size
uint8_t length = packet[pos++]; uint8_t length = packet[pos++];
uint8_t * data = &packet[pos]; uint8_t * data = &packet[pos];
printf("\n\nAdvertisement event: evt-type %u, addr-type %u, addr %s, rssi %u, length adv %u, data: ", event_type, printf("Advertisement event: evt-type %u, addr-type %u, addr %s, rssi %u, data[%u] ", event_type,
address_type, bd_addr_to_str(address), rssi, length); address_type, bd_addr_to_str(address), rssi, length);
printf_hexdump(data, length); printf_hexdump(data, length);
dump_advertisement_data(data, length); dump_advertisement_data(data, length);