Mono

M2Mqtt su una Raspberry Pi con il progetto Mono

Un nuovo use case per la libreria M2Mqtt !! La sezione dei case studies sul sito ufficiale si è arricchita con un altro grande esempio !

Jon Gallant, parte del Microsoft IoT maker team, ha scritto un interessantissimo articolo relativamente alla sua “esperienza da maker” con una demo sull’utilizzo del protocollo MQTT su una Raspberry Pi. Jon ha deciso di non utilizzare le librerie native C/C++ ma il linguaggio C# e quindi la libreria M2Mqtt grazie al progetto Mono !

L’articolo descrive tutti i passi per mettere in piedi l’intera demo dall’hardware fino all’installazione di Mono sulla Raspberry Pi ed all’esecuzione della relativa applicazione.

E’ bello vedere un ulteriore esempio di utilizzo del client M2Mqtt…e questa volta in ambiente Linux !

M2Mqtt e GnatMQ … adesso anche su Windows 8.1 e Windows Phone 8.1 !!

Windows_logo_-_2012 m2mqttpng
gnat

Sembra che io sia stato in vacanza (vista la mancanza di post sul mio blog) ed è la verità !

Nonostante la vacanza, ho proseguito lo sviluppo del progetto M2Mqtt ed oggi ho il piacere di rilasciare la nuova versione 3.6.0.0 con il supporto per WinRT !!

Ho dovuto intervenire soprattutto nei punti di gestione del networking (in WinRT non ci sono le Socket ma gli StreamSocket), dei thread (passaggio da Thread a Task) e della sicurezza ma finalmente il primo client MQTT per tutte le piattaforme .Net, da oggi funziona anche sui tablet dotati di Windows 8.1 e sugli smartphone con Windows Phone 8.1.

Il nuovo progetto, aggiunto in una solution per Visual Studio 2013, è una “portable class library” che ho utilizzato e testato in una Universal App.

La stessa sorte è toccata al “fratello” GnatMQ, giunto alla versione (Beta) 0.9.2.0, grazie al quale abbiamo a disposizione un broker MQTT da eseguire su tablet e smartphone della famiglia Windows 8.1.

Ovviamente ho provveduto ad aggiornare anche il package Nuget aggiungendo gli assemblies per WinRT.

Spero di aver fatto cosa gradita per moltissimi utilizzatori di M2Mqtt che in passato mi hanno richiesto fortemente questo porting !

Sorriso

M2Mqtt 3.5 : .Net MQTT client con un miglior supporto SSL/TLS, altri miglioramenti e licenza Apache 2.0 !

Questa volta la libreria M2Mqtt ha subito alcune modifiche “importanti” sia in termini di nuove funzionalità che di bug fixing. Devo ammettere che i miglioramenti sono dovuti soprattutto alle persone che la utilizzano in maniera assidua e mi segnalano nuove funzionalità da aggiungere o bug da risolvere. Oltre ad alcuni problemi segnalati su CodePlex, questa volta anche Clemens Vasters, PM su Microsoft Azure, mi ha sottoposto alcuni miglioramenti da applicare nell’ambito dell’autenticazione SSL/TLS. Infatti, come già twittato molte settimane fa, Clemens ha usato la mia libreria per eseguire i test sul progetto Reykjavik (Device Gateway) presentato a Build 2014 ed io non posso che esserne onorato.

Autenticazione SSL/TLS

In questo caso, il miglioramento è strettamente legato alla versione per .Net Framework, poiché è l’unica versione a supportare quanto è stato aggiunto. In particolare, la classe MqttClient mette disposizione altri costruttori ai quali è possibile fornire le seguenti callback :

  • RemoteCertificateValidationCallback : permette all’utente di effettuare ulteriori controlli sulla validazione del certificato ricevuto dal server oltre a quelli già eseguiti dal sistema. Utile nel caso di debugging e di utilizzo di certificati self-signed, in modo da accettare a prescindere la connessione con il server;
  • LocalCertificateSelectionCallback : permette all’utente di selezionare in maniera opportuna il certificato client da trasferire al server in caso di mutua autenticazione durante l’handshake SSL. Il certificato può essere selezionato da un pool di certificati locali oppure creato “a volo” direttamente nella callback;

Per maggiori informazioni, è possibile fare riferimento alla documentazione MSDN ufficiale.

Nel caso del costruttore più complesso (con entrambe le callback), un esempio di applicazione può essere il seguente :

