• Non ci sono risultati.

Progettazione e realizzazione di dispositivi low-cost per la raccolta dati tramite Crowdsensing per IoT collaborativo

N/A
N/A
Protected

Academic year: 2021

Condividi "Progettazione e realizzazione di dispositivi low-cost per la raccolta dati tramite Crowdsensing per IoT collaborativo"

Copied!
86
0
0

Testo completo

(1)

Alma Mater Studiorum · Universit`

a di

Bologna

SCUOLA DI SCIENZE Corso di Laurea in Informatica

Progettazione e realizzazione di

dispositivi low-cost per

la raccolta dati tramite Crowdsensing

per IoT collaborativo

Relatore:

Chiar.mo Prof.

Luciano Bononi

Co-relatore:

Dott. Luca Bedogni

Presentata da:

Natale Vadal`

a

Sessione II

(2)
(3)
(4)

Abstract

La redazione di questo documento cerca di inquadrare dal punto di vista tecnico e tecnologico il campo dell’ Internet of Things intersecato con quello del Crowdsensing (rilevazione dati) e, in particolare, della progettazione di semplici dispositivi per la misurazione e la raccolta di dati legata a sensori. L’ Internet of Things `e uno dei campi di ricerca (ed industria) pi`u crescenti e prolifici negli ultimi anni; esso racchiude l’ idea di mappare il mondo reale con dispositivi di rilevamento capaci, ad esempio, di fornire un’ intelligenza artificiale ad un elettrodomestico, cos`ı da consentirgli di relazionarsi con altri elettrodomestici e, in genere, con altri dispositivi general purpose.

Il Crowdsensing, invece, `e un fenomeno che consiste nella raccolta di rile-vazioni di varie entit`a da utilizzare per analisi successive, e si riferisce alla condivisione dei dati raccolti dai singoli dispositivi di rilevamento con l’ obiet-tivo di misurare o fare interagire fenomeni di interesse comune.

Il presente progetto consiste nella realizzazione di una Weather Station low-cost collegata ai server Unibo, con integrati sensori di temperatura, umidit`a e pressione atmosferica, facilmente fruibile dall’ utente finale, visto che non `e necessaria alcuna conoscenza particolare per il suo utilizzo, se non quella di aprire una pagina web. Essa nasce dalla necessit`a di fornire all’ utente validi e semplici strumenti che consentono di avvicinarsi al Crowdsensing, offrendo pure la possibilit`a di ottenere un qualche benefit da uno stakeholder e/o di poter aumentare notevolmente il numero di canali reliable (sicuri) analizzabi-li dai progetti di ricerca attivi nei campi della statistica, dell’ ecosostenibianalizzabi-lit`a, dell’ intelligenza artificiale, dell’ analisi di reti.

(5)

ii INTRODUZIONE

La tesi, ovviamente, `e solo un punto di partenza, sia per l’Universit`a, che potr`a realizzarla e fornirla a degli utenti per ricerche sul territorio, sia per l’ utente privato, che seguendo l’ Appendice potr`a realizzare la sua Weather Station low-cost in poco tempo e con un costo relativamente basso.

(6)

Indice

Abstract i 1 Introduzione 1 2 Stato dell’arte 5 2.1 Crowdsensing . . . 5 2.2 Internet of Things . . . 6 2.3 Lavori correlati . . . 7 2.3.1 Standard . . . 8 2.3.2 Smart Cities . . . 9 2.3.3 Mobile Crowdsensing . . . 11 2.3.4 Back End . . . 11 3 Hardware 15 3.1 Progetto . . . 15 3.1.1 Componenti . . . 16 3.1.2 Casi d’uso . . . 18 3.2 Realizzazione . . . 21 3.2.1 Schema . . . 23 3.2.2 Problematiche incontrate . . . 24 4 Software 27 4.1 Metodologia di sviluppo . . . 27 4.2 Pianificazione . . . 28 iii

(7)

iv INDICE 4.3 Progettazione . . . 29 4.4 Sviluppo . . . 32 4.4.1 Ambiente di sviluppo . . . 32 4.4.2 Librerie utilizzate . . . 32 4.5 Testing . . . 33 4.6 Deployment . . . 36 4.6.1 Sketch . . . 36 4.6.2 Librerie prodotte . . . 37 4.6.3 Misurazioni . . . 38 4.6.4 Web Service . . . 40 Conclusioni 45 A Sketch 47 Bibliografia 75

(8)

Elenco delle figure

2.1 Famiglia di standard P21451-01 . . . 13

3.1 Diagramma dei casi d’uso . . . 18

3.2 Diagramma degli stati . . . 19

3.3 Prototipo 1 . . . 21

3.4 Prototipo 2 . . . 22

3.5 Prototipo 3 . . . 22

3.6 Schema completo . . . 23

4.1 Screenshot della comunicazione via seriale . . . 34

4.2 Screenshot dello sketch . . . 36

4.3 Screenshot canale ThingSpeak . . . 39

4.4 Screenshot canale ThingSpeak 2 . . . 39

4.5 Screenshot pagina Home . . . 40

4.6 Screenshot pagina RegisterWStation . . . 41

4.7 Screenshot pagina IoT . . . 42

4.8 Screenshot pagina About . . . 43

4.9 Screenshot pagina Contact . . . 43

4.10 Screenshot pagina Tools . . . 44

(9)
(10)

Capitolo 1

Introduzione

In un mondo che vacilla sotto il peso delle nuove sfide economiche e scien-tifiche, si avverte sempre pi`u l’ esigenza di raccogliere grandi quantit`a di dati (ai fini statistici, analitici o economici) con il dichiarato intento di contenere la spesa massimizzandone i profitti.

`

E cosi, che partendo da un contesto prettamente finanziario, nasce il Crowd-funding, modello di business che permette di raccogliere, attraverso donazioni sul web, una quota monetaria prefissata per uno specifico fine. L’ apporto sostanziale di tale tipo di intervento consiste nella traduzione di un sistema in cui qualsiasi aiuto (economico, intellettuale, lavorativo) proveniente dal singolo va ad implementare un sistema in cui la collaborazione `e quel punto in pi`u che permette in modo (relativamente) facile, veloce ed economico il raggiungimento di un obiettivo (che pu`o essere la raccolta di fondi, il fixing di un’applicazione, lo sviluppo di una piattaforma). Traslando questo con-cetto - presente nella cultura occidentale gi`a dal ‘700 grazie allo scrittore Jonathan Swift - in ambito informatico possiamo parlare tranquillamente di Crowdsourcing.

(11)

2 1. Introduzione

Crowdsourcing

“Richiesta di idee, suggerimenti, opinioni, rivolta agli utenti di Internet da un’azienda o da un privato in vista della realizzazione di un progetto o della soluzione di un problema.”.1

Con “Crowdsourcing” ci si riferisce generalmente alla collaborazione in un progetto di un (numeroso) gruppo di persone, esterne agli ideatori/iniziatori del progetto. Il termine `e stato coniato e utilizzato per la prima volta da John Howe sulla rivista Wired. Le strategie pi`u famose basate sul Crowdsourcing sono quattro:

1. Crowdfunding

Raccolta di fondi attraverso piccoli contributi da molteplici sostenitori della stessa idea/progetto, una sorta di microfinanziamento.

StartsUp2, o i ben pi`u famosi KickStarter3 e Indiegogo4 sono le

piatta-forme online per dare visibilit`a al proprio progetto e ricevere finanzia-menti, o finanziare progetti altrui;

2. Crowdcreation

Collaborazione democratica nelle scelte di un progetto o alla soluzione di un problema.

Un esempio di piattaforma che ne d`a la possibilit`a `e Starteed5, (che `e anche una piattaforma per Crowdfunding);

3. Crowdvoting

Espressione di un’idea, sensazione, parere riguardo a qualcosa. Esempio lampante: Facebook6;

4. Crowdwisdom

Ci riferiamo a crowdwisdom come teoria sociologica e relativa

applica-1https://www.google.it/#q=crowdsourcing 2http://www.starsup.it/ 3https://www.kickstarter.com/ 4https://www.indiegogo.com/ 5https://starteed.com/crowdcreation 6https://www.facebook.com

(12)

3

zione secondo cui la massa sia pi`u precisa nella valutazione di quanto non lo sia un team di esperti.

Esempio di applicazione `e il sistema di PageRanking di Google.

A fronte di una definizione “malformata” e poco confacente alla reale defi-nizione e filosofia che ci sta dietro, Estell´es y Gonz´alez fornisce nel 2012 una definizione ben pi`u calzante:

“Il Crowdsourcing `e una tipologia di attivit`a online partecipativa nella qua-le una persona, istituzione, organizzazione non a scopo di lucro o azienda propone ad un gruppo di individui, mediante un annuncio aperto e flessibile, la realizzazione libera e volontaria di un compito specifico. La realizzazione di tale compito, di complessit`a e modularit`a variabile, e nella quale il grup-po di riferimento deve partecipare apgrup-portando lavoro, denaro, conoscenze e/o esperienza, implica sempre un beneficio per ambe le parti. L’utente otterr`a, a cambio della sua partecipazione, il soddisfacimento di una concreta necessit`a, economica, di riconoscimento sociale, di autostima, o di sviluppo di capacit`a personali, il crowdsourcer d’altro canto, otterr`a e utilizzer`a a proprio benefi-cio il contributo offerto dall’utente, la cui forma dipender`a dal tipo di attivit`a realizzata.”. [1]

Degli esempi noti di progetti che hanno fatto del Crowdsourcing il proprio modello di business:

• Wikipedia7, enciclopedia web scritta dalla collaborazione della

comu-nit`a;

• Linux8, sistema operativo Unix open-source;

• MIT Climate CoLab9, piattaforma che coinvolge pi`u di 10.000 utenti

per ideare soluzioni al cambiamento climatico, presso il MIT Center for Collective Intelligence10;

7https://it.wikipedia.org 8http://www.linux.it/ 9http://climatecolab.org/ 10http://cci.mit.edu/

(13)

4 1. Introduzione

• Il mondo dell’ open-source in generale, del software libero e delle piat-taforme per gestire progetti software (GitHub11).

(14)

Capitolo 2

Stato dell’arte

2.1

Crowdsensing

Nato come ramo del Crowdsourcing, il Crowdsensing `e un modello di bu-siness nato negli ultimi anni, in cui devices diversi sono sfruttati, oltre che ai fini per cui sono stati pensati (telefonare, collegarsi ad Internet, gestire file multimediali), anche per comunicare e condividere valori rilevati da sensori su una qualche piattaforma di raccolta dati.

In analogia, le “idee, suggerimenti, opinioni” che, nella fase di “outsourcing” erano il soggetto dello scambio in un modello di Crowdsourcing, nel Crowd-sensensing vengono sostituite con valori di sensori e/o informazioni legate a misurazioni ambientali o di processi.

Distinguiamo due tipi di Crowdsensing, in base allo “sforzo” che l’utente compie per attivare la procedura di comunicazione dei dati:

• Crowdsensing partecipativo, che `e quello in cui l’utente deve attivare la rilevazione di un certo sensore, o la sua inizializzazione, ed implica il massimo sforzo tra i casi possibili;

Es. SenSquare [2], un servizio che raccoglie valori da sensori (Crowd-sensing ambientale) inviati da stazioni meteo minimali di utenti e offre un’interfaccia ai possibili stakeholder per accedere a queste rilevazioni

(15)

6 2. Stato dell’arte

• Crowdsensing opportunistico, che `e quello in cui l’utente manda au-tomaticamente i valori, probabilmente perch´e sono sensori inizializzati senza input utente (fuorch´e l’alimentazione), e comporta un minimo sforzo.

Es. Google o Facebook o gli operatori telefonici, ed in generale i dispo-sitivi che si prestano al Mobile Crowdsensing, che tengono, cio`e, traccia di sensori come luce, rumore (disturbo), posizione (GPS) e movimento (accelerometro) automaticamente senza una esplicita azione dell’uten-te se non l’installazione dell’applicazione (e la concessione dei permessi necessari, come nel caso delle apps di Google) e/o alla sottoscrizione del servizio (come per gli operatori, che possono leggere i valori riferiti alla qualit`a della nostra linea dati o alla nostra posizione cellulare).

2.2

Internet of Things

Risale all’ormai lontano 1999, la nascita dell’estensione naturale di quella che era gi`a allora la rete pi`u grande mai creata fra persone sul globo: Internet. Il neologismo Internet of Things si riferisce all’integrazione della rete con gli oggetti di uso comune, alla connessione fra strumenti e all’accesso reciproco ad informazioni acquisite da altri dispositivi.

Naturalmente, per spiegare un cos`ı grosso impatto sociologico di un fenomeno del quale parliamo ancora dopo quasi 20 anni, `e evidente che esso contenga in s´e potenzialit`a, e quindi possibilit`a di sviluppo e/o campi d’applicazione, ben pi`u interessanti della mera definizione o della storia dell’IoT.

Oggi l’IoT `e pesantemente presente in: • Domotica;

• Industria; • Telematica;

(16)

2.3 Lavori correlati 7

• Security/Sorveglianza; • Robotica;

• Monitoraggio ambientale (Fini geologici, sismologici, meteorologici, eco-logici).

Mentre i settori in cui il mondo dell’IoT sta convogliando le proprie attenzioni sono:

• Ingegneria Biomedica;

• Sicurezza (intrinseca) dei dispositivi adattati al mondo dell’IoT ; • Ricerca scientifica.

Partendo dall’idea di IoT, passando per un business model come il Crowd-sourcing, approdiamo proprio in uno dei settori in cui l’IoT si sta focalizzan-do: l’IoT collaborativo, un sistema che permetta di raccogliere misurazioni da devices eterogenei in un’unica locazione, che le gestisca e che fornisca a molteplici utenti una metodologia di scrittura/lettura di ci`o che pu`o es-sere ritenuto interessante: in poche parole, l’IoT collaborativo `e la nuova frontiera della condivisione di informazioni [3].

2.3

Lavori correlati

In uno scenario ormai attivo da quasi vent’anni, la letteratura prodotta `

e innumerevole. Molteplici sono gli articoli scientifici che trattano la stan-dardizzazione dei protocolli per l’IoT, come tante sono le pubblicazioni che presentano ci`o che viene definito come “Smart Cities”; addirittura in lette-ratura, troviamo progetti simili a quello che stiamo trattando (con qualche differenza implementativa), prodotti da grandi aziende/fornitrici di servizi online.

(17)

8 2. Stato dell’arte

2.3.1

Standard

Sebbene uno standard non sia stato ancora raggiunto, su pi`u fronti la ri-cerca sta affrontando questa tematica, su pi`u versanti e da pi`u angoli visuali. Il primo punto da affrontare `e quello del protocollo di rete (a livello d’ap-plicazione) da utilizzare, diverso da HTTP (possibilmente pi`u leggero), ma comunque standardizzato da una qualche specifica. E qui che ci vengo-` no in aiuto CoAP1 (Constrained Application Protocol) e MQTT2(Message

Queuing Telemetry Transport), due protocolli lightweight facilmente inter-facciabili con HTTP e, soprattutto, che supportano bene la comunicazione Machine2Machine.

Gi`a nel 2012 Zack Shelby e altri ricercatori presentavano la potenza di CoAP per attivit`a di Crowdsensing e per dispositivi con risorse limitate in un arti-colo pubblicato sull’IEEE Internet Computing[4], lo stesso Shelby che l’anno dopo ha rilasciato la specifica per il protocollo[5]. Nel 2016 viene pubblicato un modello di integrazione fra dispositivi per IoT tramite CoAP, che presen-ta, oltre ad un confronto fra i vari protocolli di rete, il protocollo CoAP come il migliore fra tutti quelli analizzati (MQTT, DDS, XMPP, RestFull HTTP). “CoAP `e un protocollo applicativo per Internet of Things, che utilizza le funzionalit`a simili a HTTP, con basso overhead e multicasting per la comu-nicazione di gruppo all’interno dell’IoT. A differenza dei protocolli basati su HTTP , CoAP opera su UDP in modo che il sovraccarico del protocollo TCP possa essere ridotto al minimo. Cos`ı, CoAP ottimizza la lunghezza del datagram e fornisce una comunicazione affidabile sulla sommit`a di un protocollo UDP inaffidabile. Inoltre, si `e basato su architettura REST con metodi di base, come ad esempio GET, POST, PUT e DELETE, per l’ac-cesso delle diverse risorse Internet tramite Web Services. Il modello client / server viene applicata con l’utilizzo di comunicazione Request / Response. Il protocollo CoAP offre le seguenti caratteristiche: protocollo specializzato

1https://tools.ietf.org/html/rfc7252

(18)

2.3 Lavori correlati 9

per IoT, scambio di messaggi asincroni, trasporto UDP con livello di applica-zione affidabile, spese generali di header ridotte, mappatura stateless HTTP a COAP, supporto proxy HTTP/CoAP con caching.”[6] Inoltre, nel modello presentato precedentemente, all’apice della piramide (il Web Service), viene arricchito il “vecchio” MES (Manufacturing Execution System) con lo stesso MES ospitato, questa volta, in un cloud, l’hosting del XXI secolo. Ci`o viene confermato da moltissimi progetti e articoli che considerano il cloud come la base di partenza per un servizio dedicate alle interazioni IoT, come [7] dell’Universit`a di Bologna, dimostrando quanto la scalabilit`a di questo tipo di reti possa essere mantenuta solo usando i mezzi adatti (cloud e protocolli MQTT/CoAP).

Uno dei progetti attivi basati su CoAP `e descritto nell’articolo[8], che tratta della progettazione e realizzazione di un sistema di Crowdsensing sulla salute umana (usando il set di standard ISO/IEEE 11073 Personal Health Data), e dimostrando ancora quanto CoAP sia pi`u adatto al Crowdsensing e all’IoT. Il secondo punto riguarda gli standard di lettura di sensori, trattati egregia-mente in un paper del 2016 che descrive lo standard ISO/IEC/IEEE P21451-001, riguardante la corretta misurazione di smart transductor (sensori)[9] e l’algoritmo RTSAL (Real Time Segmentation And Labeling). L’IEEE, dal canto suo, allo stato attuale ha in stato di lavorazione l’“IEEE Draft Re-commended Practice for Signal Treatment Applied to Smart Transducers”, sempre riguardante la famiglia di standard P21451-001.

2.3.2

Smart Cities

Molteplici sono i progetti che riguardano il campo delle “Smart Cities”, che consiste nell’ integrare servizi in modo da poter risolvere, o almeno tenere sotto controllo, alcuni fenomeni problematici come il cambiamento del clima, l’offerta e la domanda di energia, la scarsit`a di carburante e risorse naturali, la crescita della popolazione, l’assistenza sanitaria, l’urbanizzazione, il cibo, la tracciabilit`a e sicurezza, il declino dell’ecosistema naturale. Questa sfida `

(19)

10 2. Stato dell’arte

Commissione Europea per creare reti capillari integrando le reti EDGE e quelle metropolitane in una Smart City Platform.

Altri famosi progetti di “Smart Cities” sono:

• SmartSantader3, nato a Praga nel 2009, `e ci`o che incarna lo spirito di

ALMANAC, `e una rete sperimentale di dispositivi e servizi che tuttora `e integrata con il progetto ALMANAC;

• UrbanWater4 project, nato per una maggiore efficienza nella gestione

idrica di Almer`ıa (Spagna);

• Open IoT5 definisce una soluzione cloud open-source per l’IoT, e

pu`o essere visto come pioniere tecnologico nel campo delle piattaforme Smart City;

