|
| 1 | + |
| 2 | +#include "Blufi.h" |
| 3 | +#include <ssid_manager.h> |
| 4 | +#include "board.h" |
| 5 | +#include "freertos/FreeRTOS.h" |
| 6 | +#include "freertos/task.h" |
| 7 | +#include "freertos/event_groups.h" |
| 8 | +#include "esp_mac.h" |
| 9 | +#include "esp_wifi.h" |
| 10 | +#include "esp_event.h" |
| 11 | +#include "esp_log.h" |
| 12 | +#include "nvs_flash.h" |
| 13 | +#include "wifi_board.h" |
| 14 | +#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED |
| 15 | +#include "esp_bt.h" |
| 16 | +#endif |
| 17 | + |
| 18 | +#include <blufi_local.h> |
| 19 | +#include "esp_blufi_api.h" |
| 20 | +#include "esp_blufi.h" |
| 21 | + |
| 22 | +#if CONFIG_ESP_WIFI_AUTH_OPEN |
| 23 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN |
| 24 | +#elif CONFIG_ESP_WIFI_AUTH_WEP |
| 25 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP |
| 26 | +#elif CONFIG_ESP_WIFI_AUTH_WPA_PSK |
| 27 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK |
| 28 | +#elif CONFIG_ESP_WIFI_AUTH_WPA2_PSK |
| 29 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK |
| 30 | +#elif CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK |
| 31 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK |
| 32 | +#elif CONFIG_ESP_WIFI_AUTH_WPA3_PSK |
| 33 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK |
| 34 | +#elif CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK |
| 35 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK |
| 36 | +#elif CONFIG_ESP_WIFI_AUTH_WAPI_PSK |
| 37 | +#define EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK |
| 38 | +#endif |
| 39 | + |
| 40 | +#define EXAMPLE_WIFI_CONNECTION_MAXIMUM_RETRY 5 |
| 41 | +#define EXAMPLE_INVALID_REASON 255 |
| 42 | +#define EXAMPLE_INVALID_RSSI (-128) |
| 43 | + |
| 44 | + |
| 45 | +#define WIFI_LIST_NUM 10 |
| 46 | + |
| 47 | +static wifi_config_t sta_config; |
| 48 | +static wifi_config_t ap_config; |
| 49 | +static esp_blufi_callbacks_t example_callbacks = { |
| 50 | + .event_cb = Blufi::event_callback, |
| 51 | + .negotiate_data_handler = blufi_dh_negotiate_data_handler, |
| 52 | + .encrypt_func = blufi_aes_encrypt, |
| 53 | + .decrypt_func = blufi_aes_decrypt, |
| 54 | + .checksum_func = blufi_crc_checksum, |
| 55 | +}; |
| 56 | + |
| 57 | +/* The event group allows multiple bits for each event, |
| 58 | + but we only care about one event - are we connected |
| 59 | + to the AP with an IP? */ |
| 60 | +const int CONNECTED_BIT = BIT0; |
| 61 | + |
| 62 | + |
| 63 | +/* store the station info for send back to phone */ |
| 64 | +static bool gl_sta_connected = false; |
| 65 | +static bool gl_sta_got_ip = false; |
| 66 | +static bool ble_is_connected = false; |
| 67 | +static uint8_t gl_sta_bssid[6]; |
| 68 | +static uint8_t gl_sta_ssid[32]; |
| 69 | +static int gl_sta_ssid_len; |
| 70 | +static wifi_sta_list_t gl_sta_list; |
| 71 | +static bool gl_sta_is_connecting = false; |
| 72 | +static esp_blufi_extra_info_t gl_sta_conn_info; |
| 73 | + |
| 74 | +static int softap_get_current_connection_number(void) { |
| 75 | + esp_err_t ret; |
| 76 | + ret = esp_wifi_ap_get_sta_list(&gl_sta_list); |
| 77 | + if (ret == ESP_OK) { |
| 78 | + return gl_sta_list.num; |
| 79 | + } |
| 80 | + |
| 81 | + return 0; |
| 82 | +} |
| 83 | + |
| 84 | +void Blufi::event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param) { |
| 85 | + switch (event) { |
| 86 | + case ESP_BLUFI_EVENT_INIT_FINISH: |
| 87 | + BLUFI_INFO("BLUFI init finish\n"); |
| 88 | + esp_blufi_adv_start(); |
| 89 | + break; |
| 90 | + case ESP_BLUFI_EVENT_BLE_CONNECT: |
| 91 | + BLUFI_INFO("BLUFI ble connect\n"); |
| 92 | + ble_is_connected = true; |
| 93 | + esp_blufi_adv_stop(); |
| 94 | + blufi_security_init(); |
| 95 | + break; |
| 96 | + case ESP_BLUFI_EVENT_BLE_DISCONNECT: |
| 97 | + BLUFI_INFO("BLUFI ble disconnect\n"); |
| 98 | + ble_is_connected = false; |
| 99 | + blufi_security_deinit(); |
| 100 | + esp_blufi_adv_start(); |
| 101 | + break; |
| 102 | + case ESP_BLUFI_EVENT_SET_WIFI_OPMODE: |
| 103 | + BLUFI_INFO("BLUFI Set WIFI opmode %d\n", param->wifi_mode.op_mode); |
| 104 | + // TODO 实现此功能 |
| 105 | + //ESP_ERROR_CHECK(esp_wifi_set_mode(param->wifi_mode.op_mode)); |
| 106 | + break; |
| 107 | + case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP: { |
| 108 | + BLUFI_INFO("BLUFI request wifi connect to AP\n"); |
| 109 | + std::string *ssid__ = new std::string(reinterpret_cast<char *>(sta_config.sta.ssid)); |
| 110 | + std::string *password__ =new std::string(reinterpret_cast<char *>(sta_config.sta.password)); |
| 111 | + SsidManager::GetInstance().Clear(); |
| 112 | + SsidManager::GetInstance().AddSsid(*ssid__, *password__); |
| 113 | + SsidManager::GetInstance().SetDefaultSsid(0); |
| 114 | + // TODO 连接至Wi-Fi测试能否连接成功 |
| 115 | + esp_restart(); |
| 116 | + break; |
| 117 | + } |
| 118 | + case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP: |
| 119 | + BLUFI_INFO("BLUFI request wifi disconnect from AP\n"); |
| 120 | + // TODO 完成断开连接逻辑 |
| 121 | + break; |
| 122 | + case ESP_BLUFI_EVENT_REPORT_ERROR: |
| 123 | + BLUFI_ERROR("BLUFI report error, error code %d\n", param->report_error.state); |
| 124 | + esp_blufi_send_error_info(param->report_error.state); |
| 125 | + break; |
| 126 | + case ESP_BLUFI_EVENT_GET_WIFI_STATUS: { |
| 127 | + wifi_mode_t mode; |
| 128 | + esp_blufi_extra_info_t info; |
| 129 | + |
| 130 | + esp_wifi_get_mode(&mode); |
| 131 | + |
| 132 | + if (gl_sta_connected) { |
| 133 | + memset(&info, 0, sizeof(esp_blufi_extra_info_t)); |
| 134 | + memcpy(info.sta_bssid, gl_sta_bssid, 6); |
| 135 | + info.sta_bssid_set = true; |
| 136 | + info.sta_ssid = gl_sta_ssid; |
| 137 | + info.sta_ssid_len = gl_sta_ssid_len; |
| 138 | + esp_blufi_send_wifi_conn_report(mode, gl_sta_got_ip ? ESP_BLUFI_STA_CONN_SUCCESS : ESP_BLUFI_STA_NO_IP, |
| 139 | + softap_get_current_connection_number(), &info); |
| 140 | + } else if (gl_sta_is_connecting) { |
| 141 | + esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONNECTING, softap_get_current_connection_number(), |
| 142 | + &gl_sta_conn_info); |
| 143 | + } else { |
| 144 | + esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, softap_get_current_connection_number(), |
| 145 | + &gl_sta_conn_info); |
| 146 | + } |
| 147 | + BLUFI_INFO("BLUFI get wifi status from AP\n"); |
| 148 | + |
| 149 | + break; |
| 150 | + } |
| 151 | + case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE: |
| 152 | + BLUFI_INFO("blufi close a gatt connection"); |
| 153 | + esp_blufi_disconnect(); |
| 154 | + break; |
| 155 | + case ESP_BLUFI_EVENT_RECV_STA_BSSID: |
| 156 | + memcpy(sta_config.sta.bssid, param->sta_bssid.bssid, 6); |
| 157 | + sta_config.sta.bssid_set = 1; |
| 158 | + BLUFI_INFO("Recv STA BSSID %s\n", sta_config.sta.bssid); |
| 159 | + break; |
| 160 | + case ESP_BLUFI_EVENT_RECV_STA_SSID: |
| 161 | + if (param->sta_ssid.ssid_len >= sizeof(sta_config.sta.ssid) / sizeof(sta_config.sta.ssid[0])) { |
| 162 | + esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR); |
| 163 | + BLUFI_INFO("Invalid STA SSID\n"); |
| 164 | + break; |
| 165 | + } |
| 166 | + strncpy((char *) sta_config.sta.ssid, (char *) param->sta_ssid.ssid, param->sta_ssid.ssid_len); |
| 167 | + sta_config.sta.ssid[param->sta_ssid.ssid_len] = '\0'; |
| 168 | + BLUFI_INFO("Recv STA SSID %s\n", sta_config.sta.ssid); |
| 169 | + break; |
| 170 | + case ESP_BLUFI_EVENT_RECV_STA_PASSWD: |
| 171 | + if (param->sta_passwd.passwd_len >= sizeof(sta_config.sta.password) / sizeof(sta_config.sta.password[0])) { |
| 172 | + esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR); |
| 173 | + BLUFI_INFO("Invalid STA PASSWORD\n"); |
| 174 | + break; |
| 175 | + } |
| 176 | + strncpy((char *) sta_config.sta.password, (char *) param->sta_passwd.passwd, param->sta_passwd.passwd_len); |
| 177 | + sta_config.sta.password[param->sta_passwd.passwd_len] = '\0'; |
| 178 | + sta_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; |
| 179 | + BLUFI_INFO("Recv STA PASSWORD %s\n", sta_config.sta.password); |
| 180 | + break; |
| 181 | + case ESP_BLUFI_EVENT_RECV_SOFTAP_SSID: |
| 182 | + if (param->softap_ssid.ssid_len >= sizeof(ap_config.ap.ssid) / sizeof(ap_config.ap.ssid[0])) { |
| 183 | + esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR); |
| 184 | + BLUFI_INFO("Invalid SOFTAP SSID\n"); |
| 185 | + break; |
| 186 | + } |
| 187 | + strncpy((char *) ap_config.ap.ssid, (char *) param->softap_ssid.ssid, param->softap_ssid.ssid_len); |
| 188 | + ap_config.ap.ssid[param->softap_ssid.ssid_len] = '\0'; |
| 189 | + ap_config.ap.ssid_len = param->softap_ssid.ssid_len; |
| 190 | + BLUFI_INFO("Recv SOFTAP SSID %s, ssid len %d\n", ap_config.ap.ssid, ap_config.ap.ssid_len); |
| 191 | + break; |
| 192 | + case ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD: |
| 193 | + if (param->softap_passwd.passwd_len >= sizeof(ap_config.ap.password) / sizeof(ap_config.ap.password[0])) { |
| 194 | + esp_blufi_send_error_info(ESP_BLUFI_DATA_FORMAT_ERROR); |
| 195 | + BLUFI_INFO("Invalid SOFTAP PASSWD\n"); |
| 196 | + break; |
| 197 | + } |
| 198 | + strncpy((char *) ap_config.ap.password, (char *) param->softap_passwd.passwd, |
| 199 | + param->softap_passwd.passwd_len); |
| 200 | + ap_config.ap.password[param->softap_passwd.passwd_len] = '\0'; |
| 201 | + BLUFI_INFO("Recv SOFTAP PASSWORD %s len = %d\n", ap_config.ap.password, param->softap_passwd.passwd_len); |
| 202 | + break; |
| 203 | + case ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE: |
| 204 | + if (param->softap_auth_mode.auth_mode >= WIFI_AUTH_MAX) { |
| 205 | + return; |
| 206 | + } |
| 207 | + ap_config.ap.authmode = param->softap_auth_mode.auth_mode; |
| 208 | + esp_wifi_set_config(WIFI_IF_AP, &ap_config); |
| 209 | + BLUFI_INFO("Recv SOFTAP AUTH MODE %d\n", ap_config.ap.authmode); |
| 210 | + break; |
| 211 | + case ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL: |
| 212 | + if (param->softap_channel.channel > 13) { |
| 213 | + return; |
| 214 | + } |
| 215 | + ap_config.ap.channel = param->softap_channel.channel; |
| 216 | + esp_wifi_set_config(WIFI_IF_AP, &ap_config); |
| 217 | + BLUFI_INFO("Recv SOFTAP CHANNEL %d\n", ap_config.ap.channel); |
| 218 | + break; |
| 219 | + case ESP_BLUFI_EVENT_GET_WIFI_LIST: { |
| 220 | + wifi_scan_config_t scanConf = { |
| 221 | + .ssid = NULL, |
| 222 | + .bssid = NULL, |
| 223 | + .channel = 0, |
| 224 | + .show_hidden = false |
| 225 | + }; |
| 226 | + esp_err_t ret = esp_wifi_scan_start(&scanConf, true); |
| 227 | + if (ret != ESP_OK) { |
| 228 | + esp_blufi_send_error_info(ESP_BLUFI_WIFI_SCAN_FAIL); |
| 229 | + } |
| 230 | + break; |
| 231 | + } |
| 232 | + case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA: |
| 233 | + BLUFI_INFO("Recv Custom Data %" PRIu32 "\n", param->custom_data.data_len); |
| 234 | + ESP_LOG_BUFFER_HEX("Custom Data", param->custom_data.data, param->custom_data.data_len); |
| 235 | + break; |
| 236 | + default: |
| 237 | + break; |
| 238 | + } |
| 239 | +} |
| 240 | + |
| 241 | + |
| 242 | +void Blufi::init() { |
| 243 | + esp_err_t ret; |
| 244 | + #if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED |
| 245 | + ret = esp_blufi_controller_init(); |
| 246 | + if (ret) { |
| 247 | + BLUFI_ERROR("%s BLUFI controller init failed: %s\n", __func__, esp_err_to_name(ret)); |
| 248 | + return; |
| 249 | + } |
| 250 | +#endif |
| 251 | + ret = esp_blufi_host_and_cb_init(&example_callbacks); |
| 252 | + if (ret) { |
| 253 | + BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret)); |
| 254 | + return; |
| 255 | + } |
| 256 | + BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version()); |
| 257 | +} |
| 258 | + |
0 commit comments