Mono

M2Mqtt : MQTT per le piattaforme .Net con la nuova versione e sempre più social !

4503.m2mqttpng_thumb_4B412890

Ed anche questa volta arriva puntuale un aggiornamento per la mia libreria M2Mqtt ormai giunta alla versione 3.1.0.0 !

Le novità principali riguardano una migliore gestione del QoS Level 2, alcune proprietà del client esposte all’esterno ma soprattutto il fatto di aver valutato ed aggiunto alcune richieste che mi sono state fatte dagli utilizzatori che ovviamente ringrazio !

Inoltre, in alcune parti del codice sorgente potrete notare una direttiva di compilazione condizionata alla definizione del simbolo BROKER … perchè ? Ho uniformato il codice della libreria M2Mqtt al codice di un broker MQTT che sto sviluppando e che a breve sarà rilasciato in versione beta. Il suo nome è GnatMQ ed il progetto è già pubblicato online sempre su CodePlex e quindi open source. Attenzione che attualmente è ancora una versione in via di sviluppo e non completamente stabile ma il rilascio è imminente !

Oltre ad aggiornare il progetto su CodePlex, ho provveduto ad aggiornare il relativo package su Nuget (che ormai ha superato i 1000 download !), il codice nella Microsoft Gallery ed il progetto M2Mqtt4CE per includere il nuovo componente nelle proprie immagini di Windows Embedded Compact 2013.

L’ultima novità riguarda una libreria sempre più social ! Ho creato l’account twitter ufficiale @M2Mqtt e la pagina Facebook !

Non avete scuse per non poter seguire la sua evoluzione !

M2Mqtt MQTT Client : nuova 2.3 con eventi asincroni !

Lo sviluppo di questo progetto è iniziato ad Aprile di quest’anno con l’obiettivo di colmare l’assenza di un buon client MQTT per tutte le piattaforme .Net. A distanza di 6 mesi non mi sarei aspettato un interesse così forte nei suoi confronti, probabilmente dovuto all’onda d’urto dell’Internet Of Things che sta arrivando (o è già tra noi ?).

Molte persone stanno utilizzando la libreria per progetti più o meno complessi, mi mandano mail (con segnalazioni ma anche con complimenti) ed aprono degli “issue” sul sito CodePlex, che io prontamente risolvo.

Questo non può far altro che spingermi a migliorare sempre di più il livello qualitativo del progetto, oggi arrivato alla versione 2.3.0 con alcuni bug fix ma soprattutto con un’interessante novità : tutti gli eventi sollevati dalla classe MqttClient (messaggio pubblicato, messaggio ricevuto, …) sono eseguiti in un thread separato, per cui l’utilizzatore del client non deve più preoccuparsi di lanciare un’elaborazione “lunga” nell’event handler attraverso un nuovo thread.

Con questo, spero di aver apportato un’ulteriore miglioria di estremo interesse per chi la sta usando e per chi vorrà usarla !

Come sempre, l’aggiornamento è disponibile su CodePlex e su Nuget per tutte le versioni del .Net Framework (Desktop, Compact e Micro) oltre che per Mono Project su Linux !

M2Mqtt library : aggiunto il supporto per SSL/TLS !!

m2mqttssl

Ho finalmente avuto modo di aggiungere ciò che volevo da tempo alla mia libreria M2Mqtt : il supporto al protocollo SSL/TLS !

Grazie a questa nuova funzionalità, è ora possibile collegarsi ad un broker MQTT utilizzando anche il protocollo SSL/TLS (per la versione .Net Micro Framework c’è il supporto solo fino a TLS1.0) per poter usufruire delle sue principali caratteristiche : criptazione dei dati ed autenticazione del server attraverso un certificato X509 (non è supportata l’autenticazione lato client).

Per poter lasciare libera scelta allo sviluppatore di voler includere o meno questa funzionalità nel proprio progetto, ho vincolato il tutto al simbolo di compilazione “SSL” che deve essere definito per aggiungere tale supporto. In questo modo, per alcune piattaforme con meno memoria (vedi Netduino o FEZ Cerberus nel caso di .Net Micro Framework), è possibile escluderla, ricordando di eliminare anche i riferimenti agli assemblies che gestiscono l’SSL/TLS.

Ovviamente, oltre che su CodePlex, l’aggiornamento è disponibile anche su Nuget !

Al più presto, scriverò un nuovo post in cui descriverò un esempio di utilizzo della connessione sicura in ambito MQTT con un broker come Mosquitto !

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 !