Recull de pràctiques de 2n de DAM. Curs 2021-2022

De binefa.com
Salta a la navegació Salta a la cerca

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) Fer 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)

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:

02_indicadorLed_00


02_indicadorLed_00

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):

03_indicadorLed_01

Qt-5)

Basant-vos en 04_indicadorBotons00.zip del recull, desenvolupeu el projecte 05_indicadorBotons_01 per a que tingui aquest aspecte:

05_indicadorBotons_01

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)

Fer 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)

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

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. (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.

Codi IoT-02_11_modbus_bme280

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. (Feu servir unions).

Podeu consultar: Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED