Visualizzazione post con etichetta mqtt. Mostra tutti i post
Visualizzazione post con etichetta mqtt. Mostra tutti i post

venerdì 13 ottobre 2017

MQTT 101 for ESP8266






Introduction

Recently many people asked my help in the implementation of ESP8266 sketches to let two or more modules communicate over the MQTT protocol.
This article provides and describes a basic MQTT source code working skeleton to interconnect ESP8266 modules over MQTT protocol.
The goal of this code is to provide a start point to beginner developers to develop their application by extending it.





MQTT

The main site for MQTT (Message Queuing Telemetry Transport) is [http://mqtt.org/].
MQTT is define in this way: “MQTT is a machine-to-machine (M2M)/”Internet of Things” connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport.”
The basic and key actors in a Publish/Subscribe architecture are:
  • A communication Broker : a central communication component which orchestrates all the communication processes and that manages the entire life-cycle of topics and messages
  • An agent which take the role of Publisher: sending messages to a specific topic living within a given MQTT
  • An agent which take the role of Subscriber: receiving messages from a specific topic on a broker
  • A Topic: a dedicated communication channels between devices


In this architecture a Publisher communicates with one or more Subscriber without knowing its/their identity (any type of addressing)
In other words when a Publisher wants to communicate, it just sends a message to a broker for a specific topic.
After the message has been delivered to the broker, it’s broker responsibility to propagate the message to all the Subscriber which are “listening” of a given topic (Publisher and Subscriber must publish and listen on the same topic).
Such architecture is present in many different IT domains and it is not limited to MQTT only.
As an example (over simplified), the Pub/Sub architecture is used by most of the GUI systems (Windows, Linux, …). For instance when I click on a button in a window, the windows manager send a message (Publisher). The handler of the button is listening (Subscriber) and when receiving a message from the manager it execute a specific piece of code (i.e. close the window)





ESP and MQTT

The MQTT protocol and its Pub/Sub architecture perfectly fits in the communication between ESP8266 devices and between ESP8266 and the external world (cloud). This provides a very easy, lightweight and fast communication mechanism to be used in ESP8266 projects.
A huge advantage, from a networking and security point of view, is that a given ESP can communicates with external devices with no necessity to open a TCP port in the router/firewall (if you implement a more traditional web model yo must open a port in your firewall to accept incoming web requests).
The MQTT protocol is supported by virtually any platform out there and for sure by Android, iOS, Javascript. This allow for an easy communication between a mobile/web application and an ESP module.

CLOUDMQTT

The MQTT broker I typically use for my projects and in this sketch is provided by https://www.cloudmqtt.com/


The cloud service is available in different pricing tiers, included my preferred one: the free of charge :)


Once you have sign-up to the service you can access the cloud console


Here you can find all the detailed information about your MQTT broker that you can use to configure the ESP sketch





MQTT Basic

The sample code allows one or more ESP to communicate over MQTT protocol and is available here github.
Below some important #define which should be configured before compiling and uploading the sketch to ESP8266


  • WIFI_SSID: the SSID of your WiFi network
  • WIFI_PASSWD: WiFi password
  • MQTT_CLIENT_ID: just a unique (random) ID for your MQTT client
  • MQTT_SERVER: the FQDN of the MQTT broker
  • MQTT_UNAME: authentication user name at the broker
  • MQTT_PASSWD: authentication password at the broker
  • MQTT_BROKER_PORT: listening broker port
  • MQTT_TOPIC: the MQTT topic on which exchange messages
  • ESP_NAME: a name for your ESP module
  • ESP_PUB_ROLE: ESP is behaving as a Publisher
  • ESP_SUB_ROLE: ESP is behaving as a Subscriber

ESP Libraries

This code uses the following libraries
MQTT.h and PubSubClient.h — v 1.99.0 — https://github.com/Imroy/pubsubclient





MQTT Basic Testing

The demonstration code can be tested either with 2x ESP communication between each other or 1x ESP and 1x MQTT client (for instance I will show how to use a mosquitto client on Linux, but any other MQTT client will be ok)

ESP as Publisher

On the ESP sketch un-comment #define ESP_PUB_ROLE, then compile and upload the generated binary to ESP
Once the program starts you can see in the serial monitor something similar to the below


