基于ESP-IDF4.1

  1. #include <stdio.h>
  2. #include "esp_wifi.h"
  3. #include "esp_system.h"
  4. #include "nvs_flash.h"
  5. #include "esp_event.h"
  6. #include "protocol_examples_common.h"
  7.  
  8. #include "freertos/FreeRTOS.h"
  9. #include "freertos/task.h"
  10. #include "freertos/semphr.h"
  11. #include "freertos/event_groups.h"
  12.  
  13. #include "esp_log.h"
  14. #include "esp_websocket_client.h"
  15. #include "esp_event.h"
  16.  
  17. #define NO_DATA_TIMEOUT_SEC 10
  18.  
  19. static const char *TAG = "WEBSOCKET";
  20.  
  21. static TimerHandle_t shutdown_signal_timer;
  22. static SemaphoreHandle_t shutdown_sema;
  23.  
  24. static void shutdown_signaler(TimerHandle_t xTimer)
  25. {
  26. ESP_LOGI(TAG, "No data received for %d seconds, signaling shutdown", NO_DATA_TIMEOUT_SEC);
  27. //释放信号量
  28. xSemaphoreGive(shutdown_sema);
  29. }
  30.  
  31. #if CONFIG_WEBSOCKET_URI_FROM_STDIN
  32. static void get_string(char *line, size_t size)
  33. {
  34. int count = 0;
  35. while (count < size) {
  36. int c = fgetc(stdin);
  37. if (c == '\n') {
  38. line[count] = '\0';
  39. break;
  40. } else if (c > 0 && c < 127) {
  41. line[count] = c;
  42. ++count;
  43. }
  44. vTaskDelay(10 / portTICK_PERIOD_MS);
  45. }
  46. }
  47.  
  48. #endif
  49.  
  50. //时间处理程序
  51. static void websocket_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
  52. {
  53. esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;
  54. switch (event_id) {
  55. case WEBSOCKET_EVENT_CONNECTED:
  56. ESP_LOGI(TAG, "WEBSOCKET_EVENT_CONNECTED");
  57. break;
  58. case WEBSOCKET_EVENT_DISCONNECTED:
  59. ESP_LOGI(TAG, "WEBSOCKET_EVENT_DISCONNECTED");
  60. break;
  61. case WEBSOCKET_EVENT_DATA:
  62. ESP_LOGI(TAG, "WEBSOCKET_EVENT_DATA");
  63. ESP_LOGI(TAG, "Received opcode=%d", data->op_code);
  64. ESP_LOGW(TAG, "Received=%.*s", data->data_len, (char *)data->data_ptr);
  65. 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);
  66. //复位软件定时器,会重新计算定时周期到达的时间点
  67. xTimerReset(shutdown_signal_timer, portMAX_DELAY);
  68. break;
  69. case WEBSOCKET_EVENT_ERROR:
  70. ESP_LOGI(TAG, "WEBSOCKET_EVENT_ERROR");
  71. break;
  72. }
  73. }
  74.  
  75. //启动
  76. static void websocket_app_start(void)
  77. {
  78. esp_websocket_client_config_t websocket_cfg = {};
  79.  
  80. shutdown_signal_timer = xTimerCreate("Websocket shutdown timer", NO_DATA_TIMEOUT_SEC * 1000 / portTICK_PERIOD_MS,
  81. pdFALSE, NULL, shutdown_signaler);
  82. shutdown_sema = xSemaphoreCreateBinary();
  83.  
  84. #if CONFIG_WEBSOCKET_URI_FROM_STDIN
  85. char line[128];
  86.  
  87. ESP_LOGI(TAG, "Please enter uri of websocket endpoint");
  88. get_string(line, sizeof(line));
  89.  
  90. websocket_cfg.uri = line;
  91. ESP_LOGI(TAG, "Endpoint uri: %s\n", line);
  92.  
  93. #else
  94. websocket_cfg.uri = CONFIG_WEBSOCKET_URI;
  95.  
  96. #endif
  97.  
  98. ESP_LOGI(TAG, "Connecting to %s...", websocket_cfg.uri);
  99.  
  100. esp_websocket_client_handle_t client = esp_websocket_client_init(&websocket_cfg);
  101. esp_websocket_register_events(client, WEBSOCKET_EVENT_ANY, websocket_event_handler, (void *)client);
  102.  
  103. esp_websocket_client_start(client);
  104. //启动软件定时器
  105. xTimerStart(shutdown_signal_timer, portMAX_DELAY);
  106. char data[32];
  107. int i = 0;
  108. while (i < 10) {
  109. if (esp_websocket_client_is_connected(client)) {
  110. int len = sprintf(data, "hello %04d", i++);
  111. ESP_LOGI(TAG, "Sending %s", data);
  112. esp_websocket_client_send(client, data, len, portMAX_DELAY);
  113. }
  114. vTaskDelay(1000 / portTICK_RATE_MS);
  115. }
  116. //获取信号量
  117. xSemaphoreTake(shutdown_sema, portMAX_DELAY);
  118. esp_websocket_client_stop(client);
  119. ESP_LOGI(TAG, "Websocket Stopped");
  120. esp_websocket_client_destroy(client);
  121. }
  122.  
  123. //入口
  124. void app_main(void)
  125. {
  126. ESP_LOGI(TAG, "[APP] Startup..");
  127. ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());
  128. ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version());
  129. esp_log_level_set("*", ESP_LOG_INFO);
  130. esp_log_level_set("WEBSOCKET_CLIENT", ESP_LOG_DEBUG);
  131. esp_log_level_set("TRANS_TCP", ESP_LOG_DEBUG);
  132.  
  133. ESP_ERROR_CHECK(nvs_flash_init());
  134. ESP_ERROR_CHECK(esp_netif_init());
  135. ESP_ERROR_CHECK(esp_event_loop_create_default());
  136.  
  137. //连接网络
  138. ESP_ERROR_CHECK(example_connect());
  139.  
  140. websocket_app_start();
  141. }

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

