static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ if (packet_type != HCI_EVENT_PACKET) return; switch (hci_event_packet_get_type(packet)) { case BTSTACK_EVENT_STATE: // BTstack activated, get started if (btstack_event_state_get_state(packet) == HCI_STATE_WORKING){ printf("Start scaning!\n"); gap_set_scan_parameters(0,0x0030, 0x0030); gap_start_scan(); } break; case GAP_EVENT_ADVERTISING_REPORT:{ bd_addr_t address; gap_event_advertising_report_get_address(packet, address); uint8_t event_type = gap_event_advertising_report_get_advertising_event_type(packet); uint8_t address_type = gap_event_advertising_report_get_address_type(packet); int8_t rssi = gap_event_advertising_report_get_rssi(packet); uint8_t length = gap_event_advertising_report_get_data_length(packet); const uint8_t * data = gap_event_advertising_report_get_data(packet); printf("Advertisement event: evt-type %u, addr-type %u, addr %s, rssi %d, data[%u] ", event_type, address_type, bd_addr_to_str(address), rssi, length); printf_hexdump(data, length); dump_advertisement_data(data, length); break; } default: break; } }
// returns 1 if name is found in advertisement static int advertisement_report_contains_name(const char * name, uint8_t * advertisement_report){ // get advertisement from report event const uint8_t * adv_data = gap_event_advertising_report_get_data(advertisement_report); uint16_t adv_len = gap_event_advertising_report_get_data_length(advertisement_report); int name_len = strlen(name); // iterate over advertisement data ad_context_t context; for (ad_iterator_init(&context, adv_len, adv_data) ; ad_iterator_has_more(&context) ; ad_iterator_next(&context)){ uint8_t data_type = ad_iterator_get_data_type(&context); uint8_t data_size = ad_iterator_get_data_len(&context); const uint8_t * data = ad_iterator_get_data(&context); int i; switch (data_type){ case BLUETOOTH_DATA_TYPE_SHORTENED_LOCAL_NAME: case BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME: // compare common prefix for (i=0; i<data_size && i<name_len;i++){ if (data[i] != name[i]) break; } // prefix match return 1; default: break; } } return 0; }
static void fill_advertising_report_from_packet(advertising_report_t * adv_report, uint8_t *packet){ gap_event_advertising_report_get_address(packet, adv_report->address); adv_report->event_type = gap_event_advertising_report_get_advertising_event_type(packet); adv_report->address_type = gap_event_advertising_report_get_address_type(packet); adv_report->rssi = gap_event_advertising_report_get_rssi(packet); adv_report->length = gap_event_advertising_report_get_data_length(packet); adv_report->data = gap_event_advertising_report_get_data(packet); }