Question

I am making a web application with MQTT Paho Javascript (mqttws31.js).

in my onMessageArrived function I now define what message arrived by the following code:

    var topic = message.destinationName;
    var message = message.payloadString;
    var n = topic.lastIndexOf('/');
    var result = topic.substring(n + 1);
    switch(result){
      case "register":{
        //registerhandler
      }
      break;
      case "data":{
        //datahandler
      }
      break;
      default:{
        alert("wrong topic");
      }
    };

Is there a better way to check the topic?

Is it possible to define a messageArrived function per subscription? The only way I know to define the messageArrived is before the client.connect function. And the only way I know to subscribe is after the connection to do client.subscribe.

It would be very handy to define for example: client.subscribe("registertopic", registerhandlerfunction);

What can I do?

Was it helpful?

Solution

No, the client api doesn't provide this capability.

You have a couple options. Either do as you are doing; hard code a series of if/then/elses or switch/cases. Or you could quite easily add your own wrapper to the client library that provides it a more generic capability.

For example, the following untested code:

var subscriptions = [];
function subscribe(topic,callback) {
    subscriptions.push({topic:topic,cb:callback});
    mqttClient.subscribe(topic);
}

mqttClient.onMessageArrived = function(message) {
    for (var i=0;i<subscriptions.length;i++) {
        if (message.destinationName == subscriptions[i].topic) {
            subscriptions[i].cb(message);
        }
    }
}

Note, this assumes you only subscribe to absolute topics - ie without wildcards. If you use wildcards, you'd have to do some regular expression matching rather than the == test this code uses.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top