我有一个使用MQTT发布者和订阅节点以及一个代理配置的工作流程。一切正常。
启动NodeRED之前,我必须使用环境变量MQTT_BROKER_IP
和MQTT_BROKER_PORT
更改MQTT代理ip和端口。
我使用的是
sed -i -e "s/^\([[:blank:]]*\"broker\":[[:blank:]]*\)\"[^\"]*\",/\1\"$MQTT_BROKER_IP\",/g" /data/flows.json
sed -i -e "s/^\([[:blank:]]*\"port\":[[:blank:]]*\)\"[^\"]*\",/\1\"$MQTT_BROKER_PORT\",/g" /data/flows.json
替换有效。
现在,问题是,当NodeRED启动时,日志文件中有错误:
[info] Starting flows
[error] [mqtt out:2b1fba1a.efa24e] missing broker configuration
[error] [mqtt in:58c7bd6b.0e8664] missing broker configuration
当我进入NodeRED编辑器时,打开MQTT节点,保存它们而不进行任何修改并部署流程,一切正常,并且MQTT节点显示绿色的“已连接”指示灯。
为什么会这样?如何在NodeRED外部正确修改flows.json?
问题是流中的多个条目将json字段broker
用于不同的事物。例如
您要编辑的mqtt-broker
配置节点:
{
"id": "c2ba2a60.80ae38",
"type": "mqtt-broker",
"z": "",
"name": "",
"broker": "192.168.1.116",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
}
和mqtt-in
节点:
{
"id": "98d0e95b.c28c2",
"type": "mqtt in",
"z": "a4de5120.cd3f58",
"name": "",
"topic": "#",
"qos": "0",
"datatype": "auto",
"broker": "c2ba2a60.80ae38",
"x": 190,
"y": 80,
"wires": [
[]
]
}
如您所见,当您运行sed脚本时,它还将更改broker
指向mqtt-in
的mqtt-broker
节点中的条目。
打开/保存可能有效,因为您仅定义了一个mqtt-broker
,因此将默认在列表中选择它,因此在部署时会修复该条目。
[如果您想做这种事情,您将需要更复杂的东西,它知道要更新的每个JSON条目中的type
条目。