第五十章 WiFi熱點實驗
本章節實驗作者把ESP32-S3配置為AP模式,即創建連接熱點,讀者可使用手機連接該熱點。AP模式相關知識請讀者查看第二章節的內容。
本章分為如下幾個小節:
50.1 硬件設計
50.2 軟件設計
50.3 下載驗證
50.1 硬件設計
1.例程功能
本章實驗功能簡介:當手機連接這個熱點時,LCD顯示該連接設備的MAC地址,斷開時,LCD顯示斷開設備的MAC地址。
2.硬件資源
1)LED燈
LED-IO1
2)XL9555
IIC_INT-IO0(需在P5連接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳線帽將IO_SET和LCD_DC相連)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
4)ESP32-S3內部WiFi
3.原理圖
本章實驗使用的WiFi為ESP32-S3的片上資源,因此並沒有相應的連接原理圖。
50.2 軟件設計
50.2.1 程序流程圖
程序流程圖能幫助我們更好的理解一個工程的功能和實現的過程,對學習和設計工程有很好的主導作用。下面看看本實驗的程序流程圖:
圖50.2.1.1 程序流程圖
50.2.2 程序解析
在本章節實驗中,我們只關心main.c文件內容即可,該文件內容如下:
i2c_obj_t i2c0_master;
static const char *TAG = "AP";
#define EXAMPLE_ESP_WIFI_SSID "123"
#define EXAMPLE_ESP_WIFI_PASS "123456789"
#define EXAMPLE_MAX_STA_CONN 5
#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
static char lcd_buff[100] = {0};
/**
* @brief WIFI鏈接糊掉函數
* @param arg:傳入網卡控制塊
* @param event_base:WIFI事件
* @param event_id:事件ID
* @param event_data:事件數據
* @retval 無
*/
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)
{
lcd_fill(0,90,320,240,WHITE);
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);
sprintf(lcd_buff, "MACSTR:"MACSTR,MAC2STR(event->mac));
lcd_show_string(0, 90, 320, 16, 16, lcd_buff, BLUE);
lcd_show_string(0, 110, 320, 16, 16, "With device connection", BLUE);
}
/* 設備斷開 */
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);
lcd_fill(0,90,320,320,WHITE);
sprintf(lcd_buff, "Device disconnected:"MACSTR,MAC2STR(event->mac));
lcd_show_string(0, 90, 320, 16, 16, lcd_buff, BLUE);
}
}
/**
* @brief WIFI初始化
* @param 無
* @retval 無
*/
static void wifi_init_softap(void)
{
/* 初始化網卡 */
ESP_ERROR_CHECK(esp_netif_init());
/* 創建新的事件循環 */
ESP_ERROR_CHECK(esp_event_loop_create_default());
/* 使用默認配置初始化包括netif的Wi-Fi */
esp_netif_create_default_wifi_ap();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
&wifi_event_handler, NULL));
/* 配置WIFI */
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;
}
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_netif_ip_info_t ip_info;
/* 獲取當前設備的IP地址 */
esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"),
&ip_info);
char ip_addr[16];
inet_ntoa_r(ip_info.ip.addr, ip_addr, 16);
ESP_LOGI(TAG, "Set up softAP with IP: %s", ip_addr);
ESP_LOGI(TAG, "wifi_init_softap finished. SSID:'%s' password:'%s'",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
lcd_show_string(0, 90, 240, 16, 16, "wifi connecting......", BLUE);
}
/**
* @brief 程序入口
* @param 無
* @retval 無
*/
void app_main(void)
{
/* 省略部分代碼..... */
wifi_init_softap();
while (1)
{
LED_TOGGLE();
vTaskDelay(500);
}
}
上述源碼相對簡單,主要將ESP32-S3設備配置為AP模式,即作為熱點設備。然後,設置熱點設備的賬號、密碼、安全模式等參數。在WiFi事件回調函數中,當有外部設備請求連接時,程序會在LCD上顯示連接設備的MAC地址等信息。而當外部設備從連接狀態斷開時,LCD會顯示當前斷開的外部設備MAC地址。
50.3 下載驗證
程序下載成功後,我們利用手機連接ESP32-S3熱點設備,當手機連接熱點設備成功時,LCD顯示手機的MAC地址等信息,當手機從已連接狀態斷開時,LCD顯示斷開的外部設備的MAC地址。下圖為連接成功的LCD顯示效果圖。
圖50.3.1 外部設備連接熱點設備
下圖為外部設備從已連接狀態斷開效果圖,如下所示。
圖50.3.2 外部設備斷開熱點設備