ESP8266_RTOS - WIFI篇(1) softAP
前言
softAP為WIFI模組最主要的功能之一,任何wifi產品通常都是由AP模式開始
AP模式與STATION模式簡單的區分就是:
- AP模式:當ESP8266為AP模式,可以把他想像成喔個WIFI路由器,啟用時會有一個WIFI名稱,讓裝置(手機/電腦/其他設備)可以連線,連上的裝置,ESP8266就會分配一組虛擬IP給設備(通常都是192.168.x.x)。
- STATION模式:當ESP8266為station模式,就是去連AP的角色,連上後會得到一組虛擬IP
- AP+STATIO模式:此模式為上述兩種的結合,使用時機通常為透過其他設備來讓ESP8266連線到其他WIFIAP
程式碼
程式碼為ESP8266_RTOS_SDK中的example,在此做個筆記
主程式
1 2 3 4 5 6 7 | void app_main() { ESP_ERROR_CHECK(nvs_flash_init()); ESP_LOGI(TAG, "ESP_WIFI_MODE_AP"); wifi_init_softap(); } |
ncs_flash_init()為出數默認的nvs區塊,wifi_Init_softap()為AP模式的重要副函示
副函示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | void wifi_init_softap() { tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); //wifi初始化 ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL)); wifi_config_t wifi_config = { .ap = { .ssid = EXAMPLE_ESP_WIFI_SSID, .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID), .password = EXAMPLE_ESP_WIFI_PASS, .max_connection = EXAMPLE_MAX_STA_CONN, .authmode = WIFI_AUTH_WPA_WPA2_PSK }, }; if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) { wifi_config.ap.authmode = WIFI_AUTH_OPEN; }//密碼長度為0,則加密方式改為無密碼 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); } |
第4行:esp_event_loop_create_default() ,這是一個事件循環的task,這是RTOS的範疇,在這邊先 不討論
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL))
esp_event_handler_register這是一個事件的註冊函示,其註冊的函示為 wifi_event_handler()
wifi_config為一個結構體,裡面參數從上到下為:
wifi名稱、wifi名稱長度、wifi密碼、密碼長度、最多可以連接的station數量、加密方式
esp_wifi_set_mode():為設定esp8266的操作模式,在此為AP模式
esp_wifi_set_config():設定esp8266 wifi組態
esp_wifi_set_config(): 打開AP模式
事件函示
1 2 3 4 5 6 7 8 9 10 11 12 13 | static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_id == WIFI_EVENT_AP_STACONNECTED) { wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data; ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid); } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) { wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data; ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d", MAC2STR(event->mac), event->aid); } } |
只要有滿足以下事件就會進到這個函示,可以對相對應的事件作處理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /** WiFi event declarations */ typedef enum { WIFI_EVENT_WIFI_READY = 0, /**< WiFi ready */ WIFI_EVENT_SCAN_DONE, /**< finish scanning AP */ WIFI_EVENT_STA_START, /**< station start */ WIFI_EVENT_STA_STOP, /**< station stop */ WIFI_EVENT_STA_CONNECTED, /**< station connected to AP */ WIFI_EVENT_STA_DISCONNECTED, /**< station disconnected from AP */ WIFI_EVENT_STA_AUTHMODE_CHANGE, /**< the auth mode of AP connected by station changed */ WIFI_EVENT_STA_WPS_ER_SUCCESS, /**< station wps succeeds in enrollee mode */ WIFI_EVENT_STA_WPS_ER_FAILED, /**< station wps fails in enrollee mode */ WIFI_EVENT_STA_WPS_ER_TIMEOUT, /**< station wps timeout in enrollee mode */ WIFI_EVENT_STA_WPS_ER_PIN, /**< station wps pin code in enrollee mode */ WIFI_EVENT_AP_START, /**< soft-AP start */ WIFI_EVENT_AP_STOP, /**< soft-AP stop */ WIFI_EVENT_AP_STACONNECTED, /**< a station connected to soft-AP */ WIFI_EVENT_AP_STADISCONNECTED, /**< a station disconnected from soft-AP */ WIFI_EVENT_AP_PROBEREQRECVED, /**< Receive probe request packet in soft-AP interface */ } wifi_event_t; |
留言
張貼留言