HTTP

Il Physical Computing con Arduino e Galileo … su HTML.it

Capture

La mia guida su Arduino è ormai giunta al quarto appuntamento in cui si parla (finalmente) di Physical Computing !

Nel corso di questo capitolo si parla del modo in cui il nostro sistema embedded può interfacciarsi con il mondo reale attraverso l’utilizzo dei sensori e pilotare la realtà che lo circonda attraverso gli attuatori.

Al suo termine sarete pronti per le puntate successive in cui inizieremo a toccare con mano questo fantastico mondo …. arrivando sino al Cloud !

Hello World: facciamo blinkare un led … su HTML.it

6558.Cattura_501EE8A3

Pubblicato il terzo capitolo della mia guida introduttiva alla programmazione su Arduino ed Intel Galileo su HTML.it.

Questa volta si inizia a fare sul serio ed a toccare con mano lo sviluppo in C/C++ negli sketch. Ovviamente, per chi si avvicina al mondo embedded, la prima applicazione non può essere nient’altro che il “blink” di un led !

Arduino, l’ambiente di sviluppo per gli sketch su HTML.it

Capture

Vi segnalo la pubblicazione del secondo capitolo della mia guida di introduzione alla programmazione su Arduino ed Intel Galileo su HTML.it.

Questa volta è descritto l’ambiente di sviluppo (IDE) per la realizzazione degli “sketch” ossia dei programmi eseguiti su entrambe le board oltre alla prima fase di installazione dei driver. Insomma, tutto ciò di cui c’è bisogno per iniziare a sviluppare !

IoT@Work e MobileDay : due eventi da non perdere !

3404.Cattura_187953B7

La community romana DomusDotNet (i “cugini” dei membri del DotNetCampania) e TinyCLR.it (di cui faccio parte) sono lieti di presentarvi IoT@Work, un evento in collaborazione con Microsoft ed Intel, completamente dedicato al mondo dell’Internet Of Things che si svolgerà il prossimo 6 Giugno a Roma !

La giornata è assolutamente gratuita ed affronta uno dei temi più “caldi” dell’ultimo anno relativo all’Internet delle Cose.

Si inizia con la sessione “IoT – What is it ?” di Mirco Vanini che ci spiega che cosa si intende per Internet of Things, quali sono i campi applicativi e le implementazioni attuali nel mondo reale. Subito dopo c’è la mia sessione “IoT Protocols Landscape” in cui affronto l’analisi dei principali protocolli che ad oggi si stanno mettendo in evidenza nel mondo dell’IoT con un occhio di riguardo a quello che mi sta più a “cuore”, MQTT. La mattinata si conclude con Lorenzo Maiorfi e la sessione su “IoT NodeRed”, un interessantissimo strumento basato su NodeJS ed utilizzato per la cosiddetta “flow-based programming” molto efficace nel mondo M2M.

Subito dopo la pausa pranzo, il pomeriggio parte con una demo corale (io, Mirco e Lorenzo) che mostra un sistema di Smart Home e Smart Factory e con una dimostrazione pratica dei concetti di IoT nell’ambito della domotica e dell’automazione industriale. A seguire, Francesco Baldassarri portavoce di Intel, sponsor dell’evento, ci mostra le caratteristiche principali e le potenzialità della board Galileo con le sue applicazioni future.

4478.Cattura_7019FB95

Il 13 Giugno a Napoli, DotNetCampania vi invita al MobileDay per poter parlare di sviluppo mobile con le tecnologie Microsoft e del partner Xamarin.

Nella prima sessione, Michele Aponte e Mauro Ghiani ci mostrano quali sono i principali problemi del web mobile ed i principali framework a disposizione con relativi esempi di applicazioni reali; quali sono le tecniche di responsive design e creare un sito web specifico per mobile in modo da fornire ai nostri utenti una user experience più o meno adatta ai dispositivi con cui accedono alla nostra applicazione. A seguire, Fabio Cozzolino parla di Xamarin attraverso il quale sia possibile sviluppare applicazioni mobile “cross-platform” data l’eterogeneità delle piattaforme sul mercato da Windows Phone ad iOS passando per l’immancabile Android. Infine, Emanuele Garofalo ci mostra la nuova linea di sviluppo Microsoft con le “universal” apps su Windows 8.1 e Windows Phone 8.1 in modo da condividere il codice che possa girare su smartphone e su tablet/desktop.

Insomma, il mese di Giugno inizia alla grande con due eventi assolutamente da non perdere !

Sviluppare su Arduino ed Intel Galileo con la guida di HTML.it

0245.Cattura_5E4E2BB9

Parte una nuova “esperienza” come technical writer per HTML.it, il primo network editoriale italiano sul Web !

Ovviamente, considerando la mia passione ed il mio lavoro, non potevo che scrivere sul mondo embedded ma soprattutto sull’Internet of Things, per cui ecco pubblicato il primo capitolo della Guida Arduino. In realtà, questa guida coprirà anche numerosi aspetti della board Intel Galileo, nata proprio sulle basi della Arduino, con alcuni capitoli completamente dedicati ad essa.

Non posso svelarvi nulla … seguite la pubblicazione dei successivi capitoli ed inizierete in maniera molto semplice a programmare la vostra scheda Arduino e/o Galileo dalle basi fino alla connessione al Cloud !

uPLibrary : HttpClient aggiornato con il supporto per IPv6

Ho appena aggiornato su CodePlex e su Nuget la libreria uPLibrary (versione 2.1.0.0), aggiungendo nel client HTTP (classe HttpClient) il rilevamento automatico di un eventuale indirizzo IPv6 a cui connettersi.

