玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

这里我们使用了一个库: PubSubClient
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台
中移动ONENET平台 IP地址: 183.230.40.39
旧版MQTT端口号: 6002


一. 在ONENET平台添加MQTT设备(旧版)

1. 添加
找到多协议接入入口
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

添加旧版MQTT产品
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

添加产品
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

添加产品成功
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

然后添加设备
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

2. 旧版MQTT关键信息
接下来我们来找到旧版MQTT关键的信息:
1.产品ID(在产品页面)
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台
2.设备ID(在设备界面)
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

3.设备鉴权信息
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

二. ESP32连接ONENET旧版MQTT

思路: 1.连接网络 2.登录ONENET 3.发布主题信息
#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"
#include "Ticker.h"
 
const char *ssid = "anny";                 //wifi名
const char *password = "20141208";         //wifi密码
const char *mqtt_server = "183.230.40.39"; //onenet 的 IP地址
 
#define mqtt_devid "626108102"  //设备ID
#define mqtt_pubid "370025"     //产品ID
#define mqtt_password "test123" //鉴权信息
 
WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
 
char msg_buf[200];                                //发送信息缓冲区
char dataTemplate[] = "{\"temp\":%.2f,\"hum\":%.2f}"; //信息模板
char msgJson[75];                                 //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
Ticker tim1;                                      //定时器,用来循环上传数据
 
//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("连接WIFI");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi连接成功");
}
 
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.println("message rev:");
  Serial.println(topic);
  for (size_t i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}
 
//向主题发送模拟的温湿度数据
void sendTempAndHumi()
{
  if (client.connected())
  {
    snprintf(msgJson, 40, dataTemplate, 22.31, 25.92); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
    json_len = strlen(msgJson);                   //msgJson的长度
    msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
    msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
    msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
    memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
    msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
    Serial.print("public message:");
    Serial.println(msgJson);
    client.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  }
}
 
//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
  while (!client.connected()) //再重连客户端
  {
    Serial.println("reconnect MQTT...");
    if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
    {
      Serial.println("connected");
    }
    else
    {
      Serial.println("failed");
      Serial.println(client.state());
      Serial.println("try again in 5 sec");
      delay(5000);
    }
  }
}
 
void setup()
{
  Serial.begin(115200);                                  //初始化串口
  delay(3000);                                           //这个延时是为了让我打开串口助手
  setupWifi();                                           //调用函数连接WIFI
  client.setServer(mqtt_server, 6002);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  client.setCallback(callback);                          //设置好客户端收到信息是的回调
  tim1.attach(20, sendTempAndHumi);                      //定时每20秒调用一次发送数据函数sendTempAndHumi
}
 
void loop()
{
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
  }
  client.loop(); //客户端循环检测
}


可以上传数据,也能接收到OneNet下发的命令
玩转 ESP32 + Arduino 12.通过MQTT协议上传数据至OneNet云平台

后来又在接收命令的callback里写了一个点灯, 下发命令1就开灯, 0就关灯

if (payload[0] == 49)
  {
    digitalWrite(2, HIGH);
  }
  if (payload[0] == 48)
  {
    digitalWrite(2, LOW);
  }

————————————————
链接:https://blog.csdn.net/finedayforu/article/details/108485481
- 本文内容来自网络,如有侵权,请联系本站处理。

2023-09   阅读(339)   评论(0)
 标签: 创客 ESP32 Arduino 物联网

涨知识
RISC-V

RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件。

评论:
相关文章
【ESP32 C++教程】Unit5-2 执行器件之舵机

本节主要讲解舵机驱动类和用按键控制舵机。


【ESP32 C++教程】Unit5-1 执行器件之继电器

本节主要讲解执行器件类型和用按键控制继电器。


【ESP32 C++教程】Unit4-3 红外接收和遥控

本小节主要讲解红外接收和遥控器件,以及遥控操作LED。


【ESP32 C++教程】Unit4-2 模拟量传感器

本小节讲解模拟量传感器使用,旋转电位器,DHT11温湿度传感器和实现自定义传感器类。


【ESP32 C++教程】Unit4-1 数字量传感器

本小节讲解Sensor类及派生类、数字量传感器使用和传感器的推荐交互流程。


【ESP32 C++教程】Unit3-2 触摸输入

本小节讲解ESP32内置触摸引脚的用法,


【ESP32 C++教程】Unit3-1 按键输入

本小节主要介绍按键信号转换、Button类及派生类、和Button交互推荐流程。


【ESP32 C++教程】Unit2-2 Ws2812灯珠

本小节主要介绍Ws2812灯珠的使用、对父类进行扩展实现自定义功能,和指针向下强制转换的使用。


【ESP32 C++教程】Unit2-1 RGB三色LED

本小节主要介绍RGB三色LED的使用,以及多态的具体实现。


【ESP32 C++教程】Unit1-3 ESP32 Arduino 开发框架

ESP32 Arduino Framework是专门针对ESP32开发板的Arduino应用开发框架,为用户开发IOT应用、HMI应用提供一致的开发体验。