• Mobosens US fornisce ai cittadini una piattaforma per la raccolta e la condivisione ambientale di dati.

Gaurav Sarin, indiano, ha prodotto nel 2016 un paper intitolato “Develo-ping Smart Cities using Internet of Things: An Empirical Study”[11], molto interessante poich´e ci mostra un dato per nulla banale: nel 2011 il numero dei dispositivi connessi ad Internet era quasi il doppio del numero di abitanti del nostro pianeta (12.5 miliardi contro 7 circa).

Partendo da ci`o, e considerata l’importanza (per cittadini, aziende, gover-ni) di poter sfruttare tutta questa corrente di dati e di potenza di calcolo a disposizione, Sarin valuta come fattori da tenere in considerazione 5 aree:

1. Congestione del traffico, installando un GPS in ogni nuovo veicolo; 2. Qualit`a dell’aria, con delle sorta di “backdoors” sulle app per l’al-lenamento fisico che comunicano con delle stazioni il livello di qualit`a dell’aria;

3http://www.smartsantander.eu/ 4http://urbanwater-ict.eu/ 5http://www.openiot.eu/

(20)

2.3 Lavori correlati 11

3. Salute, monitorando i cambiamenti del battito cardiaco, della tempe-ratura, della pulsazione e della respirazione dei pazienti critici;

4. Energia, dando un riscontro alla cittadinanza di quanta energia sta consumando un edificio pubblico, ad esempio;

5. Infrastrutture, tenendo sotto controllo con sensori le vibrazioni, il rumore e lo stress dell’edificio, oltre che la possibilit`a di installazione di qualsiasi stazione, utile alle categorie precedenti, proprio su infrastrut-ture importanti.

2.3.3

Mobile Crowdsensing

Parliamo di Mobile Crowdsensing (MCS ) quando, banalmente, il dispo-sitivo che raccoglie informazioni non `e destinato a rimanere fisso in una data posizione geografica.

I dispositivi che sono considerati adatti per il MCS, in linea di massima, sono gli smartphone, i tablet, i laptop, e tutti i device wearables (“vestibi-li”), come orologi, occhiali, pacemaker, braccialetti con computer integrati (Smartwatch, FitBit6 e i Google Glasses7 sono gli esempi pi`u lampanti).

Tra i progetti pi`u famosi italiani di MCS troviamo:

• SecondNose [12], progetto italiano per misurare la qualit`a dell’aria con un dispositivo simile ad un portachiavi dato a 80 cittadini di Trento, che attualmente conta circa 30.000 rilevazioni al giorno;

• ParkHere! [13], sistema di comunicazione fra utenti per segnalare un parcheggio in una citt`a, basato su giroscopi e accelerometri.

2.3.4

Back End

Sebbene nel progetto in discussione ci si appoggi su server proprietari, esistono alcuni servizi online che forniscono spazi web gratuiti per scrivere le

6https://www.fitbit.com/

(21)

12 2. Stato dell’arte

proprie rilevazioni, analizzarne i dati e scaricarli su un terzo dispositivo. Queste piattaforme per l’Iot, oltre a fornire un’indubbia comodit`a, grazie alla grandissima comunit`a che le utilizzano sono diventati de facto dei database mondiali di misurazioni.

• Thingspeak8, lanciato nel 2010, `e una piattaforma open-source che

fornisce spazio web e API su protocollo HTTP. Importante poich`e, fra l’altro, integra MATLAB della MathWorks, Inc.9. E stata utilizza-` ta nella fase iniziale del nostro progetto, come anche in passato per lo sviluppo di Thingspeak4Android10, applicazione per crowdsensing

dell’Universit`a di Bologna. Thingspeak, inoltre, nel 2016 presenta un progetto di Weather Station basata su Arduino11 e/o Raspberry Pi12.

• SparkFun Electronics13, azienda nel campo dell’elettronica, produce

e vende microcontrollori ed accessori utili per l’IoT, tutto con hard-ware open-source. Lanciata nel 2003 come azienda, pi`u tardi come servizio API-REST per Crowdsensing, oltre ad un funzionamento si-mile a Thingspeak 14, presenta annualmente progetti/sfide nel campo

dell’automazione, tra cui la costruzione di un’ automobile autonoma.

8https://thingspeak.com/ 9http://www.mathworks.com 10https://bitbucket.org/eldiablo100000/thingspeak4android 11https://www.arduino.cc/ 12https://www.raspberrypi.org/ 13https://www.sparkfun.com/ 14https://data.sparkfun.com/

(22)

2.3 Lavori correlati 13

Figura 2.1: Famiglia di standard P21451-01

(23)
(24)

Capitolo 3

Hardware

Abbiamo considerato la fase di progettazione e sviluppo hardware come la migliore da cui partire, sia nella creazione effettiva che nella documen-tazione, per poter fornire una visione BOTTOM -UP del progetto, e quindi rendendolo abbastanza intuitivo da capire.

3.1

Progetto

La fase di progettazione, iniziata nel mese di Ottobre 2016, `e stata prece-duta da una fase embrionale, in cui `e stata avviata un’analisi delle componenti e dei microcontrollori al fine di sviluppare una libreria per Arduino per fa-re Crowdsensing, appoggiandosi su un Web Service online (Thingspeak) per salvare i monitoraggi, gestirli e ottenerne statistiche. Questa fase `e durata circa un mese, e ha contribuito ad individuare le problematiche intrinseche di alcune boards (schede) e, quindi, di affinare quegli strumenti valutativi che, in un momento successivo, possono consentire di operare la scelta pi`u funzionale, economica ed espandibile fra le alternative.

Il presente progetto consiste nell’ aggregazione di un modulo microcon-trollore, una scheda di rete, dei sensori e una predisposizione per

(25)

16 3. Hardware

zione da pile.

La scelta operata `e stata quella di creare una Weather Station non pi`u basata su Arduino (come in fase embrionale), bens`ı direttamente su un mo-dulo ESP8266, un momo-dulo WiFi low-cost con un MCU (Micro Controller Unit ) integrato, con ovvi ed evidenti benefici:

1. Abbattere i costi.

No Arduino, no shields/schede di rete/moduli XBEE, solamente un modulo ESP acquistabile a 9$;

2. Essere svincolati da boards “preconfezionate”.

Poter ottimizzare il tutto, eliminando ci`o che non `e necessario che po-trebbe solamente consumare energia inutilmente alla Weather Station e costruendo la board ad hoc per la nostra esigenza;

3. Velocizzare la fase di sviluppo.

Esiste un’intera community su GitHub dedicata al “chip pi`u cheap” del mondo network 1.

3.1.1

Componenti

Le componenti utilizzate sono:

DHT22 (AM2302) Sensore di temperatura ed umidit`a.

(26)

3.1 Progetto 17

BMP280, Sensore di temperatura e pressione atmosferica.

ESP8266 Chip WiFi con MCU integrata.

Bottoni Uno per registrare la Weather Station sulla rete, attraverso un’interfaccia web B1; l’altro per il reboot/wake-up del dispositivo B2.

Led Uno giallo L1 e uno rosso L2, per dare un riscontro all’utente dell’effettivo funzionamento del dispositivo senza errori. Batteria Una sola batteria ricaricabile al litio per ottenere un ottimo trade-off tra una potenziale richiesta superiore di energia dalla Station e la durabilit`a di queste batterie.

(27)

18 3. Hardware

3.1.2

Casi d’uso

Figura 3.1: Diagramma dei casi d’uso

A livello hardware (come anche a livello software), la Weather Station `e stata pensata in modo che consumi energia il meno possibile, infatti per la gran parte della “giornata tipo” reale del dispositivo prodotto, esso sar`a in modalit`a “dormiente” (deepSleep mode ).

Semplicemente, la Weather Station d`a la possibilit`a di Registrarsi su una rete, cliccando il bottone B1 per almeno 3 secondi, o iniziare il reporting con le credenziali che ci sono in memoria (se esistono). Se il dispositivo `e in deepSleep mode occorre svegliarlo prima con il bottone B2.

La fase di Registrazione consiste ne:

• ESP in modalit`a STATION : scansione delle reti WiFi vicine;

• ESP in modalit`a SOFT AP : il modulo crea una rete locale con SSID “WeatherStationESP” a cui collegarsi per vedere la pagina di registra-zione;

(28)

3.1 Progetto 19

• L’utente si connette alla WiFi “WeatherStationESP ” attraverso qua-lunque dispositivo, e collegandosi alla pagina http://192.168.4.1 acce-der`a al sito;

• L’utente sottomette il form e le credenziali vengono (sovra)scritte in memoria EEPROM, poi deve chiudere il server dal browser ;

• ESP RESET : il modulo si riavvia.

Figura 3.2: Diagramma degli stati

Ramo eseguito se il bottone sulla Weather Station viene premuto per almeno 3 secondi (ed il led giallo lampeggia).

Ramo eseguito se le credenziali di rete non vengono ritrovate in memoria sul dispositivo o la lettura non `e andata a buon fine (Necessaria registrazio-ne) .

(29)

20 3. Hardware

Ramo eseguito se viene spento il Web Service standalone attraverso l’interfaccia utente(click su “Close the server! ” o con una richiesta GET http://192.168.4.1/Exit+ “/Exit ”)

(30)

3.2 Realizzazione 21

3.2

Realizzazione

Nella realizzazione, per tutta la fase di sviluppo software e di testing, `e sta-to usasta-to un Espduino2 come board economica programmabile con un modulo ESP8266-12F integrato, sostanzialmente un modulo ESP con un ambiente di sviluppo facilmente interfacciabile da chiunque non abbia troppa dimesti-chezza con la circuiteria interna dei moduli ESP8266*, n´e con le componenti da acquistare e/o saldare su una PCB.

La costruzione, e realizzazione, `e iniziata nel Settembre 2016 ed `e terminata solo con il deployment software (per via di problematiche e bug testabili solo via software) nel Novembre 2016.

