Month: June 2014

Flow-based programming per l’Internet of Things con Node-RED in Microsoft Azure

azure-ill

Uno dei migliori e più conosciuti tool per il “flow-based programming” e che fornisce ottimi strumenti per l’Internet of Things è sicuramente Node-RED. Esso è un progetto open source ospitato su GitHub e sviluppato da Nick O’Leary e Dave Conway-Jones della IBM, anche se non è assolutamente basato su tecnologie IBM. La sua caratteristica principale è che è completamente scritto in JavaScript ed HTML e si basa sul framework server-side NodeJS. Ciò significa che può essere eseguito su un qualsiasi PC in cui sia possibile installare NodeJS e con tutti i sistemi operativi disponibili da Windows a Linux passando per Mac OS X.

Questo articolo non intende essere una guida introduttiva o completa a Node-RED ma vuole mostrare come quest’ultimo possa essere eseguito nel cloud ! Grazie alle sue fondamenta in NodeJS e la potenza di tutti i servizi Microsoft Azure, è possibile creare un Azure Web Site per un’applicazione NodeJS che ospiti Node-RED in modo da potervi accedere, controllare e svilupparci ovunque ci troviamo !

In questo modo, non c’è bisogno di mettere su un server “on premise” oppure a casa una delle board maggiormente utilizzate dai makers come la Raspberry Pi o la Intel Galileo. Queste soluzioni vanno bene per scenari dove c’è poco carico e traffico sui “flows” di Node-RED ma per ottenere un sistema altamente scalabile con milioni di connessioni, l’unica soluzione possibile è quella di utilizzare una PaaS come Microsoft Azure.

Siete interessati a sapere come si ? Partiamo !

Deploy in un Local Git repository su Azure

Il primo passo da fare è quello di procurarsi il codice sorgente di Node-RED, poichè è necessario eseguire una piccola modifica al codice stesso. Abbiamo a disposizione molteplici soluzioni per farlo, grazie alla funzionalità di integrate source control fornita da Azure per i Web Sites. Quando si crea un Web Sites, è possibile impostare il deploy da un source control system in modo che ogni modifica apportata al proprio repository (locale o remoto) viene automaticamente distribuita in produzione su Azure. Il codice sorgente può essere su Visual Studio Online, in un Local Git repository (su Azure), GitHub, Dropbox, Bitbucket, CodePlex oppure su un qualsiasi altro repository esterno basato su Git o Mercurial.

Nel caso di Node-RED, le possibili soluzioni sono quelle di usare un Local Git repository oppure un repository remoto su GitHub. Nel corso dell’articolo, li vedremo entrambi per completezza ma ciascuno di voi potrà scegliere il modo migliore in base alle proprie esigenze.

In primo luogo, bisogna creare un Azure Web Site utilizzando il management portal online.

01

Per impostare un deploy da un source control system, è possibile utilizzare il link corrispondente nella pagina principale del Web Site appena creato.

02

Per utilizzare un Local Git repository, è necessario selezionare la corrispondente voce “Local Git repository”.

03

Per abilitare il publishing attraverso Git, la prima volta che viene utilizzato, il management portal chiede di impostare le credenziali di accesso (username e password). Queste credenziali sono comuni a tutti i Web Sites, per cui se sono state già impostate, non verrano richieste nuovamente. Al termine di questa operazione, Azure crea un repository Git locale in cui è possibile pubblicare la propria applicazione; per farlo il portale ci mostra i passi da eseguire : scaricare ed installare Git sul proprio PC, creare un repository Git locale e committare l’applicazione sul repository remoto in Azure.

In questo caso, l’applicazione locale è Node-RED per cui è necessario scaricarne il codice sorgente attraverso il file zip disponibile sul sito ufficiale. Una volta estratti i file in una cartella sul proprio PC (nel mio caso C:\Users\Paolo\Source\Repos\node-red-0.8.0), usando la Git Bash (nella medesima cartella di Node-RED) è possibile creare il repository locale, aggiungere i file dell’applicazione ed eseguire il primo commit in locale attraverso I seguenti comandi :

git init

git add .

git commit –m “Initial Node-RED commit”

04

(E’ necessario ricordare che per eseguire il commit, Git richiede di impostare email e username mediante il comand git config per i parametri user.email e user.name)

Il passo successivo consiste nell’aggiungere un server Git remoto ed eseguire il push del master branch sul repository in Azure; dal management portal, nella dashboard del Web Site, è possibile ricavere il nome di tale repository. I comandi da eseguire sono i seguenti :

git remote add azure [repository URL on Azure]

git push azure master

Ovviamente, Git chiede la password per la connessione al repository remoto ed al termine di tale operazione, Azure inizia il deploy, il cui risultato è visibile nel tab Deployments del management portal.

05

