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("数据上传失败");
}
}