|
| 1 | +#include <bt.h> |
| 2 | +#include <esp_bt_main.h> |
| 3 | +#include <esp_gap_ble_api.h> |
| 4 | +#include <esp_log.h> |
| 5 | +#include <freertos/FreeRTOS.h> |
| 6 | +#include <freertos/task.h> |
| 7 | + |
| 8 | +#include "sdkconfig.h" |
| 9 | + |
| 10 | +#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" |
| 11 | +#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] |
| 12 | + |
| 13 | +static const char *bt_event_type_to_string(uint32_t eventType); |
| 14 | +static const char *bt_gap_search_event_type_to_string(uint32_t searchEvt); |
| 15 | +static const char *bt_addr_t_to_string(esp_ble_addr_type_t type); |
| 16 | +static const char *bt_dev_type_to_string(esp_bt_dev_type_t type); |
| 17 | + |
| 18 | +static const char tag[] = "ble1"; |
| 19 | + |
| 20 | +static void dump_adv_payload(uint8_t *payload) { |
| 21 | + uint8_t length; |
| 22 | + uint8_t ad_type; |
| 23 | + uint8_t sizeConsumed = 0; |
| 24 | + int finished = 0; |
| 25 | + int i; |
| 26 | + char text[31*2+1]; |
| 27 | + //sprintf(text, "%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x") |
| 28 | + while(!finished) { |
| 29 | + length = *payload; |
| 30 | + payload++; |
| 31 | + if (length != 0) { |
| 32 | + ad_type = *payload; |
| 33 | + payload += length; |
| 34 | + ESP_LOGD(tag, "Type: 0x%.2x, length: %d", ad_type, length); |
| 35 | + |
| 36 | + } |
| 37 | + |
| 38 | + sizeConsumed = 1 + length; |
| 39 | + if (sizeConsumed >=31 || length == 0) { |
| 40 | + finished = 1; |
| 41 | + } |
| 42 | + } // !finished |
| 43 | +} // dump_adv_payload |
| 44 | + |
| 45 | + |
| 46 | +static void gap_event_handler(uint32_t event, void *param) { |
| 47 | + ESP_LOGD(tag, "Received a GAP event: %s", bt_event_type_to_string(event)); |
| 48 | + esp_ble_gap_cb_param_t *p = (esp_ble_gap_cb_param_t *)param; |
| 49 | + if (event == ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT) { |
| 50 | + ESP_LOGD(tag, "status: %d", p->scan_param_cmpl.status); |
| 51 | + } else if (event == ESP_GAP_BLE_SCAN_RESULT_EVT) { |
| 52 | + ESP_LOGD(tag, "device address (bda): %02x:%02x:%02x:%02x:%02x:%02x", BT_BD_ADDR_HEX(p->scan_rst.bda)); |
| 53 | + ESP_LOGD(tag, "device type: %s", bt_dev_type_to_string(p->scan_rst.dev_type)); |
| 54 | + ESP_LOGD(tag, "search_evt: %s", bt_gap_search_event_type_to_string(p->scan_rst.search_evt)); |
| 55 | + ESP_LOGD(tag, "addr_type: %s", bt_addr_t_to_string(p->scan_rst.ble_addr_type)); |
| 56 | + ESP_LOGD(tag, "rssi: %d", p->scan_rst.rssi); |
| 57 | + ESP_LOGD(tag, "flag: %d", p->scan_rst.flag); |
| 58 | + ESP_LOGD(tag, "num_resps: %d", p->scan_rst.num_resps); |
| 59 | + |
| 60 | + |
| 61 | + if (p->scan_rst.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT) { |
| 62 | + ESP_LOGD(tag, "payload:"); |
| 63 | + uint8_t len; |
| 64 | + uint8_t *data = esp_ble_resolve_adv_data(p->scan_rst.ble_adv, ESP_BLE_AD_TYPE_NAME_CMPL, &len); |
| 65 | + ESP_LOGD(tag, "len: %d, %.*s", len, len, data); |
| 66 | + ESP_LOGD(tag, "dump -"); |
| 67 | + dump_adv_payload(p->scan_rst.ble_adv); |
| 68 | + } |
| 69 | + ESP_LOGD(tag, ""); |
| 70 | + } |
| 71 | +} // gap_event_handler |
| 72 | + |
| 73 | +static const char *bt_dev_type_to_string(esp_bt_dev_type_t type) { |
| 74 | + switch(type) { |
| 75 | + case ESP_BT_DEVICE_TYPE_BREDR: |
| 76 | + return "ESP_BT_DEVICE_TYPE_BREDR"; |
| 77 | + case ESP_BT_DEVICE_TYPE_BLE: |
| 78 | + return "ESP_BT_DEVICE_TYPE_BLE"; |
| 79 | + case ESP_BT_DEVICE_TYPE_DUMO: |
| 80 | + return "ESP_BT_DEVICE_TYPE_DUMO"; |
| 81 | + default: |
| 82 | + return "Unknown"; |
| 83 | + } |
| 84 | +} // bt_dev_type_to_string |
| 85 | + |
| 86 | +static const char *bt_addr_t_to_string(esp_ble_addr_type_t type) { |
| 87 | + switch(type) { |
| 88 | + case BLE_ADDR_TYPE_PUBLIC: |
| 89 | + return "BLE_ADDR_TYPE_PUBLIC"; |
| 90 | + case BLE_ADDR_TYPE_RANDOM: |
| 91 | + return "BLE_ADDR_TYPE_RANDOM"; |
| 92 | + case BLE_ADDR_TYPE_RPA_PUBLIC: |
| 93 | + return "BLE_ADDR_TYPE_RPA_PUBLIC"; |
| 94 | + case BLE_ADDR_TYPE_RPA_RANDOM: |
| 95 | + return "BLE_ADDR_TYPE_RPA_RANDOM"; |
| 96 | + default: |
| 97 | + return "Unknown addr_t"; |
| 98 | + } |
| 99 | +} // bt_addr_t_to_string |
| 100 | + |
| 101 | +static const char *bt_gap_search_event_type_to_string(uint32_t searchEvt) { |
| 102 | + switch(searchEvt) { |
| 103 | + case ESP_GAP_SEARCH_INQ_RES_EVT: |
| 104 | + return "ESP_GAP_SEARCH_INQ_RES_EVT"; |
| 105 | + case ESP_GAP_SEARCH_INQ_CMPL_EVT: |
| 106 | + return "ESP_GAP_SEARCH_INQ_CMPL_EVT"; |
| 107 | + case ESP_GAP_SEARCH_DISC_RES_EVT: |
| 108 | + return "ESP_GAP_SEARCH_DISC_RES_EVT"; |
| 109 | + case ESP_GAP_SEARCH_DISC_BLE_RES_EVT: |
| 110 | + return "ESP_GAP_SEARCH_DISC_BLE_RES_EVT"; |
| 111 | + case ESP_GAP_SEARCH_DISC_CMPL_EVT: |
| 112 | + return "ESP_GAP_SEARCH_DISC_CMPL_EVT"; |
| 113 | + case ESP_GAP_SEARCH_DI_DISC_CMPL_EVT: |
| 114 | + return "ESP_GAP_SEARCH_DI_DISC_CMPL_EVT"; |
| 115 | + case ESP_GAP_SEARCH_SEARCH_CANCEL_CMPL_EVT: |
| 116 | + return "ESP_GAP_SEARCH_SEARCH_CANCEL_CMPL_EVT"; |
| 117 | + default: |
| 118 | + return "Unknown event type"; |
| 119 | + } |
| 120 | +} // bt_gap_search_event_type_to_string |
| 121 | + |
| 122 | +/* |
| 123 | + * Convert a BT GAP event type to a string representation. |
| 124 | + */ |
| 125 | +static const char *bt_event_type_to_string(uint32_t eventType) { |
| 126 | + switch(eventType) { |
| 127 | + case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: |
| 128 | + return "ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT"; |
| 129 | + case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: |
| 130 | + return "ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT"; |
| 131 | + case ESP_GAP_BLE_SCAN_RESULT_EVT: |
| 132 | + return "ESP_GAP_BLE_SCAN_RESULT_EVT"; |
| 133 | + case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: |
| 134 | + return "ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT"; |
| 135 | + default: |
| 136 | + return "Unknown event type"; |
| 137 | + } |
| 138 | +} // bt_event_type_to_string |
| 139 | + |
| 140 | + |
| 141 | +void bt_task(void *ignore) { |
| 142 | + int errRc; |
| 143 | + bt_controller_init(); |
| 144 | + esp_init_bluetooth(); |
| 145 | + esp_enable_bluetooth(); |
| 146 | + errRc = esp_ble_gap_register_callback(gap_event_handler); |
| 147 | + if (errRc != ESP_OK) { |
| 148 | + ESP_LOGE(tag, "esp_ble_gap_register_callback: rc=%d", errRc); |
| 149 | + goto end; |
| 150 | + } |
| 151 | + static esp_ble_scan_params_t ble_scan_params = { |
| 152 | + .scan_type = BLE_SCAN_TYPE_ACTIVE, |
| 153 | + .own_addr_type = ESP_PUBLIC_ADDR, |
| 154 | + .scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, |
| 155 | + .scan_interval = 0x50, |
| 156 | + .scan_window = 0x30 |
| 157 | + }; |
| 158 | + errRc = esp_ble_gap_set_scan_params(&ble_scan_params); |
| 159 | + if (errRc != ESP_OK) { |
| 160 | + ESP_LOGE(tag, "esp_ble_gap_set_scan_params: rc=%d", errRc); |
| 161 | + goto end; |
| 162 | + } |
| 163 | + |
| 164 | + errRc = esp_ble_gap_start_scanning(20); |
| 165 | + if (errRc != ESP_OK) { |
| 166 | + ESP_LOGE(tag, "esp_ble_gap_start_scanning: rc=%d", errRc); |
| 167 | + goto end; |
| 168 | + } |
| 169 | + ESP_LOGD(tag, "We have registered what we need!"); |
| 170 | +end: |
| 171 | + vTaskDelete(NULL); |
| 172 | +} // bt_task |
0 commit comments