利用onenet mqtt协议 ,ESP32上传温湿度数据流成功(arduinoIDE)[开发日志]

本文讲述了开发者在使用ESP32通过OneNet平台远程控制LED和继电器过程中遇到的挑战,如MQTT协议接入、数据流上传和可视化按键问题。作者分享了解决这些问题的方法,以及OneNet可视化界面的功能限制。
摘要由CSDN通过智能技术生成

目标:开发esp32通过onenet平台远程控制LED、继电器等其它设备,并利用onenet可视化功能开发出一个简单的控制页面。

原以为能够快速完成,没想到接入mqtt协议、数据流上传、可视化按键都不同程度遇到了问题,还好经过一番查找和修改,终于初步完成了前两个功能,可视化按键是因为我需要远程控制继电器,刚开始时,一直无数据流可选择。没想到需要通过数据流来进行,所以需要在代码创建一个数据3laig流,虽然我在onenet平台也创建数据流,但在可视化界面一直不显示。明天在尝试一下新的方法。

发现有许多网友其实也不太清楚怎么连接onenet,我也是站在前人的基础上摸索了好久。

这几天一直在上班,没有太多来深入,一直利用下班时间来完成,续更中。。。。。。

 

 

1、参考链接:ESP32+MQTT+OneNet上报数据点+平台命令控制LED - Arduino专区 - OneNET设备云论坛 (10086.cn)

2、参考代码: 

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
//#include <ArduinoJson.h>
#include "DHT.h"

#define DHTPIN 5      // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
#define BUILTIN_LED 21

// Update these with values suitable for your network.

const char *ssid = "Oppo-Xu";        //wifi名
const char *password = "123456ABC";      //wifi密码
const char *mqtt_server ="183.230.40.96"; //onenet 的 IP地址

const char *clientid = "smartlight";//OneNet注册设备的“设备名称”
const char *userid = "ze3xOCB42t";//OneNet 注册的MQTT产品的“产品ID”
const char *mqtt_password ="version=2018-10-31&res=products%2Fze3xOCB42t%2Fdevices%2Fsmartlight&et=1923199463&method=md5&sign=uG4snxEt7s%2Bqi55uPtCtxA%3D%3D";//OneNet 注册的MQTT产品的“产品ID”

char outTopic[] = "$sys/ze3xOCB42t/smartlight/dp/post/json";//数据上传的Topic,格式为“$sys/userid/clientid/dp/post/json”
char inTopic[] = "$sys/ze3xOCB42t/smartlight/dp/post/json/+";//数据返回的Topic,格式为“$sys/userid/clientid/dp/post/json/+”
char cmdTopic[] = "$sys/ze3xOCB42t/smartlight/cmd/#";//接收平台命令的TOPIC,格式为“$sys/userid/clientid/cmd/#”
int switch0 = 0;//开关状态

DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
//数据上报格式模板,按网上例程的不成功,只能按下列格式,有Temperatrue、Humidity、switch0三个数据点
char dataTemplete[] = "{\"id\":1,\"dp\":{\"Temperatrue\":[{\"v\":%5.1f}],\"Humidity\":[{\"v\":%d}],\"switch0\":[{\"v\":%d}]}}";
char msgJson[100];//上传的数据
int h = 10;

void setup_wifi()
{
    delay(10);
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    randomSeed(micros());
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    //  digitalWrite(BUILTIN_LED, HIGH);
}

//收到订阅Topic信息的回调处理
void callback(char *topic, byte *payload, unsigned int length)
{
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    for (int i = 0; i < length; i++)
    {
        Serial.print((char)payload[i]);
    }
    Serial.println();

    // 平台发来命令“1”时开灯
    if ((char)payload[0] == '1')
    {
        switch0 = 1;
        //digitalWrite(BUILTIN_LED, HIGH);
    }
    else
    {
        switch0 = 0;
        //digitalWrite(BUILTIN_LED, LOW);
    }
    digitalWrite(BUILTIN_LED, switch0);
}

void reconnect()
{
    //循环连接
    while (!client.connected())
    {
        Serial.print("Attempting MQTT connection...");
        if (client.connect(clientid, userid, mqtt_password))
        { 
            Serial.println("connected");
            //订阅inTop的消息,上报数据后平台自动发来的
            //client.unsubscribe (inTopic);        
            client.subscribe(cmdTopic); //订阅平台发来命令消息
        }
        else
        {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            // Wait 5 seconds before retrying
            delay(5000);
        }
    }
}

void setup()
{
    pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output, where do it esp32 get gpio21 as led
    Serial.begin(115200);
    setup_wifi();
    client.setServer(mqtt_server, 1883); //按OneNet开发文档设置端口为1883
    client.setCallback(callback);
    //dht.begin();
}

void loop()
{

    if (!client.connected())
    {
        reconnect();
    }
    client.loop();
    long now = millis();
    if (now - lastMsg > 2000)
    {
        
        float t = 15.5;
        lastMsg = now;
        sprintf(msgJson, dataTemplete, t, h, switch0);//按模板格式化上传数据到msgJson
        Serial.print("Publish message: ");
        Serial.println(msgJson);
        client.publish(outTopic, msgJson);//上传
                
    }
    h=h+2;    
}

