Embedded

Intel Joule debate and … #thesixthsense on #IoT

After Intel Developer Forum 2016 (IDF) with the new Joule IoT Dev Kit announcement, a debate started between some colleagues here in Red Hat on using this kind of platforms only for maker projects or in the enterprise world as well.

This debate became a post on the Red Hat Developers blog titled “Intel Joule Debate: A maker platform ready for widespread IoT use?”.

It was funny because before it was published, I started a #thesixthsense #IoT series on Twitter worried about how the embedded systems “could” be in a near future using high level tools by high level developers …

thesixthsense_iot

I think that the blog post worths a read and I hope you’ll enjoy it !

My Raspberry Pi runs the Qpid Dispatch Router

This morning my “embedded” soul had an idea for supporting my “messaging” soul and spending some time in a productive way … trying to compile the Qpid Dispatch Router on a different machine with a different architecture : it’s C/C++ code … so it’s portable by definition (even if related to Linux for now) … it uses Python but today this language is available on a lot of different platforms … so it seems to be no problems.

Searching for some embedded stuff in my closet and discarding Cortex-Mx based boards (for obvious reasons regarding Linux lack on them) I got my Raspberry Pi … the first version (ARM11 based … not Cortex-Ax) 🙂

embedded_stuff

I have the Pi2 as well (I have to by the third version) but I preferred to stop my research for starting immediately. I followed all the steps needed (explained in my previous article) using the Pi as a normal PC (connected via SSH) and after a while for compiling directly on the board, the router was up and running !

router_pi

The only tweak needed was to force cmake to use the Python 2.7 library with following command line :

cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DPYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython2.7.so -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 -DPYTHON_EXECUTABLE=/usr/bin/python

because the 3.x version is installed on the Pi as well but we can’t use it for the router.

I know .. it’s not the right way to compile source code for embedded devices and cross-compilation from my PC is the better way to do that but I preferred it in order to go fast and avoid to setup a complete ARM toolchain on the laptop; of course be patient … building the Qpid Proton took me about one hour ! I can suggest you to have a good coffee …

Before starting the router, another simple tweak was needed in order to make persistent the value of the PYTHONPATH environment variable writing the following line to the .bashrc file :

export PYTHONPATH=/usr/lib/python2.7/site-packages

Now I have an idea … Pi with its Linux version is SSL/TLS capable but there are a lot of resources constrained devices which are able to “speak” AMQP but can’t support SSL/TLS connections. Why don’t use the Pi as a “shadow” IoT gateway and it’s security capabilities in order to bring above constrained devices to reach SSL/TLS and AMQP based cloud platforms even if they can’t “speak” SSL/TLS ?

My chat about IoT on TecHeroes show !

techeroes_channel9

On December 2nd I had a session at WPC 2015 in Milan speaking about Microsoft Azure IoT Hub.

During the conference I had a chat with Erica Barone (Microsoft Italia Evangelist) about IoT in general and more specific about the Microsoft offer on Azure with IoT Hub and IoT Suite. The chat was recorded as a new episode of the TecHeroes show published on Channel9.

Today it’s there !

It’s in italian and I’m sorry for all my foreign friends 😦

Mobile Camp 2015 : telemetria da Windows 10 IoT Core all’Azure Event Hubs

mobile_camp_2015

Anche quest’anno ho avuto il piacere di essere speaker al Mobile Camp organizzato da Microsoft a Napoli; quest’anno l’evento era incentrato su Windows 10 e tutte le novità di Build 2015.

Da buon Microsoft MVP su Windows Embedded ed IoT, la mia sessione era ovviamente dedicata all’embedded ed all’Internet of Things ed in particolare alla Raspberry Pi 2 con Windows 10 IoT Core.

Ovviamente, in una soluzione IoT non può mancare il Cloud con i suoi servizi e nel mio caso non poteva mancare l’Azure Event Hubs come destinazione dei dati (temperatura) trasmessi dalla Raspberry Pi 2 (utilizzando la mia libreria Azure SB Lite).

Per chi fosse interessato, il materiale è disponibile su SlideShare (slide) e su GitHub (il codice sorgente della demo).

Netduino : la nuova “terza” generazione anche con Wi-Fi integrato

Ed ora … posso finalmente scrivere qualcosa !! 🙂

