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 !

Advertisements

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.