Per rilevare la classe di indirizzo (AddressFamily), ho implementato l’ “Extension Method” GetAddressFamily() per la classe IPAddress attraverso la classe statica IPAddressUtility, necessario solo perché il .Net Micro Framework non fornisce nativamente  la property AddressFamily della classe IPAddress.

public static AddressFamily GetAddressFamily(this IPAddress ipAddress)
{
   return (ipAddress.ToString().IndexOf(':') != -1) ?
	   AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork;
}

In questo modo, al momento della creazione della socket, viene automaticamente  impostata la corretta address family a partire dall’indirizzo a cui connettersi.

// create socket and connect
this.socket = new Socket(
	this.hostIpEndPoint.Address.GetAddressFamily(),
	SocketType.Stream, ProtocolType.Tcp);
this.socket.Connect(this.hostIpEndPoint);

Un micro client HTTP nella uPLibrary !

Non mi fermo mai ed anche ora che sono in ferie continuo a …. programmare !

Questa volta tocca alla mia uPLibrary che ho aggiornato alla versione 2.0 (ovviamente anche su Nuget con il supporto a ben tre versioni del .Net Micro Framework, dalla 4.1 all’attuale 4.3) con un nuovo componente : un client HTTP.

Tutti vi starete facendo delle domande sul perché della necessità di riscrivere un client HTTP considerando che esistono le già ampiamente collaudate classi HttpWebRequest edHttpWebResponse direttamente incluse nel .Net Micro Framework. Ebbene, in alcune board con poca memoria (vedi Netduino), gli assembly relativi a queste due classi occupano troppo spazio e lavorando con degli stream sono poco performanti. Per questo motivo, ho deciso di realizzare un semplice client (ogni consiglio per il suo miglioramento è ben accetto) che sfrutta direttamente le socket senza alcuno strato intermedio di astrazione (concetto che molte volte nei sistemi embedded bisogna limitare per migliorare le performance).

Il modello di programmazione è abbastanza semplice, in quanto prevede l’uso della classeHttpClient che mette a disposizione i tre seguenti metodi principali :

  • Send() : per eseguire una generica richiesta HTTP (GET, POST, PUT, …);
  • Get() : metodo ad hoc per eseguire richieste di tipo GET;
  • Post() : metodo ad hoc per eseguire richieste di tipo POST;

Il metodo Send() riceve in ingresso un oggetto di tipo HttpRequest nel quale vanno specificati tutti i dati che compongono la richiesta (metodo HTTP, URI di destinazione ed eventuali headers). Esso ritorna un oggetto di tipo HttpResponse con tutte le informazioni sulla risposta ricevuta dal server. Per poter gestire la ricezione di un body (nel caso di GET) o l’invio (nel caso di POST o PUT), è possibile utilizzare i seguenti due eventi che la classe espone :

  • RecvBody : sollevato nel momento in cui ci sono dati nel body in ricezione e possono essere acquisiti;
  • SendBody : sollevato dal client solo nel caso in cui c’è un event handler registrato, che sancisce la volontà di voler trasferire dei dati al client attraverso il body;

In caso di ricezione, l’event handler riceve in ingresso l’oggetto HttpResponse attraverso il quale poter accedere alla proprietà Body su cui invocare il metodo Read(), che legge i dati direttamente dalla socket restituendoli in un buffer da noi specificato. L’evento viene sollevato più volte fino al completamento del body.

In caso di invio, l’event handler riceve in ingresso l’oggetto HttpRequest attraverso il quale poter accedere sempre alla proprietà Body su cui invoare il metodo Write() al quale poter passare un buffer con i dati da scrivere sulla socket sottostante. Questo evento viene sollevato una sola volta dal client, per cui è necessario effettuare al suo interno eventualmente più chiamate su Body.Write() fino alla completa trasmissione del body desiderato.

Di seguito è riportato un banalissimo esempio per ricevere la pagina del sito Microsoft.

public static void Main()
{
    HttpRequest req = new HttpRequest();
    req.Method = HttpMethod.Get;
    req.Uri = new Uri("http://www.microsoft.com");
    req.Headers.Add("Accept", "text/html");

    HttpClient client = new HttpClient();
    client.RecvBody += client_RecvBody;
    client.Send(req);
}

static void client_RecvBody(HttpResponse httpResp)
{
    byte[] buffer = new byte[1024];
    int read = httpResp.Body.Read(buffer, 0, 1024);
    Debug.Print(new String(Encoding.UTF8.GetChars(buffer)));
}
I metodi Get() e Post() sono banalmente due wrapper del metodo Send() che servono solo a semplificare le operazioni più comunemente eseguite, appunto GET e POST. Entrambe ricevono l’URI verso il quale effettuare la richiesta (senza la necessità di “riempire e passare” un oggetto HttpRequest , lo faranno loro per noi) e l’event handler per eseguire la ricezione del body (in caso di GET) o l’invio (in caso di POST).

Riprendendo l’esempio precedente, attraverso il metodo Get() avremmo il seguente codice.

public static void Main()
{
    HttpClient client = new HttpClient();
    client.Get("http://www.microsoft.com", client_RecvBody);
}

Nel caso di collegamento ad un servizio REST al quale dover trasmettere dei dati, possiamo pensare ad un utilizzo di questo tipo.

public static void Main()
{
    HttpClient client = new HttpClient();
    client.Post("http://myserver/api/", client_SendBody);
}

static void client_SendBody(HttpRequest httpReq)
{
    byte[] buffer = Encoding.UTF8.GetBytes("");
    httpReq.ContentLength = buffer.Length;
    httpReq.Body.Write(buffer, 0, httpReq.ContentLength);
}