ESP32连接OneNET-MQTT平台上传送数据

一、首先在OneNET上创建一个产品和一个设备

1、创建MQTT产品

第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
第三步:
在这里插入图片描述
点击确定之后:
在这里插入图片描述

2、为产品添加设备

第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
第三步:创建完成后可以查看设备的ID和Key。
在这里插入图片描述

3、为设备创建数据流

第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
第三步:
在这里插入图片描述

二、使用OneNET提供的MQTT软件测试MQTT

软件下载地址,OneNet官网:https://open.iot.10086.cn/doc/mqtt/book/get-start/connect.html

打开MQTT软件后:

第一步:
在这里插入图片描述
第二步:配置MQTT。

以下网址必看:

MQTT地址和端口号的配置:(我这里选择的是非加密接口)
https://open.iot.10086.cn/doc/mqtt/book/device-develop/manual.html
token算法详解:https://open.iot.10086.cn/doc/mqtt/book/manual/auth/token.html
token算法工具以及使用:
https://open.iot.10086.cn/doc/mqtt/book/manual/auth/tool.html
unix时间戳转换工具:
https://tool.lu/timestamp/

注意:使用的时间戳必须大于当前的时间,否则会提示密码错误,导致无法连接。
在这里插入图片描述
token密钥生成举例:

products/426214/devices/radar

在这里插入图片描述

以上步骤完成后:

点击Connect够就连接成功啦!
在这里插入图片描述
在OneNet上查看设备,已在线:
在这里插入图片描述

三、使用MQTT发送数据到OneNET

参考官网,MQTT 协议规范:https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html

参考官网,数据点 topic 簇:
https://open.iot.10086.cn/doc/mqtt/book/device-develop/topics/dp-topics.html

第一步:首先订阅 “订阅设备数据点上报结果 ”;
注意修改产品ID和设备名称,其他的目前OneNet不允许修改。

$sys/426214/radar/dp/post/json/+

在这里插入图片描述

第二步:发布消息;

$sys/426214/radar/dp/post/json

在这里插入图片描述
发布消息的规则如下:
id: 后面的id号可随便改。
dp:不可更改。目前OneNet还不允许自定义修改。
dis:自己在OneNet产品定义的数据流的名称。
v: 不可更改,后边的数据可更改。

{
    "id": 123,        
    "dp": {             
        "dis":  
            [{     
            "v": 100.00
             }]
          }
}

查看订阅消息:

在这里插入图片描述

在云平台查看发送的数据:
在这里插入图片描述

四、使用ESP32连接OneNet-MQTT

以上测试都成功后,其实就是用代码在实现一遍这个过程。

注意,这个ESP32是未烧写任何固件的,如果之前少写过其他的固件,请先擦出后再使用。

1、ESP32-Arduino IDE 开发环境的搭建

Arduino IDE 下载:
https://www.arduino.cc/en/software

在Arduino IDE的开发版管理网址中添加:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

之后就可以在开发版管理器中下载了,没梯子的源码安装吧。
这里就不赘述了。
在这里插入图片描述

2、代码实现

直接上代码吧:
参考:https://blog.csdn.net/finedayforu/article/details/111517908

#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"
#include "Ticker.h"
//#include "uFire_SHT20.h"
#include "ArduinoJson.h"
 
//uFire_SHT20 sht20;
 
const char* ssid = "NET502";              //wifi名
const char* password = "502502502";      //wifi密码
const char* mqtt_server = "mqtts.heclouds.com"; //onenet 的 IP地址 mqtts.heclouds.com 183.230.40.96
const int port = 1883;                    //端口号

#define mqtt_pubid "426214"    //产品ID
#define mqtt_devid "radar"       //设备名称
//鉴权信息
#define mqtt_password "version=2018-10-31&res=products%2F426214%2Fdevices%2Fradar&et=1552234385&method=md5&sign=GZpCklfYK8LviOhGxXP3Iw%3D%3D"       //鉴权信息

WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
Ticker tim1;                    //定时器,用来循环上传数据
Ticker tim2;                    //定时器,用来循环上传数据
float temp;
float humi;
float dis;

//设备上传数据的post主题
#define ONENET_TOPIC_PROP_POST "$sys/" mqtt_pubid "/" mqtt_devid "/dp/post/json" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/post"
//接收下发属性设置主题
#define ONENET_TOPIC_PROP_SET  "$sys/" mqtt_pubid "/" mqtt_devid "/dp/post/json/+" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/set"
//接收下发属性设置成功的回复主题
#define ONENET_TOPIC_PROP_SET_REPLY "$sys/" mqtt_pubid "/" mqtt_devid "/dp/post/accepted" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/set_reply"
 
