基于Arduino的ESP32-S3连接OneNET云平台实战指南(四)——ESP32-S3连接OneNET云平台的订阅主题与发布主题、消息(数据流)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本系列将以0基础新手视角,完整演示从账号注册到云端数据可视化的全流程,涵盖数据流模型设计、MQTT协议配置及代码实现。建议搭配Arduino IDE 2.0+和ESP32-S3开发板使用。

(四)本文为ESP32-S3连接OneNET云平台的订阅主题与发布主题、消息(数据流)

本文仅仅是《数据上传与命令下发的验证》
注:此核心代码为基础版本,若需更深入的版本私聊。

一、核心代码

1.修改对应的《WiFi,密码,PRODUCT_ID,DEVICE_ID,TOKEN》,其他不用修改

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

/*云平台下发格式*/
/*
{
  "TLED": {
    "v": 1   // 1=开灯,0=关灯
  }
}
*/

// 配置参数
const char* ssid = "your_wifi";/***************************WiFi名字****************************************/
const char* password = "your_password";/***************************密码****************************************/
const char* mqtt_server = "mqtts.heclouds.com";
const int mqtt_port = 1883;
/*************************PRODUCT_ID,DEVICE_ID,TOKEN***************************************/
#define PRODUCT_ID "/**/"
#define DEVICE_ID "/**/"
#define TOKEN "/**/"
#define TLED_PIN 5

// 数据定义
int msgId = 1;
float temp = 22.60;
int humi = 80;
int TLED_state = 0;  // 测试灯

WiFiClient espClient;
PubSubClient client(espClient);

// MQTT主题  /*PRODUCT_ID为产品id,DEVICE_ID为设备名字*/
const char* pubTopic = "$sys/" PRODUCT_ID "/" DEVICE_ID "/dp/post/json";//发布主题
const char* subTopic = "$sys/" PRODUCT_ID "/" DEVICE_ID "/#";//订阅主题:
void setup() {
  Serial.begin(115200);
  
  pinMode(TLED_PIN, OUTPUT);
  digitalWrite(TLED_PIN, TLED_state);
 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(mqttCallback);
  mqttConnect();
}

void loop() {
  if (!client.connected()) {
    mqttConnect();
  }
  client.loop();
  
  static unsigned long lastPost = 0;
  if (millis() - lastPost >= 3000) {   //上传云平台的时间间隔
    postData();
    lastPost = millis();
  }
}

void mqttConnect() {
  while (!client.connected()) {
    if (client.connect(DEVICE_ID, PRODUCT_ID, TOKEN)) {
      client.subscribe(subTopic);
      Serial.println("Subscribed to control topic");
    } else {
      delay(5000);
    }
  }
}

void postData() {
  JsonDocument doc;
  if(msgId > 65535) msgId = 1;
  doc["id"] = msgId++;
  
  // 构建数据点
  JsonObject dp = doc["dp"].to<JsonObject>();
  
  // 温度数据点
  JsonArray tempArr = dp["temp"].to<JsonArray>();
  JsonObject tempObj = tempArr.add<JsonObject>();
  tempObj["v"] = temp;
  
  // 湿度数据点
  JsonArray humiArr = dp["humi"].to<JsonArray>();
  JsonObject humiObj = humiArr.add<JsonObject>();
  humiObj["v"] = humi;
  
  // TLED数据点
  JsonArray ledArr = dp["TLED"].to<JsonArray>();
  JsonObject ledObj = ledArr.add<JsonObject>();
  ledObj["v"] = TLED_state;

  // 序列化并发送
  char payload[256];
  serializeJson(doc, payload);
  
  if (client.publish(pubTopic, payload)) {
    Serial.println("Data sent:");
    Serial.println(payload);
  }
}

void mqttCallback(char* topic, byte* payload, unsigned int length) {
  String msg;
  for (int i=0; i<length; i++) {
    msg += (char)payload[i];
  }
  Serial.println("Received: " + msg);

  // 解析TLED控制指令
  JsonDocument doc;
  deserializeJson(doc, msg);
  
  if (doc.containsKey("TLED")) {
    int newState = doc["TLED"]["v"];
    if (newState != TLED_state) {
      TLED_state = newState;
      digitalWrite(TLED_PIN, TLED_state);
      postData(); // 状态改变后立即上报
      Serial.println("TLED changed to: " + String(TLED_state));
    }
  }
}


注意事项
代码中的temp与humi是直接定义的固定值,本文仅仅是《数据上传与命令下发的验证》

二、数据上传

在这里插入图片描述在这里插入图片描述

三、命令下发

注意事项

  • 响应时间,调成最小值就行,避免延迟太久。
  • 下发命令的格式也不能变。
  • 右边响应超时是正常情况,不影响命令的下发,控制开灯关灯

