第15篇ESP32 idf框架 wifi联网_WiFi AP模式_手机连接到esp32开发板

2023-09-17 14:43:50

第1篇:Arduino与ESP32开发板的安装方法

第2篇:ESP32 helloword第一个程序示范点亮板载LED

第3篇:vscode搭建esp32 arduino开发环境

第4篇:vscode+platformio搭建esp32 arduino开发环境

​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验

第6篇:ESP32连接无源喇叭播放音乐《涛声依旧》

第7篇:ESP32连接按钮点亮LED无源喇叭播放声音

​​​​​​第8篇:ESP32连接超声波HC-SR04测距点亮LED无源喇叭播放声音

第9篇:ESP32超声波HC-SR04Arduino类库编写

第10篇:ESP32外部中断功能的使用

第11篇:ESP32vscode_platformio_idf框架helloworld点亮LED

第12篇:ESP32模拟SPI驱动12864LCD_ST7920显示屏

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示
第14篇ESP32 idf wifi联网_WiFi STA 模式(连接到WIFI)LCD ST7920液晶屏显示

ESP32 的 Wi-Fi 可以工作在以下几种工作状态:

  • Station 模式(STA):在这种模式下,ESP32 连接到一个已经存在的无线网络,类似于一台普通的 Wi-Fi 客户端设备。
  • Access Point 模式(AP):在这种模式下,ESP32 自己作为一个 Wi-Fi 热点,并接受其他 Wi-Fi 客户端设备的连接,类似于一个路由器。
  • Station + Access Point 模式(STA+AP):在这种模式下,ESP32 同时工作在 Station 和 Access Point 两种模式下,既可以连接到已有的 Wi-Fi 网络,也可以提供 Wi-Fi 热点。
  • Wi-Fi Direct 模式(P2P):在这种模式下,ESP32 作为 Wi-Fi Direct 设备,可以直接和其他 Wi-Fi Direct 设备进行通信,不需要使用路由器。
  • Promiscuous 模式:在这种模式下,ESP32 可以在监听所有 Wi-Fi 数据包,而不仅仅是与它连接的 AP 或者 P2P 设备相关的数据包。

前面文章介绍了ESP32作为 Station的工作模式,今天使用其(SoftAP模式)Access Point模式。

第14篇ESP32 idf wifi联网_WiFi STA 模式(连接到WIFI)LCD ST7920液晶屏显示

在WIFI示例中我们可以看到有默认的event loop,event loop 我的理解就是任务事件,就是当我们注册回调函数之后,在执行wifi初始化之后,就会执行wifi任务,然后wifi任务有事件产生之后就会有一个类似于中断事件在回调事件中产生。其中注册函数如下:

ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        NULL));

 WIFI_EVENT是一个字符串,就是我们event loop基础事件,后续event loop发送到那个组件都是根据这个参数确定的,ESP_EVENT_ANY_ID是指在发送event loop 事件的时候,只要是WIFI_EVENT这个基础事件的数据都会调用我们的回调函数,当我们使用ESP_EVENT_ANY_BASE的时候这个时候就是发送除了WIFI_EVENT这个基础事件之外的其他任何基础事件都会调用这个我们注册的回调函数,当我们使用指定ID的时候,这个时候就只会当有这个ID事件触发的时候才会调用我们注册的回调函数,例如我们注册ID为WIFI_EVENT_AP_STACONNECTED的时候,这个时候只要有WIFI_EVENT_AP_STACONNECTED的事件触发的时候才会触发执行我们的回调函数wifi_event_handler,其他的WIFI_EVENT_AP_STADISCONNECTED、WIFI_EVENT_AP_START事件产生的时候不会调用我们注册的回调函数。
  WIFI的认证模式有以下几种,我们默认基本上都是WIFI_AUTH_WPA_WPA2_PSK。

