ESP32通过MQTT协议上传数据至onenet物联网平台(新版)

文章目录


一、onenet物联网平台操作

首先创建产品:

接着创建设备:

 创建物模型:

 接着便是计算接入的token:

在自己的产品详情以及设备详情中找到下面的信息:

接着下载下面的工具用于计算token:

 在网页上使用时间戳计算工具:

输入未来时间(就是你希望你的这个token在什么时候过期失效)

 随后将自己的产品id和设备id替换掉第一行中的相关部分,第二行为未来的时间戳,第三行为自己的access_key,点击生成即可

二、esp32端代码

如下为esp32端的代码:将其中的相关部分替换为自己的内容,以及修改上报数据格式和sendMessage()这个函数的相关定义改为自己的数据格式就行。

查找onenet手册得知MQTT接入地址:

#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"

const char *ssid = "res2";                // WiFi名
const char *password = "123456789";       // WiFi密码
const char *mqtt_server = "mqtts.heclouds.com"; // OneNET MQTT服务器地址
const int port = 1883;                    // 端口号

#define mqtt_pubid "TAZEUgwp61"           // 产品ID
#define mqtt_devid "esp32_device"         // 设备名称
// 鉴权信息
#define mqtt_password "version=2018-10-31&res=products%2FTAZEUgwp61%2Fdevices%2Fesp32_device&et=1777432654&method=md5&sign=y6zEIz3OggO%2FQ9vu4ZcUSg%3D%3D" 

WiFiClient espClient;                     // 创建一个WIFI连接客户端
PubSubClient client(espClient);           // 创建一个PubSub客户端, 传入创建的WIFI客户端

// 设备上传数据的post主题
#define ONENET_TOPIC_PROP_POST "$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/post"

// 这是post上传数据格式
#define ONENET_POST_BODY_FORMAT "{\"id\":\"%u\",\"params\":%s}"
int postMsgId = 0;                        // 记录已经post了多少条
unsigned long lastMsgTime = 0;            // 上次发送消息的时间

// 连接WIFI相关函数
void setupWifi() {
  delay(10);
  Serial.println("连接WiFi...");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected()) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("WiFi已连接!");
  Serial.println("IP地址: ");
  Serial.println(WiFi.localIP());
}

// 发送消息到OneNET平台
void sendMessage() {
  if (client.connected()) {
    // 拼接JSON字符串
    char param[100];
    char jsonBuf[200];
    
    // 构造消息内容,只有message物模型
    sprintf(param, "{\"message\":{\"value\":\"chelsea the king of north london\"}}");
    postMsgId += 1;
    sprintf(jsonBuf, ONENET_POST_BODY_FORMAT, postMsgId, param);
    
    // 发布消息
    if (client.publish(ONENET_TOPIC_PROP_POST, jsonBuf)) {
      Serial.print("消息发送成功: ");
      Serial.println(jsonBuf);
    } else {
      Serial.println("消息发送失败!");
    }
  }
}

// 重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect() {
  while (!client.connected()) {
    Serial.println("重新连接MQTT...");
    if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) {
      Serial.println("已连接!");
    } else {
      Serial.print("连接失败, 错误码: ");
      Serial.println(client.state());
      Serial.println("5秒后重试...");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);                             // 初始化串口
  delay(1000);
  
  setupWifi();                                      // 连接WiFi
  
  client.setServer(mqtt_server, port);              // 设置MQTT服务器
  client.setKeepAlive(120);                         // 设置心跳时间
  
  // 连接MQTT服务器
  if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) {
    Serial.println("OneNET平台已连接!");
  }
}

void loop() {
  // 检查WiFi连接
  if (!WiFi.isConnected()) {
    setupWifi();
  }
  
  // 检查MQTT连接
  if (!client.connected()) {
    clientReconnect();
  }
  
  // 每2秒发送一次消息
  unsigned long currentMillis = millis();
  if (currentMillis - lastMsgTime >= 2000) {
    lastMsgTime = currentMillis;
    sendMessage();
  }
  
  client.loop();                                    // 客户端循环检测
}

 三、测试

合理!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值