On a Linux shell you need to subscribe to this topic: esp8266/sensori
you can use the following command:
mosquitto_sub -h <host name> -p <port> -u <user name> -p <password> -i <client id univoco> t- esp8266/sensori
where the parameters between <> are the one visible in your CloudMQTT cloud console


As you can see from the screenshot, my client running on Linux somewhere in the Internet receives commands (the string “Hello I m ESP-my_ESP_8266”) from my ESP8266 running on my desk in my office. Pretty cool ah!!

ESP as Subscriber

On the ESP sketch un-comment #define ESP_SUB_ROLE, then compile and upload the generated binary to ESP
Once the program starts you can see in the serial monitor something similar to the below


On the Linux client now I send commands to my ESP through the following command:
mosquitto_pub -h <host name> -p <port> -u <user name> -p <password> -i <client id univoco> t- esp8266/sensori -m “hi this is another ESP8266”
where the parameters between <> are the one visible in your CloudMQTT cloud console


As you can see from the screenshot, my ESP8266 running on my desk receives commands from my Linux client.

Conclusion

The MQTT protocol and the Pub/Sub architecture are used in different environments and especially in the IoT market. They provide and lightweight and flexible communication mechanism that we can leverage to give our Arduino/ESP projects connectivity to the cloud or local network.
Let me know if you find this short introduction to MQTT on ESP useful and if use it in your projects send me a picture :)




martedì 14 febbraio 2017

MQTT Basic per ESP8266


 Introduzione


Recentement ho ricevuto alcune richieste di aiuto nell'implementare su ESP8266 uno sketch di base per far comunicare il modulo attraverso il protocollo MQTT.

Questo post resenta uno sketch di base che permette di far comunicare uno o piu' moduli ESP8266 attraverso un broker MQTT.





MQTT

Il sito di riferimento per il protocollo MQTT (Message Queuing Telemetry Transport) e' questo [http://mqtt.org/]. 

Qui MQTT viene definito in questo modo:  "MQTT e' un protocollo di comunicazione machine-to-machine (M2M) progettato come un protocollo estremamente legegro che implementa un architettura publish/subscribe"

Nella sua essenza un architettura Publish/Subscribe prevede 4 elementi principali:

  • Un agent con il ruolo di Publisher: che invia messaggi al broker indirizzati ad uno specifico Topic
  • Un agent con il ruolo di Subscriber: che riceve messaggi dal broker provenienti da uno specifico Topic
  • Un Broker di comunicazione: un elemento centrale che orchestra tutti i processi di comunicazione e gestisce il ciclo di vita dei topic e dei messaggi
  • Un Topic: un canale di comunicazione dedicato. 



In questa architettura un Publisher comunica con un Subscriber senza doverne conoscere esattamente l'identita'. 
In altre parole un Publisher invia un messaggio al broker indirizzandolo ad uino specifico Topic.
A questo punto e' responsabilita' del Broker inviare il messaggio a tutti i Subscriber che stanno volontariamente "alscoltando" il Topic.

Questa architettura si applica in svariati amienti e non e' limitata solo al mondo MQTT.
Solo a titolo di esempio un'architettura di questo tipo si usa nella stragande maggioranza di sistemi grafici a finestre (Windows, Linux, ...). Per esempio quando faccio click col mouse su un pulsante sto facendo il Publish di un messaggio. In ascolto (subscriber) ci sono una o piu' funzioni che eseguono un codice particolare (chiudo la finestra, cancello l'area di disegno, etc...)







ESP e MQTT


Il protocollo MQTT ma ancor di piu' la sua architettura Pub/Sub si presta perfettamente ad essere utilizzata per la comunicazione tra i diversi (o il singolo) ESP dei nostri progetti fornendo un meccanismo di comunicazione facile, veloce, snello e sicuro.

Un grande vantaggio, sopratutto in ambito domestico, che lo ESP puo' comunicare con il mondo esterno senza dover aprire porte nel nostro Router casalingo e senza dover far nessun port forwarding 

Il protocollo MQTT e' supportato praticamente da tutte le piatatforme quali ad esempio Android, iOS, Javascript rendendo l'interazione tra lo ESP ed un client di controllo estremamente semplice.


CLOUDMQTT


Il broker MQTT che utilizzo per i miei progetti ed in questo sketch e' fornito da https://www.cloudmqtt.com/




Il servizio offfre diversi tier di prezzo, incluso il mio preferito: quello gratis :)




