Month: November 2013

Service Bus for Windows Server 1.1 : errore di installazione di Windows Fabric su Windows in lingua Italiana

E’ stato rilasciato da circa un mese Service Bus for Windows Server, ossia la versione “on premise” del Service Bus che la Microsoft mette a disposizione attraverso Windows Azure. La versione “on premise” permette l’utilizzo di questo servizio su di un PC/server opportunamente configurato per costituire una farm con altri PC nella stessa rete (oppure come unico PC di una farm). In questo modo, abbiamo la possibilità di utilizzare un middleware di messaging senza la necessità di utilizzare il cloud (un pò come abbiamo fatto sino ad oggi con MSMQ, che rappresenta ormai la versione “legacy” del Service Bus).

L’installazione va eseguita attraverso il Web Platform Installer 4.6 all’interno del quale è semplice trovare la voce “Windows Azure Pack : Service Bus 1.1” nella categoria dei prodotti Windows Azure.

01_sb

Cliccando su “Aggiungi” e poi su “Installa”, il gioco sembrerebbe fatto ma purtroppo, per chi come me ha un sistema operativo in italiano…il risultato non è così scontato !

Prima di installare il Service Bus, parte l’installazione di Windows Fabric necessaria al middleware di messaging. Ebbene, è proprio questa installazione che non si completa in maniera corretta.

Dopo aver cercato in rete senza alcun risultato utile, mi sono messo in contatto con Ziv Rafalovich del team Microsoft sul Service Bus che, dopo un fitto scambio di mail, ha capito quale fosse il mio problema, strettamente legato alla nazionalità “italiana” della mia installazione di Windows. A quanto pare c’è un problema noto per il quale è previsto un workaround che riporto di seguito :

Problem – Windows Fabric V1 Setup issue on the ITA Sku

Root cause – In FabricSetup we use: logman creates trace FabricTraces -p {cbd93bc2-71e5-4566-b3a7-595d8eeca6e8} -o “C:\ProgramData\Windows Fabric\Fabric\log\Traces\fabric_traces_129915852913461599” -bs 128 -f bin -max 128 -cnf 00:00:00 -v nnnnnn

This is failing because in Italian the format for time is 00.00.00 and not 00:00:00

Work Around –

1) Change the following registry setting to HH:MM:SS and install windows fabric (without restarting the services/machine). .

> HKEY_USERS\.DEFAULT\Control Panel\International\sTimeFormat = h:mm:ss tt

2) After the installation. Change the registry setting back to h.mm.ss tt as it was in ITA

Cambiando il formato dell’orario prima dell’installazione, permette di completare quest’ultima in maniera corretta, per poi ripristinare tale formato al valore originale.

Il mio client MQTT all’MVP Summit showcase 2013

Quando ho iniziato lo sviluppo della libreria M2Mqtt non avrei mai pensato che potesse raccogliere così tanti consensi facendo riferimento al numero di download da CodePlex a daNuget (le cifre vanno contestualizzate, poiché sono ovviamente riduttive rispetto ai prodotti di massa che hanno migliaia di download). Molte persone la utilizzano e mi segnalano bug e migliorie da apportare.

Tra le persone più assidue nel suo utilizzo c’è Lorenzo Maiorfi, MVP per Windows Embedded, che ha effettuato più volte dei test che hanno messo duramente alla prova il mio codice che è progressivamente migliorato nelle situazioni di maggior carico.

In questi giorni Lorenzo sta partecipando al suo primo MVP Summit ed ha ben pensato di mettere in piedi una demo per lo showcase che si è tenuto domenica 17 Novembre insieme aMirco Vanini, altro MVP per Windows Embedded. La demo era orientata sulla realizzazione di un sistema di Smart Home e Smart Factory nell’ambito della domotica casalinga ed industriale utilizzando le tecnologie embedded di Microsoft.

IoT-M2M-Showcase-2_2

Ebbene tutto il sistema utilizzava in gran parte la mia libreria client MQTT. Inoltre, sono stato direttamente coinvolto nella realizzazione del sistema di monitoring basato su Windows Embedded Compact 2013 (ho dovuto realizzare un’immagine del sistema operativo per la ebox della ICOP, presso cui lavora il “mitico” Samuel Phung) ed un’applicazione con il .Net Compact Framework 3.9.

Dalle loro parole, la demo è andata più che bene e ne sono estremamente felice. Nel blog post dedicato di Samuel Phung è possibile trovare qualche foto della demo ed aspetto presto un resoconto dettagliato sui blog dei due protagonisti.

Devo ringraziare entrambi per avermi fatto “partecipare” in un certo modo all’MVP Summit !

Internet of Things : MQTT con la piattaforma 2lemetry

Oramai online è possibile trovare numerose piattaforme che offrono il servizio di “device to cloud”, per poter acquisire dati provenienti da dispositivi remoti, storicizzarli ed eventualmente esporli verso altri device : uno di queste è 2lemetry.

Quest’ultima, oltre a fornire l’interfacciamento RESTful tramite HTTP, mette a disposizione anche il protocollo MQTT che andremo ad utilizzare facendo uso della libreria client M2Mqtt.

In primo luogo è necessario effettuare la registrazione online (operazione banalissima)

01_register

