MQTT Protocol for Internet of Things (IoT)
I was thinking about how to control my Aeroponic system remotely via internet. The Raspberry Pi controlling the system is connected to internet via a router. I could access RaspberryPi by Port forwarding and stuff like that but it’s complicated. Next option could be using Websockets but I felt it’s an overkill for the applications running in Pi.
Recently I received a Refcard from Dzone regarding a protocol called MQTT. I was not aware of this Protocol before. So thought of doing some experiment with it. I am not going much deeper into the protocol, Dzone refcard did a great job of explaining it well.
In a nutshell, MQTT consist of three parts.
-
Broker
-
Subscribers
-
Publishers
Publisher, publish message to a specific topic and any Subscriber subscribes for that topic receives the message. Broker is the central hub, both Publishers and Subscribers are connected to the Broker and it take care of delivering the message to all the subscribers subscribed for the topic.
Brokers
We can implement our own broker using RabitMQ or Mosca plugin for Node js or any other MQTT brokers available in the market. To experiment it, I used CloudMQTT addon in Heroku. I used Heroku just to manage every thing from one central place.
Dev Environment
I created two set off Node js application, one running in my computer as a publisher and another running in my RaspberryPi as a subscriber. Both have no direct connection instead they are connected to CoudMQTT broker. Below is a test code and nothing related to my Aeroponic system.
Publisher Code
var mqtt = require('mqtt'); var client = mqtt.createClient('<<PortNumber>>', 'm11.cloudmqtt.com', { username: '<<UserName>>', password: '<<Password>>' }); client.on('connect', function () { // When connected // subscribe to a topic client.subscribe('TEMPERATURE_READING', function () { // when a message arrives, do something with it client.on('message', function (topic, message, packet) { console.log("Received '" + message + "' on '" + topic + "'"); }); }); // publish a message to a topic client.publish('SET_TEMPERATURE', '24', function () { console.log("Message is published"); }); });
The above code act as a Publisher as well as a Subscriber. For e.g. the above code can be a piece running in Internet and the Pi’s can Publish the Temperature readings in a periodic interval and logged in a central db. We can see the readings via a webapp or which ever the way we need. Also if required we can set a temperature to all the connected RPi’s by publishing a message to topic ‘SET_TEMPERATURE’.
Subscriber Code
var mqtt = require('mqtt'), url = require('url'); var client = mqtt.createClient('<<Portnumber>>', 'm11.cloudmqtt.com', { username: '<<UserName>>', password: '<<Password>>' }); client.on('connect', function () { // When connected // subscribe to a topic client.subscribe('SET_TEMPERATURE', function () { // when a message arrives, do something with it client.on('message', function (topic, message, packet) { console.log("Received '" + message + "' on '" + topic + "'");
// set the temperature. }); }); });
The code is very minimal and we could achieve an easy communication to all the connected devices. In the above scenario clients are always connected. If you want to end the connection then call ‘client.end()’.
Later I implemented a Broker using Mosca, both scenarios the system worked really well.
Hello, Sony.
Did you use Windows 10 IoT with RPi?
Roman
September 3, 2015 at 8:34 pm
Hi Roman,
I still use my old RPi with Raspbian, I haven’t bought the new one yet.
Regards,
Sony Arouje
Sony Arouje
September 3, 2015 at 10:37 pm
Check out AMQP too.
Pradeep Chellappan
September 4, 2015 at 7:31 am
sure da PC.
Sony Arouje
September 4, 2015 at 9:51 am
i’am not able to run the above code….i’am using on raspberry pi and the syntax error is coming in the very first line for the word ‘mqtt’
yuvraj
December 1, 2015 at 11:47 am
might not have installed MQTT node module.
Sony Arouje
December 1, 2015 at 12:32 pm
Hi Sir, whether if I use mqtt protocol means no need to use port forwarding on raspberry pi?
Muhammad Imaddudin
April 22, 2016 at 8:19 am
Yes Muhammad, if you use MQTT you dont need to do port forwarding. But MQTT needs a server, to which all the clients will get connected.
Sony Arouje
April 22, 2016 at 5:08 pm