Circa due settimane fa ho ricevuto un bel regalo dalla Secret Labs (grazie a Chris Walker) … la nuova scheda Netduino 3 Wi-Fi !

WP_20150429_22_18_19_ProWP_20150429_22_18_35_Pro

Personalmente, ho iniziato la mia “carriera” con il .Net Micro Framework utilizzando le board Netudino e Netduino Plus (prima e seconda generazione), divertendomi tantissimo nello sviluppo di driver gestiti per i componenti ad esse collegati. Con l’esplosione dell’Internet of Things, ho iniziato a sviluppare la mia libreria M2Mqtt ed a testarla sulla versione della board dotata di connessione Ethernet, ma per quanto riguarda il collegamento con i servizi Azure come il Service Bus (event hubs, queues e topics/subscription) mi sono dovuto fermare a causa di un grosso problema: il mancato supporto per il protocollo SSL/TLS ! (necessario per Azure).

Ufficialmente a partire da ieri (ma poche settimane fa per me) … non abbiamo questo limite ! La “terza” generazione delle board della famiglia Netduino supporta i protocolli sicuri come SSL/TLS e quindi fornisce la possibilità di connettersi a tutti i servizi Microsoft Azure ! 🙂

Per ora, solo la versione Wi-Fi è già disponibile su Amazon qui e la versione Ethernet sarà disponibile nel mese di giugno qui.

L’hardware

Parlando della Netduino 3 Wi-Fi, questa scheda ha un STM32 MCU (microcontrollore a 32 bit) Cortex-M4 a 168Mhz con 2 MB di Flash dual-bank e 256 KB di RAM. Naturalmente, a causa del .Net Micro Framework TinyCLR abbiamo fino a 1408 KB per il nostro codice applicativo (in Flash) e circa 164 KB di RAM disponibile. Per me, si tratta di enormi quantità di memoria per le applicazioni embedded complesse !

netduino3wifi

Abbiamo lo stesso pulsante ed il led come le schede precedenti e tutti i pin, 22 pin digitali e analogici come GPIO, che possono essere utilizzate con le seguenti caratteristiche specifiche :

  • Porte UART
  • Segnali PWM
  • Porte SPI
  • Porte I2C

La grande differenza con le schede precedenti è la presenza di 3 porte GoBus 2.0 e sembra che la Secret Labs stia sviluppando nuovi componenti da connettere ad essi. Se volete sapere che cosa è GoBus, potete approfondire con il seguente articolo : sembra essere una caratteristica simile a .Net Gadgeteer ma ha molteplici differenze.

Il modulo Wi-Fi è una grande caratteristica in più perché è completamente integrato sulla scheda senza la necessità di un dispositivo esterno. Il chip è un TI CC3100 (Texas Instruments), con tutte le certificazioni necessarie e supporta 802.11 b/g  n con SSL/TLS ed i tre livelli di sicurezza: aperto, WEP e WPA2.

Ultima caratteristica ma non meno importante è il connettore microSD (fino a 2 GB) per la memorizzazione dei dati.

Il software

Naturalmente le nuove schede Netduino sono tutti basate sulla più recente versione del .Net Micro Framework (4.3 QFE2-RTM) e tutto il codice è open source: si può trovare il porting per Netduino su GitHub.

Una grande differenza con il passato è il Netduino.IP: il nuovo stack TCP/IP per .Net Micro Framework. Come sappiamo, uno dei grandi problemi del .Net Micro Framework è lo stack di rete che non è molto affidabile. Per questo motivo, Secret Labs ha deciso di iniziare il nuovo progetto di cui sopra con lo sviluppo di uno stack TCP/IP completamente gestito ed avere il pieno controllo su di esso. Naturalmente, questo nuovo “nato” è ancora in Technical Preview e sotto test ogni giorno per migliorare le sue featues e prestazioni. La buona notizia è che ha supporta per le classi standard in System.Net  (Socket, HttpWebRequest, …) per garantire retrocompatibilità ed utilizza solo 4 KB di RAM. Come progetto open source, è disponibile su GitHub per due chip Ethernet: il solito Microchip ENC28J60 e Asix AX88796C.

