mqtt异步等待并发消息,然后响应相应的http发布请求

时间:2019-02-06 12:37:38

标签: javascript node.js http async-await mqtt

我有这个用于家庭自动化项目的过程。

  1. 在HTTP请求中接收到我服务器的消息。
  2. 在上一步中,通过MQTT主题将消息发布到设备。
  3. 等待5秒钟,以通过MQTT主题接收来自设备的响应。
  4. 如果在5秒钟内收到响应,则发送成功响应, 否则,将错误响应发送到步骤1中的原始HTTP请求。

下面是从另一个question提取的代码,因为它与我要尝试执行的操作完全匹配。

此代码一次只能处理一个请求。如何处理并发请求

var resp;
var timeOutValue = 5000; //wait 5 seconds
var timer;

const client = mqtt.connect(MQTTServer)

client.on('message', (topic, message) => {
     resp.send(message);
     client.unsubscribe('inTopic');
     resp = undefined;
     clearTimeout(timer)
}

app.post('/test', function (request, response) {

resp = response;
client.publish ('outTopic' , 'request ');
client.subscribe('inTopic');

  timer = setTimeout(function(){
    if (resp) {
        resp.send(message);
        resp = undefined;
        client.unsubscribe('inTopic');
    }
  }, timeOutValue);

}

我已经尝试过了:

  1. 我正在将HTTP请求正文存储在数据库中并发送一个唯一的 与MQTT请求中存储到设备的记录相对应的ID。
  2. 此唯一ID是作为响应从设备发送回的。
  3. 当通过MQTT收到任何消息时,我检查是否唯一ID为 存在于数据库中并检索记录(如果存在并发送) 基于记录中存在的请求主体的响应。
  4. 我等待5秒钟以获得设备的响应,否则我发送 对HTTP的错误响应。

但是我不知道它是否可以用于并发请求,因为我是nodejs的新手。 这一切都发生在http发布路由处理程序内。

1 个答案:

答案 0 :(得分:0)

export async function scheduleMqtt() {
    var topic= 'office/csb_1';
    var topic1=topic;
    console.log("MQTT is started")
         var client = mqtt.connect(mqtturl, options);
         client.on('connect', mqtt_connect);
         function mqtt_connect() {
            console.log('client has connected successfully');
            client.subscribe(topic, 0, mqtt_subscribe);
            client.on('message', mqtt_messsageReceived);
            console.log(topic);
        };
        function mqtt_subscribe(err, granted) {
            console.log("Subscribed to " + topic);
            if (err) { console.log(err); }
            console.log("Granted:")
            console.log(granted)
    
            client.publish(topic);
            console.log("topic");
            client.on('message', function (topic, message) {
                console.log(message.toString()); //if toString is not given, the message comes as buffer
            });       

        };