//接收设备属性获取命令主题
#define ONENET_TOPIC_PROP_GET "$sys/" mqtt_pubid "/" mqtt_devid "/cmd/request/+" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/get"
//接收设备属性获取命令成功的回复主题
#define ONENET_TOPIC_PROP_GET_REPLY "$sys/" mqtt_pubid "/" mqtt_devid "/cmd/response/+/+" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/get_reply"
 
//这是post上传数据使用的模板
#define ONENET_POST_BODY_FORMAT "{\"id\":%d,\"dp\":%s}"
//#define ONENET_POST_BODY_FORMAT
int postMsgId = 0; //记录已经post了多少条


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

}


//向主题发送模拟的温湿度数据
void sendTempAndHumi()
{
  if (client.connected())
  {
    //先拼接出json字符串
    char param[82];
    char jsonBuf[178];
    //sprintf(param, "{ \"temp\":[{\"v\":%.2f}],\"humi\":[{\"v\":%.2f}] }", temp, humi); //我们把要上传的数据写在param里
    sprintf(param, "{ \"dis\":[{\"v\":%.2f}] }", dis); //我们把要上传的数据写在param里
    postMsgId += 1;
    sprintf(jsonBuf, ONENET_POST_BODY_FORMAT, postMsgId, param);
    //再从mqtt客户端中发布post消息
    if (client.publish(ONENET_TOPIC_PROP_POST, jsonBuf))
    {
      Serial.print("Post message to cloud: ");
      Serial.println(jsonBuf);
    }
    else
    {
      Serial.println("Publish message to cloud failed!");
    }
  }

}


//重连函数, 如果客户端断线,可以通过此函数重连
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 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();
 
  if (strstr(topic, ONENET_TOPIC_PROP_SET))
  {
    DynamicJsonDocument doc(100);
    DeserializationError error = deserializeJson(doc, payload);
    if (error)
    {
      Serial.println("parse json failed");
      return;
    }
    JsonObject setAlinkMsgObj = doc.as<JsonObject>();
    serializeJsonPretty(setAlinkMsgObj, Serial);
    String str = setAlinkMsgObj["id"];
    Serial.println(str);
    char sendbuf[100];
    sprintf(sendbuf, "{\"id\": \"%s\",\"code\":200,\"msg\":\"success\"}", str.c_str());
    Serial.println(sendbuf);
    client.publish(ONENET_TOPIC_PROP_SET_REPLY, sendbuf);
  }
  if (strstr(topic, ONENET_TOPIC_PROP_GET))
  {
    DynamicJsonDocument doc(100);
    DeserializationError error = deserializeJson(doc, payload);
    if (error)
    {
      Serial.println("parse json failed");
      return;
    }
    JsonObject setAlinkMsgObj = doc.as<JsonObject>();
    serializeJsonPretty(setAlinkMsgObj, Serial);
    String str = setAlinkMsgObj["id"];
    Serial.println(str);
    char sendbuf[100];
    //sprintf(sendbuf, "{\"id\": \"%s\",\"code\":200,\"msg\":\"success\",\"data\":{\"temp\":%.2f,\"humi\":%.2f}}", str.c_str(), temp, humi);
    sprintf(sendbuf, "{\"id\": \"%s\",\"code\":200,\"msg\":\"success\",\"data\":{\"dis\":%.2f }}", str.c_str(), temp);
    Serial.println(sendbuf);
    client.publish(ONENET_TOPIC_PROP_GET_REPLY, sendbuf);
  }
}


void update_date(void)
{
  temp++;
  humi++;
  dis++;
  }

 
 

void setup() {
  // put your setup code here, to run once:


  Serial.begin(115200); //初始化串口
  //Wire.begin();
  //sht20.begin();
  delay(3000);
  setupWifi();                                           //调用函数连接WIFI
  client.setServer(mqtt_server, port);                   //设置客户端连接的服务器,连接Onenet服务器, 使用1883端口
  delay(2000);
  Serial.println("setServer Init!"); 
  //client.setCallback(callback);
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  delay(2000);
  Serial.println("connect Init!"); 
  
  if (client.connected())
  {
    Serial.println("OneNet is connected!"); //判断以下是不是连好了.
  }
  client.subscribe(ONENET_TOPIC_PROP_SET);
  client.subscribe(ONENET_TOPIC_PROP_GET);
  client.setCallback(callback);
  tim1.attach(8, sendTempAndHumi); //定时每20秒调用一次发送数据函数sendTempAndHumi
  tim2.attach(4, update_date);
  temp =10;
  humi =20;
  dis = 100;
}
int count = 0;

void loop() {
  // put your main code here, to run repeatedly:

  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
    delay(100);
  }
  client.loop(); //客户端循环检测

 
 
}


3、实现效果

Arduino IDE串口读取数据:
在这里插入图片描述