typedef enum {
    WIFI_AUTH_OPEN = 0,         /**< authenticate mode : open */
    WIFI_AUTH_WEP,              /**< authenticate mode : WEP */
    WIFI_AUTH_WPA_PSK,          /**< authenticate mode : WPA_PSK */
    WIFI_AUTH_WPA2_PSK,         /**< authenticate mode : WPA2_PSK */
    WIFI_AUTH_WPA_WPA2_PSK,     /**< authenticate mode : WPA_WPA2_PSK */
    WIFI_AUTH_WPA2_ENTERPRISE,  /**< authenticate mode : WPA2_ENTERPRISE */
    WIFI_AUTH_WPA3_PSK,         /**< authenticate mode : WPA3_PSK */
    WIFI_AUTH_WPA2_WPA3_PSK,    /**< authenticate mode : WPA2_WPA3_PSK */
    WIFI_AUTH_WAPI_PSK,         /**< authenticate mode : WAPI_PSK */
    WIFI_AUTH_MAX
} wifi_auth_mode_t;

当我们设置热点的密码长度为0的时候,我们就需要设置加密方式为WIFI_AUTH_OPEN 开放。

1.wifi_config_t结构体

示例代码设置 ESP32 的 Wi-Fi 模块工作在 AP 模式下,同时配置 Wi-Fi AP 热点的一些参数,方便客户端连接

// 设置为AP模式,配置名称,密码,频道,最大连接数,认证模式    
wifi_config_t wifi_config = { 
           .ap = { 
                   .ssid = EXAMPLE_ESP_WIFI_SSID, 
                   .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),                   
 .channel = EXAMPLE_ESP_WIFI_CHANNEL,                   
 .password = EXAMPLE_ESP_WIFI_PASS,                   
 .max_connection = EXAMPLE_MAX_STA_CONN,                  
  .authmode = WIFI_AUTH_WPA_WPA2_PSK           
 },    
};    
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));

2.wifi_event_handler事件

(1)esp_event_handler_instance_register注册事件

示例:

//wifi相关设置初始化   
 ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,             //检查                                                        ESP_EVENT_ANY_ID,                                                        &wifi_event_handler,                                                        NULL,                                                        NULL));

esp_event_handler_instance_register用于在事件循环中注册事件处理程序,其参数解释:

  • WIFI_EVENT:事件的基础类型,该函数将向WiFi事件注册处理程序。
  • ESP_EVENT_ANY_ID:这是事件ID,这里使用ESP_EVENT_ANY_ID表示注册所有WiFi事件。
  • &wifi_event_handler:这是事件处理程序的指针,它将在WiFi事件发生时被调用。
  • NULL:这是事件处理程序的参数,这里没有使用参数,因此将其设置为NULL。
  • NULL:这是事件处理程序的实例,这里没有使用多个实例,因此将其设置为NULL。

(2)system_event_sta_connected_t结构体

在ESP-IDF中,当一个设备通过WiFi连接到ESP32的WiFi热点时,ESP32会触发一个连接事件。这个事件会包含一个结构体system_event_sta_connected_t,其中包含连接设备的MAC地址(event->mac)和连接设备在该AP热点下的AID(event->aid)。

其中,event->aid代表的是连接设备在AP热点下的AID(Association ID),AID是一个整数值,表示AP热点中连接的设备的编号。
在802.11标准中,AID是一个由AP热点指派的,可以被用来唯一标识一个STA(Station)设备的值。在ESP-IDF中,AID的范围是1~16,代表连接的设备数量。

3. 关闭SoftAP

ESP_LOGI(TAG, "Max clients reached, shutting down AP");    
// 关闭 softAP    
esp_wifi_stop();    
esp_wifi_deinit();    
esp_netif_deinit();    
vTaskDelete(NULL);

三、示例

ESP32可以通过Wi-Fi芯片在AP(接入点)模式下运行,当热点。下面是开启ESP32热点的示范代码:

#include "driver/gpio.h"
#include <stdio.h>
#include "unistd.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include <stddef.h>
#include <time.h>

