arduino开发esp32 eth mqtt数据传输

超声波传感器返回距离数值,小于50厘米,将数据上传至mqtt服务器(有链接说明)esp32 开发板插网线款用arduino 开发

我可以把原程序发给你在上面加一下mqtt和网线直连(代码都有)就可以了,发过来我刷一下机直接测

img

img

我自己解决了,你们发的都没有用。

这个可以试试

#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(); //客户端循环检测

}
不知道你这个问题是否已经解决, 如果还没有解决的话:

  • 您还可以看一下 可用行师老师的物联网即时通信架构实现与实战课程中的 MQTT控制报文剩余长度编码及解码算法解释2小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    这里是一个示例代码,用于将超声波传感器的数据上传到MQTT服务器。请将代码添加到您的项目中,并根据您的需求进行适当的修改。

    首先,您需要包含所需的库和定义一些常量。例如:

    #include <WiFi.h>
    #include <PubSubClient.h>
    
    const char* ssid = "YourWiFiSSID";
    const char* password = "YourWiFiPassword";
    const char* mqttServer = "mqtt://39.96.35.207";
    const int mqttPort = 1883;
    

    然后您需要定义一个MQTT客户端对象,并设置回调函数来处理MQTT事件:

    WiFiClient espClient;
    PubSubClient client(espClient);
    
    void mqttCallback(char* topic, byte* payload, unsigned int length) {
      // 处理接收到的MQTT消息
    }
    
    void setup() {
      // 初始化超声波传感器和其他组件
    
      // 连接WiFi
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
      }
    
      // 连接MQTT服务器
      client.setServer(mqttServer, mqttPort);
      client.setCallback(mqttCallback);
      while (!client.connected()) {
        if (client.connect("ESP32_Client")) {
          Serial.println("Connected to MQTT server");
        } else {
          Serial.print("Failed to connect to MQTT server, rc=");
          Serial.print(client.state());
          Serial.println(" Retrying...");
          delay(2000);
        }
      }
    
      // 订阅主题
      client.subscribe("topic");
    }
    

    接下来,您可以在您的循环函数中读取超声波传感器的数据,并在满足条件时将其上传到MQTT服务器:

    void loop() {
      // 读取超声波传感器的数据
      float distance = getDistance();
    
      // 检查数据是否小于50厘米
      if (distance < 50) {
        // 转换数据为字符串
        char payload[10];
        sprintf(payload, "%.2f", distance);
    
        // 发布数据到MQTT服务器
        client.publish("topic", payload);
      }
    
      // 处理MQTT事件
      client.loop();
    }
    

    以上是一个简单的示例代码,用于将超声波传感器的数据上传到MQTT服务器。请根据您的项目需求进行适当的调整,并确保正确配置WiFi和MQTT服务器的参数。如果您遇到问题或需要更详细的解决方案,请告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这种程序没有实际的硬件很难调试的

首先,您需要确保您的ESP32开发板上已经安装了MQTT库和以太网库。以下是一个示例代码,展示了如何使用已安装库连接到MQTT服务器并将超声波传感器数据上传:

#include <WiFi.h>
#include <PubSubClient.h>
#include <Ethernet.h> // 以太网库
#include <Adafruit_Sensor.h>
#include <Adafruit_US100.h> // 超声波传感器库

// WiFi网络凭据
const char* ssid = "您的WiFi名称";
const char* password = "您的WiFi密码";

// MQTT服务器凭据
const char* mqttServer = "mqtt服务器IP地址";
const int mqttPort = 1883;
const char* mqttUsername = "您的MQTT用户名";
const char* mqttPassword = "您的MQTT密码";
const char* mqttTopic = "您的MQTT主题";

// 超声波传感器引脚
const int trigPin = 2;
const int echoPin = 3;

// 创建超声波传感器实例
Adafruit_US100 us100(trigPin, echoPin);

// 创建以太网客户端实例
EthernetClient ethClient;

// 创建MQTT客户端实例
PubSubClient mqttClient(ethClient);

void setup() {
  // 初始化串口
  Serial.begin(115200);

  // 连接WiFi网络
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("连接到WiFi网络...");
  }
  Serial.println("已连接到WiFi网络");

  // 连接MQTT服务器
  mqttClient.setServer(mqttServer, mqttPort);
  mqttClient.setCallback(callback);
  while (!mqttClient.connected()) {
    if (mqttClient.connect("ESP32Client", mqttUsername, mqttPassword)) {
      Serial.println("已连接到MQTT服务器");
    } else {
      Serial.print("连接到MQTT服务器失败,错误码: ");
      Serial.println(mqttClient.state());
      delay(2000);
    }
  }

  // 初始化超声波传感器
  us100.begin();
}

void loop() {
  // 获取超声波传感器测量值
  float distance = us100.readDistance();
  
  // 如果距离小于50厘米,则上传数据到MQTT服务器
  if (distance < 50) {
    char payload[10];
    snprintf(payload, sizeof(payload), "%.2f", distance);
    mqttClient.publish(mqttTopic, payload);
    Serial.println("已上传数据到MQTT服务器");
  }

  // 在循环中保持MQTT连接
  if (!mqttClient.connected()) {
    reconnect();
  }
  mqttClient.loop();
}

void reconnect() {
  while (!mqttClient.connected()) {
    if (mqttClient.connect("ESP32Client", mqttUsername, mqttPassword)) {
      Serial.println("已重新连接到MQTT服务器");
      break;
    } else {
      Serial.print("重新连接到MQTT服务器失败,错误码: ");
      Serial.println(mqttClient.state());
      delay(2000);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  // 处理接收到的MQTT消息
  // 在这里添加您的逻辑代码
}

请根据您的具体情况修改上述代码中的WiFi凭据、MQTT服务器凭据以及传感器引脚。该代码中使用的是基于Ethernet库的以太网连接,因此您需要将以太网模块正确连接到ESP32开发板。

希望这可以帮助您实现所需的功能。如果您有任何进一步的问题,请随时提问。

使用Arduino开发ESP32(六):基于arduino的ESP32,连接MQTT服务器,发送,接收消息;与MQTT服务器的搭建,
可以参考下这个例子


玩转 ESP32 + Arduino (十三) 通过MQTTs协议上传数据至OneNet云平台_finedayforu的博客-CSDN博客 这里我们使用了一个库: PubSubClientOneNet服务器地址:开发者文档: https://open.iot.10086.cn/doc/mqtt/token生成工具: https://open.iot.10086.cn/doc/mqtt/book/manual/auth/tool.html一. OneNet上创建MQTTs协议产品1. 添加..._esp32采集到的数据上传mqtt云端 arduino https://blog.csdn.net/finedayforu/article/details/108510293

可以,我写的有

可以参考资料实现:
ESP32连接OneNET-MQTT平台上传送数据:https://blog.csdn.net/qq_40700822/article/details/116640694
玩转 ESP32 + Arduino (十二) 通过MQTT协议上传数据至OneNet云平台:https://blog.csdn.net/finedayforu/article/details/108485481

可以通过MQTT库来做

没有真机,不好开发测试