Una volta che vi siete registrati accedete alla console


Qui potete trovare tutte le informazioni utili per connettere lo ESP al broker







MQTT Basic

Il codice di esempio che permette ad uno o piu' ESP di comunicare tramite MQTT e' disponibile sul mio github.

Qui sotto alcuni define che permettono di configurare i vari parametri necessari


  • WIFI_SSID: lo SSID della vostra rete wifi alla quale lo ESP si collega
  • WIFI_PASSWD: la passowrd del WiFi
  • MQTT_CLIENT_ID: ogni agent MQTT deve avere un identificatore univoco
  • MQTT_SERVER: lo FQDN del broker MQTT che utilizzate
  • MQTT_UNAME: user name per autenticazione al broker
  • MQTT_PASSWD: password di autenticazione al broker
  • MQTT_BROKER_PORT: porta di ascolto del broker
  • MQTT_TOPIC: il tpic su cui inviare e ricevere i messaggi
  • ESP_NAME: un nome del vostro modulo ESP
  • ESP_PUB_ROLE: lo ESP si comporta come un Publisher
  • ESP_SUB_ROLE: lo ESP si comporat come un Subscriber

Librerie

Questo codice usa le seguienti librerie

MQTT.h e PubSubClient.h> - versione 1.99.0 - https://github.com/Imroy/pubsubclient


Test di MQTT Basic

Il codice in questione puo' essere testato sia con due o piu' ESP, oppure con un ESP ed unq ualsiasi client MQTT (io uso inq uesto esempio mosquitto su linux  ma qualsiasi altro client MQTT va bene ugualmente)

ESP come Publisher

Lato ESP togliete il comento per il #define ESP_PUB_ROLE, compilate e caricate lo sketch su ESP
Una volta partito vedrete nel vostro monitor seriale qualcosa di simile a questo



Su un client Linux mi metto in acolto sul topic esp8266/sensori

con il comando: mosquitto_sub -h <host name> -p <port> -u <user name> -p <password> -i <client id univoco> t- esp8266/sensori

dove i valori tra parentesi <> sono quelli recuperati dalla console di CloudMQTT




Come vedete dallo screenshot sopra, il mio client che gira su un Linux ovunque in Internet riceve i comandi dal mio ESP sulla mia scrivania






ESP come Subscriber

Lato ESP togliete il comento per il #define ESP_SUB_ROLE, compilate e caricate lo sketch su ESP
Una volta partito vedrete nel vostro monitor seriale qualcosa di simile a questo




Su un client Linux mi metto in acolto sul topic esp8266/sensori

con il comando: mosquitto_pub -h <host name> -p <port> -u <user name> -p <password> -i <client id univoco> t- esp8266/sensori -m "hi this is another ESP8266"

dove i valori tra parentesi <> sono quelli recuperati dalla console di CloudMQTT




Come vedete dagli screenshot il mio ESP sulla mia scrivania riceve i messaggi inviati da un client Linux ovunque in Internet


Conclusioni

Il protocollo MQTT e l'architettura Pub/Sub sono utilizzati in vari ambiti e nel contesto IoT forniscono un meccanismo di comunicazione snello e flessibile che permette la comunicazione tra i vari device dei nostri progetti in modo veloce, leggero e sicuro.

Se questa breve introduzione vi e' utile o e se realizzate un progetto con ESP/Arduino fatemi sapere









domenica 15 gennaio 2017

Software per valvola termostatica TM3030 con estensione wifi- Progetto Walvola - SW


Questo post descrive il software da far girare sulla valvola TM3030 












Software

Sul mio github e' disponibile tutto il progetto Walvola, ed in particolare il software di  controllo della valvola e' disponibile [qui]




Chiaramente il software e' aperto e disponbile a tutti. Inoltre il software e' 'as is', cioe' proprio in base alla natura aperta io condvido il software che ho sviluppato per le mie esigenze.

Ovviamente supporto l'idea di accettare contributi esterni. Quindi chiunqe trovi il softyware utile e voglia contrbuie con delle miglorie e' il ben accetto.


Architettura


Il sistema di controllo remoto dell'impianto di riscaldamneto (valvole termostatiche e caldaia) adotta un'architettura flessibile e scalabile basata sullo scambio di messaggi MQTT.

