jsmds123 2025-03-01 16:46 采纳率: 66.7%
浏览 43

esp8266使用arduino ide无法上传数据到OneNet云平台

esp8266使用arduino ide无法上传数据到OneNet云平台,wifi正常连接,MQTT服务器也正常连接,从Arduino接收的数据也正常显示,但是没有上传到OneNet平台,是我的代码有问题吗,串口监视器既不显示数据已上传,又不显示上传失败,仿佛没有这段代码一样

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

// 配置参数
#define WIFI_SSID "XiaoMi"
#define WIFI_PASSWORD "123456789"
#define MQTT_SERVER "183.230.40.96"
#define MQTT_PORT 1883
#define PRODUCT_ID "P5ihOds4cx"
#define DEVICE_ID "hx711"
#define API_KEY "version=2018-10-31&res=products%2FP5ihOds4cx%2Fdevices%2Fhx711&et=1803811076&method=md5&sign=MYvBpbiX%2BqK2NuBcoaC%2FYQ%3D%3D"  

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);  // 与Arduino波特率一致
  connectWiFi();
  client.setServer(MQTT_SERVER, MQTT_PORT);
}

void loop() {
  maintainConnections();
  
  if (Serial.available()) {
    String rawData = Serial.readStringUntil('\n');
    if (validateData(rawData)) {
      sendToOnenet(rawData);
    }
  }
  client.loop();
}

// WiFi连接
void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("连接WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功");
}

// 维持网络连接
void maintainConnections() {
  if (WiFi.status() != WL_CONNECTED) connectWiFi();
  if (!client.connected()) reconnectMQTT();
}

// MQTT重连
void reconnectMQTT() {
  String clientId = DEVICE_ID;
  while (!client.connected()) {
    if (client.connect(clientId.c_str(), PRODUCT_ID, API_KEY)) {
      Serial.println("MQTT连接成功");
    } else {
      Serial.print("MQTT连接失败,错误码: ");
      Serial.println(client.state());
      delay(5000);
    }
  }
}

// 校验数据格式
bool validateData(String rawData) {
  return rawData.startsWith("{") && rawData.endsWith("}");
}

// 发送数据到OneNet(核心修改部分)
void sendToOnenet(String jsonData) {
  DynamicJsonDocument doc(256);
  deserializeJson(doc, jsonData);

  // 构建符合要求的JSON格式
  DynamicJsonDocument payload(512);
  payload["id"] = 123;  // 设备标识

  JsonObject dp = payload.createNestedObject("dp");
  
  // 添加各数据流(示例格式:{"weight":[{"v":46}]})
  addDataPoint(dp, "weight", doc["weight"]);
  addDataPoint(dp, "dht11_w", doc["temperature"]);
  addDataPoint(dp, "dht11_s", doc["humidity"]);
  addDataPoint(dp, "distance", doc["distance"]);

  // 发布数据
  char buffer[512];
  serializeJson(payload, buffer);
  String topic = "$sys/" + String(PRODUCT_ID) + "/" + DEVICE_ID + "/dp/post/json";
  
  if (client.publish(topic.c_str(), buffer)) {
    Serial.print("数据已上传: ");
    Serial.println(buffer);
  } else {
    Serial.println("数据上传失败");
  }
}

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-03-01 16:46
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    ESP8266使用Arduino IDE无法上传数据到OneNet云平台

    你遇到的问题是,使用Arduino IDE连接ESP8266,WiFi连接正常,MQTT服务器连接正常,数据从Arduino接收也正常显示,但是数据无法上传到OneNet云平台。

    可能的解决方案:

    1. 检查OneNet云平台的API Key和Secret Key是否正确。
    2. 检查Arduino IDE的网络设置是否正确,确保WiFi连接和MQTT服务器连接正确。
    3. 检查数据上传代码是否正确,确保数据格式和内容正确。
    4. 检查OneNet云平台的数据上传限制是否存在,例如数据大小、频率等限制。

    核心代码:

    #include <WiFi.h>
    #include <PubSubClient.h>
    
    // OneNet云平台的API Key和Secret Key
    const char* apiKey = "your_api_key";
    const char* apiSecret = "your_api_secret";
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    void setup() {
      Serial.begin(115200);
      WiFi.begin("your_wifi_ssid", "your_wifi_password");
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
      }
      Serial.println("Connected to WiFi");
      client.setServer("iot.one.net", 1883);
    }
    
    void loop() {
      // 发送数据到OneNet云平台
      String data = "your_data";
      client.publish("your_topic", data);
      delay(1000);
    }
    

    请注意,需要将API Key和Secret Key替换为你的OneNet云平台的API Key和Secret Key。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日