当前位置: 首页 > news >正文

esp32idf使用thingscloud例程

对于不同的消息类型,API 如下:

消息类型 HTTP Method HTTP URL
设备上报属性 POST /device/v1//attributes
设备获取属性 GET /device/v1//attributes
设备上报事件 POST /device/v1//event/report
您只需要将以上的 HTTP URL 和接入点拼接即可获得最终 API URL,例如:

https:///device/v1//attributes

包括 HTTP 和 HTTPs 在内,调用设备访问 API 时,需要通过在 HTTP header 中加入 Project-Key 字段来配合云平台完成设备身份认证。如下:

Content-Type: application/json
Project-Key: <ProjectKey>

基于以上信息,给我编写esp32-s3的idf例程,使用post和get两种方式请求数据,写出上传和下发的函数代码,对下发的json数据进行解析,以温度,湿度两种数据为例,对数据进行输出到端口

以下是基于 ESP32-S3 IDF 的例程示例,包括使用 POST 和 GET 请求方式上传和获取数据,并解析下发的 JSON 数据,将温度和湿度输出到端口。

首先,在 main.c 文件中添加以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_http_client.h"
#include "cJSON.h"// WiFi配置
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"// 云平台访问信息
#define ENDPOINT "YOUR_ENDPOINT"
#define ACCESS_TOKEN "YOUR_ACCESS_TOKEN"
#define PROJECT_KEY "YOUR_PROJECT_KEY"// 上报数据间隔时间(毫秒)
#define REPORT_INTERVAL 5000static const char *TAG = "ESP32-S3";// WiFi连接回调函数
static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
{switch(event->event_id) {case SYSTEM_EVENT_STA_START:ESP_LOGI(TAG, "Wi-Fi started");esp_wifi_connect();break;case SYSTEM_EVENT_STA_CONNECTED:ESP_LOGI(TAG, "Wi-Fi connected");break;case SYSTEM_EVENT_STA_DISCONNECTED:ESP_LOGI(TAG, "Wi-Fi disconnected");esp_wifi_connect();break;case SYSTEM_EVENT_STA_GOT_IP:ESP_LOGI(TAG, "Obtained IP address");break;default:break;}return ESP_OK;
}// HTTP POST请求回调函数
static esp_err_t http_post_event_handler(esp_http_client_event_t *evt)
{switch (evt->event_id) {case HTTP_EVENT_ON_DATA:ESP_LOGI(TAG, "Received data: %.*s", evt->data_len, (char*)evt->data);// 解析JSON数据cJSON *json = cJSON_Parse((char*)evt->data);if (json == NULL) {ESP_LOGE(TAG, "Failed to parse JSON data");break;}cJSON *temperature = cJSON_GetObjectItemCaseSensitive(json, "temperature");cJSON *humidity = cJSON_GetObjectItemCaseSensitive(json, "humidity");if (cJSON_IsNumber(temperature)) {ESP_LOGI(TAG, "Temperature: %.2f", temperature->valuedouble);}if (cJSON_IsNumber(humidity)) {ESP_LOGI(TAG, "Humidity: %.2f", humidity->valuedouble);}cJSON_Delete(json);break;default:break;}return ESP_OK;
}// HTTP GET请求回调函数
static esp_err_t http_get_event_handler(esp_http_client_event_t *evt)
{switch (evt->event_id) {case HTTP_EVENT_ON_DATA:ESP_LOGI(TAG, "Received data: %.*s", evt->data_len, (char*)evt->data);// 解析JSON数据cJSON *json = cJSON_Parse((char*)evt->data);if (json == NULL) {ESP_LOGE(TAG, "Failed to parse JSON data");break;}cJSON *temperature = cJSON_GetObjectItemCaseSensitive(json, "temperature");cJSON *humidity = cJSON_GetObjectItemCaseSensitive(json, "humidity");if (cJSON_IsNumber(temperature)) {ESP_LOGI(TAG, "Temperature: %.2f", temperature->valuedouble);}if (cJSON_IsNumber(humidity)) {ESP_LOGI(TAG, "Humidity: %.2f", humidity->valuedouble);}cJSON_Delete(json);break;default:break;}return ESP_OK;
}// 上报数据函数
void upload_data(void)
{// 创建JSON数据cJSON *json = cJSON_CreateObject();cJSON_AddNumberToObject(json, "temperature", 25.0);cJSON_AddNumberToObject(json, "humidity", 50.0);char *json_str = cJSON_PrintUnformatted(json);cJSON_Delete(json);// 构建HTTP POST请求URLchar url[128];snprintf(url, sizeof(url), "https://%s/device/v1/%s/attributes", ENDPOINT, ACCESS_TOKEN);// 配置HTTP请求参数esp_http_client_config_t config = {.url = url,.event_handler = http_post_event_handler,.method = HTTP_METHOD_POST,.timeout_ms = 5000,.buffer_size = 1024,.headers = {.content_type = "application/json",.project_key = PROJECT_KEY,.project_key_len = strlen(PROJECT_KEY),},};// 发送HTTP POST请求esp_http_client_handle_t client = esp_http_client_init(&config);esp_http_client_set_post_field(client, json_str, strlen(json_str));esp_http_client_perform(client);esp_http_client_cleanup(client);free(json_str);
}// 获取数据函数
void get_data(void)
{// 构建HTTP GET请求URLchar url[128];snprintf(url, sizeof(url), "https://%s/device/v1/%s/attributes", ENDPOINT, ACCESS_TOKEN);// 配置HTTP请求参数esp_http_client_config_t config = {.url = url,.event_handler = http_get_event_handler,.method = HTTP_METHOD_GET,.timeout_ms = 5000,.buffer_size = 1024,.headers = {.content_type = "application/json",.project_key = PROJECT_KEY,.project_key_len = strlen(PROJECT_KEY),},};// 发送HTTP GET请求esp_http_client_handle_t client = esp_http_client_init(&config);esp_http_client_perform(client);esp_http_client_cleanup(client);
}// 主任务
void app_main(void)
{// 初始化非易失性存储(NVS)nvs_flash_init();// 初始化TCP/IP堆栈tcpip_adapter_init();// 注册WiFi事件处理程序ESP_ERROR_CHECK(esp_event_loop_create_default());wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_config));ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID,.password = WIFI_PASSWORD,},};ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());// 等待连接到WiFi网络ESP_LOGI(TAG, "Waiting for Wi-Fi connection...");while (1) {vTaskDelay(1000 / portTICK_PERIOD_MS);if (wifi_is_connected()) {ESP_LOGI(TAG, "Connected to Wi-Fi");break;}}// 循环上报数据和获取数据while (1) {upload_data();get_data();vTaskDelay(REPORT_INTERVAL / portTICK_PERIOD_MS);}
}

请确保将代码中的以下占位符替换为您的实际信息:

  • YOUR_WIFI_SSID:您的Wi-Fi SSID。
  • YOUR_WIFI_PASSWORD:您的Wi-Fi密码。
  • YOUR_ENDPOINT:云平台的访问端点。
  • YOUR_ACCESS_TOKEN:设备的访问令牌。
  • YOUR_PROJECT_KEY:云平台的项目密钥。

这段代码使用了 ESP-IDF 中的 WiFi 和 HTTP Client 组件,通过 Wi-Fi 连接到网络,然后循环执行上报数据和获取数据的函数。上传数据使用 HTTP POST 请求,将温度和湿度作为 JSON 数据发送到指定的 API URL。获取数据使用 HTTP GET 请求,从指定的 API URL 获取返回的 JSON 数据,并解析出温度和湿度值。最后,将温度和湿度值输出到端口。

SS_TOKEN`:设备的访问令牌。

  • YOUR_PROJECT_KEY:云平台的项目密钥。

这段代码使用了 ESP-IDF 中的 WiFi 和 HTTP Client 组件,通过 Wi-Fi 连接到网络,然后循环执行上报数据和获取数据的函数。上传数据使用 HTTP POST 请求,将温度和湿度作为 JSON 数据发送到指定的 API URL。获取数据使用 HTTP GET 请求,从指定的 API URL 获取返回的 JSON 数据,并解析出温度和湿度值。最后,将温度和湿度值输出到端口。

请注意,此例程仅作为参考示例,具体实现可能需要根据您的实际需求进行适当修改和调整。

如需指导,可私聊,适当收费

相关文章:

esp32idf使用thingscloud例程

对于不同的消息类型&#xff0c;API 如下&#xff1a; 消息类型 HTTP Method HTTP URL 设备上报属性 POST /device/v1//attributes 设备获取属性 GET /device/v1//attributes 设备上报事件 POST /device/v1//event/report 您只需要将以上的 HTTP URL 和接入点拼接即可获得最终…...

记一次应急响应练习(Linux)

记一次应急响应练习(Linux) Linux&#xff1a; 请提交攻击者的IP地址 答&#xff1a; 192.168.31.132 思路&#xff1a; 通过查看历史命令和开放的8080端口看到这台主机上运行的是Tomcat服务。并且在历史命令中看到了Tomcat的安装路径。那么就算是找到了日志的查看点了&#x…...

Pandas教程(四)—— 分层索引及数据联合

1.分层索引 分层索引就是在一个轴上拥有多个&#xff08;两个及以上&#xff09;索引级别&#xff0c;能以低维度形式处理高维度数据。 行索引有两层 1.1 分层索引的创建 1.1.1 方式一&#xff1a;直接设置 1&#xff09;在创建series、dataframe或读取文件时时&#xff0c;行…...

小梅哥Xilinx FPGA学习笔记16——FSM(状态机)的学习

目录 一、 状态机导读 1.1 理论学习 1.2 状态机的表示 1.3 状态机编码 1.4 状态机描述方式 二 、实战演练一&#xff08;来自野火&#xff09; 2.1 实验目标 2.2 模块框图 2.3 状态转移图绘制 2.4 设计文件 2.5 仿真测试文件 2.6 仿真结果 三、 实战演练二&…...

vol----学习随记!!!

目录 一、代码生成1.先新建一个功能的对应的代码配置各项解释&#xff1a; 2.后设置配置菜单3.再点保存&#xff0c;生成vue页面&#xff0c;生成model&#xff0c;生成业务类4.再通过菜单设置编写系统菜单 一、代码生成 1.先新建一个功能的对应的代码配置 各项解释&#xff…...

HarmonyOS4.0系统性深入开发10卡片事件能力说明

卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互&#xff0c;当前支持router、message和call三种类型的事件&#xff0c;仅在卡片中可以调用。 接口定义&#xff1a;postCardAction(component: Object, action: Object): void 接口…...

openGauss学习笔记-181 openGauss 数据库运维-升级-升级流程

文章目录 openGauss学习笔记-181 openGauss 数据库运维-升级-升级流程 openGauss学习笔记-181 openGauss 数据库运维-升级-升级流程 本章介绍升级到该版本的主要升级过程。 图 1 升级流程图 说明&#xff1a; 本文档中描述的时间仅供参考&#xff0c;实际操作时间以现场情况…...

提前应对威胁

通过新的《2023-2028 年荷兰国际网络安全战略》&#xff0c;荷兰政府在面对国家和犯罪分子持续构成的网络威胁时展现了责任和机构。它渴望将民主、人权和规范放在首位&#xff0c;并寻求维护全球开放、自由和安全的互联网。该战略明确了政府在国内实施打击的意愿和能力&#xf…...

C语言与人生:数组交换和二分查找

少年们&#xff0c;大家好。我是博主那一脸阳光&#xff0c;今天和分享数组交换和二分查找。 前言&#xff1a;探索C语言中的数组交换操作与二分查找算法 在计算机编程领域&#xff0c;特别是以C语言为代表的低级编程语言中&#xff0c;对数据结构的理解和熟练运用是至关重要的…...

Python实现【亚马逊商品】数据采集

前言 亚马逊公司&#xff0c;是美国最大的一家网络电子商务公司&#xff0c;位于华盛顿州的西雅图 是网络上最早开始经营电子商务的公司之一&#xff0c;亚马逊成立于1994年 今天教大家用Python批量采集亚马逊平台商品数据&#xff08;完整代码放在文末&#xff09; 地址&#…...

Git使用教程 gittutorial

该教程对该文章的翻译&#xff1a;https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先&#xff0c; 可以使用以下指令获取文档帮助 git help log笔者注&#xff1a;不建议看这个文档&#xff0c;标准的语法介绍…...

有了向量数据库,我们还需 SQL 数据库吗?

“除了向量数据库外&#xff0c;我是否还需要一个普通的 SQL 数据库&#xff1f;” 这是我们经常被问到的一个问题。如果除了向量数据以外&#xff0c;用户还有其他标量数据信息&#xff0c;那么其业务可能需要在进行语义相似性搜索前先根据某种条件过滤数据&#xff0c;例如&a…...

信息网络协议基础-IPv6协议

文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…...

VC++ ado 实现单表CURD

继续修改前文的资产管理源码; 新建一个数据库sds;把代码中的数据库连接改为连接此库; 新建下图一个表; 把之前的资产类别管理对话框改为下图所示;对话框ID也改为下图; 资产类别管理菜单和ID改为下图; 直接修改资产类别管理对话框类不太方便,新建一个对话框类,没有关联…...

C#使用switch多路选择语句判断何为季节

目录 一、 switch语句 二、示例 三、生成 一、 switch语句 switch语句是多路选择语句&#xff0c;它通过一个表达式的值来使程序从多个分支中选取一个用于执行的分支。 switch表达式的值只可以是整型、字符串、枚举和布尔类型。 switch语句中多个case可以使用一个break。 在…...

可爱的魔法曲线 Lovely Magical Curves(12年开始只有5个人AC)

一起来交流编程吧&#xff01;【CSDN app】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&k3svdDJTlkD76TRRShbxYCYK1zK1c8cyF&authKeyv1pxp6rS8AA4SRy7bflJl9LIwp8d5v0HOudw%2BDxHiWDRqZ1LzjeoBJH1Z1EXnl35&noverify0&group_code546881376 可爱的魔法…...

通过C++程序实现光驱的自动化刻录和读取

文章目录 ISO文件格式光盘的基本概念光盘种类特点DVDR光盘使用windows调用Linux调用Linux平台下用到的C库:读取设备驱动列表向光驱中写文件 数字存储媒体快速发展的今天&#xff0c;光驱的使用已经不像以前那样普及了。但是在数据备份、安装软件和操作系统、旧设备兼容等领域还…...

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…...

概率论基础

1.概率论 1.1 随机事件与概率 1.1.1 基本概念 ​ 样本点(sample point)&#xff1a; 称为试验 S S S的可能结果为样本点&#xff0c;用 ω \omega ω表示。 ​ 样本空间(sample space)&#xff1a;称试验 S S S的样本点构成的集合为样本空间&#xff0c;用 Ω \Omega Ω表示…...

Mac电脑CMake安装和配置

1.从CMake官网下载dmg文件并且安装 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a43f1462b5f743b4ba0bf5302ee76066.png)...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...