#include <string.h>
#include <time.h>
#include <sys/time.h>
#include "esp_system.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_sleep.h"
#include "nvs_flash.h"
#include "esp_sntp.h"
#include "esp_wifi.h"
#include "lcd12864st7920idf.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 withthe config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
 * 头文件包含 
 */


// 联网相关的宏
//#define EXAMPLE_ESP_WIFI_SSID      "xx"               // 账号
//#define EXAMPLE_ESP_WIFI_PASS      "@xx68"          // 密码
#define EXAMPLE_ESP_WIFI_SSID "ESP32_AP_t" // WIFI名字
#define EXAMPLE_ESP_WIFI_PASS "12345678"   // WIFI密码
#define EXAMPLE_ESP_WIFI_CHANNEL 1         //
#define EXAMPLE_MAX_STA_CONN 2             //
#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X"//转换后的格式,可按需求修改

#define EXAMPLE_ESP_MAXIMUM_RETRY 5 // wifi连接失败以后可以重新连接的次数
#define WIFI_CONNECTED_BIT BIT0     // wifi连接成功标志位
#define WIFI_FAIL_BIT BIT1          // wifi连接失败标志位
#define AR_SIZE(a) sizeof(a) / sizeof(a[0])

unsigned char show1[] = {0xB0, 0xA2, 0xCE, 0xE4, 0xBF, 0xC6, 0xBC, 0xBC}; //阿武科技

unsigned char show_we_chat1[] = "wechat:";
unsigned char show_nick1[] = "txwtech";
unsigned char show_wifi_connecting[] = "wifi_connecting...";
unsigned char show_wifi_reconnect[] = "wifi_reconnecting...";
unsigned char show_wifi_connected[] = "wifi_connected";

// 联网相关的变量
static EventGroupHandle_t s_wifi_event_group; // 事件组,用于对wifi响应结果进行标记
static int s_retry_num = 0;                   // 记录wifi重新连接尝试的次数

static const char *TAG = "esp32idf_title_txwtech";

// void app_main()
// {
//     Initialise();
//     DisplayString(0, 0, show_wifi_connecting, AR_SIZE(show_wifi_connecting));

//     int mLevel = 0;
//     int temp = 0;

//     esp_err_t ret = nvs_flash_init();
//     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
//     {
//         ESP_ERROR_CHECK(nvs_flash_erase());
//         ret = nvs_flash_init();
//     }
//     ESP_ERROR_CHECK(ret);
//     //CLEAR();
//     // 连wifi
//     //ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
//     ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");
//      wifi_init_sta();

//      CLEAR();
//      DisplayString(1, 0, show_wifi_connected, AR_SIZE(show_wifi_connected));
//     while (false)
//     {
//         time_t timer; // time_t就是long int 类型
//       //  DisplayString(0, 1, show1, AR_SIZE(show1)); //第一行第三格开始
//        // DisplayString(3, 2, show_wifi_connected, AR_SIZE(show_wifi_connected));       //
//        DisplayString(1, 0, show_wifi_connected, AR_SIZE(show_wifi_connected));
//         usleep(1000 * 1000 * 1);                                    //微秒,1000微秒=1毫秒,1000毫秒=1秒
//     }
// }

/*  WiFi softAP ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
 */

// static const char *TAG = "wifi softAP";
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);
    }
}
void wifi_init_softap(void)
{
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_create_default_wifi_ap();
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL));
    wifi_config_t wifi_config =
        {
            .ap =
                {
                    .ssid = EXAMPLE_ESP_WIFI_SSID,
                    .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
                    .channel = EXAMPLE_ESP_WIFI_CHANNEL,
                    .password = EXAMPLE_ESP_WIFI_PASS,
                    .max_connection = EXAMPLE_MAX_STA_CONN,
                    .authmode = WIFI_AUTH_WPA_WPA2_PSK},
        };
    if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0)
    {
        wifi_config.ap.authmode = WIFI_AUTH_OPEN;
    }
    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());
    ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL);
}
void app_main(void)
{ // Initialize NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
    ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");
    wifi_init_softap();
}

更多推荐