MqttClient client = new MqttClient("<server_name>", 8883, true, ValidateServerCertificate, SelectClientCertificate);
...
...

bool ValidateServerCertificate(object sender,
 X509Certificate certificate,
 X509Chain chain,
 SslPolicyErrors sslpolicyerrors)
{
 bool valid;
 // check sslpolicyerrors and execute your certificate validation
 ...
 ...
 return valid;
}

X509Certificate SelectClientCertificate(
 Object sender,
 string targetHost,
 X509CertificateCollection localCertificates,
 X509Certificate remoteCertificate,
 string[] acceptableIssuers)
{
 X509Certificate cert;

 // choose client certificate from local store or creating new one
 ...
 ...
 return cert;
}

Per cercare di semplificare la creazione dell’oggetto client, i costruttori che ricevono in ingresso un IPAddress sono stati “marcati” con l’attributo Obsolete. Infatti, tutti gli altri costruttori permettono di specificare in ingresso un indirizzo IP o un host name in formato stringa; sarò carico del costruttore verificare di che tipo si tratta e nel caso di host name effettuare una conversione ad indirizzo IP attraverso DNS.

Per quanto riguarda il tracing, alcune persone hanno segnalato che nella versione Nuget questa funzionalità non visualizzava il contenuto di ciascuno messaggio scambiato ma il tipo del messaggio; ciò era dovuto al fatto che la libreria Nuget è compilata in modalità Release ma i messaggi di trace erano attivi in Debug. La versione attuale fornisce il tracing sia in debug che release in quanto è legata al simbolo TRACE (e non più al simbolo DEBUG) che è definito in entrambe le configurazioni. Ovviamente, il tracing è sempre legato alla definizione di un TraceListener da parte dell’utilizzatore.

Bug fixing

I principali bug risolti sono stati segnalati sul sito CodePlex da alcuni utenti e di seguito riporto i riferimenti :

Conclusioni

La libreria è in continua evoluzione grazie alla community e molto presto includerà il supporto per MQTT 3.1.1 che tra poche settimane sarà standard OASIS. L’ulteriore passo è la licenza passata da L-GPL ad Apache 2.0 !

Come sempre potete trovare la versione aggiornata su CodePlex, Nuget e Microsoft Code Gallery. Infine, è stato ovviamente aggiornato anche il broker GnatMQ alla versione 0.9.1.0 ed il progetto M2Mqtt4CE.

M2Mqtt : aggiunto il supporto per il tracing nel client MQTT

La libreria M2Mqtt è giunta alla versione 3.4.0.0 con un’utile funzionalità come il tracing in modalità di debugging.

Il progetto ha la nuova classe Trace che espone il membro statico TraceListener il quale è dichiarato attraverso il seguente delegate :

// delegate for writing trace
public delegate void WriteTrace(string format, params object[] args);

In questo modo, è possibile scegliere la propria modalità di tracing assegnando a questo delegate un metodo con la medesima firma. Inoltre, è possibile stabilire il livello di tracing attraverso l’impostazione del membro statico TraceLevel sulla base dei seguenti possibili valori dell’enumerativo :

/// <summary>
/// Tracing levels
/// </summary>
public enum TraceLevel
{
 Error = 0x01,
 Warning = 0x02,
 Information = 0x04,
 Verbose = 0x0F,
 Frame = 0x10
}

Un semplice esempio applicativo di uso del tracing potrebbe essere il seguente :

Trace.TraceLevel = MqttUtility.TraceLevel.Verbose | MqttUtility.TraceLevel.Frame;
Trace.TraceListener = (f, a) => System.Diagnostics.Trace.WriteLine(System.String.Format(f, a));

In questo caso, attraverso una lambda expression, tutti i messaggi di trace vengono scritti sulla finestra di output di Visual Studio.

