Files
snapclient/components/esp_peripherals/lib/blufi/wifibleconfig.c
Karl Osterseher db0f9732b2 upgrade to IDF v5.1.1
custom board driver ma120x0 is broken
esp dsp is now IDF managed component
mdns is now IDF managed component

Signed-off-by: Karl Osterseher <karli_o@gmx.at>
2024-01-08 22:49:11 +01:00

287 lines
9.9 KiB
C

/*
* ESPRESSIF MIT License
*
* Copyright (c) 2018 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
*
* Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in
* which case, it is free of charge, to any person obtaining a copy of this
* software and associated documentation files (the "Software"), to deal in the
* Software without restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "audio_idf_version.h"
#include "audio_mem.h"
#if defined(CONFIG_BT_BLE_BLUFI_ENABLE)
#include "audio_error.h"
#include "esp_bt.h"
#include "esp_log.h"
#include "esp_system.h"
#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0))
#include "esp_blufi.h"
#else
#include "esp_blufi_api.h"
#endif
#ifdef CONFIG_BT_BLE_BLUFI_ENABLE
#include "esp_bt_defs.h"
#include "esp_bt_device.h"
#include "esp_bt_main.h"
#include "esp_gap_ble_api.h"
#include "esp_gap_bt_api.h"
#elif CONFIG_BT_NIMBLE_ENABLED
#include "console/console.h"
#include "esp_nimble_hci.h"
#include "host/ble_hs.h"
#include "host/util/util.h"
#include "nimble/nimble_port.h"
#include "nimble/nimble_port_freertos.h"
#include "services/gap/ble_svc_gap.h"
#include "services/gatt/ble_svc_gatt.h"
#endif
#include "audio_error.h"
#include "blufi_security.h"
#include "esp_smartconfig.h"
#include "esp_wifi.h"
#include "periph_wifi.h"
#include "wifibleconfig.h"
#define WIFI_BLE_TAG "WIFI_BLE_CONFIG"
#define BLUFI_DEVICE_NAME "BLUFI_DEVICE"
#define WIFI_LIST_NUM (10)
static uint8_t wifi_ble_service_uuid128[32] = {
/* LSB
<-------------------------------------------------------------------------------->
MSB */
// first uuid, 16bit, [12],[13] is the value
0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
0x00, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
};
typedef struct wifi_ble_config {
uint8_t ble_server_if;
uint16_t ble_conn_id;
wifi_config_t sta_config;
esp_periph_handle_t periph;
} wifi_ble_config_t;
static wifi_ble_config_t *g_wifi_ble_config = NULL;
static void wifi_ble_event_callback(esp_blufi_cb_event_t event,
esp_blufi_cb_param_t *param);
static esp_ble_adv_data_t wifi_ble_adv_data = {
.set_scan_rsp = false,
.include_name = true,
.include_txpower = true,
.min_interval = 0x100,
.max_interval = 0x100,
.appearance = 0x00,
.manufacturer_len = 0,
.p_manufacturer_data = NULL,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = 16,
.p_service_uuid = wifi_ble_service_uuid128,
.flag = 0x6,
};
static esp_ble_adv_params_t wifi_ble_adv_params = {
.adv_int_min = 0x100,
.adv_int_max = 0x100,
.adv_type = ADV_TYPE_IND,
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
.channel_map = ADV_CHNL_ALL,
.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};
static esp_blufi_callbacks_t wifi_ble_callbacks = {
.event_cb = wifi_ble_event_callback,
.negotiate_data_handler = blufi_dh_negotiate_data_handler,
.encrypt_func = blufi_aes_encrypt,
.decrypt_func = blufi_aes_decrypt,
.checksum_func = blufi_crc_checksum,
};
static void wifi_ble_gap_event_handler(esp_gap_ble_cb_event_t event,
esp_ble_gap_cb_param_t *param) {
switch (event) {
case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
esp_ble_gap_start_advertising(&wifi_ble_adv_params);
break;
default:
break;
}
}
esp_err_t ble_config_stop(void) {
if (g_wifi_ble_config != NULL) {
audio_free(g_wifi_ble_config);
g_wifi_ble_config = NULL;
}
blufi_security_deinit();
esp_blufi_profile_deinit();
esp_bluedroid_disable();
esp_bluedroid_deinit();
return ESP_OK;
}
static void wifi_ble_event_callback(esp_blufi_cb_event_t event,
esp_blufi_cb_param_t *param) {
/* actually, should post to blufi_task handle the procedure,
* now, as a audio_ble, we do it more simply */
esp_err_t ret;
switch (event) {
case ESP_BLUFI_EVENT_INIT_FINISH:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI init finish");
esp_ble_gap_set_device_name(BLUFI_DEVICE_NAME);
esp_ble_gap_config_adv_data(&wifi_ble_adv_data);
break;
case ESP_BLUFI_EVENT_DEINIT_FINISH:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI deinit finish");
break;
case ESP_BLUFI_EVENT_BLE_CONNECT:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI ble connect");
esp_smartconfig_stop();
g_wifi_ble_config->ble_server_if = param->connect.server_if;
g_wifi_ble_config->ble_conn_id = param->connect.conn_id;
break;
case ESP_BLUFI_EVENT_BLE_DISCONNECT:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI ble disconnect");
break;
case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI Set WIFI opmode %d",
param->wifi_mode.op_mode);
ESP_ERROR_CHECK(esp_wifi_set_mode(param->wifi_mode.op_mode));
break;
case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI request wifi connect to AP");
esp_wifi_disconnect();
if (ESP_OK != esp_wifi_connect()) {
esp_periph_send_event(g_wifi_ble_config->periph,
PERIPH_WIFI_CONFIG_ERROR, NULL, 0);
} else {
esp_periph_send_event(g_wifi_ble_config->periph,
PERIPH_WIFI_CONFIG_DONE, NULL, 0);
ble_config_stop();
}
break;
case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI request wifi disconnect from AP");
esp_wifi_disconnect();
break;
case ESP_BLUFI_EVENT_GET_WIFI_STATUS: {
wifi_mode_t mode;
esp_blufi_extra_info_t info;
esp_wifi_get_mode(&mode);
memset(&info, 0, sizeof(esp_blufi_extra_info_t));
info.sta_bssid_set = true;
info.sta_ssid = g_wifi_ble_config->sta_config.sta.ssid;
esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0,
&info);
ESP_LOGI(WIFI_BLE_TAG, "BLUFI get wifi status from AP");
break;
}
case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:
ESP_LOGI(WIFI_BLE_TAG, "BLUFI close a gatt connection");
esp_blufi_close(g_wifi_ble_config->ble_server_if,
g_wifi_ble_config->ble_conn_id);
break;
case ESP_BLUFI_EVENT_DEAUTHENTICATE_STA:
/* TODO */
break;
case ESP_BLUFI_EVENT_RECV_STA_BSSID:
memcpy(g_wifi_ble_config->sta_config.sta.bssid, param->sta_bssid.bssid,
6);
g_wifi_ble_config->sta_config.sta.bssid_set = 1;
esp_wifi_set_config(WIFI_IF_STA, &g_wifi_ble_config->sta_config);
ESP_LOGI(WIFI_BLE_TAG, "Recv STA BSSID %s",
g_wifi_ble_config->sta_config.sta.bssid);
break;
case ESP_BLUFI_EVENT_RECV_STA_SSID:
strncpy((char *)g_wifi_ble_config->sta_config.sta.ssid,
(char *)param->sta_ssid.ssid, param->sta_ssid.ssid_len);
g_wifi_ble_config->sta_config.sta.ssid[param->sta_ssid.ssid_len] = '\0';
ret = esp_wifi_set_config(WIFI_IF_STA, &g_wifi_ble_config->sta_config);
ESP_LOGI(WIFI_BLE_TAG, "Recv STA SSID ret %d %s", ret,
g_wifi_ble_config->sta_config.sta.ssid);
break;
case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
strncpy((char *)g_wifi_ble_config->sta_config.sta.password,
(char *)param->sta_passwd.passwd, param->sta_passwd.passwd_len);
g_wifi_ble_config->sta_config.sta.password[param->sta_passwd.passwd_len] =
'\0';
esp_wifi_set_config(WIFI_IF_STA, &g_wifi_ble_config->sta_config);
ESP_LOGI(WIFI_BLE_TAG, "Recv STA PASSWORD %s",
g_wifi_ble_config->sta_config.sta.password);
break;
default:
ESP_LOGE(WIFI_BLE_TAG, "Event %d is not supported", event);
break;
}
}
esp_err_t ble_config_start(esp_periph_handle_t periph) {
ESP_LOGI(WIFI_BLE_TAG, "ble_config_start");
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) {
if (esp_bt_controller_init(&bt_cfg) != ESP_OK) {
ESP_LOGE(WIFI_BLE_TAG, "%s initialize controller failed", __func__);
return ESP_FAIL;
}
if (esp_bt_controller_enable(ESP_BT_MODE_BLE) != ESP_OK) {
ESP_LOGE(WIFI_BLE_TAG, "%s enable controller failed", __func__);
return ESP_FAIL;
}
}
if (esp_bluedroid_get_status() == ESP_BLUEDROID_STATUS_UNINITIALIZED) {
if (esp_bluedroid_init() != ESP_OK) {
ESP_LOGE(WIFI_BLE_TAG, "%s esp_bluedroid_init failed", __func__);
return ESP_FAIL;
}
if (esp_bluedroid_enable() != ESP_OK) {
ESP_LOGE(WIFI_BLE_TAG, "%s esp_bluedroid_enable failed", __func__);
return ESP_FAIL;
}
}
ESP_LOGI(WIFI_BLE_TAG, "BD ADDR: " ESP_BD_ADDR_STR "",
ESP_BD_ADDR_HEX(esp_bt_dev_get_address()));
ESP_LOGI(WIFI_BLE_TAG, "BLUFI VERSION %04x", esp_blufi_get_version());
g_wifi_ble_config = audio_calloc(1, sizeof(wifi_ble_config_t));
AUDIO_MEM_CHECK(WIFI_BLE_TAG, g_wifi_ble_config, return ESP_FAIL);
g_wifi_ble_config->periph = periph;
blufi_security_init();
esp_ble_gap_register_callback(wifi_ble_gap_event_handler);
esp_blufi_register_callbacks(&wifi_ble_callbacks);
esp_blufi_profile_init();
return ESP_OK;
}
#endif