Node.js Express+;从POST请求到主题中发布的MQTT
我需要一个Node.js web服务,它接受特定的POST请求,该请求将触发特定MQTT主题中的发布。 我使用Express来监听请求,脚本的这一部分工作得很好。 问题是,我认为它应该在什么时候触发发布主题以执行下行链路。 没有快速部分的代码可以正常工作。因此,Express似乎会干扰MQTT。但是与代理的连接工作正常。只有发布过程不起作用Node.js Express+;从POST请求到主题中发布的MQTT,node.js,express,post,mqtt,Node.js,Express,Post,Mqtt,我需要一个Node.js web服务,它接受特定的POST请求,该请求将触发特定MQTT主题中的发布。 我使用Express来监听请求,脚本的这一部分工作得很好。 问题是,我认为它应该在什么时候触发发布主题以执行下行链路。 没有快速部分的代码可以正常工作。因此,Express似乎会干扰MQTT。但是与代理的连接工作正常。只有发布过程不起作用 var express = require('express'); var bodyParser = require('body-parser'); var
var express = require('express');
var bodyParser = require('body-parser');
var mqtt = require('mqtt')
var fs = require('fs')
var path = require('path')
const util = require('util')
var app = express();
var CERT = //certificate
var PORT = //port
var HOST = // host
var options = {
port: PORT,
host: HOST,
clientId: //client_id
username: //uname
password: //pswd
cert: CERT,
rejectUnauthorized: false,
protocol: 'mqtts'
}
var client;
var jsonParser = bodyParser.json();
var port = process.env.PORT || 8080;
app.use(express.static('public'));
app.get('/', function (req, res) {
res.render(__dirname + "/public/index.html");
})
client = mqtt.connect(options);
client.on("connect", () => {
console.log("MQTT connected");
})
client.on('message', function (topic, message) {
var msg = JSON.parse(message)
console.log("topic: " + topic + " msg:" + util.inspect(msg))
});
app.post('/', jsonParser, function (req, res) {
// Prepare output in JSON format
data = {
dev_id: req.body.dev_id,
pswd: req.body.password,
tx_cycle: req.body.tx_cycle
};
if (data.pswd != "password") {
console.log("Wrong password")
}
else {
console.log(data);
var topic = 'publish_topic';
var tx_cy = data.tx_cycle;
var msg = '{"port":"222","payload":"' + tx_cy + '","confirmed": false,"window":"BOTH","priority":0}';
console.log('Try to send downlink message, for ' + data.dev_id + ' set to ' + data.tx_cycle + ' min -> hex ' + tx_cy);
client.subscribe('reply/+/id/+');
client.publish(topic, msg);
res.status(200).send(msg + " sent to broker");
}
});
var server = app.listen(port, function () {
var host = server.address().address
var port = server.address().port
console.log("App listening at http://%s:%s", host, port)
})
我解决了这个问题。代理拒绝了客户端id,因为它不是唯一的。更改它解决了问题。为什么要在post处理程序中订阅?最好在
client.on('connect',…)
回调中执行一次。将对client.publish()
的调用包装在try-catch块中,以查看是否/为什么失败。没有理由不起作用。谢谢你的建议。我试着用不同的方法来理解这个问题。现在我设法解决了这个问题,没有必要编辑这个问题以将其标记为已解决。返回并将您自己的答案标记为已接受,因为这将更容易在搜索结果中找到。客户端id需要全局唯一,如果您有两个客户端具有相同的客户端id,则第一个客户端将在第二个客户端连接时断开连接。如果您已启用自动重新连接,则它们将重复彼此启动。