SEND CONNECT(protocolName:MQIsdp,protocolVersion:3,clientId:testId,willFlag:False,willRetain:False,willQosLevel:2,willTopic:,willMessage:,cleanSession:False,keepAlivePeriod:60)
RECV CONNACK(returnCode:0)
SEND SUBSCRIBE(messageId:1,topics:[/foo/#,/foo/+/baz],qosLevels:0202)
RECV SUBACK(messageId:1,grantedQosLevels:0202)
RECV PUBLISH(messageId:1,topic:/foo,message:48656C6C6F)
SEND PUBREC(messageId:1)
RECV PUBREL(messageId:1)
SEND PUBCOMP(messageId:1)
Hello
SEND PUBLISH(messageId:2,topic:/thank,message:5468616E6B20596F7520212031)
RECV PUBREC(messageId:2)
SEND PUBREL(messageId:2)
RECV PUBCOMP(messageId:2)

La nuova versione è disponibile sul CodePlex, Nuget e nella Microsoft Code Gallery. Ad essa va aggiunto anche l’aggiornamento della M2Mqtt4CE per l’immagine di Windows Embedded Compact 2013 !

M2Mqtt e GnatMQ : il progetto MQTT per la piattaforma .Net ha un sito ufficiale !

4760.Cattura_thumb_76DD1A9C

Finalmente, il progetto M2Mqtt, che include la libreria client ed il broker GnatMQ, ha il suo sito ufficiale !

Oltre ad un blog dedicato, è disponibile una ricca sezione di documentazione che attualmente contiene la descrizione dell’architettura della libreria client, i principali vantaggi nell’utilizzarla ed un semplice esempio di applicazione. Per quanto riguarda il broker, sono riportate le principali funzionalità implementate e quelle future.

Inoltre, nella sezione download sono elencati tutti i link da cui scaricare i progetti (CodePlex, Nuget e Microsoft Code Gallery).

Il mio obiettivo è quello di aggiungere una sezione relativa ai “case study” con esempi applicativi, hobbistici e professionali, e/o demo di coloro che stanno utilizzando la libreria e/o il broker. Ovviamente, chiunque voglia parteciparvi può contattare attraverso la sezione Contact !

M2Mqtt : release 3.3.0.0 per il client MQTT su piattaforma .Net

Lo sviluppo della libreria M2Mqtt continua …. ormai giunta alla versione 3.3.0.0 !

Questa volta le nuove funizionalità riguardano due richieste provenienti dalle persone che la stanno utilizzando.

In primo luogo, ho aggiunto più overload al metodo Connect(), poichè da quanto ho rimosso i parametri di default (per questioni di compatibilità con le versioni precedenti del .Net Framework) ho lasciato il costruttore più complesso che richiede tutti i parametri. Molte persone, non conoscendo bene il protocollo MQTT, si sono trovate in difficoltà nel decidere quali valori passare ai parametri meno noti (will message, clean session, …).

L’ulteriore nuova funzionalità riguarda l’evento di disconnessione del client dal broker MQTT che è stato richiesto sul sito ufficiale CodePlex. La classe MqttClient espone l’evento MqttMsgDisconnected che viene sollevato quando è rilevata una condizione di mancata connessione con il broker e tipicamente in due casi :

  • In caso di assenza di traffico dati, al messaggio di PINGREQ (relativo al keep alive) non si riceve la risposta PINGRESP dal broker;
  • La trasmissione o la ricezione dati verso/da il broker fallisce per un problema di connessione;

Anche questa volta la nuova versione è disponibile su CodePlex e su Nuget, oltre ad aver aggiornato il corrispondente componente M2Mqtt4CE per Windows Embedded Compact 2013 !

Breaking changes ….

Per quanto riguarda Nuget, gli assemblies M2Mqtt relativi al .Net Micro Framework 4.3 sono stati aggiornati all’ultima release QFE1; essi non funzionano con la versione RTM precedente, poichè gli assemblies del micro framework sono passati dalla versione 4.3.0.0 alla 4.3.1.0.

M2Mqtt : bug fix e nuova versione 3.2.0.0

Se utilizzando la versione 3.1.0.0 vi rendete conto che gli eventi di Connect e Disconnect non sono sollevati … è corretto … non sono gestiti nel client e dovete aggiornare la libreria oppure ignorarli !

Ho rilasciato un aggiornamento della libreria M2Mqtt (versione 3.2.0.0) che mette a posto questa dimenticanza.

A seguito della fusione del codice tra la libreria client M2Mqtt ed il futuro broker GnatMQ ho commesso l’errore di includere la gestione dei messaggi di SUBSCRIBE, UNSUBSCRIBE, CONNECT e DISCONNECT anche nel client (ovviamente senza alcun senso) con i corrispondenti eventi.

L’aggiornamento è disponibile come sempre anche su Nuget ed ho provveduto ad aggiornare anche il corrispondente componente M2Mqtt4CE per Windows Embedded Compact 2013.

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 !