Per quanto riguarda il supporto Wi-Fi, lo stack TCP/IP per il TI CC3100 è in un altro progetto (che sarà assimilato nel Netduino.IP) disponibile qui. In questo caso, abbiamo il pieno supporto per la classe SslStream per SSL/TLS 1.2. Questo progetto è in fase di sviluppo ed ha alcune alcune limitazioni relative al numero di socket aperte simultaneamente e buffer. Le prestazioni potrebbero essere superiori perché la versione corrente usa l’UART per comunicare con il chip ma il supporto SPI arriverà presto.

Dal punto di vista degli sviluppatori, abbiamo Visual Studio 2013 ma è già pronto il supporto per Visual Studio 2015.

Infinite possibilità

Con questa nuova terza generazione, ora abbiamo molte possibilità nell’ambito dell’Internet of Things con la famiglia delle board Netduino. Il grande vantaggio è l’accesso a tutti i servizi Microsoft Azure come Event Hubs (e tutti gli altri servizi del Service Bus) e di tutti i servizi on-line che hanno bisogno di supporto SSL (le Twitter APIs per esempio). Ho già provato la mia board nelle ultime due settimane ed ho avuto buoni risultati usando la libreria AMQP Net Lite per la connessione al Service Bus e con la mia libreria M2Mqtt con un broker MQTT nell’iinviare e ricevere molteplici messaggi. Tutti i miei test sono correlati al lato client dell’uso della board poichè non concordo nell’avere un server su un dispositivo embedded per motivi di sicurezza, quindi non ho approfondito le funzionalità disponibili per sviluppare un server HTTP(S) a bordo. La scheda con tutti i relativi stack software sembra essere affidabile ma la performance potrebbero essere migliorate. So che Chris lavorerà duramente nei prossimi mesi per fornire nuove funzionalità e miglioramenti per darci un prodotto migliore per collegare le “nostre” cose all’Internet degli oggetti in rete.

Internet of Things a Napoli : una giornata all’insegna delle “cose” e del “cloud”

Ieri si è tenuta a Napoli la terza edizione della Microsoft Embedded Conference, ormai rinominata in Internet of Things Conference ed organizzata dalla community DotNetCampania grazie al supporto di Microsoft Italia.

Come ogni anno la giornata, completamente gratuita, ha avuto un ottimo riscontro considerando soprattutto l’argomento trattato ed il livello elevatissimo degli speaker, tutti Microsoft MVP per Windows Embedded ed IoT. Ad essi si sono aggiunti Erica Barone, Techincal Evangelist di Microsoft Italia, e Olivier Bloch (con una sessione remota da Redmond), Techical Evangelist di Microsoft Open Tech.

La giornata è iniziata proprio con Erica che ci ha fornito una panoramica generale su come Microsoft intende l’IoT e quali sono tutti i servizi Cloud che mette a disposizione per la realizzazione di sistemi più o meno complessi. A seguire, io ho tenuto una sessione tecnica ed approfondita sull’ultimo nato tra i servizi del Service Bus di Azure : l’Event Hubs. La mattinata si è conclusa con Mirco Vanini che ci ha illustrato il programma Windows Developer for IoT parlando ovviamente anche della Intel Galileo.

DSC_0342 DSC_0384

DSC_0389 WP_20150418_12_21_02_Pro - Copia

Il pomeriggio è iniziato con Beppe Platania e Gianni Rosa Gallina che ci hanno prima illustrato una soluzione reale di IoT implementata anche attraverso l’utilizzo del .Net Micro Framework e successivamente alcuni interessanti progetti su cui stanno lavorando nell’ambito dei wereable e della realtà aumentata. A seguire, la sessione di Lorenzo Maiorfi sull’utilizzo del progetto Orleans nell’ambito IoT : Lorenzo ha avuto un enorme successo con la sua demo basata anche su Bluetooth e Beacon che mi ha visto protagonista come “navetta” per la quale riuscirne a tracciare il percorso effettuato.

DSC_0390 DSC_0405

DSC_0411 DSC_0427

DSC_0438 DSC_0445

La giornata si è conclusa con una sessione in coppia con Valter Minute e, direttamente da Redmond in remoto, Olivier Bloch che si è svegliato molto presto (alle 6:00 del mattino) solo per noi. Ovviamente, a lui va un ringraziamento particolare !

Come sempre la giornata è stata resa possibile grazie all’aiuto di tutti i ragazzi della commnunity : Antonio Liccardi che ha gestito interamente la logistica, Carmine Alfano ed Emanuele Garofalo che da ottimi fotografi ci hanno regalato i momenti principali dell’evento ed i principali sponsor come Nova Tech Consulting (Mario Saccoia), Blexin (Michele Aponte, presidente del DotNetCampania) e QT2000 (Gaetano Criscuolo). Un grazie va anche a tutti gli altri che vi hanno partecipato con grande intersse !

