ESP32连接ThingsCloud上传设备数据(智慧小灯)

cpp 复制代码
#include <ThingsCloudWiFiManager.h>
#include <ThingsCloudMQTT.h>

//======================================================
// 设置 ssid / password,连接到你的 WiFi AP
const char *ssid = "@Ruijie-s78A8";
const char *password = "***";
// 在 ThingsCloud 控制台的设备详情页中,复制以下设备连接信息
// https://console.thingscloud.xyz
#define THINGSCLOUD_MQTT_HOST "sh-3-mqtt.iot-api.com"
#define THINGSCLOUD_DEVICE_ACCESS_TOKEN "***"
#define THINGSCLOUD_PROJECT_KEY "***"
//======================================================

bool switch1State = true;  // 1号小灯初始状态:打开
bool switch2State = false; // 2号小灯初始状态:关闭
float humidity = 60.2;

ThingsCloudMQTT client(
    THINGSCLOUD_MQTT_HOST,
    THINGSCLOUD_DEVICE_ACCESS_TOKEN,
    THINGSCLOUD_PROJECT_KEY);

// 设置 LED GPIO 引脚
const int LED_PIN = 2;
// 上报数据的间隔时间计时器
unsigned long timer1 = millis();
// 设置定时上报数据的时间间隔,单位是 ms。免费版项目请务必大于30秒,否则设备可能会被限连。
const int report_interval = 1000 * 60 * 5;

void pubSensors();

void setup()
{
  Serial.begin(115200);

  // 拉低 LED
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // 允许 SDK 的日志输出
  client.enableDebuggingMessages();

  // 连接 WiFi AP
  client.setWifiCredentials(ssid, password);
}

// 必须实现这个回调函数,当 MQTT 连接成功后执行该函数。
void onMQTTConnect()
{
  // 这里点亮 LED
  digitalWrite(LED_PIN, HIGH);

  // 订阅属性上报的回复消息
  client.onAttributesResponse([](const String &payload)
                              { Serial.println("attributes response: " + payload); });

  // 订阅属性获取的回复消息
  client.onAttributesGetResponse([](const String &topic, const String &payload)
                                 { Serial.println("attributes get response: " + topic + ", payload: " + payload); });

  // 订阅云平台下发属性的消息
  client.onAttributesPush([](const String &payload)
                          {
                                Serial.println("attributes push: " + payload);
                                DynamicJsonDocument doc(512);
                                DeserializationError error = deserializeJson(doc, payload);
                                if (error)
                                {
                                    Serial.printf("deserialize error: %s\n", error.f_str());
                                    return;
                                }
                                JsonObject obj = doc.as<JsonObject>();
                                if (obj.containsKey("relay1"))
                                {
                                    if (obj["relay1"] == true)
                                    {
                                        Serial.println("relay1 ON");
                                        // todo 输出 GPIO 控制继电器
                                    }
                                    else
                                    {
                                        Serial.println("relay1 OFF");
                                        // todo 输出 GPIO 控制继电器
                                    }
                                } });

  // 读取设备在云平台上的属性
  client.getAttributes();

  // 延迟 5 秒上报首次传感器数据
  client.executeDelayed(1000 * 5, []()
                        { pubSensors(); });
}

void pubSensors()
{
  // 每次上传前翻转switch2的状态(true <-> false)
  switch2State = !switch2State;
  switch1State = !switch1State;
  humidity = random(20, 90);
  // 这个示例模拟传感器数值,仅用于演示如何生成 JSON。实际项目中可读取传感器真实数据。
  DynamicJsonDocument obj(512);
  obj["humidity"] = humidity;
  obj["switch1"] = switch1State;
  obj["switch2"] = switch2State;
  char attributes[512];
  serializeJson(obj, attributes);
  // 调用属性上报方法
  client.reportAttributes(attributes);
}

void loop()
{
  client.loop();

  // 按间隔时间上报传感器数据
  if (millis() - timer1 > report_interval)
  {
    timer1 = millis();
    pubSensors();
  }
}
相关推荐
想唱rap几秒前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
许长安3 分钟前
protobuf 使用详解
c++·经验分享·笔记·中间件
Soley7 分钟前
用 Boost.Log 封装一个更顺手的 C++17 日志库:GoodLog
c++
HAPPY酷12 分钟前
从Public到Private:UE5 C++类创建路径差异全解析
java·c++·ue5
无敌昊哥战神12 分钟前
【LeetCode 37】解数独 (Sudoku Solver) —— 回溯法详解 (Python/C/C++)
c语言·c++·python·算法·leetcode
AI进化营-智能译站17 分钟前
ROS2 C++开发系列08-传感器数据缓存与指令解析方式之数组、向量与字符串实战
开发语言·c++·缓存·ai
胡楚昊25 分钟前
借Polar IOTS一道困难挑战题简单入门蓝牙流量分析
物联网·蓝牙
AI进化营-智能译站29 分钟前
ROS2 C++开发系列14-Lambda表达式处理传感器数据流|文件IO保存机器人实验日志
开发语言·c++·ai·机器人
AI进化营-智能译站1 小时前
ROS2 C++开发系列15-模板实现通用算法|宏定义ROS2调试开关|一次编码适配多平台
java·c++·算法·ai
澈2071 小时前
C++引用与指针:核心区别全解析
开发语言·数据结构·c++