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 == '\n') {
- line[count] = '\0';
- 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\r\n", 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\n", 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
ESP32-websocket笔记的更多相关文章
- ESP32学习笔记(一) 环境搭建与下载
ESP32学习笔记(一) 环境搭建与下载 作者:Nevel 博客:nevel.cnblogs.com 转载请保留出处 前几天刚入手了ESP32模块,趁着放假有时间,我们先把ESP32的编译环境搭建好 ...
- ESP32 学习笔记 - Ubuntu安装
最近买了一个ESP32的开发板,以前只玩过ESP8266,没经验只能自己一步步摸索 现在把学习的过程记录下来,以免过了一段时间就忘记了 第一步安装 VMware 可以在我的网盘下载 链接:https: ...
- 学习WebSocket笔记
由于HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接. 当用户在浏览器上进行操作时,可以请求服务器上的api:但是反过来不可以:服务端发生了一件事,无法将这个事 ...
- ESP32 学习笔记 - 环境搭建
打开终端 输入命令 sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-seria ...
- websocket笔记
本文为原创,转载请注明出处: cnzt 文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6742746.html websocket -- 双向通信网 ...
- WebSocket 笔记
WebSocket介绍 WebSocket+Flask开启一个WebSocket服务 群聊小Demo 私聊小Demo WebSocket介绍 - 菜鸟教程详解连接 - 下载:pip install g ...
- Spring 中使用 WebSocket 笔记
编写 WebSocket 消息处理类,比较简单的方式就是直接继承AbstractWebSocketHandler,并覆写其中的处理方法,下面为一个简单的 demo public class WebSo ...
- ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键
LittlevGL 添加自定义字体获取字库 ttf 文件可以从一些网站上获取字库文件,比如请注意字体许可证 生成源文件使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件 ...
- 最新 .NET Core 中 WebSocket的使用 在Asp.Net MVC 中 WebSocket的使用 .NET Core 中 SignalR的使用
ASP.NET MVC 中使用WebSocket 笔记 1.采用控制器的方法 这个只写建立链接的方法的核心方法 1.1 踩坑 网上都是直接 传个异步方法 直接接受链接 自己尝试了好多次链接是打开的,到 ...
- ESP32 IDF 获取天气信息
一.注册天气获取账号 我使用的知心天气,没有获取天气账号的小伙伴可以去注册一下,知心天气官网:https://www.seniverse.com/ 取得天气获取的API后,可以直接在浏览器中访问测试一 ...
随机推荐
- lua table的遍历
--ordered table iterator sorted by key function pairsByKeys(t) local a = {} for n in pairs(t) do a[# ...
- GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...
- Go语言web开发---Beego的session
一.简介 Session是一段保存在服务器上的信息,当客户端第一次访问服务器时创建Session,同时也会创建一个名为beegosessionID,值为创建的Session的id的Cookie. 这个 ...
- 人脸标记检测:ICCV2019论文解析
人脸标记检测:ICCV2019论文解析 Learning Robust Facial Landmark Detection via Hierarchical Structured Ensemble 论 ...
- MindSpore张量mindspore::tensor
MindSpore张量mindspore::tensor MSTensor #include <ms_tensor.h> MSTensor定义了MindSpore Lite中的张量. 构造 ...
- 数据、人工智能和传感器按COVID-19新冠流感排列
数据.人工智能和传感器按COVID-19新冠流感排列 Data, AI and sensors arrayed against COVID-19 各国政府.卫生保健专业人士和工业界争先恐后地应对Cov ...
- Mac设置charles证书信任
- Javaweb:Servlet
servlet简介 Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序.具有独立于平台和协议的特性,主要功能在于交互式地 ...
- 【NX二次开发】Block UI 指定矢量
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 网络游戏逆向分析-3-通过发包函数找功能call
网络游戏逆向分析-3-通过发包函数找功能call 网络游戏和单机游戏的分析有相似点,但是区别还是很大的. 网络游戏和单机游戏的区别: 网络游戏是需要和服务器进行交互的,网游中的所有功能几乎都会先发送封 ...