2

我正在使用 Bluemix for IoT 中的 Node-RED。

如何解析函数节点中的各个信息(如 cmdmsg 和 tempr),以便可以在流程中的其他节点中使用它?我在尝试时遇到错误(见下文)

当我将其设置为查看完整的消息对象时,我正在接收我在“调试”节点中看到的 JSON 完整消息对象(来自 Node 中的 IoT)。请参阅下面的对象。

在我看来,JSON 格式正确。

我尝试将以下内容放在函数节点中,但我收到一条错误消息“TypeError:无法读取未定义的属性'tempr'”

这是函数参数的内容: return {payload:msg.payload.d.tempr};

这是消息对象

{
   "topic": "iot-2/type/Arduino-tempsensor/id/FFFFFFFFFFFF/evt/status/fmt/json", 
   "payload": "{\n\"d\": {\n\"myName\": \"Arduino CF\",\n\"cmdmsg\": \"Weekly\",\n\"tempr\": -3,\n}\n}", 
   "deviceId": "FFFFFFFFFFFF", 
   "deviceType": "Arduino-tempsensor", 
   "eventType": "status", 
   "format": "json", 
   "_msgid": "ffffffff.55555" 
}

注意:我混淆了设备 ID(mac 地址)和 msgid

关于如何解析数据以及为什么我收到错误的任何想法?

4

2 回答 2

4

抱歉,您的 JSON 有效负载完全搞砸了,它应该如下所示:{"d": {"myName": "Arduino CF","cmdmsg": "Weekly","tempr": -3}} 您不应该在有效负载中看到任何\\n,它们看起来像是来自客户端的转义字符。我还认为 tempr 值之后的最后一个逗号不应该用于有效的 JSON。

我不是 Arduino 专家,但我已经尝试过 Raspberry Pi 和 Mosquitto 客户端,这就是我成功向 IoTF 发送事件的方法: mosquitto_pub -h <org>.messaging.internetofthings.ibmcloud.com -p 1883 -u "use-token-auth" -P "<token>" -i d:<org>:raspi:raspi2 -t iot-2/evt/message/fmt/json -m {"d":{"text":"Hello World"}}

如果paylod 是正确的JSON,您的语句return {payload:msg.payload.d.tempr};将起作用。

你见过这个:http ://www.ibm.com/developerworks/cloud/library/cl-bluemix-arduino-iot2/

于 2015-10-07T07:15:15.413 回答
0

在您尝试访问其字段之前,应将您显示的 JSON 字符串转换为 Javascript 对象。要做到这一点就像将 arduino 输出连接到“JSON”节点一样简单,该节点会为您进行转换(如果字符串不是有效的 JSON,则会引发错误)。

如果要查看 msg 对象的结构,请将 JSON 节点的输出连接到调试节点。例如,如果您只想将 msg.payload 替换为温度值,您也可以将其连接到“更改”节点。您不需要函数节点中的任何自定义 javascript 代码来进行类似的简单更改。

这是您可以导入的示例流程...通过将有效负载粘贴到“模板”节点来模拟 arduino 输出字符串:

[{"id":"1a79abfe.b8abb4","type":"inject","z":"58c​​8eb7a.5496c4","name":"发送输出","topic":"iot-2/type/ Arduino-tempsensor/id/FFFFFFFFFFFF/evt/status/fmt/json","payload":"true","payloadType":"bool","re​​peat":"","crontab":"","once" :false,"onceDelay":0.1,"x":170,"y":2740,"wires":[["9fc678fb.ae18e8"]]},{"id":"69e91778.e0c6e8","type" :"json","z":"58c​​8eb7a.5496c4","name":"","property":"payload","action":"","pretty":false,"x":390," y":2800,"电线":[["d066800f.60a9b","cf991eb1.f2a1a"]]},{"id":"9d8d7da2.2a7da","type":"debug","z":"58c​​8eb7a.5496c4","name":"msg string", “活动”:真,“tosidebar”:真,“控制台”:假,“tostatus”:假,“完成”:“有效负载”,“x”:610,“y”:2740,“电线”:[] },{"id":"9fc678fb.ae18e8","type":"template","z":"58c​​8eb7a.5496c4","name":"arduino string","field":"payload","fieldType ":"msg","format":"json","syntax":"plain","template":"{\n \"d\": {\n \"myName\": \"Arduino CF\ ",\n\"cmdmsg\": \"每周\",\n \"tempr\": -3\n }\n}","输出":"str","x":360,"y":2740,"wires ":[["69e91778.e0c6e8","9d8d7da2.2a7da"]]},{"id":"d066800f.60a9b","type":"change","z":"58c​​8eb7a.5496c4","name ":"提取 tempr","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.d.tempr"," tot":"msg"}],"action":"","property":"","from":"","to":"","re​​g":false,"x":450," y":2860,"wires":[["af730d72.2995a"]]},{"id":"af730d72.2995a","type":"debug","z":"58c​​8eb7a.5496c4","name":"tempr","active":true,"tosidebar":true,"console":false,"tostatus" :false,"complete":"true","x":630,"y":2860,"wires":[]},{"id":"cf991eb1.f2a1a","type":"debug", "z":"58c​​8eb7a.5496c4","name":"msg object","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload" ,"x":610,"y":2800,"电线":[]}]"console":false,"tostatus":false,"complete":"true","x":630,"y":2860,"wires":[]},{"id":"cf991eb1.f2a1a" ,"type":"debug","z":"58c​​8eb7a.5496c4","name":"msg object","active":true,"tosidebar":true,"console":false,"tostatus":假,“完成”:“有效载荷”,“x”:610,“y”:2800,“电线”:[]}]"console":false,"tostatus":false,"complete":"true","x":630,"y":2860,"wires":[]},{"id":"cf991eb1.f2a1a" ,"type":"debug","z":"58c​​8eb7a.5496c4","name":"msg object","active":true,"tosidebar":true,"console":false,"tostatus":假,“完成”:“有效载荷”,“x”:610,“y”:2800,“电线”:[]}]tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":610,"y":2800,"wires":[]}]tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":610,"y":2800,"wires":[]}]

如前所述,由于尾随逗号,您的原始 JSON 字符串无效 - 但可以使用双引号和换行符,只要它们用“\”转义即可。解析字符串时,无论如何都会将它们剥离。

于 2018-04-06T15:07:49.960 回答