Table of Contents

Laboratorul 11. NuttX - MQTT

Despre IoT

Internet of Things (IoT, sau “Internetul Lucrurilor”) este domeniul ce studiaza dispozitivele integrate (echipate cu senzori, modul de retea, firmware si software corespunzator etc.) prin prisma conexiunilor dintre acestea si a retelelor pe care le formeaza.

Dispozitivele IoT au ca scopuri principale colectarea si transmiterea de date, dar si efectuarea unor comenzi simple pe baza informatiilor primite. In viata cotidiana, retelele IoT sunt intalnite intr-o multitudine de spatii (orice spatiu poate deveni un spatiu “inteligent”), cateva exemple fiind:

Fie ca vorbim de senzori sau controllere, dispozitivele ce formeaza o retea IoT au resurse hardware limitate. De aceea, este ideal ca modalitatea de comunicare dintre dispozitive sa tina cont de restrictiile de memorie si alimentare. O modalitate eficienta prin care putem optimiza consumul de resurse este delegarea partii de management a datelor trimise, respectiv primite, cu ajutorul unui broker, ce va gestiona datele.

Aceasta paradigma este cunoscuta sub numele de producator / consumator (sau “publisher / subscriber”), si este implementata de multiple protocoale de comunicatie. In acest laborator vom folosi protocolul MQTT pentru a facilita transmisia de date, fiind unul dintre cele mai utilizate protocoale de comunicatie in retelele IoT.

MQTT

In figura de mai sus putem observa modul de functionare al protocolului MQTT, in cadrul caruia intalnim urmatoarele:

Mesajele transmise prin acest protocol sunt organizate folosind “topic”-uri, care descriu tipul de date transmise prin retea (de exemplu “temperatura”, “umiditate” etc.). Astfel, un client de tip subscriber se poate abona doar la topic-urile de interes pentru acesta, iar un clienti de tip publisher poate publica date pe anumite topic-uri, in functie de datele pe care le poate colecta.

In cadrul laboratorului, vom folosi broker-ul MQTT public de la adresa broker.hivemq.com.

MQTT in NuttX

Din NuttX, putem publica mesaje prin MQTT folosind aplicatia mqttc_pub, din suita de aplicatii prezente in nuttx-apps. Dupa cum sugereaza si numele, aplicatia este un MQTT publisher, si are mai multe optiuni legate de publicarea mesajelor, printre care urmatoarele:

Exercitii

1. Folosind sistemul de build al NuttX, vom compila aplicatia mqttc_pub. Codul sursa a acesteia il puteti gasi in apps/examples/mqttc.

Vom folosi o versiune diferita a toolchain-ului. Adaptati comenzile din primul laborator pentru numele acestui toolchain.

wget https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20240906/xtensa-esp-elf-14.2.0_20240906-x86_64-linux-gnu.tar.xz

De asemenea, vom clona nuttx si nuttx-apps folosind urmatoarele comenzi:

git clone --branch=si-lab-11 https://github.com/andreeaThePenguin/nuttx.git nuttx --depth 1
git clone --branch=releases/12.7 https://github.com/andreeaThePenguin/nuttx-apps.git apps

2. Pentru a putea testa aplicatia, ne dorim sa cream un setup de tipul Publisher-Subscriber. Pentru aceasta, vom crea un MQTT subscriber care sa primeasca datele trimise de MQTT publisher (reprezentat de placa).

mqtt_subscriber.py
import paho.mqtt.client as mqtt
import ssl
 
broker = "broker.hivemq.com"
port = 1883
topic = "si-labs"
 
# This is the Subscriber
def on_connect(client, userdata, flags, rc, properties):
    print("Connected with result code: " + str(rc))
    print("Subscribing to topic: ", topic)
    client.subscribe(topic)
 
def on_message(client, userdata, msg):
    print("Received message: ", str(msg.payload.decode("utf-8")))
 
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
 
client.on_connect = on_connect
client.on_message = on_message
 
if port == 8883:
    client.tls_set(tls_version=ssl.PROTOCOL_TLSv1_2)
 
client.connect(broker, port, 60)
 
client.loop_forever()

Schimbati numele topic-ului atat in scriptul Python, cat si in comanda de mai sus (altfel, veti primi si mesajele de la ceilalti colegi).

3. Dorim sa trimitem date mai utile catre script-ul nostru de Python, pentru a simula un scenariu real de transmisie a datelor. Mai exact, vom prelua date de la senzorul LTR308, ce capteaza intensitatea luminoasa, apoi vom repeta setup-ul de la exercitiul 2.

Puteti verifica ca lucrati pe branch-ul corect folosind comanda git branch.

Deoarece mesajul transmis este preluat de la senzor, rulam aplicatia folosim comanda:

mqttc_pub -t si-labs

Resurse