ESP32-C3入门教程 网络 篇(一、 Wi-Fi 使用入门 — 初始化及STA、AP模式)_esp32 c3 wifi csdn

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{
ESP_LOGI(TAG,“event_base:%s, event_id:%d\r\n”,event_base, event_id);
wifi_event_ap_staconnected_t *wifi_event_data;
if (event_base == WIFI_EVENT){
switch (event_id)
{
case WIFI_EVENT_STA_START: //STA模式启动
/* code */
break;
case WIFI_EVENT_STA_STOP: //STA模式关闭
/* code */
break;
case WIFI_EVENT_STA_DISCONNECTED: //STA模式断开连接
/* code */
break;
case WIFI_EVENT_AP_START: //AP模式启动
/* code */
break;
case WIFI_EVENT_AP_STOP: //AP模式关闭
/* code */
break;
case WIFI_EVENT_AP_STACONNECTED: //一台设备连接到esp32
wifi_event_ap_staconnected_t *AP_STACONNECTED_EVENT_DATA = (wifi_event_ap_staconnected_t *)event_data; //获取事件信息
ESP_LOGI(TAG, “station:” MACSTR " join, AID=%d", MAC2STR(AP_STACONNECTED_EVENT_DATA->mac), AP_STACONNECTED_EVENT_DATA->aid);
break;
case WIFI_EVENT_AP_STADISCONNECTED: //一台设备断开与esp32的连接
wifi_event_ap_stadisconnected_t *AP_STADISCONNECTED_EVENT_DATA = (wifi_event_ap_stadisconnected_t *)event_data; //获取事件信息
ESP_LOGI(TAG, “station:” MACSTR “leave, AID=%d”, MAC2STR(AP_STADISCONNECTED_EVENT_DATA->mac), AP_STADISCONNECTED_EVENT_DATA->aid);
break;
default:
break;
}
}else if(event_base == IP_EVENT){
switch (event_id)
{
case IP_EVENT_STA_GOT_IP: //esp32从路由器获取到ip
/* code */
break;
case IP_EVENT_STA_LOST_IP: //esp32失去ip
/* code */
break;
case IP_EVENT_AP_STAIPASSIGNED: //esp32给设备分配了ip
/* code */
break;
default:
break;
}
}


### 1.4 WiFi 初始化启动步骤


WiFi 配置初始化的步骤,用官方的两张图表示:


**STA模式:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2a0837d7eb934894bd6239ccbd567a1b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


**AP模式:**


![在这里插入图片描述](https://img-blog.csdnimg.cn/162aaf06b9ca484fa1bd0e8e534ab507.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


下面通过示例再一次说明一下上面图示的使用步骤:


1、初始化 NVS,使用函数`nvs_flash_init`:


在示例中(以 STA 模式示例举例):


![在这里插入图片描述](https://img-blog.csdnimg.cn/0e5c02d78f314358828a672145513ff0.png)


2、初始化 ESP-NETIF,使用`esp_netif_init()`:


在示例中:


![在这里插入图片描述](https://img-blog.csdnimg.cn/c4d4fffdd7414b57a1f5deb33229368f.png)


3、调用`esp_event_loop_create_default()` 创建默认事件循环。之后使用`esp_event_handler_register()` 将事件处理程序注册到系统事件循环,详情见上一小节 1.3 WiFi事件的注册、响应、信息获取 部分。


在示例中:


![在这里插入图片描述](https://img-blog.csdnimg.cn/5e665d713d7f4b2e9aef303df50749bb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


4、初始化WiFi 和 配置WiFi


使用`esp_wifi_init`进行 WiFi 初始化。


在示例中,先是使用了默认配置进行 WiFi 初始化,如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/a1b0c573668a41b09dd94d9a774616f4.png)


初始化后,用户可以根据自己的需要使用`esp_wifi_set_config(WIFI_IF_STA, &wifi_config)` 进行必要的配置,在联合体 `wifi_config_t wifi_config`中定义对应的参数:


![在这里插入图片描述](https://img-blog.csdnimg.cn/80e95850d507490ab7faa8aa064060d9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


在示例中的配置如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/ed73354bb72a424c80e019bf1af4c905.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


5、 启动WiFi


使用`esp_wifi_start`启动WiFi。


Wi-Fi驱动程序将 `WIFI_EVENT_STA_START` 发布到事件任务;然后,事件任务将执行一些常规操作,并将调用应用程序事件回调函数。


应用程序事件回调函数将`WIFI_EVENT_STA_START`中继到应用程序任务。此时调用`esp_wifi_connect()`。


在示例中:


![在这里插入图片描述](https://img-blog.csdnimg.cn/c84587a140704e698a2295934e795f2d.png)


6、实现事件回调函数


回调函数,在上面 1.3 小节有说明,在示例中:


![在这里插入图片描述](https://img-blog.csdnimg.cn/ee53b58b68e348828815d69afff21b2e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


 在一般情况下,上述步骤完成WiFi便可以正常连接工作,在一些环境恶劣场合出现一些连接不稳定等复杂问题,需要根据不同情况不同处理,比如连接超时,意外断开,在设计的时候都需要考虑到,一般的说明在官方都有文档说明


比如:


![在这里插入图片描述](https://img-blog.csdnimg.cn/82e9c21c05504be1b7c6690b8cd29665.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


 总而言之,遇到问题还是先把官方相关的文档看完再寻找问题!


## 2、示例测试


在官方例程中,我们测试的示例的程序如下图:


![在这里插入图片描述](https://img-blog.csdnimg.cn/b341b241baff4ce4b12f69d94431c1fb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


### 2.1 WiFi STA 模式


**STA模式,ESP32-C3连接到其他设备的热点。**


WiFISTA模式一般流程请参阅上面 1.4 WiFi 初始化启动步骤,示例需要修改的地方只有一个,就是把 SSID 和 PASS 改成自己环境中可以连接的 WiFi 信息:


![在这里插入图片描述](https://img-blog.csdnimg.cn/8ea7e9c915a84a5bb7c5d522d7bed195.png)


测试结果如下图:


![在这里插入图片描述](https://img-blog.csdnimg.cn/66e42b79340c4e899bf5339f67fa59c0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


### 2.2 WiFi AP 模式


**AP模式,ESP32-C3 产生热点供其他设备连接。**


WiFI AP模式一般流程请参阅上面 1.4 WiFi 初始化启动步骤, AP模式于STA模式的步骤大体上是一致的,只是在配置 联合体 `wifi_config_t`中使用的是 `wifi_ap_config_t` 结构体:


![在这里插入图片描述](https://img-blog.csdnimg.cn/d746421885734373855b2e84b05dccb2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


然后把宏定义的 SSID 和 PASS 改成自己想要设置的 wifi 名称和密码:


![在这里插入图片描述](https://img-blog.csdnimg.cn/9af3b97e3ed042e69a5a4074d32929c7.png)


 注意一个问题,就是密码的长度必须大于8,否则会出现下图的报错:


![在这里插入图片描述](https://img-blog.csdnimg.cn/0467340d81424016936694c4e04bf833.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


按照上面的说明设置好以后,可以用手机尝试连接 ESP32-C3 的热点,测试效果如下图:


![在这里插入图片描述](https://img-blog.csdnimg.cn/393d8886a4ef4e9f956255949511dd1f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16)


### 2.3 WiFi AP-STA 共存模式


![在这里插入图片描述](https://img-blog.csdnimg.cn/a22fc9b8bc1c4d3daafd85126e1708c4.png)


WiFi AP-STA 共存模式,官方好像没有直接的示例代码,我这里是在 AP模式的基础之上,自己参考一些资料进行修改,这里直接上源码(路由器SSID 和 密码 在下面源码中我用的 \*\*\*\*\*\* 表示,如果需要拷贝进行测试,记得修改):



/* WiFi softAP Example

This example code is in the Public Domain (or CC0 licensed, at your option.)

Unless required by applicable law or agreed to in writing, this
software is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <string.h>
#include “freertos/FreeRTOS.h”
#include “freertos/task.h”
#include “esp_system.h”
#include “esp_wifi.h”
#include “esp_event.h”
#include “esp_log.h”
#include “nvs_flash.h”

#include “lwip/err.h”
#include “lwip/sys.h”

/* The examples use WiFi configuration that you can set via project configuration menu.

If you’d rather not, just change the below entries to strings with
the config you want - ie #define EXAMPLE_WIFI_SSID “mywifissid”
*/
#define EXAMPLE_ESP_WIFI_SSID “JCSZ_ESP32_WIFI”
#define EXAMPLE_ESP_WIFI_PASS “123454321”

#define EXAMPLE_ESP_WIFI_CHANNEL CONFIG_ESP_WIFI_CHANNEL
#define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN

#define ESP_WIFI_STA_SSID “******”
#define ESP_WIFI_STA_PASS “******”

static const char *TAG = “wifi AP_STA”;

/*重新连接热点*/
void WIFI_EVENT_STA_DISCONNECTED_FUN(void)
{
esp_wifi_connect();//连接热点
ESP_LOGI(TAG,“connect to the AP fail”);
}

/*有设备连接上ESP32的热点*/
void WIFI_EVENT_AP_STACONNECTED_FUN( void* event_data )
{
wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
/*打印连接设备的MAC地址*/
ESP_LOGI(TAG, “station “MACSTR” join, AID=%d”, MAC2STR(event->mac), event->aid);
}

/*有设备断开和ESP32的热点*/
void WIFI_EVENT_AP_STADISCONNECTED_FUN( void* event_data )
{
wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
/*打印断开设备的MAC地址*/
ESP_LOGI(TAG, “station “MACSTR” leave, AID=%d”,MAC2STR(event->mac), event->aid);
}

/*连接上路由器(获取到了分配的IP地址)*/
void IP_EVENT_STA_GOT_IP_FUN( void* event_data )
{
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, “got ip:” IPSTR, IP2STR(&event->ip_info.ip));
ESP_LOGI(TAG, “connected to ap SSID:%s password:%s”,ESP_WIFI_STA_SSID, ESP_WIFI_STA_PASS);
}

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) {
// 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);
// } 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);
// }
if( event_base == WIFI_EVENT )
{
switch ( event_id )
{
case WIFI_EVENT_STA_START:
esp_wifi_connect();
break; // STA START
case WIFI_EVENT_STA_STOP:
// ESP_LOGI(TAG,“WIFI_EVENT_STA_STOP”);
break; // STA STOP
case WIFI_EVENT_STA_DISCONNECTED:
WIFI_EVENT_STA_DISCONNECTED_FUN();
break; //和路由器断开
case WIFI_EVENT_AP_START:
// ESP_LOGI(TAG,“WIFI_EVENT_AP_START”);
break; // AP START
case WIFI_EVENT_AP_STOP:
// ESP_LOGI(TAG,“WIFI_EVENT_AP_STOP”);
break; // AP STOP
case WIFI_EVENT_AP_STACONNECTED: //有设备连接上ESP32的热点
WIFI_EVENT_AP_STACONNECTED_FUN( event_data );
break;
case WIFI_EVENT_AP_STADISCONNECTED: //有设备断开和ESP32的热点
WIFI_EVENT_AP_STADISCONNECTED_FUN(event_data );
break;
default: break;
}
}
else if( event_base == IP_EVENT ) // 路由事件ID 组
{
switch ( event_id )
{
case IP_EVENT_STA_GOT_IP:
IP_EVENT_STA_GOT_IP_FUN(event_data);
break; //获取到指定IP
case IP_EVENT_STA_LOST_IP:
// ESP_LOGI(TAG,“IP_EVENT_STA_LOST_IP”);
break;
case IP_EVENT_AP_STAIPASSIGNED:
// ESP_LOGI(TAG,“IP_EVENT_AP_STAIPASSIGNED”);
break;
default: break;
}
}
}

void wifi_init_softap_sta(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());

esp\_netif\_create\_default\_wifi\_ap();
esp\_netif\_create\_default\_wifi\_sta();//创建有 TCP/IP 堆栈的默认网络接口实例绑定STA。;

wifi\_init\_config\_t cfg = WIFI\_INIT\_CONFIG\_DEFAULT();
ESP\_ERROR\_CHECK(esp\_wifi\_init(&cfg));

esp\_event\_handler\_instance\_t instance_any_id;
esp\_event\_handler\_instance\_t instance_got_ip;
ESP\_ERROR\_CHECK(esp\_event\_handler\_instance\_register(WIFI_EVENT,
                                                    ESP_EVENT_ANY_ID,
                                                    &wifi_event_handler,
                                                    NULL,
                                                    &instance_any_id));
ESP\_ERROR\_CHECK(esp\_event\_handler\_instance\_register(IP_EVENT,
                                                    IP_EVENT_STA_GOT_IP,
                                                    &wifi_event_handler,
                                                    NULL,
                                                    &instance_got_ip));

// ESP\_ERROR\_CHECK(esp\_event\_handler\_instance\_register(WIFI\_EVENT,
// ESP\_EVENT\_ANY\_ID,
// &wifi\_event\_handler,
// NULL,
// NULL));

wifi\_config\_t wifi_config_sta = {
    .sta = {
        .ssid = ESP_WIFI_STA_SSID,
        .password = ESP_WIFI_STA_PASS,
        /\* Setting a password implies station will connect to all security modes including WEP/WPA.

* However these modes are deprecated and not advisable to be used. Incase your Access point
* doesn’t support WPA2, these mode can be enabled by commenting below line */
.threshold.authmode = WIFI_AUTH_WPA2_PSK,

        .pmf_cfg = {
            .capable = true,
            .required = false
        },
    },
};
// strcpy( (char \*) wifi\_config\_sta.sta.ssid , ESP\_WIFI\_STA\_SSID );
if(strlen(ESP_WIFI_STA_PASS)==0)//没有密码
{

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

ESP_WIFI_STA_SSID );
if(strlen(ESP_WIFI_STA_PASS)==0)//没有密码
{

[外链图片转存中…(img-A73BnN0I-1715870966176)]
[外链图片转存中…(img-4q1u6xy0-1715870966177)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值