7 #include <freertos/FreeRTOS.h> 8 #include <esp_bt_main.h> 10 #include <freertos/task.h> 11 #include <esp_gap_ble_api.h> 16 #include <esp32-hal-bt.h> 20 namespace esp32_ble_beacon {
22 static const char *
const TAG =
"esp32_ble_beacon";
25 static esp_ble_adv_params_t ble_adv_params = {
28 .adv_type = ADV_TYPE_NONCONN_IND,
29 .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
30 .peer_addr = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
31 .peer_addr_type = BLE_ADDR_TYPE_PUBLIC,
32 .channel_map = ADV_CHNL_ALL,
33 .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
36 #define ENDIAN_CHANGE_U16(x) ((((x) &0xFF00) >> 8) + (((x) &0xFF) << 8)) 38 static const esp_ble_ibeacon_head_t IBEACON_COMMON_HEAD = {
39 .flags = {0x02, 0x01, 0x06}, .length = 0x1A, .type = 0xFF, .company_id = {0x4C, 0x00}, .beacon_type = {0x02, 0x15}};
42 ESP_LOGCONFIG(TAG,
"ESP32 BLE Beacon:");
45 for (int8_t ii = 0; ii < 16; ++ii) {
46 bpos += sprintf(bpos,
"%02X", this->
uuid_[ii]);
47 if (ii == 3 || ii == 5 || ii == 7 || ii == 9) {
48 bpos += sprintf(bpos,
"-");
53 " UUID: %s, Major: %u, Minor: %u, Min Interval: %ums, Max Interval: %ums, Measured Power: %d" 60 ESP_LOGCONFIG(TAG,
"Setting up ESP32 BLE beacon...");
87 esp_err_t err = nvs_flash_init();
89 ESP_LOGE(TAG,
"nvs_flash_init failed: %d", err);
95 ESP_LOGE(TAG,
"btStart failed: %d", esp_bt_controller_get_status());
99 if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
101 if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) {
102 esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
103 err = esp_bt_controller_init(&cfg);
105 ESP_LOGE(TAG,
"esp_bt_controller_init failed: %s", esp_err_to_name(err));
108 while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE)
111 if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) {
112 err = esp_bt_controller_enable(ESP_BT_MODE_BLE);
114 ESP_LOGE(TAG,
"esp_bt_controller_enable failed: %s", esp_err_to_name(err));
118 if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
119 ESP_LOGE(TAG,
"esp bt controller enable failed");
125 esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
127 err = esp_bluedroid_init();
129 ESP_LOGE(TAG,
"esp_bluedroid_init failed: %d", err);
132 err = esp_bluedroid_enable();
134 ESP_LOGE(TAG,
"esp_bluedroid_enable failed: %d", err);
137 err = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_ADV,
140 ESP_LOGE(TAG,
"esp_ble_tx_power_set failed: %s", esp_err_to_name(err));
145 ESP_LOGE(TAG,
"esp_ble_gap_register_callback failed: %d", err);
149 esp_ble_ibeacon_t ibeacon_adv_data;
150 memcpy(&ibeacon_adv_data.ibeacon_head, &IBEACON_COMMON_HEAD,
sizeof(esp_ble_ibeacon_head_t));
152 sizeof(ibeacon_adv_data.ibeacon_vendor.proximity_uuid));
157 esp_ble_gap_config_adv_data_raw((uint8_t *) &ibeacon_adv_data,
sizeof(ibeacon_adv_data));
163 case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: {
164 err = esp_ble_gap_start_advertising(&ble_adv_params);
166 ESP_LOGE(TAG,
"esp_ble_gap_start_advertising failed: %d", err);
170 case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: {
171 err = param->adv_start_cmpl.status;
172 if (err != ESP_BT_STATUS_SUCCESS) {
173 ESP_LOGE(TAG,
"BLE adv start failed: %s", esp_err_to_name(err));
177 case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT: {
178 err = param->adv_stop_cmpl.status;
179 if (err != ESP_BT_STATUS_SUCCESS) {
180 ESP_LOGE(TAG,
"BLE adv stop failed: %s", esp_err_to_name(err));
182 ESP_LOGD(TAG,
"BLE stopped advertising successfully");
std::array< uint8_t, 16 > uuid_
ESP32BLEBeacon * global_esp32_ble_beacon
static void ble_core_task(void *params)
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
float get_setup_priority() const override
void IRAM_ATTR HOT delay(uint32_t ms)
void dump_config() override