Al termine della registrazione, si esegue l’accesso e la pagina relativa all’account ci mostra una serie di informazioni, tra le quali quella più importante è il “domain”, che rappresenterà la radice di tutti i topic sui quali andremo a pubblicare o ricevere messaggi via MQTT.

A questo punto possiamo passare immediatamente allo sviluppo di una semplice applicazione scegliendo tra tutte le piattaforme supportate dalla libreria M2Mqtt (.Net Framework, .Net Compact Framework oppure .Net Micro Framework). Volendo realizzare un caso reale, utilizziamo la board Netduino Plus con un sensore di temperatura (il solito TMP102 già ampiamente usato in post precedenti ed il cui driver potete trovare nella uPLibrary) per inviare online i dati rilevati.

In primo luogo definiamo tutti i parametri necessari a 2lemetry per caricare i dati :

const string M2MIO_DOMAIN = "<domain>";
const string M2MIO_CLIENTID = "device1";
const string M2MIO_STUFF = "temp";
const string M2MIO_BROKER = "q.m2m.io";
const string M2MIO_USERNAME = "<username>";
const string M2MIO_PASSWORD = "<MD5password>";

E’ ovviamente necessario l’indirizzo del broker (che usa la porta standard 1883), il client ID, ciò che viene chiamato “stuff” che nel nostro caso sarà la temperatura, il dominio ed infine lo username e l’MD5 della password della nostra iscrizione online.

L’applicativo è banalmente il seguente :

TMP102 tmp102 = new TMP102(A0AddressSelect.GND, 100);

MqttClient client = new MqttClient(M2MIO_BROKER);
client.Connect(M2MIO_CLIENTID, M2MIO_USERNAME, M2MIO_PASSWORD);
string topic = M2MIO_DOMAIN + "/" + M2MIO_STUFF + "/" + M2MIO_CLIENTID;

while (true)
{
    float value = tmp102.Temperature();
    client.Publish(topic, Encoding.UTF8.GetBytes("{ \"value\" : " + value + " }"));
    Thread.Sleep(5000);
}

In questo modo, ogni 5 sec verrà pubblicato il valore della temperatura sul topic<domain>/temp/device1.

Per avere un riscontro immediato, possiamo sfruttare la piattaforma online messa a disposizione da 2lemetry all’indirizzo http://mqtt.io/. In primo luogo vanno impostate le opzioni di sessione, cioè username e password del nostro account.

02_options

Subito dopo è necessario specificare l’indirizzo del broker, la porta ed un client Id per poterci connettere. Una volta connessi, utilizzando la sezione di subscriber, possiamo sottoscrivere al topic sul quale la nostra board pubblica i dati.

03_subscriber

In poco meno di 10 minuti abbiamo messo in piedi una stazione di rilevamento della temperatura che pubblica dati online su una piattaforma che li storicizza per noi e che con i suoi strumenti permette di analizzarli e ripubblicarli magari via HTTP !

Platform Builder : compilazione parallela di Windows Embedded Compact su più “core” della CPU

Il sistema di build di Platform Builder è abbastanza complicato ma nello stesso tempo anche estremamente potente. Per poter risparmiare del tempo prezioso durante la compilazione della propria immagine del sistema operativo, è necessario conoscerlo nei minimi dettagli in modo da evitare operazioni inutili. Inoltre, esistono una serie di “trucchi” che ci permettono di renderlo molto più veloce. Tra questi c’è la possibilità di sfruttare la compilazione su più “core” della nostra CPU, considerando che tutti i PC moderni hanno ormai dai 2 “core” in su.

La chiave di questa possibilità è la variabile d’ambiente BUILD_MULTIPROCESSOR, il cui significato può essere interpretato in maniera sbagliata se non si leggesse attentamente la relativa documentazione. Erroneamente, si potrebbe pensare che impostandola a 0, la compilazione su più “core” venga disabilitata e viceversa attivata impostandola ad 1. Non è assolutamente così !

Facendo riferimento alla documentazione su MSDN, impostando il valore a 0, si lascia al sistema di build il compito di rilevare in automatico il numero di “core” della CPU e di utilizzarli tutti per la compilazione creando un opportuno numero di thread; viceversa, un numero da 1 ad N imposta esplicitamente il numero di thread da utilizzare.

Per fortuna, il valore 0 è quello di default, per cui in molti casi non ci dobbiamo preoccupare di modificarlo per avere il massimo delle performance in compilazione. Inoltre, seppure volessimo modificarla, è prevista un’opportuna voce di menu in Visual Studio che troviamo inTools –> Options –> Platform Builder.

Tools

Per evidenziare la differenza, ho utilizzato una macchina virtuale (con Platform Builder per Windows Embedded Compact 2013 installato in Visual Studio 2012) con 4 core. La prima volta ho compilato la mia immagine con BUILD_MULTIPROCESSOR = 1 ed il risultato è una CPU che non viene sfruttata oltre il 50%.

BUILD_MULTIPROCESSOR_1

La seconda volta ho compilato utilizzando BUILD_MULTIPROCESSOR = 0 (default) ed il risultato è una CPU sfruttata fino al 100%.

BUILD_MULTIPROCESSOR_0

In conclusione, è fondamentale conoscere una serie di impostazioni (talvolta nascoste) che il Platform Builder ci mette a disposizione per poter eseguire in tempi sempre più rapidi le compilazioni delle nostre immagini !

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 !