Il nostro percorso ha visto “nascere” 3 prototipi, ognuno pi`u evoluto (e pi`u piccolo) del precedente:

Figura 3.3: Prototipo 1

Espduino con breadboard e predisposizione per pila 18650 a Li.

(31)

22 3. Hardware

Figura 3.4: Prototipo 2

Espduino con shield creata ad hoc e predisposizione per pila 18650 a Li/3 pile AA a Ni-MH.

Figura 3.5: Prototipo 3

Board con ESP8266-12F integrato e predisposizione per pila 18650 a Li/3 pile AA a Ni-MH.

(32)

3.2 Realizzazione 23

3.2.1

Schema

(33)

24 3. Hardware

3.2.2

Problematiche incontrate

La realizzazione hardware `e stata ultimata solo dopo la progettazione e la realizzazione del software,in quanto sono emerse delle criticit`a risolvibili solo con un test software.

• Il primo, in ordine cronologico, `e stato quello di inserire un bottone che, alla pressione per un dato tempo, facesse scattare una routine. La problematica sta nel fatto che se la Weather Station si trova in fase di “posting” dati sul server, `e possibile rilevare cambiamenti di stato del bottone, mentre se `e in fase di “deepSleep”, il dispositivo non `e in grado di capire se il bottone `e stato premuto, e quindi non pu`o far scattare la routine (che sarebbe la routine di registrazione sulla rete).

Il problema `e stato “aggirato” montando un secondo bottone che con-nette il GPIO16 dell’ESP al RESET, permettendone il risveglio (Il GPIO16 `e quello dedicato al risveglio del dispositivo, il RESET `e sempre HIGH anche in “deepSleep mode”).

• Il secondo, nella fase finale, `e stato quello di riportare tutto lo schema su PCB. Ci`o ha comportato la perdita dei benefici che c’erano prima lavorando con una board invece che con un ESP su una scheda millefo-ri.

Una board, come Espduino, o Arduino, forniscono tutti i componen-ti ucomponen-tili “gi`a pronti”, come gli spinotti per l’alimentazione da USB con FT232 di FTDI3, o la predisposizione di circuiteria di RESET e FLASH.

Questo poich´e l’ESP supporta tre modalit`a4: Flash SPI , che

consi-ste nel caricamento del programma in memoria e della sua esecuzione, UART per caricare un nuovo sketch(script Arduino-like in C++) dalla seriale , e SDIO , che lancia il boot dalla SD. Per caricare uno sketch sull’ESP lo si deve impostare in modalit`a UART, resettarlo e caricarlo dall’IDE, cosa che con la nostra PCB non `e stata possibile fino alla

rea-3http://www.ftdichip.com/

(34)

3.2 Realizzazione 25

lizzazione di una circuiteria, seppur minimale, per resettare e settare in UART mode il nostro modulo WiFi ESP.

(35)
(36)

Capitolo 4

Software

4.1

Metodologia di sviluppo

Per quanto il lato software sia stato prodotto singolarmente da una per-sona, si `e cercato di seguire un metodo di sviluppo che si confacesse il pi`u possibile a quello che `e il paradigma dell’ ASD (Agile Software Development), con maggior enfasi su alcuni punti dell’“Agile Manifesto”1 e pratiche comuni legate alle “Regole dell’Extreme Programming”2.

Dall’ “Agile Manifesto”:

• Rispondere al cambiamento pi`u che seguire un piano;

• La collaborazione col cliente pi`u che la negoziazione dei contratti; • Il software funzionante pi`u che la documentazione esaustiva. Dalle “Regole dell’Extreme Programming”:

• Scrivere le User Stories;

• Produrre piccoli e frequenti release software; • Dividere il progetto in iterazioni;

1http://agilemanifesto.org/

2http://www.extremeprogramming.org/rules.html

(37)

28 4. Software

• Rispettare gli standard nel codice;

• Creare un test quando un bug viene trovato; • Creare test unitari per tutto il codice;

• Tutto il codice deve superare i test unitari prima della release; • Rifattorizzare il codice (Refactoring) il pi`u possibile.

4.2

Pianificazione

User Stories

Una buona “user story”, secondo i canoni della programmazione Agile, deve essere INVEST, acronimo di:

• Independent, ogni storia deve essere indipendente dalle altre;

• Negotiable, non definisce una specifica, ma una “feature” (“Dovrebbe fare...”), quindi negoziabile;

• Valuable, deve essere valutabile da tutti gli attori coinvolti; • Estimable, banalmente deve essere stimabile;

• Small, cio`e abbastanza corta (e ragionevolmente esplicativa) da essere conseguita in poco tempo;

• Testable, naturalmente deve essere testabile. Le U.S. sviluppate in fase di pianificazione sono state 3:

1. L’utente deve registrare la propria rete WiFi attraverso una routine; 2. L’utente pu`o resettare le credenziali di rete attraverso una routine; 3. L’utente pu`o visitare il Web Service sulla piattaforma.

(38)

4.3 Progettazione 29

In seguito a questa prima stesura, le “dipendenze” da risolvere sono au-mentate: il modulo ESP, viste le esigenze, deve cambiare “modalit`a di setup”, poich´e oltre a leggere da memoria EEPROM e, se possibile, collegarsi alla WiFi, ora deve switchare (all’occorrenza) in modalit`a STA MODE (Station) per fare una scansione delle reti Wireless rilevate e caricarle sulla DropDown List degli ESSID disponibili (e non hidden) a cui collegarsi, poi switchare in SOFTAP MODE (Software Access Point ) per servire un Web Service su una nuova rete locale creata e, alla chiusura del gateway/server, resettarsi e ripartire in AP MODE (Access Point ) per incominciare/riprendere l’attivit`a solita (Post di dati attraverso una WiFi ).

In un secondo momento, sono state aggiunte U.S. pi`u specifiche, riferite alle informazioni di cui il dispositivo deve tenere traccia:

1. Il dispositivo deve misurare la potenza del segnale WiFi (RSSI, Recei-ved Signal Strength Indication) a cui `e collegato;

2. Il dispositivo deve rilevare la potenza (in Volt) dell’alimentazione elet-trica;

3. Il dispositivo deve prevedere una modalit`a a basso consumo / deepSleep Mode e risvegliarsi autonomamente;

4. Il dispositivo deve dare all’utente un minimo di feedback attraverso dei led.

4.3

Progettazione

La progettazione software `e stata scandita in 6 aree di pertinenza: 1. Setup, funzione che fa parte delle Structures di Arduino insieme alla

Loop, eseguita una volta sola al lancio di uno sketch; solitamente gli sketches per ESP sviluppano il main tutto all’interno di questa fun-zione; il nostro Setup inizializza la seriale per il debugging e i pin di

(39)

30 4. Software

INPUT/OUTPUT per i led e il bottone B1, setta i pin per attivare il protocollo I2C (necessario per la comunicazione con il sensore BMP), legge da EEPROM le credenziali (se esistono) e tenta di connettersi all’ ESSID trovato con la relativa password di rete, scatta la routine di registrazione altrimenti.

v o i d s e t u p() ;

2. Loop, `e il main della nostra Weather Station; d`a la possibilit`a di re-gistrare la il dispositivo, se premuto il bottone B1 in tempo, altrimenti inizializza i sensori, li legge (se inizializzati correttamente) e li posta al server. In seguito va in deepSleep Mode per 30 minuti e, al risveglio, riparte dalla Setup.

v o i d l o o p() ;

3. Connections, funzioni che gestiscono le connessioni del modulo, cio`e la connessione Standalone (Crea una nuova rete locale a cui collegarsi per registrare la Weather Station), la connessione alla rete WiFi, la scansione delle reti WiFi disponibili e la post al server.

S t r i n g l a u n c h S t a n d A l o n e(c o n s t c h a r * essid,c o n s t c h a r * pwd) ; // d e f a u l t : " W e a t h e r S t a t i o n E S P " ," h e l l o i o t " v o i d c o n n e c t T o N e t w o r k(c o n s t c h a r e s s i d[] , c o n s t c h a r p a s s w o r d[] , c o n s t c h a r s t r i n g[]) ; c h a r* s c a n N e t w o r k s() ; int p o s t T o S e r v e r(S t r i n g api_key, f l o a t f1, f l o a t f2,

f l o a t f3, f l o a t f4) ; // key per s c r i v e r e sul server , f o r n i t a d a l l ’ U n i b o ( o da T h i n g S p e a k ) , t e m p e r a t u r a DHT , u m i d i t a ’ DHT , t e m p e r a t u r a BMP , p r e s s i o n e BMP

4. Sensors, funzioni per gestire l’inizializzazione e la lettura dei sensori, attraverso l’uso di librerie esterne.

v o i d i n i t i a l i z e D H T 2 2() ;

f l o a t r e a d D H T 2 2(int s e n s) ;// per d e c i d e r e q u a l e dei due v a l o r i l e g g e r e ( t e m p ./ u m i d .)

(40)

4.3 Progettazione 31

b o o l i n i t i a l i z e B M P 2 8 0() ;

f l o a t r e a d B M P 2 8 0(int s e n s) ;// per d e c i d e r e q u a l e dei due v a l o r i l e g g e r e ( t e m p ./ p r e s s .)

5. Web Service, set di funzioni che gestiscono la pagina web; ogni fun-zione carica una pagina HTML diversa, con del CSS embedded e senza alcun linguaggio di scripting, e proprio per questo motivo si `e cercato di creare/emulare un servizio HTTP RESTful (sebbene non sia presente nessun tipo di scripting) assegnando ad URI diverse servizi differenti; la handleRoot() `e quella pi`u importante, poich´e `e quella che contiene il form di registrazione del dispositivo.

