MQTT over Websockets

Richard Joyce edited this page Jul 8, 2016 · 7 revisions

Since v0.13.0 Mosca support MQTT over Websocket through the MQTT.js package.

It is very easy to use:

Client side

We just use an index.html file to make the calls:

<html>
  <head>
    <script src="/mqtt.js"></script>
  </head>
  <body>
    <script>
      var client = mqtt.connect();

      client.subscribe("mqtt/demo");

      client.on("message", function(topic, payload) {
        alert([topic, payload].join(": "));
        client.end();
      });

      client.publish("mqtt/demo", "hello world!");
    </script>
  </body>
</html>

Standalone Mosca

We can use Mosca standalone, using the command line:

npm install mosca bunyan -g
mosca -v --http-port 3000 --http-bundle --http-static ./ | bunyan

Embedded Mosca

var mosca = require("mosca");
var server = new mosca.Server({
  http: {
    port: 3000,
    bundle: true,
    static: './'
  }
});

Separate HTTP Server

We can also augment a node HTTP server with MQTT-over-websocket capabilities, just by calling the Server#attachHttpServer method, like so:

var http     = require('http')
  , httpServ = http.createServer()
  , mosca    = require('mosca')
  , mqttServ = new mosca.Server({});

mqttServ.attachHttpServer(httpServ);

httpServ.listen(3000);

MQTT.js Browserify Bundle

The browserified bundle for MQTT.js for the MQTT websocket client is available in the public folder of the Mosca module. You can serve it using express like so:

var mosca = require("mosca");
var broker = new mosca.Server({});
var express = require("express");
var http = require("http");
var app = express()
var srv = http.createServer(app)
var path = require("path");

app.use(express.static(path.dirname(require.resolve("mosca")) + "/public"))

app.listen(3000)