Grazie a tutti … ed arrivederci all’anno prossimo !

😉

Microsoft MVP … anno 2015 !

mvp_award

Un anno è trascorso da quando ho ricevuto la prima nomina a Microsoft MVP su Windows Embedded e pochi giorni fa (il primo Aprile) è giunta nuovamente la mail più emozionanente che si possa aspettare … il rinnovo !

Il mio “ruolo” di MVP mi ha permesso di essere al summit a Novembre a Redmond in “casa” Microsoft e per me è stata un’esperienza indescrivibile, conoscendo il team che lavora sull’IoT e tutte quelle persone con le quali avevo solo contatti “virtuali”.

Grazie a tutti coloro che hanno continuato a credere in me ed a considerarmi meritevole di questo premio.

Per quanto mi riguarda proseguirò con il massimo impegno, sperando che il prossimo anno possa essere nuovamente qui a scrivere lo stesso post !

Internet of Things : dal “cos’è” al “come” con le tecnologie Microsoft

IoT_dotnetcampania

Il nuovo portale della community DotNetCampania, di cui faccio parte, è online da qualche settimana e la sezione degli articoli si arricchisce ogni giorno di nuovi contenuti con gli argomenti più svariati, dallo sviluppo web e mobile all’ALM, dai patterns all’Internet Of Things.

Ovviamente, la sezione a cui partecipo più attivamente è quella relativa all’IoT per la quale ad oggi ho scritto i due seguenti articoli :

Nel primo, un’introduzione su cosa sia l’Internet of Things e come i sistemi embedded rientrano in questo nuovo business. Nel secondo, tutte quelle che sono le tecnologie che Microsoft mette a disposizione per la realizzazione di una soluzione IoT completa, dai device (le “cose”) al “Cloud”.

Buona lettura !

🙂

TimeService e .Net Micro Framework : importanza della data ed dell’ora nell’IoT

Nell’ambito dell’Internet of Things e soprattutto quando abbiamo intenzione di proteggere i dati trasmessi da un sistema embedded da occhi indiscreti attraverso gli algoritmi di criptazione (AES, DES, 3DES, RSA, …) e con relativi protocolli di rete (SSL, TLS, DTLS, …), assume un ruolo fondamentale l’impostazione della data ed dell’ora sulla nostra board.

Infatti, gli algoritmi di criptazione si basano fortemente sui generatori di numeri pseudocasuali (PRNG, Pseudo-Random Number Generator), la cui inizializzazione prevede molto spesso l’utilizzo della data ed dell’ora corrente come “seme” della generazione. Essendo generatori pseudo-casuali e non reali è importante che ad ogni avvio il “seme” risulti diverso altrimenti la sequenza generata è la medesima dell’avvio precedente e quindi prevedibile.

Inoltre, nel caso in cui dobbiamo accedere ad un servizio nel cloud per il quale si rende necessaria l’autenticazione attraverso un token (es. accesso SAS, Shared Access Signature, al Microsoft Azure Service Bus), è importante che la richiesta contenga anche un timestamp relativo alla scadenza del token (es. nel caso di un SWT, Simple Web Toke); il timestamp va ovviamente calcolato in base alle proprie esigenze e rispetto ad una data ed ora correttamente impostati nel sistema.

RTC ed (S)NTP server

Le modalità con cui è possibile impostare ed aggiornare la data e l’ora in un sistema embedded sono tipicamente due :

  • L’utilizzo di un RTC (Real Time Clock) che può essere a bordo del microcontrollore oppure una periferica esterna collegata a quest’ultimo mediante un opportuno protocollo (in molti casi I2C);
  • La connessione ad un (S)NTP server (Simple Network Time Protocol) e la relativa sincronizzazione con quest’ultimo con una certa cadenza oppure su richiesta esplicita;

Nel primo caso, l’RTC ha il compito di salvare e fornire al sistema la data e l’ora aggiornati anche con successivi riavvii; nel secondo caso, il sistema si connette al server per ricavare una data ed ora aggiornati senza avere però la possibilità di ritrovarsi con le informazioni corrette al successivo riavvio.