v o i d h a n d l e R o o t() ; // H o m e del s e r v i z i o , c o n t i e n e il f o r m di r e g i s t r a z i o n e v o i d h a n d l e P o s t() ; // P a g i n a c r e a t a al m o m e n t o di s u b m i t del form , r e d i r e c t a h a n d l e E x i t () v o i d h a n d l e R e s e t() ;// P e r m e t t e di l a n c i a r e una r o u t i n e per r e s e t t a r e le c r e d e n z i a l i d a l l a m e m o r i a E E P R O M v o i d h a n d l e E x i t() ; // P e r m e t t e di c h i u d e r e il server , la m o d a l i t a ’ S t a n d a l o n e e di r e s e t t a r e il d i s p o s i t i v o v o i d h a n d l e N o t F o u n d() ; // P a g i n a non t r o v a t a v o i d h a n d l e I o T() ; // C a r i c a una p a g i n a i n f o r m a t i v a su IoT v o i d h a n d l e T o o l s() ; // C a r i c a una p a g i n a che c o n t i e n e p u l s a n t i a s e r v i z i ( h a n d l e R e s e t () e h a n d l e E x i t () ) v o i d h a n d l e A b o u t() ; // C a r i c a una p a g i n a i n f o r m a t i v a sul p r o g e t t o v o i d h a n d l e C o n t a c t() ; // C a r i c a una p a g i n a i n f o r m a t i v a sui n o s t r i c o n t a t t i e l i n k u t i l i

6. Auxiliary , routines utili e utilizzate pi`u volte

i n t 3 2 _ t g e t R S S I(c o n s t c h a r* t a r g e t _ s s i d) ; // L e g g e s e g n a l e W i F i

v o i d b l i n k L e d(int pin,int r e p e a t) ;

(41)

32 4. Software

4.4

Sviluppo

4.4.1

Ambiente di sviluppo

Il progetto `e stato sviluppato e testato interamente attraverso tools e soft-ware open-source:

abbiamo lavorato solo su piattaforme con Linux come sistema operativo (Li-nux Mint 17.3 Rosa-Cinnamon)3, l’IDE utilizzato `e statoArduino IDE4, e le

librerie tutte scaricabili da GitHub.

4.4.2

Librerie utilizzate

# i n c l u d e < A r d u i n o . h >

# i n c l u d e < W i r e . h >

La prima per includere il core di Arduino, cio`e tutte le macro, le costanti e i controlli sul microcontrollore (versioni di Atmel AVR5, famiglia di

micro-controllori RISC);

la seconda permette di creare il protocollo I2C su due pin dati in INPUT a piacere. Link su GitHub6. # i n c l u d e < E S P 8 2 6 6 W i F i M u l t i . h > # i n c l u d e < E S P 8 2 6 6 H T T P C l i e n t . h > # i n c l u d e < E S P 8 2 6 6 W i F i . h > # i n c l u d e < E S P 8 2 6 6 W e b S e r v e r . h > # i n c l u d e < E S P 8 2 6 6 m D N S . h > # i n c l u d e < W i F i C l i e n t . h >

Fanno parte del core ESP8266, citato precedentemente, forniscono primitive per sfruttare il modulo ESP nell’interfacciarsi alla rete. Inoltre ci hanno permesso di avere dei metodi fondamentali per il conseguimento in toto delle nostre User Stories:

3https://www.linuxmint.com/download.php 4https://www.arduino.cc/en/Main/Software

5http://www.atmel.com/products/microcontrollers/avr/

(42)

4.5 Testing 33

ESP.g e t V c c() ; // Per l e g g e r e la p o t e n z a d e l l ’ a l i m e n t a z i o n e ESP.r e s e t() ; // Per r e s e t t a r e il d i s p o s i t i v o

ESP.d e e p S l e e p(u i n t 3 2 t t i m e u s e c) ; // Per far d o r m i r e il d i s p o s i t i v o per t i m e u s e c m i c r o s e c o n d i

Link su GitHub7.

# i n c l u d e < E E P R O M f o r A u t h . h >

Libreria scritta da noi ad hoc per leggere/scrivere le credenziali sulla memoria EEPROM della board , basandoci sulla libreriaEEPROM.h di Arduino. Link su GitHub8.

# i n c l u d e < DHT . h >

# i n c l u d e < D H T _ U . h >

Libreria per gestire i sensori DHT (DHT Unified supporta DHT11, DHT21 e DHT22).

Link su GitHub9.

# i n c l u d e < A d a f r u i t _ S e n s o r . h >//

# i n c l u d e < A d a f r u i t _ B M P 0 8 5 . h >//

Libreria per gestire i sensori BMP (BMP085 supporta BMP180 e BMP280). Link su GitHub10 11.

4.5

Testing

Il lavoro svolto nella fase di testing `e stato incentrato nella produzione (manuale e via software) di test che emulavano un evento o un comporta-mento umano.

I primi ad essere stati prodotti sono stati i test di lettura dei sensori, per verificare la reale correttezza delle librerie importate e di queste ultime in concomitanza di altre routines e per assicurarci l’integrit`a dei nostri sensori. In seguito, i test per creare un “timed button” per far scatenare la routine

7https://github.com/esp8266/Arduino/tree/master/libraries 8https://github.com/eldiablo100000/EEPROM4Auth 9https://github.com/adafruit/DHT-sensor-library 10https://github.com/adafruit/Adafruit Sensor

(43)

34 4. Software

di registrazione, che sono consistiti nel testing manuale con i jumper sulla breadboard per la circuiteria, e sempre manuali per assicurare il comporta-mento del bottone in caso di deepSleep mode o meno.

I test per le connessioni, invece, sono stati quelli pi`u complicati da produrre: dopo aver esaminato le 3 modalit`a che avremmo utilizzato nello sketch sin-golarmente, cosa semplice visto che le librerie ESP8266* sono tutte corredate da esempi molto snelli da cui attingere, testare l’integrazione dei 3 moduli ha portato qualche conflitto risolvibile unicamente modificando l’ordine d’e-secuzione di alcune chiamate a funzione.

Figura 4.1: Screenshot della comunicazione via seriale tra computer

(attraverso l’IDE) e la Weather Station.

Dispositivi difficili

Lo sviluppo e, soprattutto, il testing si sono svolti su pi`u dispositivi, di-versi in alcune caratteristiche.

I devices su cui si `e lavorato sono stati: modulo 01, modulo ESP8266-12F, Arduino Uno, Fishino Uno, Espduino.

(44)

4.5 Testing 35

ESP88266-01 Il pi`u semplice della famiglia ESP. Problema: necessaria espansione per i pin visto che `e fornito solo di GPIO0 e GPIO2. ESP8266-12F Il modulo pi`u utilizzato, visto che pu`o essere utilizzato senza board• supplementari (Vedi Prototipo 3). Problema: FLASH e RESET necessitano di circuiteria da costruire; per utilizzarlo, inoltre, serve saldarlo. Fishino UNO Board italiana nata per unire l’IoT con l’idea di “Plug and Play” per l’utente con meno conoscenze di programmazione . Problema: il modulo ESP12 integrato contiene un firmware dedicato, quindi zero compatibilit`a con qualunque altro sketch o libreria/firmware per ESP8266. Inoltre `e caro. Arduino UNO La board pi`u famosa, contiene gi`a il core di Arduino nel firmware. Problema: il meno pratico ed economico, specie se si pensa che `e sfornito di ogni modulo di rete. ESPduino La board su cui si `e svolta la maggiore attivit`a di testing. Problema: il FLASH dello sketch non pu`o essere completato con la board (Vedi Prototipo 2) gi`a inserita, poich´e per lanciarlo in UART mode il RESET non deve essere collegato. Inoltre i moduli ESP non permettono dei periodi di deepSleep maggiori di 30 minuti.

(45)

36 4. Software

4.6

Deployment

4.6.1

Sketch

Lo sketch `e stato scritto interamente in C++, con parti di codice HTML e CSS, per strutturare il Web Service, inserite in variabili, allocate al momento della richiesta al server.

Idealmente, `e la naturale implementazione della logica che era stata pensata in fase di Progettazione, non ci sono state modifiche sostanziali nel passaggio dalla fase di Progettazione a quella di Deployment.

A differenza degli sketch che si trovano spesso online per ESP, il nostro non esegue il “main” nella setup(), bens`ı nella loop(), perch´e nel nostro caso pi`u di un’ operazione deve essere eseguita solo una volta, quindi il paradigma della programmazione per Arduino ci viene in aiuto differenziando ci`o che `e “da fare sempre” da ci`o che `e “da fare una volta”.

(46)

4.6 Deployment 37

4.6.2

Librerie prodotte

Le librerie prodotte sono 2:

1. EEPROM4Auth12, libreria per scrivere/leggere credenziali

sull’EE-PROM di board Arduino-like, e per resettare i contenuti della stessa memoria.

2. CrowdsensingLibrary13, libreria per interfacciarsi su Thingspeak

at-traverso le API fornite dal Web Service; permette di creare un canale e di fare upload di dati su un proprio canale (o un canale pubblico). La prima, EEPROM4Auth, `e costituita da soli 3 metodi pubblici, basati sugli ultimi aggiornamenti della libreria EEPROM.h, che tratta la scrittura come una transazione, quindi con metodi di commit().

# d e f i n e L E N G T H E E P R O M 512 // in E E P R O M 4 A u t h . h per m o d i f i c a r e la g r a n d e z z a d e l l a m e m o r i a v o i d c l e a r E E P R O M() ; // Per r e s e t t a r e m e m o r i a E E P R O M v o i d w r i t e T o E E P R O M(S t r i n g ess,S t r i n g psw, S t r i n g key) ; // Per s c r i v e r e c r e d e n z i a l i nel f o r m a t o "# m y W i F i # m y P a s s # m y S t r i n g # 0 0 0 0 . . . " S t r i n g r e a d F r o m E E P R O M(S t r i n g a r g 1) ; // Per l e g g e r e ess / psw / key d a l l ’ EEPROM , il p a r a m e t r o puo ’ v a r i a r e fra E S S I D / PSW / KEY

