介绍
本次实验以ESP8266作为STA模式 连接WiFi 其中要连接的WiFi SSID 为CMCC-n752 SSID 为11223366
具体代码如下
/*ESP8266 WIFI Station 代码*/
#include <stdio.h> //..
#include <stdlib.h> //..
#include <string.h> //..
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "esp_wifi.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "esp_err.h"
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
#define ESP_WIFI_SSID "CMCC-n752"//要连接的WiFi名称
#define ESP_WIFI_PASSWD "11223366" //要连接的WiFi密码
static const char *TAG = "simple wifi";
EventGroupHandle_t wifi_event_group;
void wifi_init_sta(void);
void app_main()
{
printf("ESP8266 WIFI Station test!");
vTaskDelay(1000/portTICK_PERIOD_MS);
wifi_init_sta();
}
//wifi连接状态
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
uint8_t *staIP;
system_event_info_t *info = &event->event_info;
printf("event_id %d\n",event->event_id);
switch(event->event_id){
case SYSTEM_EVENT_STA_START: //初始事件状态 event id 2
printf("Connecting wifi...\n");
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP: //连接成功后调用此函数获取IP event id 8
printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
IP2STR(&event->event_info.got_ip.ip_info.ip),
IP2STR(&event->event_info.got_ip.ip_info.netmask),
IP2STR(&event->event_info.got_ip.ip_info.gw));
xEventGroupSetBits(wifi_event_group,WIFI_CONNECTED_BIT);//设置事件组标志位
break;
case SYSTEM_EVENT_STA_DISCONNECTED://断联后调用此函数
printf("Disconnect reason:%d\n",info->disconnected.reason);
if(info->disconnected.reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT){
/*断连原因为协议不支持*/
/*选择8021.bgn*/
esp_wifi_set_protocol(ESP_IF_WIFI_STA,WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N);
}
esp_wifi_connect(); //重新连接AP
xEventGroupClearBits(wifi_event_group,WIFI_CONNECTED_BIT);
break;
default:
break;
}
return ESP_OK;
}
void wifi_init_sta(void)
{
tcpip_adapter_init();//初始化TCP IP 协议栈
wifi_event_group = xEventGroupCreate();//创建事件组标志
//初始化event hander
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硬件
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
wifi_config_t wifi_config = {
.sta = {
.ssid = ESP_WIFI_SSID,
.password = ESP_WIFI_PASSWD,
},
};
//打印WIFI SSID
ESP_LOGI(TAG,"Setting WIFI Configuration SSID :%s \n",wifi_config.sta.ssid);
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));//设置WiFi为sta模式
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA,&wifi_config));//设置STA的信息
ESP_ERROR_CHECK(esp_wifi_start());//开启wifi
ESP_LOGI(TAG,"Waitting for wifi");
//等待连接上WIFI
xEventGroupWaitBits(wifi_event_group,WIFI_CONNECTED_BIT,false,true,portMAX_DELAY);
}
分析
/*ESP8266 WIFI Station 代码*/
#include <stdio.h> //..
#include <stdlib.h> //..
#include <string.h> //..
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "esp_wifi.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "esp_err.h"
包含已一些要用到的头文件,因为要操作WIFI所以包含已一些和2WiFi有关的头文件
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
#define ESP_WIFI_SSID "CMCC-n752"//要连接的WiFi名称
#define ESP_WIFI_PASSWD "11223366" //要连接的WiFi密码
static const char *TAG = "simple wifi";
EventGroupHandle_t wifi_event_group;
void wifi_init_sta(void);
定义了一些函数声明
在ESP8266 SDK中 将WiFi的操作定义为一个事件组 有点类似于对象,wifi_event_group 这个事件组中 不同的事件类型有不同的ID 根据事件ID的不同进行不同的处理方法 如重连 连接 断联等
定义了两个标志为 CONNECTED BIT0 FAIL BIT1 这两个事件标志位在后面判断事件的状态时起作用。
//wifi连接状态
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
uint8_t *staIP;
system_event_info_t *info = &event->event_info;
printf("event_id %d\n",event->event_id);
switch(event->event_id){
case SYSTEM_EVENT_STA_START: //初始事件状态 event id 2
printf("Connecting wifi...\n");
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP: //连接成功后调用此函数获取IP event id 8
printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
IP2STR(&event->event_info.got_ip.ip_info.ip),
IP2STR(&event->event_info.got_ip.ip_info.netmask),
IP2STR(&event->event_info.got_ip.ip_info.gw));
xEventGroupSetBits(wifi_event_group,WIFI_CONNECTED_BIT);//设置事件组标志位
break;
case SYSTEM_EVENT_STA_DISCONNECTED://断联后调用此函数
printf("Disconnect reason:%d\n",info->disconnected.reason);
if(info->disconnected.reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT){
/*断连原因为协议不支持*/
/*选择8021.bgn*/
esp_wifi_set_protocol(ESP_IF_WIFI_STA,WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N);
}
esp_wifi_connect(); //重新连接AP
(wifi_event_group,WIFI_CONNECTED_BIT);
break;
default:
break;
}
return ESP_OK;
}
这是event_handler 是wifi事件的处理函数 根据不同的事件ID 进行对应的操作
SYSTEM_EVENT_STA_START:开始连接wifi
SYSTEM_EVENT_STA_GOT_IP:获取IP
SYSTEM_EVENT_STA_DISCONNECTED:断连后重新连接的处理
在wifi连接成功后 调用setbit函数 将这个事件设置为WIFI_CONNECTED_BIT
在wifi断开连接后 清除这个BIT意思是已经断开了链接
经过打印我们可以知道
- SYSTEM_EVENT_STA_START 为 2
- SYSTEM_EVENT_STA_CONNECTED 为 4 代表wifi已成功连接
- SYSTEM_EVENT_STA_GOT_IP 为 8
void wifi_init_sta(void)
{
tcpip_adapter_init();//初始化TCP IP 协议栈
wifi_event_group = xEventGroupCreate();//创建事件组标志
//初始化event hander
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硬件
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
wifi_config_t wifi_config = {
.sta = {
.ssid = ESP_WIFI_SSID,
.password = ESP_WIFI_PASSWD,
},
};
//打印WIFI SSID
ESP_LOGI(TAG,"Setting WIFI Configuration SSID :%s \n",wifi_config.sta.ssid);
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));//设置WiFi为sta模式
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA,&wifi_config));//设置STA的信息
ESP_ERROR_CHECK(esp_wifi_start());//开启wifi
ESP_LOGI(TAG,"Waitting for wifi");
//等待连接上WIFI
xEventGroupWaitBits(wifi_event_group,WIFI_CONNECTED_BIT,false,true,portMAX_DELAY);
}
初始化函数中 第一步先初始化tcp ip 协议栈
然后创建一个事件标志组 wifi_event_group
然后循环等待 初始化成功 初始化函数为 event_handler
然后初始化wifi的硬件信息
设置要连接的wifi的参数 wifi_config
设置wifi模式 STA模式
设置WiFi的ssid 和 passwd
然后开启WiFi
让后在这个事件组 等待连接成功
xEventGroupWaitBits(wifi_event_group,WIFI_CONNECTED_BIT,false,true,portMAX_DELAY);
wifi_event_group:事件组的对象
WIFI_CONNECTED_BIT:连接成功的标志位 在Handler函数中 连接成功后会设置此标志位
运行结果
路由设备端