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();
  }
}
相关推荐
玉树临风ives8 分钟前
atcoder ABC 472 题解
数据结构·c++·算法
做萤石二次开发的哈哈11 分钟前
海康智能消防摄像机接入萤石蓝海AIoT一站式工作台:安消融合多端应用一站生成
物联网·海康威视·萤石开放平台·蓝海aiot一站式工作台·aiot开发·安消融合·消防监测
张张的快乐时光呀!24 分钟前
MFC添加类向导并实现响应
c++·mfc
程与留1 小时前
09_Qt 布局管理系统——QHBoxLayout、QVBoxLayout、QGridLayout
c++·qt
神仙别闹1 小时前
基于QT(C++)实现旅游线路规划系统
c++·qt·旅游
风雨中的蜜蜂1 小时前
PHY6217/PHY6257是支持蓝牙低功耗 (BLE) 与私有 2.4G 应用的 SoC 芯片
单片机·嵌入式硬件·物联网·射频工程
郝学胜_神的一滴1 小时前
C++11 工程级应用 02:decltype与返回类型后置,让泛型代码告别类型玄学
c++·编程语言
DolphinDB智臾科技1 小时前
从数据到仪表盘——DolphinDB + Grafana 搭建工业物联网实时监控
物联网·grafana
虎王物联2 小时前
Nginx反向代理实现IoT设备HTTPS接入:从证书配置到MQTT over WebSocket实战
运维·物联网·nginx·https
tudousisi2222 小时前
8.25第二题训练
c++