WIFI STATION模式 连接AP

介绍

本次实验以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

image.png

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函数中 连接成功后会设置此标志位

运行结果

image.png
路由设备端
image.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值