For a while I’ve been looking at how to bridge the
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 to interact with
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.
Prerequisites
Obviously you’ll need to have and installed and also the node library (which can easily be installed using ).
All my work was tested under ubuntu but there is no reason why it
wouldn’t work on OSX or even cygwin. To test you’ll need a websocket
compatible browser such as recent versions of chrome.
System Structure
mosquitto_pub and mosquitto_sub are command line MQTT clients
supplied with the mosquitto MQTT broker, here mosquitto_sub will be
called using node.js as child processes, events are generated on output
from the process. The data is then captured and broadcast over a
websocket. In this case a simple jquery page is used to display the
broadcast messages but in a real application there would be more client
side processing to make a useful application.
Simple Server Side Subscriber Code
This example subscribes to the topic “test” and broadcasts all messages on this topic over the websocket on port 8000.
1 | /* Include required libraries */ |
2 | var util = require('util'), |
4 | ws = require("websocket-server"), |
5 | spawn = require('child_process').spawn, |
7 | /* Create websocket server */ |
8 | server = ws.createServer({debug: true}), |
11 | * Ceate call to mosquitto_sub cli client |
12 | * to subscribe on topic "test" |
14 | mosq = spawn('mosquitto_sub',['-t','test']); |
17 | * Bind an event to stdout which occurs when |
18 | * mosquitto_sub outputs anything |
20 | mosq.stdout.on('data', function (data) { |
22 | * Brodcast the MQTT message straight back |
25 | server.broadcast(data); |
26 | /* Log the message to the console */ |
27 | console.log('' + data); |
31 | * Bind an event to stderr so we can see any |
32 | * errors that cause mosquitto_sub to crash |
34 | mosq.stderr.on('data', function (data) { |
35 | console.log('error: ' + data); |
38 | /* Start the websocket server listening on port 8000 */ |
Demonstration Client
This is a bare bones page which prints out messages received over the websocket.
13 | $(document).ready(function() { |
15 | $("#debug").append(" "+str+" "); |
17 | ws = new WebSocket("your ip address>:8000"); |
19 | /* Define websocket handlers */ |
20 | ws.onmessage = function(evt) { |
21 | $("#msg").append(" "+evt.data+" "); |
23 | ws.onclose = function() { |
24 | debug("socket closed"); |
26 | ws.onopen = function() { |
27 | debug("connected..."); |
Further Development
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.
Tags: , , , , , , , ,
Node.js, MQTT and Websockets
阅读(2302) | 评论(0) | 转发(0) |