目录

概述

1 创建ThingsCloud物联网项目

1.1 创建项目

1.2 创建数据类型

2 ESP32实现MQTT Client功能

2.1 使用Arduino IDE搭建开发环境

2.2 创建项目

2.3 配置参数

2.4 编译和下载

3 使用ESP32连接ThingsCloud

3.1 创建数据

3.2 ThingsCloud订阅数据

3.3 ThingsCloud发布数据至ESP32

4 体验ThingsCloud的可视化UI

4.1 创建看板

4.2 看板上查看数据

5 完整工程代码


概述

本文主要介绍使用ESP32硬件平台,搭建一个基于MQTT协议的物联网客户端,使其连接到ThingsCloud平台上,并上报user数据到ThingsCloud平台,还实现订阅平台信息,并鞥正确的识别和解析该信息。还介绍ThingsCloud平台提供的可视面板模块的使用方法。并将ESP32上报的数据,通过可视化工具呈现出来。

1 创建ThingsCloud物联网项目

1.1 创建项目

下面我创建测试项目,实现功能:基于ESP32测试平台搭建一个物联网项目,连接TingsCloud。通信协议:MQTT;实现功能:数据的发布和订阅。

具体操作步骤如下:

Step-1: 填写项目信息

1.2 创建数据类型

创建设备类型,定义订阅数据和发布数据的类型,这里我选择使用ThingsCloud标准协议,当然还有其他协议可供选择。

选择如下选项后,点击保存,数据类型定义完成

创建项目完成后,可以在该页面中看见该项目的相关类型:

2 ESP32实现MQTT Client功能

2.1 使用Arduino IDE搭建开发环境

在Arduino IDE中搜索ThingsCloud SDK,并安装这个SDK

安装完成后,选择一个Demo项目,然后修改其参数,使其和ThingsCloud上创建的项目对应的参数一致

2.2 创建项目

ThingsCloud SDK已经提供了许多个可以参考的项目的,现在笔者选择其中一个订阅和发布属性的项目作为案例,以介绍如何通过修改模版代码,实现产品快速开发,并且连接到物联网平台。通过点击File ----->Examples---->ThingsClound_ESP,找到适合自己的项目,点击选项后,就可以创建项目,笔者创建项目如下:

2.3 配置参数

应用ThingsCloud SDK提供的模版创建完成项目后,还需要配置相关参数,这些参数包括:wifi信息,设备认证信息,服务器地址等。

参数功能介绍如下:

参数描述
ssidwifi 账号名称
passwordwifi密码
THINGSCLOUD_MQTT_HOSTMQTT服务器地址
THINGSCLOUD_DEVICE_ACCESS_TOKEN设备用户名
THINGSCLOUD_PROJECT_KEY设备用户认证密码

如何配置参数呢?操作 步骤如下:

step-1: 打开thingsClond,进入设备页面,找到连接Thingclonds的相关参数

step-2: 填充参数至项目文件,其对应关系如下:

2.4 编译和下载

在完成项目参数配置后,就可以编译和下载代码至ESP32模块。下载代码时注意,根据实际使用的硬件,选择匹配的模块,还需要正确配置端口。

下载代码完成后,ESP32会自动重启,连接WIFI网络,网络连接成功后,会连接MQTT服务器。使用串口工具可以看见如下log信息。

在thingsClond平台上可以看见,设备已经上线

3 使用ESP32连接ThingsCloud

3.1 创建数据

ESP32模块通过MQTT连接到ThingsCloud后,这时可以进行数据发布,下面来定义要发布的数据信息,定义一个发布数据的函数,实现功能:使用json格式打包数据,然后将该数据包通过接口函数发布出去。

其详细代码如下:

void pubSensors()
{
    // 这个示例模拟传感器数值,仅用于演示如何生成 JSON。实际项目中可读取传感器真实数据。
    DynamicJsonDocument obj(512);
    obj["temperature"] = 31.2;
    obj["humidity"] = 62.5;
    obj["co2"] = 2321;
    obj["light"] = 653;
    char attributes[512];
    serializeJson(obj, attributes);
    // 调用属性上报方法
    client.reportAttributes(attributes);
}

3.2 ThingsCloud订阅数据

编写完毕数据发布函数,重新编译代码,下载代码到ESP32中,这时在ThingsCloud平台可以看见:

在ESP32的串口终端,同样能看见log信息:

3.3 ThingsCloud发布数据至ESP32

该项目已经实现订阅ThingsCloud的属性消息功能,可直接在ThingsCloud上下发消息。ESP32会通过串口打印收到的MQTT Message。

订阅消息代码:

在ThingsCloud上发送消息:

1)使用发送Relay-1属性:True

2)使用发送Relay-2属性:True

4 体验ThingsCloud的可视化UI

4.1 创建看板

ThingsCloud提供的可视化的UI面板,方便用户通过图形画的UI更直观的查看数据。其使用起来也非常简单,具体操作步骤见下图:

创建完成看板后,还需要添加相应的组件,ThingsCloud提供了各种类型的组件,用户可根据实际设备的类型选择合适组件。

4.2 看板上查看数据

创建完成看板后,可以直接在看板上查看数据,和操作设备。

属性数据信息

打开看板界面

在看板上操作Relay,改变其状态,ESP32终端接收到相应的转台变化信息。

5 完整工程代码

打开Arduino IDE,然后输入如下代码:

#include <ThingsCloudWiFiManager.h>
#include <ThingsCloudMQTT.h>

//======================================================
// 设置 ssid / password,连接到你的 WiFi AP
const char *ssid = "";
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 ""
//======================================================

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()
{
    // 这个示例模拟传感器数值,仅用于演示如何生成 JSON。实际项目中可读取传感器真实数据。
    DynamicJsonDocument obj(512);
    obj["temperature"] = 31.2;
    obj["humidity"] = 62.5;
    obj["co2"] = 2321;
    obj["light"] = 653;
    char attributes[512];
    serializeJson(obj, attributes);
    // 调用属性上报方法
    client.reportAttributes(attributes);
}

void loop()
{
    client.loop();

    // 按间隔时间上报传感器数据
    if (millis() - timer1 > report_interval)
    {
        timer1 = millis();
        pubSensors();
    }
}

更多推荐