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