- 源码地址:https://github.com/HX-IoT/ESP32-Developer-Guide
- ESP32开发指南QQ群:824870185,内有pdf版,排版整洁。
学习目的及目标
- 掌握WIFI的状态机结构
- 掌握乐鑫新建热点(AP)的程序
ESP32的WiFi特点
WiFi可作为AP、STA、AP+STA三种模式
作为AP时,可以被4个STA连接
AP 是 (Wireless) AccessPoint 的缩写,即 (无线) 访问接入点。简单来讲就像是无线路由器一样,设备打开后进入 AP 模式,在手机的网络列表里面,可以搜索到类似 TPLINK_XXX 的名字(SSID)
STA是每一个连接到无线网络中的终端(如笔记本电脑、手机、PAD及其它可以联网的用户设备)都可称为一个站点,STA本身并不接受无线的接入,它可以连接到AP。
软件设计
代码逻辑(来自网络)
ESP32的I2C master接口介绍(来自网络)
esp32wifi底层驱动是不开源的,以下是esp32 wifi状态机工作原理的流程图
ESP32的WIFI状态机总结
初始化wifi配置后,程序会根据WIFI的实时状态,在回调函数中给出状态返回,所以只需要在回调中进行相关操作,接下来讲解状态机的解析。
状态机解析
回调原型 |
static esp_err_t event_handler ( void *ctx, system_event_t *event ) |
函数功能 |
WIFI状态机回调函数 |
参数 |
[in] event: typedef struct { system_event_id_t event_id; /*事件ID*/ system_event_info_t event_info; /*事件信息*/ } system_event_t; //事件ID取值 typedef enum { SYSTEM_EVENT_WIFI_READY = 0, /*WiFi准备好*/ SYSTEM_EVENT_SCAN_DONE, /*扫描AP完成*/ SYSTEM_EVENT_STA_START, /*作为STA开始工作*/ SYSTEM_EVENT_STA_STOP, /*作为STA结束工作*/ SYSTEM_EVENT_STA_CONNECTED, /*作为STA连接上AP*/ SYSTEM_EVENT_STA_DISCONNECTED, /*作为STA断开AP*/ SYSTEM_EVENT_STA_AUTHMODE_CHANGE, /*作为STA连接的AP改变了*/ SYSTEM_EVENT_STA_GOT_IP, /*作为STA从AP获取了IP*/ SYSTEM_EVENT_STA_LOST_IP, /*作为STA丢掉了IP,也就是错了*/ SYSTEM_EVENT_STA_WPS_ER_SUCCESS, /*wps succeeds in enrollee mode */ SYSTEM_EVENT_STA_WPS_ER_FAILED, /* wps fails in enrollee mode */ SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, /* wps timeout in enrollee mode */ SYSTEM_EVENT_STA_WPS_ER_PIN, /*wps pin code in enrollee mode */ SYSTEM_EVENT_AP_START, /*AP开始*/ SYSTEM_EVENT_AP_STOP, /*AP结束*/ SYSTEM_EVENT_AP_STACONNECTED, /*有STA连上SP32的AP*/ SYSTEM_EVENT_AP_STADISCONNECTED, /*有STA断开ESP32的AP*/ SYSTEM_EVENT_AP_PROBEREQRECVED, /*从AP中接收包*/ SYSTEM_EVENT_GOT_IP6, /*获取IPv6*/ SYSTEM_EVENT_ETH_START, /*有线开始*/ SYSTEM_EVENT_ETH_STOP, /*有线停止*/ SYSTEM_EVENT_ETH_CONNECTED, /*有线上线*/ SYSTEM_EVENT_ETH_DISCONNECTED, /*有线掉线*/ SYSTEM_EVENT_ETH_GOT_IP, /*有线获取了IP*/ SYSTEM_EVENT_MAX } system_event_id_t; |
返回值 |
ESP_OK:成功 ESP_ERR_INVALID_ARG : 参数错误 |
WiFi初始化API介绍
设置WiFi回调函数esp_event_loop_init();
回调原型 |
esp_err_t esp_event_loop_init ( ) |
函数功能 |
设置WiFi回调函数 |
参数 |
[in] cb:回调函数指针 [in] ctx:保留 |
返回值 |
ESP_OK:成功 other: 失败 |
初始化WiFi设置函数WIFI_INIT_CONFIG_DEFAULT();
设置WiFi工作模式函数esp_err_t esp_wifi_set_mode();
回调原型 |
esp_err_t esp_wifi_set_mode ( wifi_mode_t mode ) |
函数功能 |
设置WiFi工作模式函数 |
参数 |
[in] mode:wifi工作模式 |
返回值 |
ESP_OK:成功 other: 失败 |
启动WiFi函数:esp_err_t esp_wifi_start(void);
更多更详细接口请参考官方指南。
WiFi初始化编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void app_main() { ESP_ERROR_CHECK( nvs_flash_init() ); tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL)); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); wifi_config_t wifi_config = { .ap = { .ssid = "Helon_test", .ssid_len = 0, /* 最多只能被4个station同时连接,这里设置为只能被一个station连接 */ .max_connection = 1, .password = "20180604", .authmode = WIFI_AUTH_WPA_WPA2_PSK, }, }; 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()); } |
作为AP的回调函数解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static esp_err_t event_handler(void *ctx, system_event_t *event) { switch (event->event_id) { case SYSTEM_EVENT_AP_START: printf("\nwifi_softap_start\n"); break; case SYSTEM_EVENT_AP_STACONNECTED: printf("\nwifi_softap_connectted\n"); break; case SYSTEM_EVENT_AP_STADISCONNECTED: printf("\nwifi_softap_disconnectted\n"); break; default: break; } return ESP_OK; } |
效果展示
WiFi总结
- 乐鑫采用了大众的,初始化+回调的状态机结构,逻辑清晰简单,方便学习和使用。
- 源码地址:https://github.com/xiaolongba/wireless-tech