La seconda, CrowdsensingLibrary, `e costituita da 4 metodi pubblici, di cui 2 sono dichiarati con overloading per poter supportare un WiFi Client, un Ethernet Client o un Fishino Client.

v o i d U p d a t e C h a n n e l(W i F i C l i e n t/E t h e r n e t C l i e n t/F i s h i n o C l i e n t client, S t r i n g api_key,S t r i n g name, f l o a t val[] ,int

n _ f i e l d s, S t r i n g desc, int e l e v a t i o n,f l o a t lat, f l o a t

lon, b o o l p u b l i c _ f, S t r i n g tags, S t r i n g url) ; // Per a g g i o r n a r e canale , a v e n d o l ’ a p i _ k e y del c a n a l e

12https://github.com/eldiablo100000/EEPROM4Auth/ 13https://github.com/eldiablo100000/CrowdsensingLibrary/

(47)

38 4. Software

S t r i n g C r e a t e C h a n n e l(W i F i C l i e n t/E t h e r n e t C l i e n t/

F i s h i n o C l i e n t ,c h a r* api_key,c h a r* name,c h a r** val, int

n _ f i e l d s, c h a r* desc, int e l e v a t i o n, f l o a t lat, f l o a t

lon, b o o l p u b l i c _ f, c h a r* tags, c h a r* url) ; // Per c r e a r e un n u o v o canale , a v e n d o l ’ a p i _ k e y MASTER , c i o e ’ q u e l l a l e g a t a all ’ a c c o u n t T h i n g S p e a k , r i t o r n a l ’ a p i _ k e y

in s c r i t t u r a r e l a t i v a al c a n a l e c r e a t o

S t r i n g G e t K e y() ; // Per r i t r o v a r e la c h i a v e s u l l ’ EEPROM , nel f o r m a t o "# m y A P I k e y "

b o o l K e y E x i s t s() ;

4.6.3

Misurazioni

Per tutta la durata del progetto, le rilevazioni sono state salvate su un canale/stream pubblico attraverso un account privato registrato su Thing-Speak.

Le misurazioni, inerenti questo ed altri progetti, possono essere trovati su questo canale. Account: doctor100000 Password: ciaociao Canale: ESP-WeatherStation14 Id Canale:180171 14https://thingspeak.com/channels/180171

(48)

4.6 Deployment 39

Figura 4.3: Screenshot canale ThingSpeak su cui, attualmente, vengono postate le rilevazioni.

(49)

40 4. Software

4.6.4

Web Service

Figura 4.5: Screenshot pagina Home. `

E la pagina che si presenta al lancio del Web Service, e contiene il form di Registrazione della Weather Station.

I dati da inserire sono: Nome, ESSID (Nome della rete a cui collegarsi), Password (di rete), Key (fornita dal proprietario del server su cui scrivere, per ora ThingSpeak).

(50)

4.6 Deployment 41

Figura 4.6: Screenshot pagina RegisterWStation

Pagina di atterraggio dopo aver sottomesso il form della Home.

Permette di chiudere il server ed iniziare il Crowdsensing, o visitare il WebService sulle altre pagine/schede.

(51)

42 4. Software

Figura 4.7: Screenshot pagina IoT

(52)

4.6 Deployment 43

Figura 4.8: Screenshot pagina About

Informazioni sul progetto e sulCrowdsensing.

(53)

44 4. Software

Figura 4.10: Screenshot pagina Tools

(54)

Conclusioni

Il presente lavoro, com’ `e evidente, affronta e prova ad analizzare uno scenario pesantemente attivo nell’ultimo decennio, l’IoT.

Sono stati analizzati i principi cardine dei modelli di business e sviluppo ba-sati sull’impiego del crowd (folla), partendo dal Crowdsourcing, per arrivare al Crowdsensing, inglobato in un certo senso nel precedente.

In seguito, l’enfasi si `e concentrata sul mondo dell’Internet of Things e del Mobile CrowdSensing, scenari tanto interessanti quanto vasti sia in termini di letteratura, che in termini di possibili sviluppi.

Dopo una prima analisi di ci`o che sono questi fenomeni, ci si `e concentrati sulla descrizione del progetto che abbiamo portato avanti, e cio`e la progetta-zione e la realizzaprogetta-zione di una Weather Station. Questa descriprogetta-zione `e stata divisa in due macro aree di dominio: Hardware e Software.

Nella parte Hardware, oltre ad una esaustiva spiegazione del lavoro svolto per arrivare ai prototipi dianzi descritti, `e riportata anche una piccola analisi delle problematiche incontrate durante la fase di creazione del nostro dispo-sitivo, problematiche che si presuppone possano essere comuni a molti che, come chi scrive, non hanno un’esperienza decennale nel mondo dell’elettro-nica e dei microcontrollori, ma sono neofiti.

Nella parte Software, abbiamo descritto come `e stato portato avanti lo svi-luppo (Metodologia di svisvi-luppo Agile), quali strumenti sono stati utilizzati e, naturalmente, abbiamo dato un feedback riguardo le piattaforme su cui ab-biamo testato il nostro software, insieme alla spiegazione della logica e delle User Stories prese in considerazione.

(55)

46 CONCLUSIONI

