Wednesday, April 13, 2016

MQTT in Python, C# and JavaScript


MQTT in Python, C# and JavaScript

MQTT is on my horizon for a lot of communication projects, I am going to experiment.
So I am gathering basic samples how to use it in different languages.
  • Python, usefull for Linux and Raspberry PI
  • C#, because I am a PC
  • JavaScrip + Node, usefull if used with Azure Function or Amazon Lambda
  • JavaScript in a Browser

Python

Roughly, what to install on Windows.

  • Download Python 2.7
  • Pip package manager. Download and run pip https://bootstrap.pypa.io/get-pip.py
    • C:\Python27\python.exe get-pip.py # to install pip
    • Use pip to download the package paho-mqtt
      • C:\Python27\Scripts\pip install paho-mqtt
For more setup info, see page hivemq.com.

Subscribe

import paho.mqtt.client as paho
 
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))
 
def on_message(client, userdata, msg):
    print("topic:"+msg.topic+" qos:"+str(msg.qos)+" payload:"+str(msg.payload))
 
client     = paho.Client()
client.on_subscribe = on_subscribe
client.on_message   = on_message
client.connect("broker.mqttdashboard.com", 1883)
client.subscribe("encyclopedia/temperature", qos=1)
client.loop_forever()

Publish

import paho.mqtt.client as paho
import time
 
def on_publish(client, userdata, mid):
    print("mid: "+str(mid))

client = paho.Client()
client.on_publish = on_publish
client.connect("broker.mqttdashboard.com", 1883)
client.loop_start()
 
temperature = 90

while True:
    print("temperature:%d " % temperature)
    (rc, mid)   = client.publish("encyclopedia/temperature", str(temperature), qos=1)
    time.sleep(2)
    temperature = temperature + 1

C#


For C# I am using the library M2Mqtt, that can be downloaded from NuGet.
Complere Source Code MQTT CSharp.cs

Subscribe

static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
    Console.WriteLine("Received = " + Encoding.UTF8.GetString(e.Message) + " on topic " + e.Topic);
}

const string mqttServer = "broker.mqttdashboard.com";
const string pusblishedVar = "encyclopedia/temperature";

private static void SubscribeAndListen(string CLIENT_ID_SUB)
{
    MqttClient client;
    Console.WriteLine("Setting up subscribe mode:{0}, clientID:{1}", mqttServer, CLIENT_ID_SUB);
    client = new MqttClient(mqttServer);
    client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
    client.MqttMsgSubscribed += Client_MqttMsgSubscribed;
    client.Connect(CLIENT_ID_SUB);
    client.Subscribe(new string[] { pusblishedVar }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });

    var displayMenu = new Action(delegate()
    {
        Console.Clear();
        Console.WriteLine("Q)uit C)lear - Waiting...");
    }); 
    
    var quit = false;
    displayMenu();
    while (!quit)
    {
        if (Console.KeyAvailable)
        {
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.Q: quit = true; break;
                case ConsoleKey.C: ; displayMenu(); break;
            }
        }
        Thread.Sleep(250);
    }
    client.Disconnect();
}



Publish

const string mqttServer = "broker.mqttdashboard.com";
const string pusblishedVar = "encyclopedia/temperature";
        
private static void Publish(string CLIENT_ID_PUB)
{
    Console.WriteLine("Setting up publish mode ClientID:{0}", CLIENT_ID_PUB);
    var client = new MqttClient(mqttServer);
    client.Connect(CLIENT_ID_PUB);
    var varValue = 70;
    client.MqttMsgPublished += Client_MqttMsgPublished;

    Console.WriteLine("Publishing {0}:{1}", pusblishedVar, varValue);
    client.Publish(pusblishedVar, Encoding.UTF8.GetBytes(varValue.ToString()), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
    
    client.Disconnect();
}

JavaScript + Node.js


To install MQTT package
nmp install mqtt

Publish

// contoller.js and garage.js
var mqtt = require('mqtt')  
var client = mqtt.connect("mqtt://broker.mqttdashboard.com");//, 1883)

client.on('connect', function() {  

 console.log("Connected, Publishing.");
   // Inform controllers that garage is connected
 client.publish('encyclopedia/temperature', '66')
})



/**
 * Want to notify controller that garage is disconnected before shutting down
 */
function handleAppExit (options, err) {  
 console.log("Exiting...")
 if (err) {
  console.log(err.stack)
 }
 if (options.cleanup) {
 
 }
 if (options.exit) {
  process.exit()
 }
}

/**
 * Handle the different ways an application can shutdown
 */
process.on('exit', handleAppExit.bind(null, {  
  cleanup: true
}))
process.on('SIGINT', handleAppExit.bind(null, {  
  exit: true
}))
process.on('uncaughtException', handleAppExit.bind(null, {  
  exit: true
}))

JavaScript in a browser


MQTT publisher or subscriber can also be hosted in a browser using Websockets. See link http://www.hivemq.com/demos/websocket-client

No comments:

Post a Comment