Telecontrol MQTT del simulador IoT-02

Introducció

El simulador iot02sim.binefa.cat disposa d'un pont MQTT bidireccional que permet:

El broker és broker.binefa.cat (port 1883 MQTT pla, 8883 TLS, 9002 WebSocket).


Identificació de sessió

Cada instància QEMU té un Session ID únic, visible a la toolbar del simulador (botó ⎘ per copiar-lo). És l'element central de tots els topics MQTT.

El Session ID pot ser un UUID generat automàticament o un nom curt assignat via URL:

https://iot02sim.binefa.cat/#run:sid=grup1&bin=https://...
https://iot02sim.binefa.cat/#open:sid=alumne-joan&code=https://...

Restricció: el Session ID no pot contenir els caràcters /, + ni # (reservats per MQTT).


Esquema de topics

iot02/{sessionId}/state/gpio        → canvis dels LEDs
iot02/{sessionId}/state/oled        → imatge de la pantalla OLED (PNG base64)
iot02/{sessionId}/state/bme         → valors del BME280
iot02/{sessionId}/state/ldr         → valor del LDR
iot02/{sessionId}/state/alive       → presència de la sessió [retained]
iot02/{sessionId}/info              → MAC i estat de la sessió [retained]
iot02/{sessionId}/action/button     → prémer/alliberar un botó
iot02/{sessionId}/action/bme        → canviar valors del BME280
iot02/{sessionId}/action/ldr        → canviar valor del LDR
iot02/sessions                      → llista de sessions actives [retained]

Topics d'estat (backend → subscriptors)

LEDs — iot02/{sessionId}/state/gpio

Publicat cada vegada que un LED canvia d'estat.

{"pin": 19, "value": 1}
Pin LED
19 Blanc
23 Vermell
27 Groc
32 Verd

value 1 = encès, 0 = apagat.


OLED — iot02/{sessionId}/state/oled

Publicat cada vegada que el contingut de la pantalla canvia.

{"png": "iVBORw0KGgoAAAANSUhEUgAA..."}

Imatge PNG 128×64 px en blanc i negre, codificada en base64. Es pot mostrar directament com a <img src="data:image/png;base64,{png}"> o aplicar-la com a textura en un entorn 3D.


BME280 — iot02/{sessionId}/state/bme

{"temp": 22.5, "rh": 48, "pressure": 1013}

LDR — iot02/{sessionId}/state/ldr

{"value": 500}

Rang: 0–4095.


Informació de sessió — iot02/{sessionId}/info [retained]

Publicat en arrancar la sessió i en aturar-la. Un client que es connecta tard el rep immediatament sense esperar cap canvi.

{"sessionId": "grup1", "mac": "AA:BB:CC:DD:EE:FF", "active": true}

Presència — iot02/{sessionId}/state/alive [retained]

Publicat en arrancar ({"ts": 1234567890}) i en aturar-se (""). Permet detectar sessions caigudes.


Llista global — iot02/sessions [retained]

[
  {"sessionId": "grup1", "mac": "AA:BB:CC:DD:EE:FF"},
  {"sessionId": "grup2", "mac": "AA:BB:CC:DD:EE:01"}
]

Topics d'acció (subscriptors → backend)

Les accions es reflecteixen tant a QEMU com a la interfície web (botó visual, sliders i textos actualitzats).

Botó — iot02/{sessionId}/action/button

{"pin": 0, "value": 1}

value 1 = premut, 0 = alliberat.

Botó Pin
IO0 0
I34 34
I35 35

BME280 — iot02/{sessionId}/action/bme

Es poden enviar els tres camps o només un:

{"temp": 25.5, "rh": 60, "pressure": 1013}
{"temp": -5.0}
Camp Rang
temp −40 – 85 °C
rh 0 – 100 %
pressure 300 – 1100 hPa

LDR — iot02/{sessionId}/action/ldr

{"value": 200}
Valor Significat
0 Màxima llum
4095 Foscor total

Qualitat de servei (QoS)

Topics QoS Retained
state/gpio, state/oled, state/bme, state/ldr 0 No
state/alive, info, sessions 1
action/* 0 No

Exemples des del terminal (Debian remot)

Prerequisit:

sudo apt install mosquitto-clients

Substituir SESSION_ID pel valor visible a la toolbar del simulador.

Subscripció a tot l'estat d'una sessió

mosquitto_sub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/SESSION_ID/state/#" \
  -v

Prémer el botó IO0

mosquitto_pub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/SESSION_ID/action/button" \
  -m '{"pin":0,"value":1}'

Alliberar el botó IO0

mosquitto_pub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/SESSION_ID/action/button" \
  -m '{"pin":0,"value":0}'

Canviar el valor del LDR (simular foscor)

mosquitto_pub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/SESSION_ID/action/ldr" \
  -m '{"value":4095}'

Canviar temperatura, humitat i pressió

mosquitto_pub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/SESSION_ID/action/bme" \
  -m '{"temp":25.5,"rh":60,"pressure":1013}'

Canviar només la temperatura

mosquitto_pub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/SESSION_ID/action/bme" \
  -m '{"temp":-5.0}'

Veure les sessions actives

mosquitto_sub \
  -h broker.binefa.cat -p 1883 \
  -u ecat -P clotClot \
  -t "iot02/sessions" \
  -C 1

-C 1 rep un sol missatge (el retained) i surt.


URL schemes amb Session ID

El Session ID es pot fixar des de l'enllaç d'accés al simulador:

Scheme Comportament
#open:sid=NOM&bin=URL Carrega el binari, assigna el Session ID, espera que l'usuari premi "Inicia QEMU"
#run:sid=NOM&bin=URL Carrega el binari, assigna el Session ID i arrenca QEMU automàticament
#run:sid=NOM&code=URL Compila el codi font ZIP, assigna el Session ID i arrenca QEMU

Exemple complet:

https://iot02sim.binefa.cat/#run:sid=grup1&bin=https://github.com/.../firmware.zip

Un cop processat, el hash desapareix de la URL. El Session ID queda desat a localStorage fins que es canvia o s'assigna un de nou.