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).
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.
IoT
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
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)
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); }
Per a tal
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);