/* * ESP BLE Mesh Example * * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ #include #include #include "esp_err.h" #include "esp_log.h" #include "wifi_connect.h" #include #include "sdkconfig.h" #include "esp_event.h" #include "esp_wifi.h" #include "esp_wifi_default.h" #include "esp_log.h" #include "esp_netif.h" #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "lwip/err.h" #include "lwip/sys.h" #define GOT_IPV4_BIT BIT(0) #define CONNECTED_BITS (GOT_IPV4_BIT) static EventGroupHandle_t s_connect_event_group; static esp_ip4_addr_t s_ip_addr; static const char *s_connection_name; static esp_netif_t *s_example_esp_netif = NULL; static const char *TAG = "example_connect"; /* set up connection, Wi-Fi or Ethernet */ static void start(const char *ssid, const char *passwd); /* tear down connection, release resources */ static void stop(void); static void on_got_ip(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { ESP_LOGI(TAG, "Got IP event!"); ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; memcpy(&s_ip_addr, &event->ip_info.ip, sizeof(s_ip_addr)); xEventGroupSetBits(s_connect_event_group, GOT_IPV4_BIT); } esp_err_t example_connect(const char *ssid, const char *passwd) { if (s_connect_event_group != NULL) { return ESP_ERR_INVALID_STATE; } s_connect_event_group = xEventGroupCreate(); start(ssid, passwd); ESP_ERROR_CHECK(esp_register_shutdown_handler(&stop)); ESP_LOGI(TAG, "Waiting for IP"); xEventGroupWaitBits(s_connect_event_group, CONNECTED_BITS, true, true, portMAX_DELAY); ESP_LOGI(TAG, "Connected to %s", s_connection_name); ESP_LOGI(TAG, "IPv4 address: " IPSTR, IP2STR(&s_ip_addr)); return ESP_OK; } esp_err_t example_disconnect(void) { if (s_connect_event_group == NULL) { return ESP_ERR_INVALID_STATE; } vEventGroupDelete(s_connect_event_group); s_connect_event_group = NULL; stop(); ESP_LOGI(TAG, "Disconnected from %s", s_connection_name); s_connection_name = NULL; return ESP_OK; } static void on_wifi_disconnect(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { ESP_LOGI(TAG, "Wi-Fi disconnected, trying to reconnect..."); esp_err_t err = esp_wifi_connect(); if (err == ESP_ERR_WIFI_NOT_STARTED) { return; } ESP_ERROR_CHECK(err); } static void start(const char *ssid, const char *passwd) { wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); esp_netif_config_t netif_config = ESP_NETIF_DEFAULT_WIFI_STA(); esp_netif_t *netif = esp_netif_new(&netif_config); assert(netif); esp_netif_attach_wifi_station(netif); esp_wifi_set_default_wifi_sta_handlers(); s_example_esp_netif = netif; ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &on_wifi_disconnect, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &on_got_ip, NULL)); ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); wifi_config_t wifi_config; memset(&wifi_config, 0, sizeof(wifi_config)); if (ssid) { strncpy((char *)wifi_config.sta.ssid, ssid, strlen(ssid)); } if (passwd) { strncpy((char *)wifi_config.sta.password, passwd, strlen(passwd)); } ESP_LOGI(TAG, "Connecting to %s...", wifi_config.sta.ssid); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); esp_wifi_connect(); s_connection_name = ssid; } static void stop(void) { ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &on_wifi_disconnect)); ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &on_got_ip)); esp_err_t err = esp_wifi_stop(); if (err == ESP_ERR_WIFI_NOT_INIT) { return; } ESP_ERROR_CHECK(err); ESP_ERROR_CHECK(esp_wifi_deinit()); ESP_ERROR_CHECK(esp_wifi_clear_default_wifi_driver_and_handlers(s_example_esp_netif)); esp_netif_destroy(s_example_esp_netif); s_example_esp_netif = NULL; } esp_netif_t *get_example_netif(void) { return s_example_esp_netif; }