Dal lavoro di tesi `e emerso che, nonostante la letteratura e la ricerca siano in forte crescita nei settori qui trattati, esistono ostacoli di non poco conto che, di certo, non aiutano il neofita a misurarsi con questo mondo, n´e incentivano lo sviluppo da parte di chi gi`a ci lavora. Questi ostacoli sono: l’assenza (visto il mercato giovane) di standard che regolino misurazioni e protocolli da utilizzare; l’assenza di banche dati pubbliche contenenti canali reliable (ThingSpeak e SparkFun, per uno stakeholder, lasciano a desidera-re, poich´e centinai di fattori possono rendere il canale di un utente privato non interessante, specie se l’utente non `e a conoscenza di essere seguito da qualcuno che fa fede sulle sue misurazioni); l’assenza di security adatta, sia per la mancanza di protocolli, sia perch´e viene soppressa nel momento in cui altre funzioni hanno la priorit`a di essere memorizzate in un dispositivo pic-colo come modulo ESP (con 1-4 MB di Memoria Flash); ci`o rende il settore dell’IoT ancora poco affidabile; la difficolt`a nel reperire alcune componenti, come le batterie a Litio.

Il presente progetto, pi`u che un prodotto finito (nonostante lo sia), vuole essere inteso come uno studio di fattibilit`a, destinato ad Universit`a, aziende o stakeholder che hanno interesse nel creare delle WeatherStation (piuttosto che WiFiSignalStation, EarthQuakeStation, NoisePollutionStation) a prezzi minimi da fornire alla gente per campagne di Crowdsensing, semplicemente con una minima (e ovvia) modifica all’hardware (basta cambiare sensori) e al software per adattarlo alle proprie esigenze.

Proprio per questo, il progetto presentato vuole essere una sorta di guida per creare piccoli ed economici dispositivi che comunichino ad server centrale del-le informazioni con una certa frequenza, a prescindere dai sensori utilizzati. Naturalmente, come ogni cosa (specie nel mondo software), anche il presente progetto `e sicuramente migliorabile, da chi scrive o da chi se ne occuper`a in futuro, infatti il software e lo schema sono disponibili gi`a su GitHub15 e in

Appendice.

(56)

Appendice A

Sketch

WeatherStationESP.ino # i n c l u d e < E S P 8 2 6 6 W i F i . h > # i n c l u d e < W i F i C l i e n t . h > # i n c l u d e < E S P 8 2 6 6 W e b S e r v e r . h > # i n c l u d e < E S P 8 2 6 6 m D N S . h > # i n c l u d e < E E P R O M . h > # i n c l u d e < A r d u i n o . h > # i n c l u d e < E S P 8 2 6 6 W i F i M u l t i . h > # i n c l u d e < E S P 8 2 6 6 H T T P C l i e n t . h > # i n c l u d e < E E P R O M f o r A u t h . h > # d e f i n e N M I N S L E E P 30 // # d e f i n e T I M E S L E E P 1 0 0 0 0 0 0 * 5 // in u s e c o n d s # d e f i n e T I M E S L E E P 1 0 0 0 0 0 0 * 60 * N M I N S L E E P # d e f i n e S E R V E R " h t t p : / / 1 8 4 . 1 0 6 . 1 5 3 . 1 4 9 / u p d a t e " A D C _ M O D E(A D C _ V C C) ; // To r e a d V o l t a g e // D H T 2 2 # i n c l u d e < A d a f r u i t _ S e n s o r . h > # i n c l u d e < DHT . h > # i n c l u d e < D H T _ U . h > # d e f i n e D H T P I N 12 // Pin w h i c h is c o n n e c t e d to the DHT s e n s o r . // U n c o m m e n t the t y p e of s e n s o r in use : // # d e f i n e D H T T Y P E D H T 1 1 // DHT 11 # d e f i n e D H T T Y P E D H T 2 2 // DHT 22 ( A M 2 3 0 2 ) 47

(57)

48 A Prima Appendice // # d e f i n e D H T T Y P E D H T 2 1 // DHT 21 ( A M 2 3 0 1 ) D H T _ U n i f i e d dht(DHTPIN, D H T T Y P E) ; // B M P 2 8 0 # i n c l u d e < W i r e . h > # i n c l u d e < A d a f r u i t _ B M P 0 8 5 . h > A d a f r u i t _ B M P 0 8 5 bmp; c o n s t c h a r * s s i d = " W e a t h e r S t a t i o n E S P "; c o n s t c h a r * p a s s w o r d = " h e l l o i o t ";// min . 8 c h a r a c t e r s c o n s t int b u t t o n P i n = 2; c o n s t int l e d P i n R e d = 5; c o n s t int l e d P i n Y e l l o w = 13; i n t 3 2 _ t r s s i; c h a r n e t w o r k s[ 5 0 0 ] =" "; int b u t t o n S t a t e = 0; // c u r r e n t s t a t e of the b u t t o n int l a s t B u t t o n S t a t e = 0; // p r e v i o u s s t a t e of the b u t t o n

int s t a r t P r e s s e d = 0; // the t i m e b u t t o n was p r e s s e d

int e n d P r e s s e d = 0; // the t i m e b u t t o n was r e l e a s e d

int t i m e H o l d = 0; // the t i m e b u t t o n is h o l d int c o u n t e r = 0; // c o u n t e r l o o p b o o l c l o s e A P = 0; E E P R O M f o r A u t h eep; // E S P 8 2 6 6 W i F i M u l t i W i F i M u l t i ; E S P 8 2 6 6 W e b S e r v e r s e r v e r( 8 0 ) ; u i n t 3 2 _ t g e t V c c; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // S E T U P AND L O O P * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * v o i d s e t u p(v o i d) { p i n M o d e(b u t t o n P i n, I N P U T) ; p i n M o d e(l e d P i n R e d, O U T P U T) ; p i n M o d e(l e d P i n Y e l l o w, O U T P U T) ; d i g i t a l W r i t e(l e d P i n R e d, LOW) ;

(58)

A Sketch 49 d i g i t a l W r i t e(l e d P i n Y e l l o w, LOW) ; S e r i a l.b e g i n( 1 1 5 2 0 0 ) ; S t r i n g res; g e t V c c = ESP.g e t V c c() ; S e r i a l.p r i n t l n(" B a t t e r y L e v e l : ") ; S e r i a l.p r i n t l n(g e t V c c) ; eep= E E P R O M f o r A u t h() ; // SDA 0 , SCL 14 W i r e.b e g i n(0 ,14) ; S t r i n g psw = eep.r e a d F r o m E E P R O M(" PSW ") ; S t r i n g e s s i d = eep.r e a d F r o m E E P R O M(" E S S I D ") ;

S t r i n g key = eep.r e a d F r o m E E P R O M(" KEY ") ;

S e r i a l.p r i n t l n() ; S e r i a l.p r i n t l n(" [ S E T U P ] e s s i d : " + e s s i d) ; S e r i a l.p r i n t l n(" [ S E T U P ] key : " + key) ; S e r i a l.p r i n t l n(" [ S E T U P ] psw : " + psw) ; d e l a y( 1 0 0 0 ) ; c o n n e c t T o N e t w o r k(e s s i d.c _ s t r() , psw.c _ s t r() , key.c _ s t r() ) ; } v o i d l o o p(v o i d) { d i g i t a l W r i t e(l e d P i n R e d, H I G H) ; S e r i a l.p r i n t l n(" [ L O O P ] P r e s s the b u t t o n and w a i t u n t i l led t u r n off to c o n n e c t s t a n d a l o n e ") ; d e l a y( 3 0 0 0 ) ; b o o l s e t u p = f a l s e; int now; b u t t o n S t a t e = d i g i t a l R e a d(b u t t o n P i n) ; // S e t u p p o s s i b l e o n l y at l a u n c h of l o o p w h i l e (b u t t o n S t a t e == LOW) { c o u n t e r++; if (c o u n t e r == 1) s t a r t P r e s s e d = m i l l i s() ; now = m i l l i s() ;

(59)

50 A Prima Appendice t i m e H o l d = now - s t a r t P r e s s e d; S e r i a l.p r i n t f(" [ L O O P ] T i m e H o l d d o w n % i \ n ", t i m e H o l d) ; if (t i m e H o l d >= 2 0 0 0 ) { s e t u p = t r u e; d i g i t a l W r i t e(l e d P i n R e d,LOW) ; d i g i t a l W r i t e(l e d P i n Y e l l o w,H I G H) ; } d e l a y( 1 0 0 ) ; b u t t o n S t a t e = d i g i t a l R e a d(b u t t o n P i n) ; } if (b u t t o n S t a t e == H I G H && s e t u p) { e n d P r e s s e d = m i l l i s() ; t i m e H o l d = e n d P r e s s e d - s t a r t P r e s s e d; // if ( c o u n t e r = = 1 ) t i m e H o l d =0; S e r i a l.p r i n t f(" [ L O O P ] T i m e H o l d h i g h % i \ n ", t i m e H o l d) ; s t r c p y(n e t w o r k s,s c a n N e t w o r k s() ) ; b l i n k L e d(l e d P i n Y e l l o w,3) ; S e r i a l.p r i n t l n(" [ L O O P ] S c a t t a la r o u t i n e di r e g i s t r a z i o n e in a p m o d e ") ; l a u n c h S t a n d A l o n e(ssid, p a s s w o r d) ; S e r i a l.p r i n t l n(" [ L O O P ] R e s t a r t i n g ") ; ESP.r e s e t() ; d e l a y( 1 0 0 0 ) ; }e l s e { // s t a r t P r e s s e d = m i l l i s () ; b l i n k L e d(l e d P i n R e d,3) ; }

(60)

A Sketch 51 f l o a t b m p S e n s[ 2 ] ; if(i n i t i a l i z e B M P 2 8 0() ) { b m p S e n s[ 0 ] =r e a d B M P 2 8 0(1) ; b m p S e n s[ 1 ] =r e a d B M P 2 8 0(2) ; } i n i t i a l i z e D H T 2 2() ; f l o a t t e m p e r a t u r e=r e a d D H T 2 2(1) ; f l o a t h u m i d i t y=r e a d D H T 2 2(2) ; f l o a t d h t S e n s[2] = { f l o a t(t e m p e r a t u r e) , f l o a t(h u m i d i t y) };

S t r i n g key = eep.r e a d F r o m E E P R O M(" KEY ") ;

int r e s u l t = p o s t T o S e r v e r(key,d h t S e n s[0] , d h t S e n s[1] , b m p S e n s[0] , b m p S e n s[ 1 ] ) ; if (r e s u l t == 1) { S e r i a l.p r i n t l n(" D e e p s l e e p ! . . . ") ; d e l a y( 1 0 0 0 ) ; ESP.d e e p S l e e p(T I M E S L E E P) ; } } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // AUX * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * i n t 3 2 _ t g e t R S S I(c o n s t c h a r* t a r g e t _ s s i d) { W i F i.m o d e(W I F I _ S T A) ;

(61)

52 A Prima Appendice W i F i.d i s c o n n e c t() ; b y t e a v a i l a b l e _ n e t w o r k s = W i F i.s c a n N e t w o r k s() ; for (int n e t w o r k = 0; n e t w o r k < a v a i l a b l e _ n e t w o r k s; n e t w o r k++) { if (s t r c m p(W i F i.S S I D(n e t w o r k) .c _ s t r() , t a r g e t _ s s i d) == 0) { r e t u r n W i F i.R S S I(n e t w o r k) ; } } r e t u r n 0; } c h a r* s c a n N e t w o r k s() { c h a r n e t w o r k s[ 5 0 0 ] ; d i g i t a l W r i t e(l e d P i n R e d, H I G H) ; d i g i t a l W r i t e(l e d P i n Y e l l o w, H I G H) ; S e r i a l.p r i n t l n(" [ S C A N ] S c a n s t a r t ") ; // W i F i . s c a n N e t w o r k s w i l l r e t u r n the n u m b e r of n e t w o r k s f o u n d W i F i.m o d e(W I F I _ S T A) ; W i F i.d i s c o n n e c t() ; int n = W i F i.s c a n N e t w o r k s() ; S e r i a l.p r i n t l n(" [ S C A N ] S c a n d o n e ") ; if (n == 0) S e r i a l.p r i n t l n(" [ S C A N ] No n e t w o r k s f o u n d ") ; e l s e { S e r i a l.p r i n t(n) ; S e r i a l.p r i n t l n(" n e t w o r k s f o u n d ") ; s t r c p y(n e t w o r k s," < s e l e c t n a m e = essid > ") ; for (int i = 0; i < n; ++i) { // P r i n t S S I D and R S S I for e a c h n e t w o r k f o u n d S e r i a l.p r i n t(i + 1) ; S e r i a l.p r i n t(" : ") ; S e r i a l.p r i n t(W i F i.S S I D(i) ) ;

(62)

A Sketch 53 S e r i a l.p r i n t(" ( ") ; S e r i a l.p r i n t(W i F i.R S S I(i) ) ; S e r i a l.p r i n t(" ) ") ; S e r i a l.p r i n t l n((W i F i.e n c r y p t i o n T y p e(i) == E N C _ T Y P E _ N O N E) ?" ":" * ") ; s t r c a t(n e t w o r k s," < o p t i o n v a l u e =\" ") ; s t r c a t(n e t w o r k s,W i F i.S S I D(i) .c _ s t r() ) ; s t r c a t(n e t w o r k s," \" > ") ; s t r c a t(n e t w o r k s,W i F i.S S I D(i) .c _ s t r() ) ; s t r c a t(n e t w o r k s," </ option > ") ; d e l a y( 1 0 ) ; } s t r c a t(n e t w o r k s," </ select > ") ; } S e r i a l.p r i n t l n(" ") ; r e t u r n n e t w o r k s; }

v o i d b l i n k L e d(int pin,int r e p e a t) {

if(repeat>0) { for(int i=0;i<r e p e a t;i++) { d i g i t a l W r i t e(pin,LOW) ; d e l a y( 5 0 0 ) ; d i g i t a l W r i t e(pin, H I G H) ; d e l a y( 5 0 0 ) ; d i g i t a l W r i t e(pin, LOW) ; d e l a y( 5 0 0 ) ; } } }