K8S:Pod概念、分类及相关的策略

文章目录一.pod相关概念1.Pod基础概念2.Kubrenetes集群中Pod两种使用方式3.pause容器的Pod中的所有容器共享的资源4.kubernetes中的pause容器主要为每个容器提供功能:5.Kubernetes设计这样的Pod概念和特殊组成结构有什么用意6.Pod分为两类:二.Pod容器的分类1.基

[k8s] 常见yml配置和详细解释

在Kubernetes(K8s)中,常见的YAML文件配置包括:文章目录PodDeploymentServiceClusterIPNodePortLoadBalancerIngressConfigMapSecretVolume访问模式StatefulSetDaemonSetJob容器的重启策略ConJobPodapiV

基于Java的高校科研信息管理系统设计与实现(亮点:完整严谨的科研项目审批流程、多文件上传、多角色)

高校科研信息管理系统一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统实现5.1系统主要功能展示5.1.1三个角色展示5.1

详谈操作系统中的内核态和用户态

不知道大家有没有思考过这样一个问题:什么是处理器(CPU)的状态?🤔其实CPU和人一样,没有执行程序的时候,是没有什么状态的,当它执行的程序是用户程序的时候就叫用户态,当执行的程序是操作系统的代码时就叫系统态或者内核态.接下来,我们就来谈谈内核态和用户态.目录1.内核态和用户态的概念2.内核态和用户态的区别3.特权指

《银河麒麟高级服务器操作系统V10》使用

一言而论:讲了麒麟服务器V10的基本使用,包括终端、VNC文章目录前言基本架构环境硬件环境软件环境麒麟安装步骤1.在宿主机上安装好VM,并且激活2.使用VM创建虚拟机3.启动虚拟机终端常用点VNC的使用麒麟上安装VNC服务器Windows上安装VNC客户端VNC服务器补充事项总结一些吐槽(坑)参考资料前言公司接到项目,

【AI】推理系统和推理引擎的整体架构

本文主要是对B站Up主ZOMI酱推理系统系列视频的理解,可以认为是重点笔记。一、深度学习模型的全生命周期相信很多人和我一样,刚看到深度学习模型中的推理系统或推理引擎时是一头雾水,因为学习DL时通常关注于模型的设计和训练。下图是深度学习模型的全生命周期图,主要分为两大类任务,训练任务和推理任务。训练任务:通常需要执行数小

理解 React 服务器组件

自从React被引入开发社区以来的十年里,它经历了几次演变。React团队在发生根本性变革时并不害羞:如果他们发现了一个更好的问题解决方案,他们就会带着它运行。几个月前,React团队推出了ReactServerComponents,这是最新的范式转变。有史以来第一次,React组件可以只在服务器上运行。网上对此有太多

计算物理专题----蒙特卡洛积分实战

Partone蒙特卡洛积分计算案例importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspdfromscipy.statsimportnorm,kstestnp.random.seed(0)defintegrate(a,b,n=100):x=np.random

面向过程与面向对象、面向对象三大特性的介绍和示例

面向过程:将问题分解成一个个详细的步骤,然后通过函数实现每一个步骤,并依次调用特点:1、适合解决简单的问题,不需要过多的协作和抽象2、关注问题的解决步骤而不是问题的本质3、代码复用性低,扩展性差,不易维护4、只有封装,没有继承和多态面向对象:通过分析问题,分解出一个个对象,然后通过不同对象之间的调用和相互协作来解决问题

论如何在Android中还原设计稿中的阴影

每当设计稿上注明需要添加阴影时,Android上总是显得比较棘手,因为Android的阴影实现方式与Web和iOS有所区别。一般来说阴影通常格式是有:X:在X轴的偏移度Y:在Y轴偏移度Blur:阴影的模糊半径Color:阴影的颜色何为阴影但是在Android中却比较单一,只有一个度量单位:Elevation,作为在An

ELK 企业级日志分析系统 ELFK

一、概述ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。使用ELK日志文件系统的原因:日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过

热文推荐