Ovviamente le due modalità possono anche essere utilizzate insieme : al primo avvio il sistema si sincronizza con un server (S)NTP e salva la data nell’RTC a disposizione. All’avvio successivo, essendo l’RTC dotato tipicamente di una batteria al litio, il sistema potrà chiedere ad esso la data e l’ora senza la necessità di una connessione al server (S)NTP. In un qualsiasi momento, si può richiedere la sincronizzazione con relativo aggiornamento della data ed ora del server con l’RTC in locale.

TimeService e .Net Micro Framework

Sviluppando con il .Net Framework, siamo tutti abituati a ricavare la data e l’ora utilizzando la proprietà DateTime.Now; se eseguiamo questa operazione all’avvio su una board con il .Net Micro Framework non avremo sicuramente la data e l’ora corretti !!

L’utilizzo di un RTC non viene fornito nativamente dal framework ma per fortuna abbiamo a disposizione la classe TimeService che ci aiuta nell’utilizzo di un (S)NTP server.

Questa classe mette a disposizione una serie di proprietà, metodi ed eventi i cui principali sono :

  • Settings : proprietà del tipo (TimeServiceSettings) che permette di definire le principali impostazioni del servizio (indirizzi di un server primario e secondario a cui connettersi, intervallo di refresh, sincronizzazione forzata ad ogni avvio, …);
  • SystemTimeChangedTimeSyncFailed : eventi sollevati rispettivamente quando la data e l’ora sono cambiati a seguito di una corretta sincronizzazione oppure quando la sincronizzazione è fallita (es. mancata connessione);
  • SetTimeZoneOffset : metodo per l’impostare l’offset della nostra timezone rispetto a UTC/GMT;
  • Start/Stop : metodi per avviare ed arrestare il servizio di sincronizzazione;
  • UpdateNow : metodo per forzare una sincronizzazione immediata;

Ovviamente, queste rappresentano solo una minima parte di tutte le caratteristiche e funzionalità della classe TimeService.

Una strana anomalia sui settings : un occhio al codice nativo

La classe statica TimeService espone tutte le impostazioni mediante la proprietà Settings che a sua volta contiene una serie di proprietà per le impostazioni stesse. Per poterle impostare, saremo portati ad eseguire un codice di questo tipo

TimeService.Settings.RefreshTime = 10;
TimeService.Settings.ForceSyncAtWakeUp = true;

I valori di default per le proprietà RefreshTime e ForceSyncAtWakeUp sono 50000 e false. Se proviamo ad eseguire il codice appena visto, vedremo che subito dopo le due istruzioni, i valori non sono assolutamente cambiati in 10 e true. Perchè ?

TimeServiceSettings

Il motivo di questo comportamente è l’implementazione nativa del “get” della proprietà Settings. Nel codice sorgente del .Net Micro Framework troviamo :

HRESULT Library_spot_Time_native_Microsoft_SPOT_Time_TimeService::get_Settings___STATIC__MicrosoftSPOTTimeTimeServiceSettings( CLR_RT_StackFrame& stack )
{
 TINYCLR_HEADER(); 

 TimeService_Settings settings;
 CLR_RT_HeapBlock& top = stack.PushValueAndClear();
 CLR_RT_HeapBlock* managedSettings = NULL;

 TINYCLR_CHECK_HRESULT(TimeService_LoadSettings(&settings)); 

 TINYCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex( top, g_CLR_RT_WellKnownTypes.m_TimeServiceSettings ));
 managedSettings = top.Dereference();

 managedSettings[ ManagedSettings::FIELD__PrimaryServerIP ].SetInteger( settings.PrimaryServerIP );
 managedSettings[ ManagedSettings::FIELD__AlternateServerIP ].SetInteger( settings.AlternateServerIP );
 managedSettings[ ManagedSettings::FIELD__RefreshTime ].SetInteger( settings.RefreshTime );
 managedSettings[ ManagedSettings::FIELD__Tolerance ].SetInteger( settings.Tolerance );
 managedSettings[ ManagedSettings::FIELD__ForceSyncAtWakeUp ].SetBoolean( 0 != (settings.Flags & TimeService_Settings_Flags_ForceSyncAtWakeUp) );
 managedSettings[ ManagedSettings::FIELD__AutoDayLightSavings ].SetBoolean( 0 != (settings.Flags & TimeService_Settings_Flags_AutoDST) );

 TINYCLR_NOCLEANUP();
}

