Ubuntu

Il client M2Mqtt su Ubuntu ? Con Mono si può !

Nonostante la mia libreria M2Mqtt sia scritta in C#, per cui ne è garantito il funzionamento su tutte le versioni del .Net Framework in ambiente Microsoft Windows, è assolutamente possibile utilizzarla anche su Linux attraverso il runtime del Mono Project.

In primo luogo, ho preparato l’ambiente utilizzando come distribuzione Linux quella più famosa e maggiormente usata nell’ambito desktop : Ubuntu (in particolare la 12.04 LTS). Il sistema operativo non fornisce nativamente il supporto per Mono, che è necessario scaricare ed installare attraverso il gestore di pacchetti Synaptic oppure attraverso il terminale mediante il seguente comando :

sudo apt-get install mono-complete

mono-complete

Il pacchetto mono-complete installa praticamente tutto, sia il runtime che le librerie per lo sviluppo delle applicazioni basate su tale framework.

Successivamente, ho scelto l’IDE MonoDevelop per poter compilare la libreria M2Mqtt con il compilatore di Mono e per poter realizzare una semplice applicazione console di test. Anche in questo caso, possiamo fare uso di Synaptic oppure del comando :

sudo apt-get install monodevelop

Sfruttando questo IDE ho creato una nuova solution ed un nuovo file di progetto che ho prontamente caricato su CodePlex, in modo che attualmente la libreria sia perfettamente compilabile sia con le versioni del .Net Framework (Desktop, Compact e Micro) che con Mono in ambiente Linux.

Per eseguire i test, ho deciso di non utilizzare il solito RSMB della IBM (sotto Windows) ma il broker Mosquitto, anch’esso a disposizione nei repository di Ubuntu e quindi facilmente installabile da Synaptic oppure attraverso :

sudo apt-get install mosquitto

sudo apt-get install mosquitto-clients

mosquitto

Il pacchetto mosquitto installa il broker mentre mosquitto-clients installa due client di esempio (mosquitto_pub e mosquitto_sub) per la pubblicazione e sottoscrizione di messaggio al broker stesso. Dopo averlo installato, non è necessaria alcuna configurazione, in quanto il broker viene automaticamente avviato ed è subito in ascolto sulla porta MQTT di default, ossia la 1883.

using System;
using uPLibrary.Networking.M2Mqtt;
using System.Net;
using System.Text;

namespace M2MqttTest
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			MqttClient client = new MqttClient(IPAddress.Parse("192.168.1.4"));
			client.Connect("testmono");

			client.MqttMsgPublishReceived += HandleClientMqttMsgPublishReceived;
			client.Subscribe(new string[] { "sensors/temp" }, new byte[] { 1 });

			//client.Publish("sensors/temp", Encoding.UTF8.GetBytes("35"), 1);

			Console.ReadLine();

		}

		static void HandleClientMqttMsgPublishReceived (object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e)
		{
			Console.WriteLine(Encoding.UTF8.GetString(e.Message));
		}
	}
}

L’applicativo console, realizzato con MonoDevelop, è alquanto banale, in quanto si connette al broker (mosquitto in questo caso) e si sottoscrive al topic “sensors/temp”, volendo simulare che si sia in “ascolto” di un sensore che pubblichi dei valori di temperatura. Il publisher è simulato mediante l’utilizzo del client mosquitto_pub con la semplice riga di comando :

mosquitto_pub –t sensors/temp –q 1 –m 32

Dove il parametro “t” identifica il topic, “q” indica il QoS secondo il protocollo MQTT ed “m” il messaggio da trasmettere (in questo caso un valore di temperature, es. 32 °C).

Dall’immagine che segue, si osserva come il risultato sia correttamente acquisito e visualizzato sulla console dall’applicativo di test che fa uso della mia libreria.

example_sub

Allo stesso modo, è possibile utilizzare l’applicativo di test come publisher ed il client mosquitto_sub per ricevere i messaggi, attraverso il comando seguente :

mosquitto_sub –t sensors/temp –q 1

example_pub

In conclusione, nonostante si trovino in rete degli ottimi client MQTT che possono essere usati senza problemi su Linux (la stessa libreria di Mosquitto oppure tanti altri scritti in in C++ o Python), per chi lo volesse può continuare ad usare la mia libreria grazie al supporto di Mono. Il prossimo passo può essere quello di utilizzare questa libreria su un sistema embedded basato su Raspberry Pi !