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例程
对于不同的消息类型,API 如下: 消息类型 HTTP Method HTTP URL 设备上报属性 POST /device/v1//attributes 设备获取属性 GET /device/v1//attributes 设备上报事件 POST /device/v1//event/report 您只需要将以上的 HTTP URL 和接入点拼接即可获得最终…...

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

Pandas教程(四)—— 分层索引及数据联合
1.分层索引 分层索引就是在一个轴上拥有多个(两个及以上)索引级别,能以低维度形式处理高维度数据。 行索引有两层 1.1 分层索引的创建 1.1.1 方式一:直接设置 1)在创建series、dataframe或读取文件时时,行…...

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

vol----学习随记!!!
目录 一、代码生成1.先新建一个功能的对应的代码配置各项解释: 2.后设置配置菜单3.再点保存,生成vue页面,生成model,生成业务类4.再通过菜单设置编写系统菜单 一、代码生成 1.先新建一个功能的对应的代码配置 各项解释ÿ…...

HarmonyOS4.0系统性深入开发10卡片事件能力说明
卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。 接口定义:postCardAction(component: Object, action: Object): void 接口…...

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

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

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

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

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

有了向量数据库,我们还需 SQL 数据库吗?
“除了向量数据库外,我是否还需要一个普通的 SQL 数据库?” 这是我们经常被问到的一个问题。如果除了向量数据以外,用户还有其他标量数据信息,那么其业务可能需要在进行语义相似性搜索前先根据某种条件过滤数据,例如&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语句是多路选择语句,它通过一个表达式的值来使程序从多个分支中选取一个用于执行的分支。 switch表达式的值只可以是整型、字符串、枚举和布尔类型。 switch语句中多个case可以使用一个break。 在…...

可爱的魔法曲线 Lovely Magical Curves(12年开始只有5个人AC)
一起来交流编程吧!【CSDN app】:http://qm.qq.com/cgi-bin/qm/qr?_wv1027&k3svdDJTlkD76TRRShbxYCYK1zK1c8cyF&authKeyv1pxp6rS8AA4SRy7bflJl9LIwp8d5v0HOudw%2BDxHiWDRqZ1LzjeoBJH1Z1EXnl35&noverify0&group_code546881376 可爱的魔法…...

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

【电商项目实战】商品详情显示与Redis存储购物车信息
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《电商项目实战》。🎯🎯 &am…...

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

Mac电脑CMake安装和配置
1.从CMake官网下载dmg文件并且安装 ...

FormData传送复杂数据
FormData 是一个用于创建表单数据对象的 JavaScript 类。它通常用于通过 JavaScript 发送表单数据,尤其是用于发送 AJAX 请求时非常有用。 使用 FormData 可以方便地构建一个以 multipart/form-data 格式提交的表单数据,这允许你在发送 XMLHttpRequest …...

力扣回溯算法-电话号码的字母组合
力扣第17题,电话号码的字母组合 题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 .电话号码的字母组合 示例: 输入:“2…...

运维面试笔试题
目录 shell脚本 nginx 数据库mysql k8s(kubernetes) 安全与防护 网络TCP/IP shell脚本 1 通过正则表达式匹配文本...

Oracle database 静默安装 oracle12c 一键安装 12.1.0.2
基于oracle安装包中应答文件实现一键安装 注意此安装脚本基于12.1.0.2 安装包 原始安装包结构为两个压缩包 此脚本使用安装包为原始压缩包解压后、 重新封装为一个.zip压缩包 建议在linux 环境下解压重新压缩后 使用该脚本 支持环境: Linux :centerOS 7 oracle :12.1.0.…...

【Java EE初阶三 】线程的状态与安全(上)
1. join方法与多线程 1.1 初识多线程 为了提高cpu得利用率,因此就引入了多个线程的概念;即每个线程负责完成整个程序的一部分工作即可。 写一个代码,让主线程,创建一个新的线程,由新线程负责完成运算(12。…...

英飞凌TC3xx之一起认识GTM系列(五)如何实现GTM与DSADC关联的配置
英飞凌TC3xx之一起认识GTM系列(五)如何实现GTM与DSADC关联的配置 1 GTM与DSADC的连接1.1 EDSADC 到 GTM 的连接1.1.1 工作原理说明1.1.2 应用举例1.2 GTM 到 EDSADC 的连接1.2.1 工作原理说明1.2.2 应用举例2 总结编者按:笔者在从事这部分开发工作的时候,看着手册上的各种通…...

小兔鲜儿 uniapp - 购物车模块
目录 加入购物车 接口相关 购物车列表 静态结构 登录状态 列表渲染 删除购物车 接口相关 参考代码 修改商品信息 接口相关 修改商品数量 修改商品选中/全选 底部结算信息 计算总钱数(总金额) 带返回按钮的购物车 完成加入购物车…...

Python使用PyMySql增删改查Mysql数据库
PyMysql简介 PyMysql是Python中用于连接MySQL数据库的一个第三方库,它实现了MySQL客户端/服务器协议,使得Python程序能够与MySQL服务器进行交互。由于Python 2的mysql-python(又称mysqldb)模块在Python 3上支持不够完善࿰…...

前端实现websocket类封装
随着Web应用程序的发展,越来越多的人开始利用Websocket技术来构建实时应用程序。Websocket是一种在客户端和服务器之间建立持久连接的协议。这种协议可以在一个单独的连接上实现双向通信。与HTTP请求-响应模型不同,Websocket允许服务器自主地向客户端发送…...

鸿蒙开发中的一些小问题
这是我在学习鸿蒙开发中遇见的小问题 Q1:This custom component must have a build function. <etsLint>Q2:page_title is not translated into en_US(American English)Q3:Module "../CustomComponent/CustomButton" declar…...