You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32中MQTT JSON payload的'on/off'转布尔值用于IF判断问题

问题分析与解决方案

你的问题出在JSON解析时的类型不匹配:MQTT payload里的state是字符串类型的"on",但你代码里直接把它赋值给了bool类型的变量。ArduinoJson库在将字符串转布尔值时,只有"true"、"1"这类值会被解析为true,"on"会被解析为false,所以你的if(state == true)条件永远不会触发。

修正后的代码

void callback(char* topic, byte* payload, unsigned int length) {
  // 给payload添加空字符结尾,确保字符串处理正常
  payload[length] = '\0';
  String payloadStr = String((char*)payload);

  StaticJsonDocument<256> doc;
  DeserializationError error = deserializeJson(doc, payloadStr);
  
  // 检查JSON解析是否成功
  if (error) {
    Serial.print("JSON解析失败: ");
    Serial.println(error.c_str());
    return;
  }

  // 将state解析为字符串,再与"on"做比较
  const char* state = doc["state"];
  int lightlevel = doc["lightlevel"];
 
  if (strcmp(state, "on") == 0) {
    // 此处执行你需要的操作
    Serial.println("state为on,触发操作");
  }
}

关键注意事项

  • 确保MQTT payload是合法JSON格式:正确格式应为{"state": "on", "lightlevel": 1500}(键名需加双引号),否则JSON解析会失败。
  • 处理payload时先添加空字符结尾,避免字符串操作出现乱码。
  • 增加解析错误判断,方便快速排查解析失败的问题。

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:39:53