【问题标题】:Paho Javascript MQTT subscribe to multiple topicsPaho Javascript MQTT 订阅多个主题
【发布时间】:2021-08-24 09:12:03
【问题描述】:

当客户端订阅多个主题时,是否可以使用与 paho python 中使用的message_callback_add 类似的概念(在 javascript 中)来使用多个回调?我在onMessageArrived() 中看到了if 条件的使用,但我想知道是否存在更有效和更干净的方式?

var mqtt;                           // MQTT variable/object
var reconnectTimeout = 5000;        // 5 seconds for the reconnectTimeout
var host="localhost";               // MQTT bridge IP
var port=8083;                      // MQTT bridge port 
MQTTconnect();                      // Initialise the MQTT connections

function MQTTconnect(){
  console.log("mqtt connecting to " + host + ":" + port);
  mqtt = new Paho.MQTT.Client(host, port, "client_test");
  var options = {
    timeout: 100,
    onSuccess: onConnect,
    onFailure: onFailure,
  };
  mqtt.onMessageArrived = onMessageArrived;
  mqtt.connect(options); // connect
}

function onConnect(){
  console.log("Mqtt Connected - Subscribe to the topics");
  mqtt.subscribe("topic1/a");
  mqtt.subscribe("topic2/b");
}
            
function onFailure(message){
  console.log("Connection attempt to MQTT " + host + " failed");
  setTimeout(MQTTconnect, reconnectTimeout);
}

function onMessageArrived(msg){
  if (msg.destinationName == "topic1/a"){
    console.log("Topic1: ", msg.payloadString);
  }
  else if (msg.destinationName == "topic2/b"){
    console.log("Topic2: ", msg.payloadString);
  }
}

【问题讨论】:

  • 那里似乎没有办法实现它。我目前正在使用开关盒。

标签: javascript mqtt paho


【解决方案1】:

不,JavaScript 中的所有消息只有一个回调。

唯一的选择是在onMessageArrived回调中根据需要检查主题和分支

【讨论】:

    【解决方案2】:

    库可能没有,但是自己做回调逻辑!这是一个漂亮的解决方案:

    import EventEmitter from 'events';
    const emitter = new EventEmitter();
    
    client.subscribe('my_topic_1');
    client.subscribe('my_topic_2');
    client.onMessageArrived = onMessage;
    
    function onMessageArrived(message) {
       emitter.emit(message.topic, message.payloadString);
    }
    
    function subscribe(event, callback) {
       emitter.addListener(event, callback);
    }
    
    function unsubscribe(event, callback) {
       emitter.removeListener(event, callback);
    }
    
    subscribe('my_topic_1', (string) => {
       console.log('only my_topic_1 messages', string);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2016-06-10
      相关资源
      最近更新 更多