
使用的库
"esp_wifi.h""esp_log.h""esp_err.h"
初始化(假设你已经完成nvs_flash初始化)
Wifi事件与资源配置及启动
- 启动TCP协议栈
esp_netif_init() - 创建默认事件循环
esp_event_loop_create_default() - 注册事件处理程序
esp_event_handler_instance_register()
创建事件循环 -> 注册事件处理程序 -> 发布事件到事件循环 - 创建网络接口对象、应用默认配置、注册部分事件回调
esp_netif_create_default_wifi_sta()
调用之前需要完成默认事件循环创建 - 初始化Wifi配置
esp_wifi_init()
默认情况可传入接收WIFI_INIT_CONFIG_DEFAULT()的变量,无需自行配置 - 设置Wifi模式为Station
esp_wifi_set_mode(WIFI_MODE_STA) - 创建
wifi_config_t类型变量并将网络配置(用户名、密码、认证方式)写入 - 设置上述网络配置
esp_wifi_set_config()
对于Station模式,wifi_interface_t传入ESP_IF_WIFI_STA - (可选)
esp_netif_set_hostname()更改客户端名称esp_netif_t传入esp_netif_create_default_wifi_sta()返回的接口对象 - 启动
esp_wifi_start()
示例
C
static wifi_config_t WifiCfg;
static esp_netif_t* StaNetif = NULL;
void wifiSetConfig()
{
esp_netif_set_hostname(StaNetif, (const char*)device_name); /*TODO 填写客户端名称*/
WifiCfg.sta.threshold.authmode = wifi_authmode; /*TODO 填写Wifi认证方式*/
strcpy((char*)WifiCfg.sta.ssid,(const char*)wifi_ssid); /*TODO 填写SSID*/
strcpy((char*)WifiCfg.sta.password,(const char*)wifi_password); /*TODO 填写密码*/
ESP_LOGI(__func__,"SSID: %s, Password: %s",wifi_ssid, wifi_password);
esp_wifi_set_config(ESP_IF_WIFI_STA, &WifiCfg);
}
void wifiInit()
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
/*注册Wifi相关事务回调*/
ESP_ERROR_CHECK(esp_event_handler_instance_register(
WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifi_event_handler, /*TODO 实现Wifi事件回调函数*/
NULL,
NULL
));
/*注册IP相关事务回调*/
ESP_ERROR_CHECK(esp_event_handler_instance_register(
IP_EVENT,
IP_EVENT_STA_GOT_IP,
&wifi_event_handler,
NULL,
NULL
));
StaNetif = esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
/*Wifi配置等函数打包 */
wifiSetConfig();
ESP_ERROR_CHECK(esp_wifi_start());
}Wifi事件处理函数实现
事件处理函数需要传入一些参数
void *argesp_event_base_t event_base指定事件基础类型,如IP_EVENT/WIFI_EVENTint32_t event_id指定事件类型void *event_data事件额外的数据
即:
C
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data);需要处理的Wifi事件
- Wifi Station启动完成
WIFI_EVENT_STA_START
可以在此之后调用esp_wifi_connect()进行连接
可选的Wifi事件
- Wifi Station停止完成
WIFI_EVENT_STA_STOP - 接入站点
WIFI_EVENT_STA_CONNECTED - 断开连接
WIFI_EVENT_STA_DISCONNECTED
需要处理的IP事件
- 获取到IP地址
IP_EVENT_STA_GOT_IP
可以启动诸如Http Server等需要联网的功能
简单示例(不安全)
C
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
/*TODO 获取IP地址! 可以在此实现一些联网程序的初始化*/
}
}断开连接
使用 esp_wifi_disconnect() 断开与当前AP的连接
该操作不会清除Wifi相关事务,只是断开连接
更改Wifi配置
- 断开连接
- 重新配置
- 启动连接
扫描
- 断开连接
为了防止Wifi连接等事务影响扫描,建议先断开连接 - 启动扫描
esp_wifi_scan_start() - 获取结果
esp_wifi_scan_get_ap_records() - 恢复连接
esp_wifi_scan_get_ap_records() 传出两个参数
uint16_t *number扫描到的AP数量wifi_ap_record_t *ap_records扫描结果
示例
C
void wifiScan(wifi_ap_record_t* ret, uint16_t* number)
{
ESP_ERROR_CHECK(esp_wifi_disconnect());
ESP_ERROR_CHECK(esp_wifi_scan_start(NULL, true)); /* 阻塞态运行 */
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(number, ret));
ESP_ERROR_CHECK(esp_wifi_connect());
}
void your_program()/*这是示例程序,请更改为你自己的程序*/
{
wifi_ap_record_t* ScanRecord = NULL;
uint16_t ScanNum = 0;
wifiScan (ScanRecord, &ScanNum);
ScanRecord[0].rssi; /* 信号强度 */
ScanRecord[0].ssid; /* SSID */
ScanRecord[0].authmode /* 认证方式 */
}
Comments NOTHING