L'architettura non prevede l'utilizzo e l'intermediazione di un controllore centrale ma e' totalmente distribuita.








Elementi Architetturali

I suoi elementi costituenti sono:

  • Walvola: elemento montato direttamente sul termosifone che ha il compito di azionare il motore della valvola che comanda un pistoncino che permette o impedisce il flusso dell'acqua calda all'interno del termosifone






  • IRB: elemento montato nel vano caldaia che ha il compito di attivare/disattivare il bruciatore della caldaia murale






  • iHeatingun'applicazione web mobile basata su framework7 che permette il controllo remoto da un qualsiasi dispositivo mobile o web browser



Funzionamento

Come detto sopra, il sistema di comunicazione si basa su un'architettura pub/sub in cui gli elementi che comunicano tra di loro (le valvole ed le applicazioni mobili) non sono fortemente connessi.
In particolare l'applicazione mobile viene a conoscenza dell'esistenza di una o piu' valvole tramite un semplice meccanismo di advertising. Cio' signigica che non e' necessaria nessuna configurazione particolare dell'applicazione mobile quando si aggiunge/rimuove una valvola, ma la lista delle valvole disponibili viene creata ed aggiornata dinamicamente.

Il software della valvola e' architetturalmente semplice ed implementa la funzione di:

  • Subscriber: rimane in ascolto di messaggi pubblicati dai publisher e in caso di ricezione li processa andando as eseguire il comando inviato
  • Publisher: informa gli altri elementi dell'architettura sul proprio stato interno tramite lo scambio di messaggi MQTT






Organizzazioe Topic MQTT

A questo punto e' chiaro che lo scambio di messaggio tra le varie valvole e le applicazioni mobili avviene tramite il protocollo MQTT. Piu' in particolare tale protocollo si basa sul concetto di topic, che in sostanza e' un canale di comunicazione tra uno/molto publisher ed uno/molti subscriber.

Nel software di controllo in questione i topic sono creati dinamicamente dal software non necessitano di nessuna configurazione iniziale.

Nel dettaglio i topic sono organizzati nel seguente modo:






Ogni valvola riceve i messaggi MQTT su un topic di ingresso ad essa dedicatao. Allo stesso modo ogni valvola pubblica messaggi MQTT verso i destinatari su un topic di uscita dedicato.

I topic in ingresso seguono la seguiente naming convention:

  • <nome del topic>/in/<label valvola>

Mentre i topic in uscita seguono la seguiente naming convention:

  • <nome del topic>/out/<label valvola>

dove:
  • <nome del topic>: e' il nome del topic univoco comune per un intero sistema
  • <label valvola>: e' il nome univoco di ogni valvola o IRB

Funzionalita' e comandi supportati

Il software e' attualmente alla sua release 1.3 e supporta una serie di comandi base ed implementa alcune funzionalita' di monitoring e controllo.

