zoukankan      html  css  js  c++  java
  • ESP32-websocket笔记

    基于ESP-IDF4.1

    #include <stdio.h>
    #include "esp_wifi.h"
    #include "esp_system.h"
    #include "nvs_flash.h"
    #include "esp_event.h"
    #include "protocol_examples_common.h"
    
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "freertos/semphr.h"
    #include "freertos/event_groups.h"
    
    #include "esp_log.h"
    #include "esp_websocket_client.h"
    #include "esp_event.h"
    
    #define NO_DATA_TIMEOUT_SEC 10
    
    static const char *TAG = "WEBSOCKET";
    
    static TimerHandle_t shutdown_signal_timer;
    static SemaphoreHandle_t shutdown_sema;
    
    static void shutdown_signaler(TimerHandle_t xTimer)
    {
        ESP_LOGI(TAG, "No data received for %d seconds, signaling shutdown", NO_DATA_TIMEOUT_SEC);
        //释放信号量
        xSemaphoreGive(shutdown_sema);
    }
    
    #if CONFIG_WEBSOCKET_URI_FROM_STDIN
    static void get_string(char *line, size_t size)
    {
        int count = 0;
        while (count < size) {
            int c = fgetc(stdin);
            if (c == '
    ') {
                line[count] = '';
                break;
            } else if (c > 0 && c < 127) {
                line[count] = c;
                ++count;
            }
            vTaskDelay(10 / portTICK_PERIOD_MS);
        }
    }
    
    #endif
    
    //时间处理程序
    static void websocket_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
    {
        esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;
        switch (event_id) {
        case WEBSOCKET_EVENT_CONNECTED:
            ESP_LOGI(TAG, "WEBSOCKET_EVENT_CONNECTED");
            break;
        case WEBSOCKET_EVENT_DISCONNECTED:
            ESP_LOGI(TAG, "WEBSOCKET_EVENT_DISCONNECTED");
            break;
        case WEBSOCKET_EVENT_DATA:
            ESP_LOGI(TAG, "WEBSOCKET_EVENT_DATA");
            ESP_LOGI(TAG, "Received opcode=%d", data->op_code);
            ESP_LOGW(TAG, "Received=%.*s", data->data_len, (char *)data->data_ptr);
            ESP_LOGW(TAG, "Total payload length=%d, data_len=%d, current payload offset=%d
    ", data->payload_len, data->data_len, data->payload_offset);
            //复位软件定时器,会重新计算定时周期到达的时间点
            xTimerReset(shutdown_signal_timer, portMAX_DELAY);
            break;
        case WEBSOCKET_EVENT_ERROR:
            ESP_LOGI(TAG, "WEBSOCKET_EVENT_ERROR");
            break;
        }
    }
    
    //启动
    static void websocket_app_start(void)
    {
        esp_websocket_client_config_t websocket_cfg = {};
    
        shutdown_signal_timer = xTimerCreate("Websocket shutdown timer", NO_DATA_TIMEOUT_SEC * 1000 / portTICK_PERIOD_MS,
                                             pdFALSE, NULL, shutdown_signaler);
        shutdown_sema = xSemaphoreCreateBinary();
    
    #if CONFIG_WEBSOCKET_URI_FROM_STDIN
        char line[128];
    
        ESP_LOGI(TAG, "Please enter uri of websocket endpoint");
        get_string(line, sizeof(line));
    
        websocket_cfg.uri = line;
        ESP_LOGI(TAG, "Endpoint uri: %s
    ", line);
    
    #else
        websocket_cfg.uri = CONFIG_WEBSOCKET_URI;
    
    #endif 
    
        ESP_LOGI(TAG, "Connecting to %s...", websocket_cfg.uri);
    
        esp_websocket_client_handle_t client = esp_websocket_client_init(&websocket_cfg);
        esp_websocket_register_events(client, WEBSOCKET_EVENT_ANY, websocket_event_handler, (void *)client);
    
        esp_websocket_client_start(client);
        //启动软件定时器
        xTimerStart(shutdown_signal_timer, portMAX_DELAY);
        char data[32];
        int i = 0;
        while (i < 10) {
            if (esp_websocket_client_is_connected(client)) {
                int len = sprintf(data, "hello %04d", i++);
                ESP_LOGI(TAG, "Sending %s", data);
                esp_websocket_client_send(client, data, len, portMAX_DELAY);
            }
            vTaskDelay(1000 / portTICK_RATE_MS);
        }
        //获取信号量
        xSemaphoreTake(shutdown_sema, portMAX_DELAY);
        esp_websocket_client_stop(client);
        ESP_LOGI(TAG, "Websocket Stopped");
        esp_websocket_client_destroy(client);
    }
    
    //入口
    void app_main(void)
    {
        ESP_LOGI(TAG, "[APP] Startup..");
        ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());
        ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version());
        esp_log_level_set("*", ESP_LOG_INFO);
        esp_log_level_set("WEBSOCKET_CLIENT", ESP_LOG_DEBUG);
        esp_log_level_set("TRANS_TCP", ESP_LOG_DEBUG);
    
        ESP_ERROR_CHECK(nvs_flash_init());
        ESP_ERROR_CHECK(esp_netif_init());
        ESP_ERROR_CHECK(esp_event_loop_create_default());
    
        //连接网络
        ESP_ERROR_CHECK(example_connect());
    
        websocket_app_start();
    }

    原文:https://gitee.com/EspressifSystems/esp-idf

  • 相关阅读:
    格式化时间
    鼠标经过,图片放大事件
    reboot 后 Docker服务及容器自动启动设置
    gin 单个文件函数 上传文件到本地目录里
    深度Linux deepin更新,防火墙操作
    第四篇 mybatis的运行原理(1):重要组件的介绍
    第三篇 常用配置和动态SQL
    第二篇 mybatis的入门
    记一次强转bug
    第一篇 mybatis的简介
  • 原文地址:https://www.cnblogs.com/kerwincui/p/13960783.html
Copyright © 2011-2022 走看看