Come possiamo notare, la funzione crea una variabile locale “settings” all’interno della quale carica le impostazioni globali. Successivamente, essa copia i campi della variabile locale alla variabile managed da ritornare al nostro codice (attraverso lo stack e per riferimento) … ciò vuol dire che non stiamo impostando i settings globali della classe TimeService ma una copia di una variabile locale di una funzione ! Non so dirvi se può essere considerato un bug o un comportamento voluto ma per impostare i settings correttamente è necessario creare una istanza della classe TimeServiceSettings ed assegnarla alla proprietà Settings di TimeService.

TimeServiceSettings settings = new TimeServiceSettings();
settings.RefreshTime = 10; // every 10 seconds
settings.ForceSyncAtWakeUp = true;
TimeService.Settings = settings;

Un esempio completo

In definitiva, per poter utilizzare in maniera corretta la classe TimeService, possiamo utilizzare il seguente codice.

void ethernetJ11D_NetworkUp(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
{
     TimeServiceSettings settings = new TimeServiceSettings();
     settings.RefreshTime = 10; // every 10 seconds
     settings.ForceSyncAtWakeUp = true;
            
     TimeService.SystemTimeChanged += TimeService_SystemTimeChanged;
     TimeService.TimeSyncFailed += TimeService_TimeSyncFailed;
     TimeService.SetTimeZoneOffset(60);

     IPHostEntry hostEntry = Dns.GetHostEntry("time.nist.gov");
     IPAddress[] address = hostEntry.AddressList;
     if (address != null)
         settings.PrimaryServer = address[0].GetAddressBytes();
                
     hostEntry = Dns.GetHostEntry("time.windows.com");
     address = hostEntry.AddressList;
     if (address != null)
         settings.AlternateServer = address[0].GetAddressBytes();
                
     TimeService.Settings = settings;

     TimeService.Start();
}

void TimeService_TimeSyncFailed(object sender, TimeSyncFailedEventArgs e)
{
     Debug.Print("DateTime Sync Failed");
}

void TimeService_SystemTimeChanged(object sender, SystemTimeChangedEventArgs e)
{
     Debug.Print("DateTime = " + DateTime.Now.ToString());
}

Sulla base dell’intervallo di tempo impostato in RefreshTime, verrà sollevato periodicamente l’evento SystemTimeChanged potremmo essere certi che la proprietà DateTime.Now sarà quella correttamente sincronizzata con il server.

Va sottolineato che la classe TimeService basa il suo funzionamento su una parte di codice nativo che è incluso nel firmware delle board della GHI Electronics (FEZ Spider, FEZ Raptor, …) ma non nel firmware del Netduino, per il quale è necessario l’utilizzo di una classe di terze parti che implementi un client (S)NTP.

IoT per sviluppatori Microsoft

IoTMicrosoftPodcast

Una delle più grandi iniziative del 2014 è stata sicuramente la nascita di DotNetPodcast, podcast completamente in italiano e dedicato alle tecnologie Microsoft. Gli ospiti sono sempre di altissimo livello e ad inizio anno, ho avuto l’onore di poter registrare una puntata, completamente dedicata all’Internet of Things ed allo sviluppo di soluzioni IoT attraverso il .Net Micro Framework. Ringrazio Roberto Albano, Antonio Giglio e Massimo Bonanni per la fiducia !!

Nel corso del podcast, ho cercato di descrivere in maniera semplice cosa sia un sistema embedded e come siamo abituati a convivere con oggetti di questo tipo quotidianamente. Dalle “cose” si arriva all’Internet delle cose ed alla relativa integrazione con i servizi nel cloud. Per poter permettere a tutti gli sviluppatori .Net un approccio “friendly” a questo mondo, Microsoft offre il .Net Micro Framework per il quale abbiamo a disposizioni numerose board di sviluppo : Netduino (Secret Labs) e le board della famiglia FEZ (GHI Electronics). Nel corso della puntata, ho analizzato l’architettura con relativi vantaggi e svantaggi di questo framework e come sia possibile iniziare a sviluppare (in maniera gratuita a meno dell’acquisto dell’hardware) le proprie “cose” da collegare alla rete.

Curiosi ? Non vi resta che ascoltarmi !  (se vi va)

🙂