Recull de pràctiques de 2n de DAM. Curs 2021-2022
Contingut
UDP
UDP-1
Mireu-vos l'ajuda al QtCreator per a saber com funciona la classe QUdpSocket. Podeu anar a la casella inferior i escriure-hi "'? QUdpSocket".
1) Feu un programa amb les Qt a on apareguin dos botons. El botó superior ha de tenir el text W i el nom de l'objecte del botó btEncenBlanc. El botó inferior ha de tenir el text w i el nom de l'objecte del botó btApagaBlanc.
El mètode que tramet el sòcol té aquest prototipus:
void GinyUdp::vTrametSocolUdp(QByteArray qbaCos,QHostAddress qhaAdd,int nPort)
Quan premeu qualsevol dels dos botons s'ha de trametre el text (W o w) al localhost (QHostAddress::LocalHost) al port 7755.
2) Executeu localment el vostre NodeRED i feu que un node UDP pseudoservidor rebi datagrames pel port 7755. (Feu una captura de pantalla, incloent-hi el NodeRED i el vostre programa en Qt, demostrant llur funcionament)
3) Modifiqueu el microprogramari (firmware) per rebre els sòcols tramesos pel programa en Qt. Indiqueu que heu canviat al microprogramri per a que funcioni. També heu de canviar l'adreça de destí del datagrama (la IP de la placa IoT-02).
UDP-2
L'exercici Qt anterior és la base per a fer aquest.
1) Afegiu ginys de tipus QLineEdit per a recollir el valor de la IP i el port de destí. Feu servir els ginys amics (buddies) per a relacionar etiquetes (QLabel) i línies d'edició (QLineEdit). Canvieu l'ordre de la tabulació per defecte.
2) Feu que al prémer un botó es trameti el contingut W o w del datagrama a la IP i port correctes.
TCP
MQTTS-01
- Microprogramari amb MQTTS a la placa IoT-02
- Connexió mitjançant sòcols web (9001) a un Snap! sense SSL. I vam provar mqttSnap.xml.
- Connexió mitjançant NodeRED. Enceneu i apagueu un led. Grafiqueu el nivell de llum mitjançant el sensor LDR. Deseu el flux de nodes en format JSON.
- Aplicació d'Android MQTT Dash (MQTTool a IOS)
MQTT-02
- Microprogramari amb MQTT a la placa IoT-02
- Connexió mitjançant sòcols web (9001) a un Snap! sense SSL. Modifiqueu mqttSnap.xml anomenant-lo mqttNoSegurSnap.xml .
- Connexió mitjançant NodeRED. Afegiu un nou broker MQTT per a comunicar-vos amb la placa. Enceneu i apagueu un led. Grafiqueu el nivell de llum mitjançant el sensor LDR. Deseu el flux de nodes en format JSON.
- Aplicació d'Android MQTT Dash. Teniu cura de no seleccionar que hi ha certificats SSL. (MQTTool a IOS)
QML
1) Feu un programa en QML que al principi hi surti un quadrat vermell centrat. Al prémer la tecla B hi sortirà de color blau, al prémer la tecla G hi sortirà de color verd i al prémer la tecla R torna a ser vermell.
2) Feu un programa en QML a on hi aparegui centrat, horitzontalment i vertical, ben gros i en negreta el nom Escola del Clot. Al prémer la tecla + la lletra es farà més grossa. I al prémer la tecla - la lletra es farà més petita.
3) Feu un programa que hi surti el text, centrat a la finestra, "Comptador: 0" de color vermell. Al prémer el botó + incrementarà el valor del comptador, i al prémer el botó '-' es decrementarà. Al prémer la tecla N el text serà de color negre i al prémer V tornarà a ser de color vermell.
4) Feu pel vostre compte els codis comentats als 10 vídeos de Connexió entre el frontal QML (frontend) i el rerefons en C++ (backend) presents a Vídeos QML
5) Feu un programa en QML que contingui una casella de selecció (checkbox) i dues etiquetes. L'objectiu és encendre i apagar el led blanc des de l'aplicació QML, una etiqueta dirà l'estat de connexió al broker (vermell: desconnectat, carabassa: connectant i verd: connectat) i l'altra etiqueta mostrarà si el botó i35 és premut o no. El rerefons fet amb C++ ha de fer la comunicació amb el broker MQTTS. Feu l'execució des de l'escriptori i des d'Android (mòbil real o virtual).
6) Resoldre l'examen del 25 de febrer de 2021
7) Feu una aplicació QML que rebi els valors de l'LDR, temperatura, humitat relativa i pressió atmosfèrica tramesa per la placa IoT-02 mitjançant LoRa. (Feu servir el broker pel port 1883 de The Things Network)
8) Feu una aplicació QML per a que la placa IoT-02 sigui controlada mitjançant un missatge LoRaWAN de downlink. Heu de controlar la il·luminació dels quatre leds i l'estat del relé. Se suggereix haver fet prèviament la pràctica LoRa-4)
Podeu consultar: Downlink LoRaWAN fent servir TTSv3
Qt
Qt-1)
Desenvolupeu una aplicació de Qt que interactuï amb la placa.
Ha de tenir:
Selecció de connectivitat mitjançant MQTT o MQTTS, amb botó de connexió / desconnexió. En funció de l'estat de connexió, amb una etiqueta hi sortirà en vermell desconnectat, en blau connectant i en verd connectat.
Mitjançant radio buttons es pot seleccionar les tres mides de text de la pantalla. A un line edit s'escriu el missatge i un botó de tramesa (activat si hi ha connexió).
Quatre caselles de selecció (check button) per a controlar la il·luminació dels quatre leds.
Tres etiquetes que mostren si els botons estan premuts o no.
Botó de petició del valor de l'LDR. Una casella de selecció, amb un line edit per a introduir el nombre de segons que permeti la repetició de la petició de valor.
Botó de petició del valor de la temperatura, humitat relativa i pressió atmosfèrica. Una casella de selecció, amb un line edit per a introduir el nombre de segons que permeti la repetició de la petició de valor.
Qt-2)
2a) Integreu les Qt amb l'SDK i l'NDK de l'Android Studio que teniu instal·lat. Feu una prova de funcionament amb el vostre mòbil, real o emulat. JDK 1.8
2b) Compileu la biblioteca qtmqtt per a que funcioni amb Android.
2c) Feu que el primer exercici, Qt-1, s'executi maximitzant el giny principal.
Qt-3)
Prenent com a base els arxius 00_botonsToggle05.zip i 00_botonsToggle06.zip del recull, desenvolupeu el projecte 02_indicadorLed_00 per a que tingui aquest comportament:
Qt-4)
Basant-vos en 02_indicadorLed_00 i 01_json_00.zip del recull, desenvolupeu el projecte 03_indicadorLed_01 per a que tingui aquest aspecte (els valors dels led R, G i B donen valors 0 i 1. Els valors del led W són true i false):
Qt-5)
Basant-vos en 04_indicadorBotons00.zip del recull, desenvolupeu el projecte 05_indicadorBotons_01 per a que tingui aquest aspecte:
Qt-6)
Basant-vos en 03_indicadorLed_01, desenvolupeu 03_indicadorLed_01_mqtt que controli els quatre leds de la placa IoT-02.
Qt-7)
Basant-vos en 05_indicadorBotons_01, desenvolupeu 05_indicadorBotons_01_mqtt que llegeixi els tres botons de la placa IoT-02.
Qt-8)
Feu una aplicació Qt que rebi els valors de l'LDR, temperatura, humitat relativa i pressió atmosfèrica tramesa per la placa IoT-02 mitjançant LoRa. (Feu servir el broker pel port 1883 de The Things Network)
Qt-9)
Feu una aplicació Qt per a que la placa IoT-02 sigui controlada mitjançant un missatge LoRaWAN de downlink. Heu de controlar la il·luminació dels quatre leds i l'estat del relé. Se suggereix haver fet prèviament la pràctica LoRa-4)
Podeu consultar: Downlink LoRaWAN fent servir TTSv3
IoT
Per a fer les pràctiques a classe emprant WiFi podeu fer servir l'SSID: JE_DAW_DAM_2 i la contrasenya clotClot
Wokwi
1) Aneu a aquest projecte de wokwi i canvieu el codi sketch.ino pel que hi ha al recull de codis d'arxius que emulen un ESP32 a wotwi. Canvieu el text de ClientID per a que sigui únic.
Obriu minimMqttSnap.xml, que hi ha al recull de codi Snap, a un Snap! sense SSL (recordeu activar les extensions per a JavaScript)
Per als reculls de codis d'aquest exercici us caldran aquestes credencials:
usuari: dam contrasenya: dam2122
Feu les captures necessàries per a demostrar el funcionament de la pràctica (encendre i apagar el led a l'emulador de wokwi).
UserLAnd
1) Instal·leu-vos l'aplicació UserLAnd al vostre telèfon mòbil (present a Google Play i aviat a App Store). Si no teniu mòbil disponible, feu servir un emulador d'Android.
Connecteu el vostre mòbil, real o emulat, a la xarxa sense fils per a IoT i poseu en marxa l'aplicació. Un cop a dins, instal·leu-vos un Debian (80MB). Us demanarà un nom d'usuari i contrasenya. Feu una instal·lació que permeti veure al navegador del vostre ordinador un NodeRED executant-se des del mòbil.
Per a fer-ho, des de l'aplicació de mòbil UserLAnd:
sudo apt update sudo apt upgrade sudo apt install aptitude openssh-server net-tools curl software-properties-common wget unzip screen
A partir d'ara us podeu connectar remotament per SSH fent servir el port 2022 ( ssh usuari@ipMobil -p 2022 o ssh -o ServerAliveInterval=30 usuari@ipMobil -p 2022 per a que hi hagi persistència en la comunicació)
mkdir bin cd bin curl -sL https://deb.nodesource.com/setup_14.x | sudo bash - sudo apt-get install -y nodejs node -v npm -v mkdir nodered-ui cd nodered-ui wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip unzip node_red_ui.zip screen node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json
Premeu Ctrl A + D. I per a tornar a screen funcionant des del rerefons:
screen -r
Servint pàgina web per a canviar contrasenya
Aquesta pràctica consisteix en canviar, mitjançant pàgina web, l'SSID i contrasenya de connexió a una xarxa sense fils de la vostra placa IoT-02. Baixeu-vos els codis del GitHub del wifi-manager per a poder desenvolupar la pràctica.
IoT-02_webCred-01)
Afegiu a sota dels include de WiFiManager-example.ino:
#define LED_BLANC 19 #define RST_WIFI_CRED 35
IoT-02_webCred-02)
També a WiFiManager-example.ino, canvieu 2 per LED_BLANC i 15 per RST_WIFI_CRED. Això farà que al bucle principal s'encengui i s'apagui el led blanc i que quan es premi el botó I35 s'esborrin les credencials.
void setup() { pinMode(2, OUTPUT); pinMode(15,INPUT); //for resetting WiFi creds ... void loop() { if(digitalRead(15) == HIGH){ Serial.println("Wiping WiFi credentials from memory..."); wipeEEPROM(); while(loadWIFICredsForm()); } digitalWrite(2,HIGH); delay(1000); digitalWrite(2,LOW); delay(1000); }
El codi haurà de quedar:
void setup() { pinMode(LED_BLANC, OUTPUT); pinMode(15,INPUT); //for resetting WiFi creds ... void loop() { if(digitalRead(RST_WIFI_CRED) == HIGH){ Serial.println("Wiping WiFi credentials from memory..."); wipeEEPROM(); while(loadWIFICredsForm()); } digitalWrite(LED_BLANC,HIGH); delay(1000); digitalWrite(LED_BLANC,LOW); delay(1000); }
IoT-02_webCred-03)
A l'arxiu WiFiManager.h, personalitzeu el vostre punt d'accés canviant l'SSID (per defecte ESP32 WiFi Manager) per un de vostre. També personalitzeu la contrasenya d'accés al punt d'accés (per defecte 12345678).
bool loadWIFICredsForm(){ String s = EEPROM.readString(100); String p = EEPROM.readString(200); const char* ssid = "ESP32 WiFi Manager"; const char* password = "12345678";
Serial.println("Setting Access Point..."); WiFi.softAP(ssid, password); IPAddress IP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(IP); server.on("/", handleRoot);
IoT-02_webCred-04)
Connecteu-vos al punt d'accés generat per la vostra placa IoT-02 (per exemple, amb el mòbil). Un cop connectats, el telèfon us pot avisar que no teniu connexió a Internet i us pot suggerir canviar de xarxa (digueu-li explícitament que no). Des del dispositiu connectat al punt d'accés entreu al navegador i escriviu com a URL: 192.168.4.1
Un cop us aparegui el formulari web demanant SSID i contrasenya, feu una captura de pantalla. Quan deseu les credencials, la placa IoT-02 tornarà a reiniciar-se en tres segons. Verifiqueu que s'aconsegueix la connexió a la xarxa sense fils de la vostra placa IoT-02.
LoRaWAN
LoRa-1)
Amb la placa IoT-02 feu una tramesa d'un missatge Hola món fins al vostre NodeRed fent servir el mètode OTAA (On The Air Activation) de LoRa i el rerefons de The Things Stack. Teniu material d'ajuda a la carpeta intro del recull LoRa ( usuari: dam / contrasenya: dam2122)
LoRa-2)
Amb la placa IoT-02 feu una tramesa del valor de la LDR amb dos bytes, fent servir el mètode OTAA. (Feu servir unions). Dimensioneu correctament el vector mydata.
LMIC_setTxData2(1, mydata, sizeof(mydata) - 1, 0); // Si no és una cadena de caràcters, hem d'informar del nombre exacte de bytes a trametre.
Al recull del 31 de gener de 2022 teniu un exemple de conversió bidireccional de float a cadena unsigned char fent servir union.
LoRa-3)
Amb la placa IoT-02 feu una tramesa del valor de la LDR, temperatura, humitat relativa i pressió atmosfèrica, fent servir el mètode OTAA. (Feu servir unions).
Podeu consultar: Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED
LoRa-4)
Feu que la placa IoT-02 sigui controlada mitjançant un downlink. Heu de controlar la il·luminació dels quatre leds i l'estat del relé, fent servir el mètode OTAA. Feu que el NodeRED s'encarregui de la tramesa del missatge de downlink.
Podeu consultar: Downlink LoRaWAN fent servir TTSv3
LoRa-5)
Amb la placa IoT-02 feu una tramesa del valor de la LDR, temperatura, humitat relativa i pressió atmosfèrica, fent servir el mètode ABP. (Feu servir unions).
Podeu consultar: Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED
LoRa ABP
Per a fer les pràctiques amb LoRa ABP haurem de desactivar el comptador de trames (cada cop que es reprograma la placa IoT-02 el comptador torna a zero. TTSv3 verifica que el comptatge de trames sigui correcta. Si no es desactiva el comptador de trames semblarà que no es rep la trama). Fera fer-ho, aneu al dispositiu, seleccioneu la pestanya General Settings, premeu el botó EXPAND a la secció Network layer, desplegueu l'enllaç Advanced MAC settings i seleccioneu Enabled a Resets frame counters. Al final deseu els canvis prement el botó Save changes.
Exemple de microprogramari emprant ABP
NodeRED
NodeRED-1)
Afegiu usuari i contrasenya al vostre NodeRED
NodeRED-2)
Implementeu en NodeRED una API que tradueixi els paràmetres passats per un navegador a un missatge MQTT.
Exemple de crida a URL:
http://localhost:2222/mqtt?topic=programador&&payload=2aProva
Codi de NodeRED en JSON per a fer la prova: http_a_mqtt.json
Bots
Telegram
BotTel-1)
Desenvolupeu un exemple d'ús d'un bot de Telegram.
BotTel-2)
Desenvolupeu un bot de Telegram que interactui amb la vostra placa IoT-02. Les ordres, des del mateix bot, són:
/W : Encén el led blanc
/w : Apaga el led blanc
/botons : Estat dels botons a la placa
BotTel-3)
Desenvolupeu un bot de Telegram que interactui amb la vostra placa IoT-02. Les ordres, des d'un grup al qual pertany i és administrador, són:
/W : Encén el led blanc
/w : Apaga el led blanc
/botons : Estat dels botons a la placa
I de manera asíncrona avisa quan s'ha premut el botó I35, trametent un missatge al grup al qual pertany.
Mastodon
BotMast-1)
Desenvolupeu un exemple d'ús d'un bot de Mastodon.
BotMast-2)
Publiqueu la temperatura, humitat relativa i pressió atmosfèrica llegides per la vostra placa IoT-02 i les publiqueu a Mastodon mitjançant NodeRED.
Feu un informe de com ho heu programat i captures de llur funcionament.
InfluxDB i Grafana
InfluxGraf-1) Exercici d'introducció a les bases de dades temporals. Ús de l'InfluxDB 2.0
Flux NodeRED d'escriptura d'una dada aleatòria a InfluxDB a l'organització Clot al bucket aleatori/v1
Codi Flux per a la graficació a Grafana:
from(bucket: "aleatori/v1") |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
Expliqueu com es poden emmagatzemar dades a InfluxDB 2.0 emprant NodeRED i com es poden visualitzar emprant el mateix servei web d'InfluxDB 2.0
InfluxGraf-2) Visualització a Grafana de les dades emmagatzemades a una base de dades temporal
- Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum. Feu servir missatgeria MQTT amb un broker públic. Gestioneu les dades amb NodeRED emmagatzemant-les a una base de dades temporal InfluxDB v2.0. Visualitzeu les dades a un panell de gràfiques emprant Grafana.
- Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum. Feu servir missatgeria MQTT amb un broker local (a la vostra màquina base o màquina virtual). Gestioneu les dades amb NodeRED emmagatzemant-les a una base de dades temporal InfluxDB v2.0. Visualitzeu les dades a un panell de gràfiques emprant Grafana.
Python i MQTT amb Paho
Paho-1)
Feu un programa de terminal en Python que controli la placa IoT-02 encenent i apagant de forma periòdica el led blanc. Ha de prendre com a argument el nombre de segons entre pampalluguejos.
Paho-2)
Feu un programa de terminal en Python que controli la placa IoT-02 encenent i apagant de forma periòdica el led blanc. Ha de prendre com a argument el nombre de segons entre pampalluguejos.
Ha de sortir per pantalla cada cop que canvia d'estat el botó i34.