For a while I've been looking at how to bridge the MQTT protocol and websockets to make it easier to build web applications using data broadcast in MQTT streams. In the past I used python and mod_pywebsocket along with mosquitto python libraries however this was cumbersome and difficult to install. Here I present a simple solution using node.js to interact with mosquitto MQTT clients. Node.js lends itself to working well with messaging systems like MQTT and websockets due to its event driven nature. I'm also in love with node.js at the moment!
This is much simpler than previous attempts and I put the initial test together in less than ten minutes.
This example subscribes to the topic "test" and broadcasts all messages on this topic over the websocket on port 8000.
/* Include required libraries */var util = require('util'),sys = require('sys'),ws = require('websocket-server'),spawn = require('child_process').spawn,/* Create websocket server */server = ws.createServer({debug: true}),/** Ceate call to mosquitto_sub cli client* to subscribe on topic 'test'*/mosq = spawn('mosquitto_sub',['-t','test']);/** Bind an event to stdout which occurs when* mosquitto_sub outputs anything*/mosq.stdout.on('data', function (data) {/** Brodcast the MQTT message straight back* out on the websocket*/server.broadcast(data);/* Log the message to the console */console.log('' + data);});/** Bind an event to stderr so we can see any* errors that cause mosquitto_sub to crash*/mosq.stderr.on('data', function (data) {console.log('error: ' + data);});/* Start the websocket server listening on port 8000 */server.listen(8000);
This is a bare bones page which prints out messages received over the websocket.
<!DOCTYPE html><html><head></head><body> <div id='debug'></div> <div id='msg'></div><script src='http://code.jquery.com/jquery-1.4.4.min.js'></script><script> $(document).ready(function() { function debug(str) { $('#debug').append('<p>'+str+'</p>'); }; ws = new WebSocket('ws://<your ip address>:8000');/* Define websocket handlers */ ws.onmessage = function(evt) { $('#msg').append('<p>'+evt.data+'</p>'); }; ws.onclose = function() { debug('socket closed'); }; ws.onopen = function() { debug('connected...'); }; });</script></body></html>
This example is of little practical use on its own however it could easily be the basis of a flashy home monitoring system. Publishing MQTT messages could be easily achieved by calling mosquitto_pub in the child process.