总结

本文讲解了ESP32-S3连接OneNET云平台的订阅主题与发布主题、消息(数据流)。

<think>好的,我现在需要帮助用户了解如何将ESP32连接OneNet云平台。根据用户提供的引用资料,虽然大部分是关于ESP8266的,但ESP32和ESP8266在连接云平台的流程上有相似之处,可能可以借鉴。 首先,我需要回顾用户提供的三个引用内容。引用[1]提到ESP8266连接OneNet的HTTP协议方法,需要APIKEY和设备号。引用[2]讨论了STM32和ESP8266通过MQTT上传数据到OneNet的步骤,涉及产品ID、设备ID和鉴权信息。引用[3]则给出了HTTP接入流程的链接。这些信息显示,连接OneNet通常需要产品ID、设备ID、APIKEY或鉴权信息,以及选择正确的协议(HTTP或MQTT)。 接下来,我需要确定ESP32ESP8266在连接云平台时的异同。ESP32同样支持Wi-Fi,可以使用AT指令或编程框架(如Arduino、MicroPython)进行开发。因此,步骤可能包括配置设备信息、编写连接代码、上传数据等。 用户的问题是关于ESP32连接OneNet的步骤教程。现有的引用中没有直接提到ESP32,但流程应该类似。可能需要先注册OneNet账户,创建设备,获取设备信息,然后编写ESP32代码,使用HTTP或MQTT协议进行连接和数据传输。 需要注意的是,不同的协议(HTTP vs MQTT)步骤不同。引用[1]和[3]用的是HTTP,而引用[2]用的是MQTT。用户可能需要选择其中一种协议,所以回答中应该区分这两种情况。 另外,确保代码示例的正确性。由于用户提供的引用中有Python的快速排序示例,但ESP32通常用C/C++(Arduino)或MicroPython编写,可能需要提供相应的代码片段。例如,使用Arduino IDE的HTTP POST请求或MQTT客户端库。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何处理连接失败、数据格式要求、如何实现远程控制等,以及可能涉及的鉴权方式、固件更新等。</think>### ESP32连接OneNet云平台步骤教程 将ESP32连接OneNet云平台的核心步骤包括**设备注册、协议选择、代码编写及数据验证**,具体流程如下: --- #### **一、OneNet平台配置** 1. **注册账号并创建产品** - 登录[OneNet平台](https://open.iot.10086.cn/),进入控制台,点击「产品」→「创建产品」。 - 选择接入协议(HTTP或MQTT),填写产品名称和行业类别[^3]。 2. **添加设备并获取关键信息** - 在创建的产品下点击「添加设备」,填写设备名称和唯一标识(如设备ID)。 - 记录**产品ID**、**设备ID**、**APIKEY**(HTTP协议)或**鉴权信息**(MQTT协议)[^1][^2]。 --- #### **二、ESP32端代码开发** ##### **方案1:HTTP协议接入** 1. **依赖库初始化** - 使用Arduino IDE,安装`WiFiClientSecure`和`HTTPClient`库。 - 配置Wi-Fi连接: ```cpp #include <WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); } ``` 2. **发送数据到OneNet** - 构造HTTP POST请求,需包含APIKEY和设备ID: ```cpp #include <HTTPClient.h> void uploadData() { HTTPClient http; String url = "http://api.heclouds.com/devices/<设备ID>/datapoints"; http.begin(url); http.addHeader("api-key", "<你的APIKEY>"); http.addHeader("Content-Type", "application/json"); String payload = "{\"datastreams\":[{\"id\":\"temp\",\"datapoints\":[{\"value\":25}]}]}"; int httpCode = http.POST(payload); if (httpCode == HTTP_CODE_OK) { Serial.println("数据上传成功"); } http.end(); } ``` ##### **方案2:MQTT协议接入** 1. **使用PubSubClient库** - 安装`PubSubClient`库,配置MQTT连接参数: ```cpp #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); const char* mqttServer = "mqtt.heclouds.com"; const int mqttPort = 1883; const char* deviceID = "<设备ID>"; const char* authInfo = "<产品鉴权信息>"; // 格式为"产品ID;设备ID;鉴权token" ``` 2. **连接发布数据** ```cpp void reconnect() { while (!client.connected()) { if (client.connect(deviceID, "<产品ID>", authInfo)) { client.publish("$sys/<产品ID>/<设备ID>/upload", "{\"temp\":25}"); } } } ``` --- #### **三、数据验证调试** 1. 在OneNet控制台找到设备的数据流页面,查看是否接收到ESP32上传的数据。 2. 使用**平台的数据可视化工具**创建仪表盘,实时监控传感器数据。 --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈乾智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值