关于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文件中查找(和事件名定义在同一文件中)。

ESP32是一种低功耗、高性能的微控制器,支持多种外设和通信协议。它的事件回调函数可以用于处理外部事件,如GPIO中断、定时器事件等。 以下是ESP32事件回调函数的示例: ```c void IRAM_ATTR gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; // 处理GPIO中断事件 } void timer_isr_handler(void* arg) { // 处理定时器事件 } void app_main() { // 配置GPIO中断 gpio_config_t io_conf; io_conf.intr_type = GPIO_INTR_POSEDGE; io_conf.pin_bit_mask = (1 << GPIO_NUM_0); io_conf.mode = GPIO_MODE_INPUT; io_conf.pull_up_en = GPIO_PULLUP_ENABLE; gpio_config(&io_conf); // 安装GPIO中断处理函数 gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); gpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0); // 配置定时器 timer_config_t timer_conf; timer_conf.divider = 80; timer_conf.counter_dir = TIMER_COUNT_UP; timer_conf.counter_en = TIMER_PAUSE; timer_conf.alarm_en = TIMER_ALARM_EN; timer_conf.intr_type = TIMER_INTR_LEVEL; timer_init(TIMER_GROUP_0, TIMER_0, &timer_conf); // 安装定时器中断处理函数 timer_isr_register(TIMER_GROUP_0, TIMER_0, timer_isr_handler, NULL, ESP_INTR_FLAG_IRAM, NULL); // 启动定时器 timer_start(TIMER_GROUP_0, TIMER_0); } ``` 在上面的示例中,我们定义了两个事件回调函数:gpio_isr_handler和timer_isr_handler。gpio_isr_handler用于处理GPIO中断事件,timer_isr_handler用于处理定时器事件。在app_main函数中,我们首先配置了一个GPIO中断和一个定时器,并安装了它们的中断处理函数。然后启动了定时器。当GPIO中断或定时器事件发生时,对应的事件回调函数就会被调用。 需要注意的是,ESP32事件回调函数必须声明为IRAM_ATTR类型,以确保它们被分配到内部RAM中,以便快速执行。此外,在安装中断处理函数时,可以指定中断处理函数的优先级和CPU核心,以确保高优先级中断的及时响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值