Durante la fase di deploy, Azure esegue anche npm (NodeJS Package Manager) per poter installare tutti i moduli necessari a Node-RED per poter funzionare; tale informazioni è ricavata attraverso il file package.json.

A questo punto sembra di aver finito ma purtroppo navigando all’URL del sito non saremo in grado di visualizzare il tool visuale di Node-RED per la creazione dei “flows”. Per risolvere questo problema è necessario effettuare una piccola modifica al file settings.js impostando opportunamente il parametro uiPort nel modo seguente :

// the tcp port that the Node-RED web server is listening on
uiPort: process.env.PORT || 1880,

Al termine dell’articolo sarà più chiaro il perchè di tale modifica.

A questo punto, bisogna committare in locale le modifiche ed aggiornale sul repository in Azure in modo da avviare il re-deploy automatico.

git add .

git commit –m “uiPort setting changed”

git push azure master

Prima di poter utilizzare Node-RED, manca un ultima modifica. Il tool visuale fa uso intensivo del protocollo WebSocket che è necessario abilitare nella Configure tab del management portal per il Web Site corrente. Resta inteso che questo passo è necessario solo se utilizziamo il tool per la creazione dei “flows” che, come sappiamo, sono dei file JSON che potremmo anche sviluppare in locale e caricare in Azure.

06

Dopo aver eseguito il salvataggio, navigando al Web Site con il proprio browser sarà possibile vedere in esecuzione il tool visuale e Node-RED. Siamo pronti per creare i nostri “flows” !

07

Deploy attraverso un repository su GitHub

La seconda possibilità consiste nell’utilizzare un repository su GitHub. Ovviamente, potremmo utilizzare quello ufficiale di Node-RED ma in questo caso non potremmo eseguire la modifica necessaria al file settings.js. Per questo motivo, un buon modo è quello di creare un fork del repository originale attraverso il proprio account GitHub.

Per farlo, è necessario accedere a GitHub con le proprie credenziali, andare sul repository di Node-RED e cliccare su fork.

08

Una volta completato il fork, GitHub avrà creato un repository con un URL di questo tipo https://github.com/<username>/node-red in modo da poterlo clonare sul proprio PC attraverso la Git Bash nel modo seguente :

git clone /node-red.git”>/node-red.git”>https://github.com/<username>/node-red.git

Al termine del cloning, possiamo modificare il file settings.js (come fatto in precedenza) ed eseguire il commit sul repository.

git add .

git commit –m “uiPort setting changed”

git push

In questo caso, non abbiamo alcun bisogno di un repository Git su Azure poichè stiamo utilizzando quello di GitHub al quale faremo puntare Azure stesso nel momento della creazione del Web Site.

Dopo aver creato un nuovo Web Site come fatto in precedenza, impostiamo il deploy attraverso il source control GitHub.

09

Microsoft Azure si connette a GitHub e chiede l’autorizzazione a poter accedere a tutti i repository del proprio account in modo da poterci far selezionare a quale repository deve collegarsi per farne il deploy.

10

Come già fatto in precedenza, è necessario abilitare il protocollo WebSocket per ottenere così l’applicazione visuale di Node-RED pronta ed in esecuzione !

Test di Node-RED su Azure con un semplice flow di debug

Per essere sicuri che l’applicazione Node-RED stia funzionando correttamente, possiamo realizzare un semplice flow di debug con i due soli seguenti nodi :

  • inject : permette di iniettare dati in un flow. Il valore di default del payload del messaggio è il timestamp che può essere cambiato in fase di configurazione del nodo;
  • debug : permette la stampa del payload del messaggio ricevuto nella finestra di debug;

Aggiungiamo e colleghiamo i due nodi nel modo seguente.

11

Cliccando su Deploy, il flow viene deployato ed eseguito nell’istanza di Node-RED e se proviamo a cliccare sul nodo di inject, vedremo il timestamp visualizzato nella finestra di debug. Il nostro flow è in esecuzione su Azure !!

IISNode … la magia per avere Node-RED su Azure

Il componente principale che permette l’esecuzione di applicazioni NodeJS su Azure è il modulo ISS chiamato IISNode, i cui vantaggi sono i seguenti :

  • ha cura del ciclo di vita del processo node.exe;
  • NodeJS è per natura single threaded ma IISNode permette la creazione di più processi node.exe e di gestire il carico delle richieste tra più istanze;
  • si assicura che se un’applicazione NodeJS viene aggiornata, il processo node.exe venga riciclato;
  • fornisce l’accesso alle informazioni di log via HTTP;