Piu' in dettaglio le funzionalita' attualemente supportate sono:
  • ricezione comandi da apllicazione mobile
    • GET_STATUS: comando di richiesta stato valvola. Quando la valvola riceve sul suo topic di ingresso tale comando, legge il suo stato interno lo posta sul topic di uscita a lei dedeicato
    • SET_STATUS: comando di variazione stato valvola. Un applicazione di controllo puo' richiedere alla valvola, tramite questo comando, di cambiare il suo stato in uno dei seguenti:
      • WALVOLA_ON:  stato di valvola aperta. Una volta che la valvola e' tutta aperta il pistoncino e' completamente ritratto e quindi permette il flusso d'acqua massimo attraverso il termosifone
      • WALVOLA_OFF: stato di valvola chiusa. Una volta che la valvola e' tutta chiusa il pistoncino e' completamente esteso e quindi impedisce il flusso d'acqua attraverso il termosifone
      • WALVOLA_OTA: stato di valvola in upgrade software. Quando la valvola e' in questo stato non esplica le sue normali funzioni, ma rimane in attesa del caricamento Over The Air di una nuova versione del software. Importante notare che al termine del caricamento del software la valvola viene resettata.
      • RELAY_ON: stato di relay aperto. Apre il relay collegato alla caldaia attivando il bruciatore.
      • RELAY_OFF: stato di relay chiuso. Chiude il relay collegato alla caldaia disattivando il bruciatore.
    • GET_INFO: un applicazione di controllo richiede informazioni relative alla valvola che riceve tale comando. La valvola fornisce sul suo topic di uscita dedicato informazioni relative a:
      • versione software
      • voltaggio alimentazione (batterie)
      • indirizzo IP assegnato
    • UPDATE: comando di aggiornamento software della valvola. Il software implementa a funzionalita' di update Over The Air [qui piu' informazioni] permettendo l'aggiornamento della valvola senza doverla smontare dal termosifone. Nota: OTA e' difficilmente implementabile su di un modulo EPS8266-01 a causa delle dimensioni limitate della RAM. Questa modalita' e' supportata dal modulo ESP8266-12 e da altri moduli di tale famiglia.
  • due modalita' operative:
    • Walvola: il software svolge le funzionalita' di controllore di una valvola termostatica per termosifone
    • IRB:il software svolge funzionalita' di controllo di un relay per accensione/spegnimento bruciatore
  • due modalita' di risparmio energetico (piu' info [qui]):
    • DEEP SLEEP:  polling periodico del topic MQTT di ingresso con funzionalita' deep sleep per risparmio energetico.
    • MODEM SLEEP:  per i moduli che non supportano il deep sleep, implementazione della modalita' modem sleep. Nota: il modulo EPS8266-01 non supporta direttamente la modalita' deep sleep causa mancanza di una connessione tra due pin specifici del chip Espressif. E' possibile modificare il modulo ESP8266-01 in modo che possa supportare il deep sleep. L'operazione richiede una certa manualita' con il saldatura. In ogni caso [qui] le informazioni correlate
  • software upgrade in loco OTA: come menzionato in caso di utilizzo del modulo EPS8266-12 e' possibile aggiornare tramite web browser il software della valvola senza dover smontare la valvola dal termosifone.
  • monitoraggio carica batterie: la valvola periodicamente legge il voltaggio ai piedini di alimentazione e ne posta il risultato su un servizio cloud chiamato kee disponibile [qui]. Questo mi permette di monitorare il consumo delle valvole e di ottenre dei grafici di scarica delle batterie

  • notifica telegram: la valvola notifica il cambio del proprio status inviando un messaggio telegram. In tal modo ricevo delle notifiche push sul mio cellulare per sapere sempre lo stato del mio sistema di riscaldamento. Nota:  nella versione attuale il messaggio telegram e' disabilitato causa di un bug nella libreria SSL. Sto debuggando il problema ed faro' un commit su github con il fix quanto prima








Organizzazione del software

Il software e' uno sketch Arduino basato sui seguenti file:


  • Walvola.ino/h: file principale dello sketch. Contiene i classici setup e loop
  • wifi.cpp/h: contiene le funzioni relative alla connettivita' wifi e all'implementazione del model sleep
  • timeapi.cpp/h: contine le funzioni per interfacciarsi con il serivizo http://www.timeapi.org/ per ottenere la data e l'orario aggiornati (chi mi segue sa' che non sono un supporter del RTC)
  • telegram.cpp/h: funzioni per l'invio di messaggi telegram. Nota:  nella versione attuale il messaggio telegram e' disabilitato causa di un bug nella libreria SSL. Sto debuggando il problema ed faro' un commit su github con il fix quanto prima
  • mqtt.cpp/h: funzioni per la gestione della connettivita' MQTT e per il processamento dei comandi
  • misc.cpp/h: funzioni generali di supporto
  • keen.cpp/h: funzioni per l'invio della lettura del voltaggio batterie versio il servizio https://keen.io/
  • json.cpp/h: funzioni per la gestione dei messaggi JSON ricevuti dall'applicazione controller

Configurazione del software

Il software necessita di una serie di parametri configurazione da scpecificare prima della compilazione e delle generazione del binario da caricare sul modulo ESP8266.