ESP32-websocket笔记的更多相关文章

  1. ESP32学习笔记(一) 环境搭建与下载

    ESP32学习笔记(一) 环境搭建与下载 作者:Nevel 博客:nevel.cnblogs.com 转载请保留出处 前几天刚入手了ESP32模块,趁着放假有时间,我们先把ESP32的编译环境搭建好 ...

  2. ESP32 学习笔记 - Ubuntu安装

    最近买了一个ESP32的开发板,以前只玩过ESP8266,没经验只能自己一步步摸索 现在把学习的过程记录下来,以免过了一段时间就忘记了 第一步安装 VMware 可以在我的网盘下载 链接:https: ...

  3. 学习WebSocket笔记

    由于HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接. 当用户在浏览器上进行操作时,可以请求服务器上的api:但是反过来不可以:服务端发生了一件事,无法将这个事 ...

  4. ESP32 学习笔记 - 环境搭建

    打开终端 输入命令 sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-seria ...

  5. websocket笔记

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6742746.html websocket -- 双向通信网 ...

  6. WebSocket 笔记

    WebSocket介绍 WebSocket+Flask开启一个WebSocket服务 群聊小Demo 私聊小Demo WebSocket介绍 - 菜鸟教程详解连接 - 下载:pip install g ...

  7. Spring 中使用 WebSocket 笔记

    编写 WebSocket 消息处理类,比较简单的方式就是直接继承AbstractWebSocketHandler,并覆写其中的处理方法,下面为一个简单的 demo public class WebSo ...

  8. ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键

    LittlevGL 添加自定义字体获取字库 ttf 文件可以从一些网站上获取字库文件,比如请注意字体许可证 生成源文件使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件 ...

  9. 最新 .NET Core 中 WebSocket的使用 在Asp.Net MVC 中 WebSocket的使用 .NET Core 中 SignalR的使用

    ASP.NET MVC 中使用WebSocket 笔记 1.采用控制器的方法 这个只写建立链接的方法的核心方法 1.1 踩坑 网上都是直接 传个异步方法 直接接受链接 自己尝试了好多次链接是打开的,到 ...

  10. ESP32 IDF 获取天气信息

    一.注册天气获取账号 我使用的知心天气,没有获取天气账号的小伙伴可以去注册一下,知心天气官网:https://www.seniverse.com/ 取得天气获取的API后,可以直接在浏览器中访问测试一 ...

随机推荐

  1. lua table的遍历

    --ordered table iterator sorted by key function pairsByKeys(t) local a = {} for n in pairs(t) do a[# ...

  2. GO学习-(38) Go语言结构体转map[string]interface{}的若干方法

    结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...

  3. Go语言web开发---Beego的session

    一.简介 Session是一段保存在服务器上的信息,当客户端第一次访问服务器时创建Session,同时也会创建一个名为beegosessionID,值为创建的Session的id的Cookie. 这个 ...

  4. 人脸标记检测:ICCV2019论文解析

    人脸标记检测:ICCV2019论文解析 Learning Robust Facial Landmark Detection via Hierarchical Structured Ensemble 论 ...

  5. MindSpore张量mindspore::tensor

    MindSpore张量mindspore::tensor MSTensor #include <ms_tensor.h> MSTensor定义了MindSpore Lite中的张量. 构造 ...

  6. 数据、人工智能和传感器按COVID-19新冠流感排列

    数据.人工智能和传感器按COVID-19新冠流感排列 Data, AI and sensors arrayed against COVID-19 各国政府.卫生保健专业人士和工业界争先恐后地应对Cov ...

  7. Mac设置charles证书信任

  8. Javaweb:Servlet

    servlet简介 Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序.具有独立于平台和协议的特性,主要功能在于交互式地 ...

  9. 【NX二次开发】Block UI 指定矢量

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. 网络游戏逆向分析-3-通过发包函数找功能call

    网络游戏逆向分析-3-通过发包函数找功能call 网络游戏和单机游戏的分析有相似点,但是区别还是很大的. 网络游戏和单机游戏的区别: 网络游戏是需要和服务器进行交互的,网游中的所有功能几乎都会先发送封 ...