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; } }
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); }
static void hci_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ UNUSED(channel); UNUSED(size); if (packet_type != HCI_EVENT_PACKET) return; uint16_t conn_interval; uint8_t event = hci_event_packet_get_type(packet); switch (event) { case BTSTACK_EVENT_STATE: // BTstack activated, get started if (btstack_event_state_get_state(packet) == HCI_STATE_WORKING) { le_streamer_client_start(); } else { state = TC_OFF; } break; case GAP_EVENT_ADVERTISING_REPORT: if (state != TC_W4_SCAN_RESULT) return; // check name in advertisement if (!advertisement_report_contains_name("LE Streamer", packet)) return; // store address and type gap_event_advertising_report_get_address(packet, le_streamer_addr); le_streamer_addr_type = gap_event_advertising_report_get_address_type(packet); // stop scanning, and connect to the device state = TC_W4_CONNECT; gap_stop_scan(); printf("Stop scan. Connect to device with addr %s.\n", bd_addr_to_str(le_streamer_addr)); gap_connect(le_streamer_addr,le_streamer_addr_type); break; case HCI_EVENT_LE_META: // wait for connection complete if (hci_event_le_meta_get_subevent_code(packet) != HCI_SUBEVENT_LE_CONNECTION_COMPLETE) break; if (state != TC_W4_CONNECT) return; connection_handle = hci_subevent_le_connection_complete_get_connection_handle(packet); // print connection parameters (without using float operations) conn_interval = hci_subevent_le_connection_complete_get_conn_interval(packet); printf("Connection Interval: %u.%02u ms\n", conn_interval * 125 / 100, 25 * (conn_interval & 3)); printf("Connection Latency: %u\n", hci_subevent_le_connection_complete_get_conn_latency(packet)); // initialize gatt client context with handle, and add it to the list of active clients // query primary services printf("Search for LE Streamer service.\n"); state = TC_W4_SERVICE_RESULT; gatt_client_discover_primary_services_by_uuid128(handle_gatt_client_event, connection_handle, le_streamer_service_uuid); break; case HCI_EVENT_DISCONNECTION_COMPLETE: // unregister listener connection_handle = HCI_CON_HANDLE_INVALID; if (listener_registered){ listener_registered = 0; gatt_client_stop_listening_for_characteristic_value_updates(¬ification_listener); } if (cmdline_addr_found){ printf("Disconnected %s\n", bd_addr_to_str(cmdline_addr)); return; } printf("Disconnected %s\n", bd_addr_to_str(le_streamer_addr)); if (state == TC_OFF) break; le_streamer_client_start(); break; default: break; } }