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

Node.js中MQTT消息解析问题:无法获取Shelly开关state值

解决Shelly MQTT消息中带冒号键的state提取问题

排查方向与解决步骤

  • 确认消息已转为JSON对象
    大概率是你拿到的MQTT消息还是原始字符串,没做JSON解析。先把payload转为字符串再解析成JavaScript对象,否则msgObject.params不是真正的对象,自然找不到input:0键:

    client.on('message', (topic, payload) => {
      // 先完成字符串转JSON对象的步骤
      const msgObject = JSON.parse(payload.toString());
      // 再尝试获取state值
      const switchState = msgObject.params?.["input:0"]?.state;
      console.log(switchState);
    });
    
  • 验证键名的准确性
    直接打印msgObject.params的所有键,确认input:0是否存在,避免键名拼写错误(比如是不是写成了inputs:0):

    console.log("Params下的所有键:", Object.keys(msgObject.params));
    
  • 用可选链操作符做防御性处理
    即使键不存在,也不会抛出TypeError,而是返回undefined,方便后续判断:

    const state = msgObject.params?.["input:0"]?.state;
    if (state !== undefined) {
      console.log("当前开关状态:", state);
    } else {
      console.log("未找到目标状态值,请检查消息结构");
    }
    

完整可运行示例

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://你的MQTT broker地址');

client.on('connect', () => {
  client.subscribe('shellyplus1-08b61fd9e540/events');
});

client.on('message', (topic, payload) => {
  try {
    const msgObject = JSON.parse(payload.toString());
    const switchState = msgObject.params?.["input:0"]?.state;
    
    if (switchState !== undefined) {
      console.log(`Shelly开关状态: ${switchState}`);
    } else {
      console.log("无法获取开关状态,完整消息结构如下:");
      console.log(msgObject);
    }
  } catch (err) {
    console.error("解析MQTT消息失败:", err);
  }
});

内容的提问来源于stack exchange,提问作者Jörg jogypilot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:15:00