Talvolta, per garantire l’esecuzione delle applicazioni NodeJS su IISNode sono necessari alcuni piccoli accorgimenti al codice sorgente dell’applicazione stessa ed in particolare l’impostazione della porta HTTP di ascolto attraverso la variabile d’ambiente process.env.PORT. Ciò spiega il perchè del fatto che il tool visuale di Node-RED non può essere in ascolto sulla porta 1880 (default) ma è necessario impostare la porta su cui è in ascolto IISNode in HTTP.

Conclusioni

Node-RED è un validissimo tool per la realizzazione di progetti per l’Internet of Things attraverso dei “flows” con una UI eseguita all’interno di un browser. Il problema principale è strettamente legato alla sua distribuzione.

Le soluzioni “on premise” o locale vanno bene per scenari semplici ma sicuramente non per scenari enterprise. In questo caso possiamo utilizzare le funzionalità di Azure per l’esecuzione delle applicazioni NodeJS aggiungendo anche la scalabilità e la gestione del carico grazie al modulo IISNode all’interno di IIS.

Advertisements

Arduino, sviluppiamo il nostro primo driver … su HTML.it

Capture

La guida introduttiva allo sviluppo su Arduino entra nel vivo con un capitolo dedicato alla realizzazione di un vero e proprio driver e nel caso specifico per un sensore di temperatura.

L’obiettivo è quello di ottenere un’interazione con il mondo che ci circonda e ricavare una grandezza fisica da trasformare in un dato da inviare al Cloud !

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 !

Arduino e l’accesso alla “grande rete” … su HTML.it

0675.Cattura_3A543116

Altro capitolo della mia guida introduttiva su Arduino e questa volta si inizia a parlare di connessione alla grande rete dalla Ethernet shield ad un semplicissimo client HTTP.

Ovviamente, questo non è nient’altro che la preparazione verso l’accesso al cloud !

.Net Micro Framework ed Internet Of Things : un rapido sguardo alle news in arrivo ed al futuro a lungo termine

7624.Cattura_59183A94

Negli ultimi giorni ho letto molte cose interessanti sul futuro del .Net Micro Framework …

In primo luogo, un post sul community forum della GHI Electronics che parla del piano dei prodotti .Net Gadgeteer per il 2014. Gary, impiegato GHI, dice :

We have some very exciting news to share with you today. First of all, we have been communicating your feedback to Microsoft and they have been very responsive. We can’t share all the details yet but we can tell you that you will be very happy with what Microsoft will announce very soon.

In queste parole ci sono due punti principali :

  • GHI ha riportato a Microsoft i feedback di tutti gli utilizzatori del .Net Micro Framework e dei prodotti .Net Gadgeteer con l’intenzione di migliorare il framework;
  • Sono all’orizzonte più dettagli e news che Microsoft annuncerà presto nei prossimi giorni (settimane ? mesi ?). Avremo così news ufficiali sul futuro del .Net Micro framework;

Sicuramente sono punti significativi !

Un’altra cosa che ho notato è sul sito ufficiale del progetto .Net Micro Framework su CodePlex.

A partire da fine Maggio 2014, Steve Maillet è project member. Steve è già stato program manager sul .Net Micro Framework dal 2007 al 2011 e successivamente passato al team Windows Embedded. Penso che il suo ritorno sia una buona notizia, perchè con la sua esperienza la piattaforma migliorerà sicuramente. Inoltre, Steve avrà una sessione alla DotNetConf su “.Net Micro Framework and IoT” per mostrarne pubblicamente le principali caratteristiche ed il relativo uso nell’Internet Of Things.

Ultimo ma non meno importante è l’aggiornamento sulla pagina principale del progetto su CodePlex il 16 Giugno (sempre da parte di Steve) …

In preparation for the longer term future of .NET MF we are in the process of some changes to the use of CodePlex. (Including switching to a GIT repository model to make things easier for a true OSS development process). As part of this transition everyone’s permissions were reset to “editor” status, thus denying check-in permissions on the TFS tree. Fear not! This isn’t a permanent change. We’ll have more details on the results of the changes and the process for contributing into the official repositories in the very near future so stay tuned.

Il punto principale è la frase iniziale che parla di un futuro a lungo termine del .Net Micro Framework supportato da Microsoft; possiamo considerarla una grande notizia considerato l’ultimo anno trascorso senza aggiornamenti (a meno del rilascio a Febbraio del .Net MF 4.3 RTM QFE1).

In conclusione, sembra che in un futuro molto vicino ci saranno grandi novità ed aggiornamento sul futuro del .Net Micro Framework che è vivo e vegeto; Microsoft immagina che abbia un grande potenziale da sfruttare nell’Internet of Things per fornire ai clienti una soluzione completa con l’offerta di Microsoft Azure : dai device al cloud !

Per questo … restate sintonizzati !

UPDATE [19 Giugno 2014]

Oggi Steve Maillet ha creato una planned version del framework sul sito ufficiale CodePlex : .Net Micro Framework v4.Next !!