3、问题日志:

  • 在可视化界面通过按钮发送信息无反应

查看设备日志,很明显数据发送失败,这里报错原因说我没有订阅主题,可我代码里已经有订阅接收命令的主题。 

但我在命令下发处却成功了。

 根据询问技术人员得知,新版的ONENET可视化界面只提供数据流上传功能,无法提供命令下发功能,除非是旧手机号注册的账号,最好18年之前的,这是一个大遗憾呢,它们功能还没有开发完善。

### 回答1: 要连接OneNet MQTT,您需要使用ESP8266的MQTT库,并在代码中设置正确的OneNet MQTT服务器地址和端口。您还需要在OneNet平台上创建一个设备,并获取设备的API密钥。然后,您可以使用ESP8266的MQTT库将设备连接到OneNet MQTT服务器,并使用API密钥进行身份验证。一旦连接成功,您可以使用MQTT协议发布和订阅OneNet平台上的数据。 ### 回答2: ESP8266是一款广泛使用的物联网芯片,它能够通过Wi-Fi实现与云端数据交换、控制等功能。而OneNet是其中一款常用的云平台,也支持MQTT协议,可用于连接ESP8266。 要连接ESP8266和OneNet MQTT,需要以下步骤: 1. 注册OneNet账户并创建设备和数据流 先在OneNet平台注册账户并新建设备,为该设备添加数据流。每个数据流都有自己的Topic,后面需要用到。同时,该设备要能够接收和发送MQTT消息。 2. 安装MQTT库和ESP8266库 要连接ESP8266和OneNet MQTT,需要使用MQTT库和ESP8266库。其中MQTT库可以通过Arduino IDE中的库管理器下载,而ESP8266库需要手动下载并导入IDE中。 3. 编写代码 在Arduino IDE中编写代码,包括导入库、定义Wi-Fi接入点、MQTT连接信息等,最后通过mqttClient.publish方法发布消息。 4. 部署代码 将编写好的代码上传到ESP8266开发板,通过串口或OTA方式部署即可。 以上就是连接ESP8266和OneNet MQTT的步骤。需要注意的是,连接过程中可能会遇到一些问题,比如Wi-Fi连接、MQTT认证等问题。这时可以参考OneNet平台提供的开发文档,或者在论坛上寻求帮助。同时,建议将消息结构化,以方便在OneNet平台上展示和处理。 ### 回答3: ESP8266是一种高度集成的Wi-Fi芯片,可以方便地连接到云平台,例如OneNetOneNet是一个基于云平台的物联网综合服务平台,提供物联网数据的连接、存储、管理和应用等多项服务,为IoT应用提供最全面的技术支持和服务。 MQTT(Message Queuing Telemetry Transport)是一种基于轻量级的发布订阅消息传送协议。在ESP8266中,我们可以使用MQTT异步通信协议进行与OneNet的连接和通信。 在进行ESP8266连接OneNet MQTT之前,我们需要先在OneNet平台上创建我们的设备以及设备所需的数据流,以便后续ESP8266连接到OneNet MQTT以及进行数据传输。同时,在网页端可得到我们设备的ID、APIkey等认证信息。 接下来,我们需要在ESP8266上安装MQTT库和WiFi连接库,并编写代码实现ESP8266与OneNet MQTT的连接和数据传输过程。 下面是一个ESP8266连接OneNet MQTT的示例代码: #include <ESP8266WiFi.h> #include <PubSubClient.h> // WiFi认证信息 const char* ssid = "your_wifi_ssid"; const char* password = "your_wifi_password"; // OneNet认证信息 const char* mqtt_server = "mqtt.heclouds.com"; const int mqtt_port = 6002; const char* mqtt_user = "your_mqtt_username"; const char* mqtt_password = "your_mqtt_password"; const char* pub_topic = "your_device_topic"; IPAddress server(183, 230, 40, 39); // OneNet服务器IP地址 WiFiClient espClient; PubSubClient mqtt_client(espClient); void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(); Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("WiFi connected. IP address: "); Serial.println(WiFi.localIP()); mqtt_client.setServer(server, mqtt_port); mqtt_client.setCallback(callback); } void loop() { if (!mqtt_client.connected()) { Serial.print("Attempting MQTT connection..."); if (mqtt_client.connect("ESP8266Client", mqtt_user, mqtt_password)) { Serial.println("connected"); mqtt_client.subscribe(pub_topic); } else { Serial.print("failed, rc="); Serial.print(mqtt_client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } mqtt_client.loop(); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); if (strcmp(topic,pub_topic)==0) { if ((char)payload[0] == '1') { digitalWrite(LED_BUILTIN, HIGH); } else { digitalWrite(LED_BUILTIN, LOW); } } } 以上是一个简单的ESP8266连接OneNet MQTT的实现步骤和示例代码供参考。在实际应用中,还需要根据需求进行调整以及安全性的考虑,例如加入SSL加密传输等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值