v o i d b l i n k 2 L e d(int pin1,int pin2,int r e p e a t) {

if(repeat>0) {

for(int i=0;i<r e p e a t;i++) {

d i g i t a l W r i t e(pin1,LOW) ;

d i g i t a l W r i t e(pin2,LOW) ;

(63)

54 A Prima Appendice d i g i t a l W r i t e(pin1, H I G H) ; d i g i t a l W r i t e(pin2,H I G H) ; d e l a y( 5 0 0 ) ; d i g i t a l W r i t e(pin1, LOW) ; d i g i t a l W r i t e(pin2,LOW) ; d e l a y( 5 0 0 ) ; } } } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // C O N N E C T I O N S * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * S t r i n g l a u n c h S t a n d A l o n e(c o n s t c h a r * essid,c o n s t c h a r * pwd ) { c l o s e A P=0; W i F i.s o f t A P(essid, pwd) ; S e r i a l.p r i n t l n() ; // W a i t for c o n n e c t i o n S e r i a l.p r i n t l n() ; S e r i a l.p r i n t(" [ C O N N . S T A N D A L O N E ] C o n n e c t e d to ") ; S e r i a l.p r i n t l n(e s s i d) ; S e r i a l.p r i n t(" [ C O N N . S T A N D A L O N E ] IP a d d r e s s : ") ; S e r i a l.p r i n t l n(W i F i.s o f t A P I P() ) ; if (M D N S.b e g i n(" e s p 8 2 6 6 ") ) { S e r i a l.p r i n t l n(" M D N S r e s p o n d e r s t a r t e d ") ; }

(64)

A Sketch 55 s e r v e r.on(" / ", h a n d l e R o o t) ; s e r v e r.on(" / R e g i s t e r W S t a t i o n ", h a n d l e P o s t) ; s e r v e r.on(" / IoT ", h a n d l e I o T) ; s e r v e r.on(" / A b o u t ", h a n d l e A b o u t) ; s e r v e r.on(" / C o n t a c t ", h a n d l e C o n t a c t) ; s e r v e r.on(" / T o o l s ", h a n d l e T o o l s) ; s e r v e r.on(" / E x i t ", h a n d l e E x i t) ; s e r v e r.on(" / R e s e t ", h a n d l e R e s e t) ; s e r v e r.o n N o t F o u n d(h a n d l e N o t F o u n d) ; s e r v e r.b e g i n() ; S e r i a l.p r i n t l n(" [ C O N N . S T A N D A L O N E ] H T T P s e r v e r s t a r t e d ") ; w h i l e (t r u e&&!c l o s e A P) { s e r v e r.h a n d l e C l i e n t() ; } S e r i a l.p r i n t l n(" [ C O N N . S T A N D A L O N E ] S e r v e r c l o s e d ! E x i t ! . . . ") ; c h a r buf[ 2 5 0 ] ; c h a r n e t w o r k[ 6 8 ] ; if(s e r v e r.arg(2) .l e n g t h() >0) { s t r c p y(network,s e r v e r.arg(2) .c _ s t r() ) ; } e l s e{ s t r c p y(network,s e r v e r.arg(1) .c _ s t r() ) ; } s p r i n t f(buf, " F u l l n a m e :% s , E S S I D :% s , P a s s w o r d :% s , W r i t e Key :% s ", s e r v e r.arg(0) .c _ s t r() , network, s e r v e r.arg

(3) .c _ s t r() , s e r v e r.arg(4) .c _ s t r() ) ;

W i F i.d i s c o n n e c t() ;

r e t u r n buf; }

(65)

56 A Prima Appendice v o i d c o n n e c t T o N e t w o r k(c o n s t c h a r e s s i d[] ,c o n s t c h a r p a s s w o r d[] ,c o n s t c h a r s t r i n g[]) { S e r i a l.p r i n t l n() ; S e r i a l.p r i n t l n() ; S e r i a l.p r i n t l n() ; S e r i a l.p r i n t f(" [ C O N N . N E T W O R K ] C o n n e c t i n g to % s w i t h p a s s % s \ n ", essid, p a s s w o r d) ; r s s i = g e t R S S I(e s s i d) ; W i F i.b e g i n(essid,p a s s w o r d) ; // W i F i M u l t i . a d d A P ( ssid , p a s s w o r d ) ; } int p o s t T o S e r v e r(S t r i n g api_key,f l o a t f1, f l o a t f2, f l o a t f3,f l o a t f4) { // w a i t for W i F i c o n n e c t i o n if ((W i F i.s t a t u s() == W L _ C O N N E C T E D) ) { H T T P C l i e n t h t t p; S e r i a l.p r i n t(" [ P O S T 2 S E R V E R ] b e g i n . . . \ n ") ; // c o n f i g u r e t r a g e d s e r v e r and url // h t t p . b e g i n (" h t t p s : / / 1 9 2 . 1 6 8 . 1 . 1 2 / t e s t . h t m l " , "7 a 9 c f4 db 40 d3 62 5 a 6 e 21 bc 5 c cc 66 c8 3 e a1 45 59 3 8 " ) ; // H T T P S h t t p.b e g i n(S E R V E R) ; // H T T P S e r i a l.p r i n t(" [ P O S T 2 S E R V E R ] P O S T . . . \ n ") ; // s t a r t c o n n e c t i o n and s e n d H T T P h e a d e r g e t V c c = ESP.g e t V c c() ; S e r i a l.p r i n t l n(" [ P O S T 2 S E R V E R ] B a t t e r y L e v e l : ") ; S e r i a l.p r i n t l n(g e t V c c) ; int h t t p C o d e = h t t p.P O S T(" a p i _ k e y = "+a p i _ k e y+" & f i e l d 1 = " +

f1 + " & f i e l d 2 = " + f2 + " & f i e l d 3 = " + f3+" & f i e l d 4 = " +

f4+" & f i e l d 5 = "+r s s i+" & f i e l d 6 = "+g e t V c c) ;

// h t t p C o d e w i l l be n e g a t i v e on e r r o r

(66)

A Sketch 57 // H T T P h e a d e r has b e e n s e n d and S e r v e r r e s p o n s e h e a d e r has b e e n h a n d l e d P i n R e d S e r i a l.p r i n t f(" [ P O S T 2 S E R V E R ] P O S T ... c o d e : % d \ n ", h t t p C o d e) ; // f i l e f o u n d at s e r v e r if (h t t p C o d e == H T T P _ C O D E _ O K) { S t r i n g p a y l o a d = h t t p.g e t S t r i n g() ; S e r i a l.p r i n t l n(p a y l o a d) ; r e t u r n 1; } } e l s e { S e r i a l.p r i n t f(" [ P O S T 2 S E R V E R ] P O S T ... failed , e r r o r : % s \ n " , h t t p.e r r o r T o S t r i n g(h t t p C o d e) .c _ s t r() ) ; } d e l a y( 5 0 0 0 ) ; h t t p.end() ; r e t u r n 0; } e l s e { S e r i a l.p r i n t l n(" Not c o n n e c t e d ") ; } } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // WEB S E R V I C E * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // CSS D E C L A R A T I O N c h a r css[ 5 4 0 ] =" b o d y {\ b a c k g r o u n d - c o l o r : L i g h t G r e e n ;\ }\ h1 {\ c o l o r : D a r k G r e e n ;\ }\

(67)

58 A Prima Appendice h2 {\ c o l o r : F o r e s t G r e e n ;\ }\ ul . bar {\ list - style - t y p e : n o n e ;\ m a r g i n : 0;\ p a d d i n g : 0;\ o v e r f l o w : h i d d e n ;\ b a c k g r o u n d - c o l o r : # 3 3 3 ; \ }\ li . bar {\ f l o a t : l e f t ;\ }\ li . bar a {\ d i s p l a y : b l o c k ;\ c o l o r : w h i t e ;\ text - a l i g n : c e n t e r ;\ p a d d i n g : 14 px 16 px ;\ text - d e c o r a t i o n : n o n e ;\ }\ li . bar a : h o v e r : not (. a c t i v e ) {\ b a c k g r o u n d - c o l o r : # 1 1 1 ; \ }\ . a c t i v e {\ b a c k g r o u n d - c o l o r : #4 C A F 5 0 ;\ } "; v o i d h a n d l e P o s t() { d i g i t a l W r i t e(l e d P i n Y e l l o w,H I G H) ; int l e n H T M L = 2 5 0 0 ; c h a r n e t w o r k[ 6 8 ] ; if(s e r v e r.arg(2) .l e n g t h() >0) { s t r c p y(network,s e r v e r.arg(2) .c _ s t r() ) ; } e l s e{ s t r c p y(network,s e r v e r.arg(1) .c _ s t r() ) ; }

Figura

Figura 2.1: Famiglia di standard P21451-01
Figura 3.1: Diagramma dei casi d’uso
Figura 3.2: Diagramma degli stati
Figura 3.3: Prototipo 1
+7

Riferimenti

Documenti correlati

che lui diceva perché c’è questa distinzione tra la parte abitativa e la parte occupazionale, è un po’ come la nostra vita di tutti i giorni, tu hai la tua casa, la

Caso sferico: Come dimostrato nel Teorema 1.1.15, ogni biolomorsmo della sfera di Riemann bC in sé ha almeno un punto sso... Ogni tale trasformazione con λ 6= 1 ha un

Un modello di danno può essere utilizzato per descrivere con successo il comportamento della sola matrice di calcestruzzo, mentre nel caso del FRC, la plasticità deve essere

Per cominciare, una società «amica del self change» elimina le barriere per chi è in cerca di aiuto: la più importante è la non volontà degli operatori di negoziare gli obiettivi

Le carriere lavorative sono ormai discontinue, caratterizzate da un susseguirsi di rapporti di lavoro presso diverse realtà, con passaggi repentini tra periodi di formazione e

 Emulare il framework tecnologico di uno di questi servizi, implementando un Rest Web Service che si interfacci con l’applicazione, e restituisca una prima

In order to test this hypothesis, we ana- lyzed the diversity, density and structural parameters of trees and shrub species in the regeneration layer (&lt; 4 m) of

ore 10,30 – Bilanci delle emissioni, PAES e Monitoraggio delle azioni – Raccolta dati e criticità emerse - Città Metropolitana di Roma Capitale / Alleanza per il Clima Italia;.