Vediamo qui in dettaglio quali parametri sono configurabili e dove sono disponibili.

  • Walvola.ino:
    • keen_voltage_collection: sostituire il valore YOUR KEEN.IO VOLTAGE COLLECTION con il nome della collezione kee.io su cui postare le letture del voltaggio della batteria. Notare che in cosa nome della collezione viene aggiuno il nome della valvola


  • Walvola.h

    • WALVOLA_DEEP_SLEEP_MODE: definisce la modalita' di funzionamento DEEP SLEEP. commentare per rimuovere tale funzionalita'
    • WALVOLA_MODEM_SLEEP_MODE: definisce la modalita' di funzionamento MODEM SLEEP. commentare per rimuovere tale funzionalita'
    • WALVOLA_ROLE: definisce la modalita' operativa Walvola e quindi il modulo si comporta di conseguenza (attivazione motore/pistoncino)
    • IRB_ROLE: definisce la modalita' operativa IRBe quindi il modulo si comporta di conseguenza (attivazione relay)
    • OTA_MODE:  abilita il supporto all'upgrade software in modalita' OTA via browser
    • DEBUG: abilita' i messaggi di debug su seriale
    • MQTT_DEBUG: abilita' il post dei messaggi di debug su uno specifico topic chiamato (<nome del topic>/out/<label valvola>/debug)
    • WALVOLA_DELAY_ON: numero di millisecondi in cui il motore viene attivato per aprire la valvola e ritrarre il pistoncino
    • WALVOLA_DELAY_OFF: numero di millisecondi in cui il motore viene attivato per chiudere la valvola ed estendere il pistoncino
    • WALVOLA_LABEL: nome della valvola
    • WALVOLA_ID: id univoco della valvola

  • kee.h:
    • KEEN_PROJECT_ID:   sostituire il valore YOUR KEEN.IO PROJECT ID con l'id univoco del tuo progetto keen.io
    • KEEN_MASTER_KEY: sostituire il valore YOUR KEEN.IO MASTER KEY con il valore univoco della tua MASTER KEY relativa al tuo progetto keen.io

  • mqtt.h:

    • MQTT_UNAME: sostituire il valore YOUR MQTT BROKER ACCOUNT USER NAME con il tuo username per l'accesso al broker MQTT
    • MQTT_PASSW: sostituire il valore YOUR MQTT BROKER ACCOUNT PASSWORD con la password per l'accesso al broker MQTT
    • MQTT_BROKER_PORT: porta di accesso al tuo broker MQTT

  • mqtt.cpp

    • mqtt_walvolas_topic:sostituire il valoreYOUR TOPIC con il nome del tuo topic univoco per il tuo sistema
    • mqtt_controllers_topic:sostituire il valoreYOUR TOPIC con il nome del tuo topic univoco per il tuo sistema
    • mqtt_controllers_topic_debug: sostituire il valoreYOUR TOPIC con il nome del tuo topic univoco per il tuo sistema

  • wifi.cpp:

    • wifi_ssid:  SSID della tu arete wifi
    • wifi_passwd: password della tua rete wifi

Conclusioni

Nel post Come aggiungere il controllo wireless ad una valvola termostatica TM3030 - Progetto Walvola - HW abbiamo visto come realizzare la parte Hardware del progetto Walvola. Ho presentato lo schema elettrico ed il PCB del controller della valvola.
Ho anche spiegato come modificare la valvola per sostituire il suo controller originale con quello da me sviluppato.

In questo posto ho messo a disposizione su github il software Walvola da caricare sul modulo precedentemente sviluppato.
Ne ho spiegato l'architettura generale, le funzionalita' base e di comandi attualemente supportati. 
Infine ho descritto tutti i parametri di configurazione in modo che ognuno possa adattare il software al suo ambiente specifico.

Per il monitoring del voltaggio io uso il servizio https://keen.io che chiaramente non e' obbligatorio o puo' essere sostituito con altri servizi simili.

Come broker MQTT io uso https://www.cloudmqtt.com/ che offre un tier gratuito ed e' estremamente affidabile. Ovviamente potete usare un qualsiasi altro broker MQTT.

Se qualcuno trova il software utile si senta libero di utilizzarlo e se vuole contribuire con nuove funzioni sono apertissimo a discuterne.

In ogni caso queste serie di articoli dimostra come con un semplice modulino come ESP8266 si possano realizzare sistemi IoT utili alla vita di tutti i giorni. L'implementazione di tutte le parti richiede una serie di competenze che il lettore puo' gia' possedere o no. In ogni caso ritengo questa serie di post una buona occasione per cimentarsi con una serie di temi che spaziano dalla realizzazione di un PCB, dall'uso di servizi cloud e fino alla realizzazione di un applicazione mobile.

Se volete aiutarmi a migliorare questo progetto e se e' per voi utile lasciate i vostri commenti qui sotto.

Buon divertimento!!!