esp32连接腾讯云物联网开发平台(基于arduino开发)(3)

arduino代码

完整代码见主页

导入所需要的库

#include <Arduino.h>

#include <WiFi.h>

#include "PubSubClient.h"

#include <ArduinoJson.h>

进行WIFI配置和服务器配置

// WiFi 配置

const char *ssid = "";     // WiFi名称

const char *pwd = ""; // WiFi密码

// MQTT 服务器配置

const char *mqtt_server = ""; // MQTT服务器地址

const char *mqtt_username = ""; // MQTT用户名

const char *mqtt_userpwd = ""; // MQTT密码

const char *mqtt_clientid = ""; // MQTT客户端ID

const char *mqtt_pub_topic = ""; // MQTT发布主题

const char *mqtt_sub_topic = ""; // MQTT订阅主题

创建一个 JSON 文档对象,用于存储和解析数据

DynamicJsonDocument doc(1024);

定义变量

// 设备状态信息

bool power_switch;    // 电源开关状态

上报数据包模板

#define REPORT_DATA_TEMPLATE "{\"method\":\"report\",\"clientToken\":\"00000001\",\"params\":{\"power_switch\":%d,}}"

创建对象,定时与缓存区

WiFiClient espClient;        // 创建一个 WiFi 客户端对象

PubSubClient mqttclient(espClient); // 创建一个 MQTT 客户端对象

long lastMsg = 0;            // 用于定时上报数据

char report_buf[1024];        // 存储上报数据的缓冲区

创建MQTT 消息回调函数,处理接收到的消息

void callback(char *topic, byte *payload, unsigned int length)

{

    Serial.print("--->Message arrived [");

    Serial.print(topic);

    Serial.print("] ");

    Serial.println();

    Serial.print("payload [");

    for (int i = 0; i < length; i++)

    {

        Serial.print((char)payload[i]);

    }

    Serial.println();

    // 处理上位机的控制指令

    DeserializationError error = deserializeJson(doc, payload);

    // 检查解析是否成功

    if (error)

    {

        Serial.print("deserializeJson() 失败: ");

        Serial.println(error.f_str());

        return;

    }

    else

    {

        if (doc["clientToken"] != "00000001")

        {

            if (doc["params"]["power_switch"] == 1)

            {

                Serial.print("开启电源 ");

                power_switch = 1;

            }

            else

            {

                Serial.print("关闭电源 ");

                power_switch = 0;

            }

        }

    }

}

设置 WiFi 连接

void setup_wifi()

{

    Serial.printf("连接到 %s ", ssid);

    WiFi.begin(ssid, pwd);

    while (WiFi.status() != WL_CONNECTED)

    {

        Serial.printf(".");

        delay(500);

    }

    Serial.println("已连接!");

    Serial.print("IP 地址: ");

    Serial.println(WiFi.localIP());

}

主函数

void setup()

{

    Serial.begin(115200);

    setup_wifi();

    // 设置 MQTT 客户端参数

    mqttclient.setServer(mqtt_server, 1883);

    mqttclient.setCallback(callback);

    mqttclient.setKeepAlive(65535);

    // 连接到 MQTT 服务器

    while (!mqttclient.connect(mqtt_clientid, mqtt_username, mqtt_userpwd))

    {

        Serial.println("mqtt 连接失败,重新连接");

        delay(2000);

    }

    Serial.println("mqtt 连接成功!");

    // 订阅主题

    boolean ret = mqttclient.subscribe(mqtt_sub_topic);

    if (ret != true)

    {

        Serial.printf("mqtt 订阅主题 [%s] 失败\n", mqtt_sub_topic);

    }

    Serial.printf("mqtt 订阅主题 [%s] 成功\n", mqtt_sub_topic);

}

void loop()

{

    // MQTT 客户端循环

    mqttclient.loop();

    // 发布主题

    long now = millis();

    if (now - lastMsg > 10000)

    {

        lastMsg = now;

        // 构造上报数据的 JSON 字符串

        memset(report_buf, 0, 1024);

        sprintf(report_buf, REPORT_DATA_TEMPLATE, power_switch, power_percent, temperature);

        Serial.println(report_buf);

        // 发布数据到 MQTT 主题

        if (mqttclient.publish(mqtt_pub_topic, report_buf))

        {

            Serial.printf("mqtt 发布主题 [%s] 成功\n", mqtt_pub_topic);

        }

        else

        {

            Serial.printf("mqtt 发布主题 [%s] 失败\n", mqtt_pub_topic);

        }

    }

}

连接成功

向esp发送讯息

arduino端收到信号

完整代码见主页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陶瓷好烦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值