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();
  }
}
相关推荐
Morwit11 分钟前
Qt qml创建c++类的单例对象
开发语言·c++·qt
June`11 分钟前
IO模型全解析:从阻塞到异步(高并发的reactor模型)
linux·服务器·网络·c++
Tao____13 分钟前
如何对接Modbus-tcp协议(使用Thinlinks物联网平台)
java·物联网·网络协议·tcp/ip·modbus
YxVoyager17 分钟前
Qt C++ :QRegularExpression 正则表达式使用详解
c++·qt·正则表达式
闻缺陷则喜何志丹18 分钟前
【回文 字符串】3677 统计二进制回文数字的数目|2223
c++·算法·字符串·力扣·回文
李余博睿(新疆)20 分钟前
c++分治算法
c++
oioihoii25 分钟前
Protocol Buffers 编码原理深度解析
c++
消失的旧时光-194326 分钟前
函数指针 + 结构体 = C 语言的“对象模型”?——从 C 到 C++ / Java 的本质统一
linux·c语言·开发语言·c++·c
郝学胜-神的一滴30 分钟前
Linux系统编程:深入理解读写锁的原理与应用
linux·服务器·开发语言·c++·程序人生
Larry_Yanan30 分钟前
Qt多进程(十一)Linux下socket通信
linux·开发语言·c++·qt