关于esp32默认事件循环 默认WiFi事件注册和获取事件信息

参考esp-idf V4.0.1中的smart_config例程。
包括默认wifi事件的注册、事件的响应、事件信息的获取。

1.事件的注册

    ESP_ERROR_CHECK(esp_event_loop_create_default());
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));

首先调用esp_event_loop_create_default() 创建默认事件循环。
之后使用esp_event_handler_register() 将事件处理程序注册到系统事件循环。
引用官方手册:

esp_event_handler_register() 
此函数可用于注册以下各项的处理程序:(1)特定事件,(2)某个事件基础的所有事件,或(3)系统事件循环已知的所有事件。

特定事件:指定确切的event_base和event_id
特定基准的所有事件:指定确切的event_base并使用ESP_EVENT_ANY_ID作为event_id
循环已知的所有事件:将ESP_EVENT_ANY_BASE用作event_base,将ESP_EVENT_ANY_ID用作event_id
可以将多个处理程序注册到事件。将单个处理程序注册到多个事件也是可能的。但是,将同一处理程序多次注册到同一事件将导致以前的注册被覆盖。

注意
事件循环库不维护event_handler_arg的副本,因此用户应确保在调用处理程序时event_handler_arg仍指向有效位置
返回
ESP_OK:成功
ESP_ERR_NO_MEM:无法为处理程序分配内存
ESP_ERR_INVALID_ARG:事件库和事件ID的无效组合
其他:失败
参量
event_base:要为其注册处理程序的事件的基本ID
event_id:要为其注册处理程序的事件的ID
event_handler:在调度事件时调用的处理函数
event_handler_arg:除事件数据外,在调用时传递给处理程序的数据

此处使用ESP_EVENT_ANY_ID将WIFI事件和IP事件全部注册到响应函数event_handler,无参数传递。

2.事件的响应

关于响应函数,这里只写了AP模式的WIFI_EVENT_AP_STACONNECTED、WIFI_EVENT_AP_STADISCONNECTED 两个事件部分以做演示。

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;
        }
    }

event事件传入四个参数,分别为
arg:注册时传入的参数
event_base:事件的基础名
event_id:事件的id
event_data:事件的信息

可以通过event_base和event_id获取本次事件类型。

3.事件信息的获取

参照以上响应代码,事件的信息由传入参数event_data中获取。

wifi_event_ap_staconnected_t *AP_STACONNECTED_EVENT_DATA = (wifi_event_ap_staconnected_t *)event_data;  //获取事件信息

不同的事件所获取的信息也不同,强制转换将event_data转换为本次事件的信息结构类型以便获取事件信息。
事件信息结构类型一般命名为“全小写_t”。具体结构类型名在esp-idf的相应.h文件中查找(和事件名定义在同一文件中)。

Arduino平台中,使用ESP32 Wi-Fi模块创建热点(即SoftAP模式)可以帮助设备提供一个临时的无线网络,供其他设备连接。以下是使用Arduino IDEESP32-WiFi库创建热点的基本步骤: 1. **环境准备**: 确保已经安装了Arduino IDE,下载并安装适用于ESP32ESP32 Boards Manager中的ESP32第三方库,如Adafruit ESP32 Core或arduino-esp32-core。 2. **库引入**: 在`.ino`文件的顶部,加入对ESP32 Wi-Fi库的引用: ```c++ #include <ESP32WiFi.h> ``` 3. **配置硬件**: 设置ESP32的GPIO引脚作为SoftAP的信号天线,通常默认就已经是Wi-Fi广播模式。 4. **初始化Wi-Fi**: 初始化WiFi模块为SoftAP模式,定义热点的SSID密码: ```c++ const char* ssid = "ESP32_Arduino_SoftAP"; const char* password = "your_password_here"; WiFiSoftAPConfig config(ssid, password); ``` 5. **建立热点**: 创建并配置SoftAP实例,然后启动: ```c++ WiFiSoftAP softAp(config); if (!softAp.begin()) { Serial.println("Failed to start SoftAP."); } else { Serial.println("SoftAP started..."); } ``` 6. **等待连接**: 循环检测连接请求,并处理新连接的客户端: ```c++ while (true) { delay(1000); // 定期检查连接 for (auto client : softAp.clients()) { Serial.println(client.localIP()); } } ``` 7. **错误处理**: 添加适当的异常处理,例如如果Wi-Fi模块无法连接到无线网络,则打印错误信息。 注意:实际应用时,请确保遵守当地法规,尤其是关于无许可的Wi-Fi热点的使用限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值