Un’altra grande notizia !

UPDATE [27 Giugno 2014]

Hello !!

Questo è il titolo del post scritto da Salvador Ramirez, program manager Microsoft, sul blog ufficiale del .Net Micro Framework. Il team sta lavorando duramente per migliorare il framework e vuole basarsi fortemente anche sull’aiuto della community come progetto open source. Una novità è stata svelata … ci sarà a breve l’integrazione con Visual Studio 2013 !

UPDATE [11 Luglio 2014]

Il lavoro di Salvador Ramirez sulla stato del .Net Micro Framework continua. Questa volta è stata aggiornata la home page del progetto su CodePlex ma soprattutto Salvador ha fornito una serie di risposte nel forum del .Net Micro Framework sul sito ufficiale. In primo luogo, ha confermato il supporto imminente per Visual Studio 2013 e l’introduzione dei generics richiesta da molti. Infine, ha ribadito il lavoro all’interno del team a chi si era già reso conto di un “refresh” in corso. Con questi interventi, possiamo essere certi di una cosa : il progetto .Net Micro Framework è vivo e vegeto, la Microsoft lo ha ripreso in pugno ed è intenzionata a portarlo avanti. Sicuramente per l’estate avremo grandi novità (almeno quelle preannunciate) … poi solo il tempo ci dirà come stanno le cose !

UPDATE [24 Luglio 2014]

Questa volta tocca alla licenza. Stave Maillet ha aggiornato il file di licenza del .Net Micro Framework indicandone il nuovo copyright assegnato alla Microsoft Open Technologies !

.NET Micro Framework

Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.

Ad esso vanno aggiunte le licenze sullo stack lwIP, il kit OpenSSL ed il protocollo Dallas 1-Wire.

UPDATE [18 Settembre 2014]

Sul forum della GHI è intervenuto Pete Brown, evangelist Microsoft che ha da sempre la passione per .Net Gadgeteer (lo dimostrano i numerosi post sul suo blog) e che negli ultimi mesi è entrato a far parte del gruppo relativo all’Internet of Things con uno sguardo al .Net Micro Framework ed al progetto Windows for IoT.

La discussione è molto “accesa” ma la conferma ulteriore che è abbiamo è …

The NETMF team is now part of the IoT org at Microsoft

There will be an announcement soon on the first visible investments. It’s a small, but important first step.

We’ve committed to making NETMF faster, to bringing more language enhancements, and to making sure it works with the latest versions of Visual Studio.

Pete è intervenuto anche in una discussione sul forum di Netduino, confermando quanto già detto ed evidenziando vantaggi e svantaggi del framework :

NETMF, on the other hand, provides a number of services above that, including CLR garbage collection, memory management, threading, and more. It’s also interpreted at runtime, not something that’s natively compiled.

For those reasons, it’s impossible in its current state, to target 8 bit devices, or low memory devices with NETMF. Maybe we’ll find a way to change that in the future, but I don’t see a way to do that with .NET and C# as people currently recognize them.

Similarly, you can’t get Windows on an 8 bit device like that, because it’s a full modern operating system.

E’ evidente la collaborazione con il team della GHI (Gus Issa) e della Secret Labs (Chris Walker) per migliorare il prodotto.

Insomma, ancora una ulteriore conferma dell’investimento di Microsoft nel .Net Micro Framework !

Better Embedded 2014 : sarò speaker sull’Internet of Things !

Capture

Quest’anno avrò l’enorme piacere ed onore di essere speaker all’unica conferenza formativa italiana sul mondo embedded, Better Embedded 2014, che si svolgerà il 4 e 5 Luglio a Firenze presso l’Hotel Londra.

La mia sessione sarà dedicata all’Internet of Things con uno sguardo alla “guerra” tra i principali protocolli utilizzati quali HTTP (REST), AMQP, MQTT e CoAP (ad essi aggiungerò presto anche XMPP e DDS). Il confronto tra di essi sarà letteralmente sul campo, quindi non più un’introduzione ai protocolli stessi ma singole battaglie su campi diversi in cui ciascun protocollo cercherà di avere la meglio sugli altri.

Ci sarà un vincitore ? Per saperlo non vi resta che iscrivervi all’evento e venire a seguire la mia sessione !

Arduino, leggere i movimenti da un potenziometro…su HTML.it

0167.Cattura_64C45C4C

Dopo aver parlato di Physical Computing nel capitolo precedente, la mia guida introduttiva su Arduino è giunta al quinto appuntamento in cui si affronta il semplice utilizzo di un potenziometro mediante un esempio, per iniziare a capire come poter gestire i pin analogici.

Dal prossimo capitolo, senza svelarvi nulla e rovinarvi la sorpresa, inizia il nostro viaggio che porterà la nostra board sul Cloud !