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
相关产品推荐
相关产品推荐

