Aquest apunt té com a objectiu la instal·lació del programa Eclipse Mosquitto. Per fer-ho, se suposarà un sistema GNU/Linux (en concret Ubuntu 18.10). També s'exploraran els conceptes fonamentals del protocol MQTT, utilitzat per Mosquitto.
Què és MQTT?
MQTT són les sigles de _Message Queuing Telemetry Transport_, un protocol lleuger de missatgeria entre dispositius M2M, ideat per IBM i orientat principalment a dispositius amb pocs recursos, com ara plaques Arduino amb sensors.
MQTT utilitza el protocol de transport TCP i té diversos ports reservats:
- 1883: MQTT, no xifrat
- 8883: MQTT, xifrat
- 8884: MQTT, xifrat, cal un certificat per part del client
- 8080: MQTT sobre WebSockets, no xifrat
- 8081: MQTT sobre WebSockets, xifrat
Tota la informació sobre la reserva d'aquests ports es pot trobar a la pàgina de _Internet Assigned Numbers Authority_.
És útil tenir presents aquests ports, ja que, per defecte, Mosquitto s'iniciarà en algun d'aquests, segons com l'estiguem executant; el més habitual és el primer. És possible utilitzar un altre port amb l'opció _-p_.
Hi ha principalment dues classes d'amfitrions en aquest protocol, els clients i el broker, que es caracteritzen de la manera següent:
- Els clients són els dispositius que recullen la informació i l'envien al broker perquè la processi.
- El broker actua bàsicament com un servidor. S'encarrega de rebre i processar les dades que li envien els diferents tipus de clients i distribueix aquests missatges fins als sensors que s'hagin subscrit a un _topic_ determinat.
Com es pot veure a la imatge, és habitual tenir només un broker i diversos clients (en aquest cas 4). Les fletxes representen els missatges intercanviats, on la fletxa discontínua és un missatge del client al broker (publicació) i la fletxa contínua és un missatge del broker al client (subscripció).
En el paràgraf anterior s'han vist dos termes que segurament no han passat desapercebuts (o no ho haurien de fer). Són els de publicació i subscripció. Són els dos tipus de missatges acceptats per MQTT. Un client pot *publicar* un missatge en qualsevol moment que vulgui. Per fer-ho, ha d'especificar el _topic_, “el tema de conversa” . A més, cada client pot *subscriure's* als _topic_ que vulgui; aquests _topic_ seran els únics que li arribin.
El broker ha de tenir (o sol tenir) una adreça IP estàtica coneguda (la de la imatge és fictícia), ja que els clients han de saber a qui enviar els missatges i de qui rebre'ls.
Qualitat de servei (QOS)
Segons la finalitat que vulguem per als nostres missatges, podem especificar diferents nivells de qualitat en funció del rendiment o la fiabilitat que vulguem.
– QOS 0: no garanteix que el missatge arribi a la destinació. La més ràpida i senzilla. *Per defecte*.
– QOS 1: garanteix que el missatge arriba a la destinació, però hi pot haver duplicats del mateix missatge.
– QOS 2: el missatge arriba a la destinació i, a més, no hi ha duplicats. És el mètode més lent.
Instal·lació de Mosquitto
Eclipse Mosquitto està disponible tant per a GNU/Linux com per a Windows o MacOS. A la seva pàgina de baixades hi ha els binaris i les instruccions per instal·lar-lo. Aquí només s'explicaran les instruccions per a Ubuntu.
Mosquitto no està disponible als repositoris oficials d'Ubuntu, per la qual cosa cal afegir-hi el seu PPA:
# apt-add-repository ppa:mosquitto-dev/mosquitto-ppaDesprés actualitzem el sistema i instal·lem:
# apt update && apt upgrade -y && apt install mosquitto -y && apt install mosquitto-clients -yMissatges
Com s'ha explicat a l'apartat _Què és MQTT?_, el protocol MQTT utilitza missatges per comunicar-se entre els diferents dispositius. Ara vegem les ordres que cal executar per enviar missatges i subscriure's a un tema concret.
Caràcters especials
El _+_ i el _#_ són dos caràcters especials que tenen un funcionament semblant al de l'asterisc (*) en un sistema UNIX, però amb alguna diferència: ‘+’ : se substitueix per qualsevol nivell. Per exemple, si volem enviar un missatge a totes les bombetes d'una casa (on les bombetes s'anomenen bombilla): `/casa/+/bombilla`. Totes les bombetes hauran d'estar subscrites a aquest _topic_. ‘#’ : només se substitueix per nivells inferiors. Per exemple, si volem enviar un missatge a tots els dispositius de la mateixa habitació (la cuina, per exemple): `/casa/cocina/#`. Tots els dispositius hauran d'estar subscrits a aquest _topic_.
Publicació
Per publicar (enviar) un missatge cal especificar diversos valors obligatoris:
- _-h_: especifica l'adreça del broker. Pot ser tant un nom d'àlies com una adreça IP. Exemple: `-h test.mosquitto.org`.
- _-t_: indica el _topic_ del missatge. Ha d'anar entre cometes.
- _-m_: el missatge en si. També ha d'anar entre cometes.
Hi ha algunes opcions més que poden ser útils, com ara _-p_ per especificar el port o _-q_ per decidir la qualitat (QOS). Es poden veure totes les opcions executant `man mosquitto_pub`.
Per tant, un exemple de missatge d'encesa des de cadascuna de les bombetes de la sala d'estar, suposant que hi ha 3 bombetes i es troben a _/casa/salon/bombilla/i_, on i={1,2,3}, seria: `mosquitto_pub -h test.mosquitto.org -t “/casa/salon/bombilla/i” -m “Bombilla i: ON”`.
A la imatge s'han enviat 3 missatges diferents, els primers per “encendre” i l'últim per “apagar”.
Subscripció
Cada dispositiu rep només els missatges als quals està subscrit. Igual que en el cas de la publicació, té diversos valors obligatoris perquè funcioni correctament:
- _-h_: broker del qual esperem rebre els missatges.
- _-t_: _topic_ al qual ens vulguem subscriure.
Lògicament, com en la publicació, hi ha moltes més opcions disponibles a través de `man mosquitto_sub`.
Seguint l'exemple de les bombetes de la sala d'estar, cada bombeta tindrà la seva identificació a la sala d'estar. Imaginem que tenim 3 bombetes; per tant, cadascuna se subscriurà a _/casa/salon/bombilla/i_ on i={1,2,3}.
El codi per a la bombeta 1 serà: `mosquitto_sub -h test.mosquitto.org -t “/casa/salon/bombilla/1″`.
A la imatge es poden veure els missatges de totes les bombetes de la sala d'estar, atès el _topic_ al qual s'ha subscrit.
Ports
Per permetre el trànsit des dels nostres clients, hem de configurar el tallafoc de [Clouding.io](https://clouding.io/) per permetre el trànsit de dades a determinats ports. Com s'ha explicat a l'apartat _Què és MQTT?_, aquest protocol utilitza determinats ports per defecte. En el cas que ens ocupa, com que no utilitzem WebSockets ni una connexió xifrada, el port que hem d'obrir és el 1883, amb el protocol TCP, com mostra la imatge següent:
Avís important
En diversos dels exemples anteriors s'ha utilitzat l'adreça http://test.mosquitto.org per al broker. Aquesta adreça és la que té Eclipse Mosquitto per fer proves i qualsevol persona pot llegir el que s'hi enviï, per la qual cosa no és recomanable enviar-hi informació sensible. A més, només es pot utilitzar amb finalitats de desenvolupament, ja que un ús intensiu d'aquest servidor pot fer caure el broker.
Documentació
Tota la documentació oficial d'Eclipse Mosquitto es pot trobar a la seva pàgina web. A banda de les ordres `man` que s'han anat comentant al llarg de l'article (disponibles també en aquest web).
A més, hi ha documentació sobre el protocol MQTT a http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html.