当前位置: 首页 > 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)...

FPGA开发实战——常见错误排查与优化技巧(持续更新)

1. Vivado仿真与PR Flow冲突问题实战解析 第一次用Vivado做PR&#xff08;Partial Reconfiguration&#xff09;项目时&#xff0c;我兴冲冲地点开仿真按钮&#xff0c;结果弹出一个让人崩溃的报错&#xff1a;"ERROR [Common 17-69] Command failed. Simulation for PR F…...

一键部署体验:Nomic-Embed-Text-V2-MoE在星图GPU平台上的开箱即用Demo

一键部署体验&#xff1a;Nomic-Embed-Text-V2-MoE在星图GPU平台上的开箱即用Demo 你是不是也遇到过这种情况&#xff1f;看到一篇技术文章介绍某个很酷的开源模型&#xff0c;比如Nomic-Embed-Text-V2-MoE&#xff0c;心里痒痒的想立刻试试。结果一搜部署教程&#xff0c;又是…...

nRF52832上电启动全解析:从MBR到Bootloader的跳转机制与寄存器配置

nRF52832上电启动全解析&#xff1a;从MBR到Bootloader的跳转机制与寄存器配置 当nRF52832芯片通电瞬间&#xff0c;一场精密的硬件芭蕾在微秒级时间内悄然上演。这颗蓝牙低功耗SoC的启动流程远非简单的"通电即运行"&#xff0c;而是涉及存储器分区、寄存器配置和多重…...

别再手动点点点了!用Python脚本自动化调用Dify工作流API(附完整代码)

用Python脚本实现Dify工作流API的自动化调用与生产级实践 在数据处理和AI应用开发中&#xff0c;手动操作Web界面不仅效率低下&#xff0c;也难以应对批量任务的需求。本文将介绍如何通过Python脚本将Dify工作流API封装为可复用的自动化工具&#xff0c;并分享生产环境中常见的…...

如何自定义ProxyManager代理生成器:从入门到精通的完整指南

如何自定义ProxyManager代理生成器&#xff1a;从入门到精通的完整指南 【免费下载链接】ProxyManager &#x1f3a9;✨&#x1f308; OOP Proxy wrappers/utilities - generates and manages proxies of your objects 项目地址: https://gitcode.com/gh_mirrors/pr/ProxyMan…...

C# + Halcon实战:药盒上多个条形码一次扫全的配置与代码详解(.NET Framework 4.8)

C# Halcon实战&#xff1a;药盒多条形码高精度识别系统开发指南 在药品包装生产线上&#xff0c;一个药盒往往同时印有追溯码、物流码和防伪码等多种条形码。传统扫码设备通常需要多次定位才能完成读取&#xff0c;而基于Halcon的机器视觉方案能实现毫秒级的多码同步识别。本文…...

革命性LLM优化代理OptiLLM:零训练实现2-10倍推理性能提升

革命性LLM优化代理OptiLLM&#xff1a;零训练实现2-10倍推理性能提升 【免费下载链接】optillm Optimizing inference proxy for LLMs 项目地址: https://gitcode.com/gh_mirrors/op/optillm OptiLLM是一款强大的LLM优化代理工具&#xff0c;能够在不进行任何模型训练的…...

InternLM2-Chat-1.8B在复杂网络问题诊断中的辅助应用

InternLM2-Chat-1.8B在复杂网络问题诊断中的辅助应用 网络问题就像家里的电路故障&#xff0c;灯不亮了&#xff0c;你很难一眼看出是灯泡坏了&#xff0c;还是开关问题&#xff0c;或者是总闸跳了。对于运维工程师来说&#xff0c;服务器连不上、服务访问超时、端口冲突这些“…...

信号完整性工程师必看:S参数实战解析与常见误区(附VNA实测案例)

信号完整性工程师必看&#xff1a;S参数实战解析与常见误区&#xff08;附VNA实测案例&#xff09; 在高速数字电路设计中&#xff0c;信号完整性&#xff08;SI&#xff09;问题往往成为工程师的"隐形杀手"。随着信号速率突破10Gbps&#xff0c;PCB走线不再只是简单…...

新手友好:Python3.9镜像环境配置,Jupyter和SSH两种方式任你选

新手友好&#xff1a;Python3.9镜像环境配置&#xff0c;Jupyter和SSH两种方式任你选 1. Python3.9镜像简介 Python3.9是Python语言的一个重要版本&#xff0c;它继承了Python一贯的简洁易读特性&#xff0c;同时带来了多项性能改进和新功能。这个Miniconda-Python3.9镜像为你…...