node js setinterval在连接时不与mqtt客户端一起使用

时间:2015-06-25 04:27:40

标签: node.js setinterval mqtt

我有以下代码每3秒发布一次MQTT broker,但它不起作用:

var mqtt    = require('mqtt');
var client  = mqtt.connect('mqtt://test.mosquitto.org');
var topic   = 'test-topic';   

client.on('connect', function () {
    client.subscribe(topic);

    setInterval(function() {
        client.publish(topic, Date.now().toString());
        console.log('hello');
    }, 3000);
});

client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString());
  client.end();
});

我可以看到每3秒打印一次hello消息,但不会发送mqtt已发布的date消息。

如果我删除了setInterval功能并改为使用client.publish(...),则只会发布一次并退出。

更新

删除client.end()后,它按预期工作。

2 个答案:

答案 0 :(得分:1)

client.on('message')中,您需要删除client.end(),因为mqtt在收到第一条消息时已完成。

答案 1 :(得分:0)

我认为 Settawat Janpuk 的答案就是您正在寻找的答案。

但是,您也可以使用一个模块,让您以声明方式每 x 毫秒在 mqtt 上发布一次:

const mqttNow = require('mqtt-now');

const options = {
  host: 'localhost',
  interval: 500,
  actions: [
    {
      topic: 'public',
      message: 'messaggio'
    },
    {
      topic: 'random',
      message: () => ( 'random ' + Math.random() )
    }
  ]
}

mqttNow.publish(options);