云平台接收的数据:
在这里插入图片描述

  • 55
    点赞
  • 368
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
### 回答1: STM32使用ESP8266连接OneNET使用MQTT协议的步骤如下: 1. 首先,确保STM32和ESP8266之间的硬件连接正确。将ESP8266的TX引脚连接到STM32的RX引脚,将ESP8266的RX引脚连接到STM32的TX引脚,并将GND引脚连接到共地。 2. 接下来,需要编写STM32的固件代码。首先,需要初始化串口通信接口,并将其配置为与ESP8266的通信接口相匹配。其次,需要配置STM32的GPIO引脚,将其用于控制ESP8266的工作模式切换(例如,将ESP8266切换到STA模式或AP模式)。然后,使用串口通信接口与ESP8266进行AT指令的交互,以设置ESP8266的连接参数和网络配置。最后,使用STM32的MQTT库来实现与OneNET连接和数据传输。 3. 在ESP8266上,需要使用AT指令配置ESP8266的网络连接MQTT参数。可以使用AT+CWMODE指令将ESP8266切换到STA模式,并使用AT+CWJAP指令连接到WiFi网络。然后,使用AT+CIPSTART指令建立与OneNETMQTT服务器的连接,并使用AT+CIPSEND指令发送MQTT消息。 4. 一旦STM32成功连接OneNETMQTT服务器,就可以使用STM32的MQTT库来发送和接收数据。可以使用MQTT的发布(Publish)和订阅(Subscribe)功能,向OneNET发送数据或接收来自OneNET的数据。 总结来说,使用STM32连接OneNETMQTT服务器需要进行硬件连接和固件代码的编写,而ESP8266则需要使用AT指令配置网络连接MQTT参数。之后,STM32可以使用MQTT库来实现与OneNET的数据传输。 ### 回答2: 要使用STM32与ESP8266连接OneNet并使用MQTT协议,我们可以采取以下步骤: 1. 在STM32上配置串口通信:将STM32通过UART配置为与ESP8266进行串口通信的方式。设置合适的波特率、数据位、停止位和奇偶校验位等。 2. 连接ESP8266和STM32:根据ESP8266的硬件连接方式(一般为串口连接),将ESP8266的TX线连接到STM32的RX线,将ESP8266的RX线连接到STM32的TX线。还需将ESP8266的VCC和GND引脚分别连接到STM32的电源线和地线。 3. 配置ESP8266连接OneNet:ESP8266需要连接OneNet,并使用MQTT协议进行通信。通过AT指令,配置ESP8266的WiFi连接,设置SSID和密码。然后使用AT+CIPSTART指令连接OneNetMQTT服务器。 4. 配置STM32发送和接收数据:在STM32上配置串口发送和接收功能,以便与ESP8266进行通信。使用UART发送指令字节流给ESP8266并接收ESP8266的响应。 5. 使用MQTT协议与OneNet通信:在STM32上通过串口向ESP8266发送MQTT协议指令,例如建立连接(CONNECT),订阅主题(SUBSCRIBE),发布消息(PUBLISH),取消订阅(UNSUBSCRIBE)等。根据需求进行合适的MQTT操作。 6. 处理OneNet的响应和数据:在STM32上解析和处理来自OneNet的响应和数据。根据MQTT协议,您可以接收和解析来自OneNet的订阅消息。 通过以上步骤,您就可以在STM32上使用ESP8266连接OneNet并使用MQTT协议进行通信和数据传输。 ### 回答3: STM32是一种常用的微控制器,而ESP8266是一种常用的Wi-Fi模块。这两者可以结合使用,通过使用MQTT协议连接OneNet平台。 首先,我们需要在STM32上配置USART或SPI接口与ESP8266通信。然后,我们可以使用AT指令集来与ESP8266进行通信。通过发送相应的AT指令,我们可以实现与ESP8266的Wi-Fi连接。这将使STM32具备互联网连接功能。 接下来,我们需要使用MQTT协议与OneNet平台进行连接。我们可以使用一个MQTT客户端库,例如MQTTFX或Paho,来处理MQTT通信。在STM32上,我们可以使用相应的库或手动实现MQTT协议来处理与OneNet的通信。 在连接OneNet之前,我们需要在OneNet平台上创建一个设备,并获取相应的设备ID和API密钥。这些信息将用于在我们的STM32代码中进行身份验证和连接。 一旦连接OneNet,我们可以通过使用MQTT发布者/订阅者机制在设备和OneNet之间进行通信。我们可以发布传感器数据或接收来自OneNet的命令。这样,我们可以实现远程监控和控制功能。 在代码实现方面,我们需要处理与ESP8266的通信、MQTT协议的处理以及与OneNet的通信。我们可以使用适当的库和API来简化代码实现过程。 综上所述,通过将STM32与ESP8266和OneNet相结合,使用MQTT协议进行通信,我们可以实现STM32与OneNet平台之间的连接和数据传输。这为物联网应用提供了一个便捷的方式,使得我们可以远程监控和控制STM32设备。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iNBC

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

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

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

打赏作者

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

抵扣说明:

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

余额充值