NodeMCU ESP8266向Ubidots发送多变量无数据问题求助
问题排查与解决方案
核心错误原因
你的payload拼接逻辑错误,生成的JSON格式非法,Ubidots平台无法正常解析,因此返回“未找到信息”提示,具体错误点如下:
- 拼接第二个变量时直接覆盖了已写入的第一个变量内容:完成第一个变量
ecgmoy的内容写入后,代码直接调用sprintf(payload, "{\"%s\":", VARIABLE_LABEL_2);,sprintf会清空目标字符串原有内容再写入,直接丢失了第一个变量的数据。 - 变量间缺少JSON要求的逗号分隔符,就算未覆盖内容,多个键值对无分隔也会导致JSON解析失败。
修正后的代码
将原有数据发送段的payload拼接逻辑替换为以下内容即可:
dtostrf(ecgmoy, 4, 2, str_val_1); dtostrf(spo2, 4, 2, str_val_2); dtostrf(heartRate, 4, 2, str_val_3); // 拼接topic sprintf(topic, "%s", ""); sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); // 按合法JSON格式拼接payload sprintf(payload, "%s", ""); sprintf(payload, "{\"%s\": {\"value\": %s},", VARIABLE_LABEL_1, str_val_1); sprintf(payload, "%s \"%s\": {\"value\": %s},", payload, VARIABLE_LABEL_2, str_val_2); sprintf(payload, "%s \"%s\": {\"value\": %s}}", payload, VARIABLE_LABEL_3, str_val_3); // 调试用:串口打印payload校验格式,调试完成后可删除 Serial.print("生成的payload:"); Serial.println(payload); Serial.println("Publishing data to Ubidots Cloud"); client.publish(topic, payload); client.loop(); delay(10);
额外注意事项
需要保证定义payload字符数组的长度足够容纳所有拼接后的内容,避免缓冲区溢出导致数据异常。
内容的提问来源于stack exchange,提问作者Rahma ahmed
相关产品推荐
相关产品推荐

