DAM 2020-2021

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

Contingut

Horari a partir del 18 de gener[modifica]

2n de DAM

Teleconferència del curs 2020-2021[modifica]

Adreça de la teleconferència

Llista 2n de DAM 2020-2021

Carpetes compartides 2n de DAM. Curs 2020-2021

Alguns vídeos d'ajuda[modifica]

QML[modifica]

Introduction to Qt / QML - all videos so far by KDAB (Codis QML de la sèrie de vídeos)

Vídeos QML de connexió entre el rerefons en C++ i el frontal en QML.

Photoshop to QML exporter

Pseudoservidor UDP[modifica]

Pseudoservidor UDP emprant Qt5 (1/2)

Pseudoservidor UDP emprant Qt5 (2/2)

Algunes classes[modifica]

20210609 (3h presencial) Avaluació extraordinària[modifica]

Enunciats de l'avaluació extraordinària

20210528 (2h en línia) Presentació de projectes de 2n de DAM[modifica]

Sala Meet de la presentació de projectes

20210527 (3h en línia) Presentació de projectes de 2n de DAM[modifica]

Sala Meet de la presentació de projectes

20210520 (1h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210517 (1h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210514 (2h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210513 (3h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210510 (1h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210507 (2h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210506 (3h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210503 (1h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210430 (2h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210429 (3h presencial)[modifica]

Seguim amb el Projecte de final de CFGS DAM (2020-2021)

20210426 Comença el projecte (1h presencial)[modifica]

Comentem les notes provisionals i comença el temps de projecte.

20210423 Darrer dia (2h síncrona)[modifica]

Feu alguns exercicis que no vau fer ahir de l'examen d'ordinària del curs 2020-2021 amb l'objectiu de pujar nota. He afegit l'arxiu de NodeRED de control de l'ascensor i he corregit alguna errata que vau detectar ahir.

20210422 Examen (3h presencial)[modifica]

Examen d'ordinària del curs 2020-2021

Snap! per HTTP per a fer servir sòcols web no segurs.

He afegit flux de NodeRED per a l'ascensor. Recordeu-vos de canviar la MAC a tot arreu i d'afegir-hi usuari i contrasenya al broker.

Errata:

M09UF3.6) Feu un control del led blanc mitjançant el NodeRED emprant el protocol UDP

20210419 (1h presencial)[modifica]

Per a canviar l'Spread Factor (línia 497 d'aquest codi d'exemple):

 // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
 LMIC_setDrTxpow(DR_SF7, 14);


20210416 (2h presencial)[modifica]

Anem acabant els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021) i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3

Alguns codis comentats avui

Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux.

20210415 (3h presencial)[modifica]

Exemple de funció amb 4 sortides (Cal que canvieu a la funció la única sortida per defecte a quatre)

var amunt = {payload: "amunt"};
var mig = {payload: "mig"};
var avall = {payload: "avall"};

return [amunt,mig,avall,msg];

Alguns codis comentats avui

Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux.

Anem acabant els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021) i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3

20210412 (1h presencial)[modifica]

Anem acabant els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021) i comentem algunes propostes de projectes relacionats amb M03UF1, M15UF1, M09UF2 i M09UF3

20210409 (2h síncrona)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

20210408 (3h presencial)[modifica]

Programació remota (OTA) (JESUITESFP / IOTcl1220_)

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis comentats avui

20210326 (2h presencial)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis comentats avui

Flux de NodeRED que agafa una cadena de text de 4 bytes i ho converteix a un número real (float)

20210325 (3h presencial)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis comentats avui per a passar vectors de bytes (unsigned char) a nombres enters o reals fent servir les funcions de Javascript per a NodeRED.

20210322 (1h presencial)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Comentem l'exercici 3.7

20210319 (2h síncrona)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Alguns codis explicats avui

FreeRTOS[modifica]

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

Explicació d'un codi bàsic en FreeRTOS

Manual de referència per al FreeRTOS

20210318 (3h presencial)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

sudo cat /etc/mosquitto/mosquitto.conf:

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

allow_anonymous false
password_file /etc/mosquitto/certs/contrasenyes.txt

listener 1883

listener 9001
protocol websockets

cat /etc/mosquitto/certs/contrasenyes.txt (usuaris ecat i ad):

ecat:$6$SdtdpCPcQ4wonN7Y$Dgix123455BRyzvUQxMKX2lmr/4r/K3b9/su9KzMdMZhLxS3cm6a+nCrRahz+r9DFOh0ecsoZVwlG+G9tnA==
ad:$6$Nu8O3BxNBORplkSW$LZAqGNiPnX1HnC0ZbI789787867677565eJZAQnWWrWDaFjJz5OIZ8ljJRBbL6GFCKlgoaUFllFGvBhMtnfJQ==

20210315 (1h presencial)[modifica]

Conceptes de LoRa 2020-2021

20210312 (2h presencial)[modifica]

Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)

Codi de desxifratge d'un missatge ascendent de The Things Network

Codi basat en la pàgina 42 d'aquest pdf:

var b = new Buffer(msg.payload.payload_raw,'base64')
msg.payload = b.toString()
return msg;

20210311 (3h presencial)[modifica]

Avui assistiré les dues primeres hores. La tercera he de ser a una sessió d'avaluació, aneu fent els Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021).

La pràctica de LoRaWAN requereix que hi sigueu a un lloc amb cobertura. Per tant, feu tot el possible per a ser-hi presencialment.

LoRaWAN[modifica]

Doneu-vos d'alta com a usuaris de The Things Network

LoRa 2020-2021

20210308 (1h presencial)[modifica]

Repassem el funcionament de la vostra placa IoT-02 al vostre broker MQTT, el vostre NodeRED, el vostre InfluxDB i el vostre Grafana.

FreeRTOS[modifica]

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

Explicació d'un codi bàsic en FreeRTOS

Manual de referència per al FreeRTOS

20210305 (2h síncrona)[modifica]

Continuem amb el temes d'ahir.

HTTP a MQTT[modifica]

Flux de NodeRED per a convertir crides HTTP a MQTT

Exercici d'HTTP a MQTT[modifica]

Mitjançant curl o navegador web encén i/o apaga qualsevol led de la placa IoT-02 connectada a un broker MQTT.

20210304 (3h presencial)[modifica]

Alguns codis comentats avui

Bases de dades temporals i visualització[modifica]

Seguim amb la instal·lació d'InfluxDB i Grafana.

Exercici de bases de dades temporals i visualització[modifica]

  • Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum.

HTTP a MQTT[modifica]

Flux de NodeRED per a convertir crides HTTP a MQTT

FreeRTOS[modifica]

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

20210301 (1h presencial)[modifica]

Seguim amb la instal·lació d'InfluxDB i Grafana.

Notes provisionals d'avaluació ordinària del M07UF1

20210226 (IoT: InfluxDB i Grafana, 2h presencial)[modifica]

Part pròpia del M15UF1 (Internet de les Coses) i M09UF2 (Processos i fils).

InfluxDB v2.0[modifica]

Instal·lació d'InfluxDB 2.0 i lloc de descàrregues

curl -s https://repos.influxdata.com/influxdb2.key | gpg --import -
wget -qO- https://repos.influxdata.com/influxdb2.key | sudo apt-key add -
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-linux-amd64.tar.gz.asc
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-amd64.deb
sudo dpkg -i influxdb2-2.0.4-amd64.deb

Un cop instal·lat ha de sortir:

...
Setting up influxdb2 (2.0.4) ...
Created symlink /etc/systemd/system/influxd.service → /lib/systemd/system/influxdb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/influxdb.service → /lib/systemd/system/influxdb.service.


  • Configuració a la nova màquina virtual:
InfluxDB : ecat / clotfje1234
Organization Name: Clot
Bucket Name: api/v2/query
  • Escriptura i lectura de dades des del NodeRed a Influx DB v2.0

Escriptura de dades múltiple des del NodeRed

Lectura de dades múltiple des del NodeRed

Grafana[modifica]

Descàrrega de Grafana

  • Posada en marxa

Recàrrega dels serveis dimoni:

sudo systemctl daemon-reload

Feu que arrenqui el servei quan poseu en marxa la màquina virtual:

sudo systemctl enable grafana-server

Poseu el servei en marxa:

sudo systemctl start grafana-server

Verifiqueu l'estat del servei:

systemctl status grafana-server
  • Primer accés
admin / admin

Us demanarà un canvi de la contrasenya d'administració. A la nova màquina virtual és:

admin / clotfje1234
  • Configuració de Grafana per rebre dades d'InfluxDB mitjançant Flux

Configure Grafana to use Flux

  • Ús de les dades d'InfluxDB a Grafana

Using InfluxDB in Grafana

from(bucket: "api/v2/query")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)


Exercici de prova[modifica]

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)

Serveis (Processos)[modifica]

  • Per saber si el servei està en marxa:
systemctl status influxd
  • Per a engegar un servei
sudo systemctl start influxd
  • Per a aturar un servei
sudo systemctl stop influxd
  • Per a fer que el servei s'engegui a l'iniciar el sistema:
sudo systemctl enable influxd
  • Per a fer que el servei deixi d'engeggar-se a l'iniciar el sistema:
sudo systemctl disable influxd
  • Llista els serveis que arrenquen (enable) a l'iniciar el sistema:
systemctl list-unit-files --type=service | grep influx
  • Per a veure els ports TCP / UDP dels serveis:
sudo netstat -aputn

Sense sudo no es veu el nom del procés.

Més teoria[modifica]

Grafana & Flux. New Flux support in Grafana by Jacob Lisi @JacobLisi

20210225 (Examen final del M07UF1. Part de QML amb IoT, 3h presencial)[modifica]

Accés a l'examen en format pdf, odt i el material comprimit necessari per a desenvolupar-lo

20210222 (QML / IoT, 2h síncrona)[modifica]

Darrer dia abans de l'examen de final de la UF1 del M07.

Resolució de dubtes.

20210219 (QML / IoT, 2h síncrona)[modifica]

Alguns codis comentats avui fent servir comportaments elàstics (easing).

Comentem la importància del centratge de les imatges. Al codi comentat avui es fan servir dissenys vectorials lliures i oberts aconseguits a https://freesvg.org

Seguim amb els Exercicis de QML

20210218 (QML / IoT, 3h presencial)[modifica]

Alguns codis comentats avui fent servir comportaments elàstics (easing).

Seguim amb els Exercicis de QML

20210212 (QML, 2h presencial)[modifica]

Alguns codis comentats avui

QmlExporter

20210211 (QML, 3h síncrona)[modifica]

Alguns codis comentats avui

Recordeu-vos de canviar l'SSID i contrasenya de la connexió sense fils, per adaptar-la a casa vostra.

Recordeu-vos de personalitzar #define MAC_PLACA "xxxxxxxxxxx"

20210208 (QML, 1h presencial)[modifica]

Microprogramari IoT-02_mqtts_10_dam.zip per a la placa IoT-02 per a provar els exercicis 7 i 8 dels Exercicis de QML.

Guia per a desenvolupar l'ex07 dels exercicis de QML fent servir senyals. Us pot ajudar per a la vostra implementació fent servir propietats.

20210205 (QML, 2h síncrona)[modifica]

Alguns codis comentats avui

Actualització de la màquina virtual[modifica]

ecat@iot-ecat:~$ sudo bash
root@iot-ecat:/home/ecat# curl -sL https://deb.nodesource.com/setup_14.x | bash -
root@iot-ecat:/home/ecat# apt install -y nodejs
root@iot-ecat:/home/ecat# exit
ecat@iot-ecat:~$ node --version
v14.15.4
ecat@iot-ecat:~$ npm -- version
6.14.10
  • Instal·lació i funcionament del NodeRed autònom:
ecat@iot-ecat:~$ mkdir bin
ecat@iot-ecat:~$ cd bin
ecat@iot-ecat:~/bin$ sudo apt install unzip
ecat@iot-ecat:~/bin$ mkdir nodered-ui
ecat@iot-ecat:~/bin$ cd nodered-ui
ecat@iot-ecat:~/bin/nodered-ui$ wget https://binefa.cat/dam2021/20200928/node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ unzip node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ 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

20210204 (QML, 3h presencial)[modifica]

Al disc dur que us passaré hi ha dues màquines virtuals (andro_8.1-r4-VM-32bit.7z de 543,8 MB i IoT - eCat - Debian 11.x 64-bit _v20210202_00.zip de 19,0 GB) al directori maquinesVirtuals/Android_i_Qt

Màquina virtual amb emulador per a Android[modifica]

El darrer dia va haver dos talls de llum. Van assistir a classe 6 alumnes. Els hi vaig passar una màquina virtual amb un emulador d'Android (Android-x86 8.1-R4 Oreo). Els que no vau assistir el darrer dia, porteu instal·lada la màquina virtual de l'emulador d'Android.

És important que aquesta màquina virtual estigui configurada amb:

  • Connexió pont (bridge i no NAT)
  • Memòria mínima de 2GB

Màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android[modifica]

Adreça de descàrrega de la màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android

Avui us passaré, comprimida a 19GB, una màquina virtual basada en Debian 11 (a hores d'ara, Debian 11 és en fase de testing) amb els següents programes ja instal·lats i preparats per a funcionar:

  • Android Studio
  • QtCreator amb la darrera Qt5 LTS i les Qt6
  • Biblioteca qtMqtt preparada per a funcionar a l'escriptori i a Android amb les Qt6

Configuració de la màquina virtual:

  • L'usuari per defecte és ecat (eCat)
  • La contrasenya de l'usuari ecat és clotfje (ecat és membre del grup d'usuaris sudo i dialout). Almenys a l'hora de passar-vos la màquina virtual. És aconsellable que canvieu la vostra contrasenya d'accés.
  • És aconsellable tenir la connexió de xarxa en connexió pont (bridge). Però no cal per a connectar-ho amb l'emulador d'Android amb màquina virtual. Sí que caldria per a tenir accés extern al broker MQTT i al NodeRED (no instal·lats en aquesta primera versió).
  • Memòria mínima de 4GB

Connectant les dues màquines virtuals[modifica]

  • Trobeu quina IP té la màquina virtual amb l'emulador d'Android (a l'explicació faré servir com a IP de l'emulador 172.20.xy.xyz).
  • Obriu un terminal a la màquina virtual amb Debian 11:
ecat@iot-ecat:~$ cd Android/Sdk/platform-tools/
ecat@iot-ecat:~/Android/Sdk/platform-tools$ ./adb connect 172.20.xy.xyz:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 172.20.25.152:5555
ecat@iot-ecat:~/Android/Sdk/platform-tools$ ./adb shell
x86:/ $
  • Obriu el Qt Creator (premeu la supertecla -aquella amb el símbol d'una finestra propietària- i escriviu-hi Qt). Feu un exemple simple de QML (per exemple el del swipe). Seleccioneu les Qt6 per a escriptori i Android x86 (amb l'opció Release i sense Debug ni Profile). Aneu a Tools / Options / Devices i verifiqueu que no hi dóna cap error de configuració (és possible que al principi surtin marques vermelles, però al cap de pocs segons se'n van). Assegureu-vos que compilareu per Android i feu Play al projecte de les Qt. Seleccioneu el dispositiu compatible VMware Virtual Platform. I premeu al botó OK.
  • Al cap de pocs segons hi apareix el programa bàsic swipe a l'emulador sobre màquina virtual. El podeu aturar prement el botó quadrat vermell d'Application Output.

MQTT i MQTTS[modifica]

MQTT_i_MQTTS

20210201 (QML, 1h presencial)[modifica]

Emulador d'Android a una màquina virtual

Aneu amb cura, malgrat és obsolet quelcom es pot fer servir en part: Using VMWare to replace the slow Android Emulator

  • Poseu en marxa la màquina virtual (connexió pont -bridge i no NAT-) i cerqueu la IP del dispositiu Android virtualitzat. Connecteu-vos-hi:
jordi@ecat-XPS13:~$ cd Android/Sdk/platform-tools/
jordi@ecat-XPS13:~/Android/Sdk/platform-tools$ ./adb connect 172.20.xy.xyz:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 172.20.xy.xyz:5555
jordi@ecat-XPS13:~/Android/Sdk/platform-tools$ ./adb shell
x86:/ $
  • Aneu al QtCreator, compileu i executeu una aplicació per a Android. Us sortirà a la llista de dispositius compatibles la màquina virtual emulant Android.

20210129 (QML, 2h presencial)[modifica]

Comencem per l'exercici ex06_07 dels Exercicis de QML (Vídeo 7/10 a Vídeos QML)

20210128 (QML, 3h síncrona)[modifica]

Avui, abans de començar la classe, s'han d'haver tramès per correu electrònic els exercicis ex01, ex02, ex03, ex04 i ex05 dels Exercicis de QML, seguint les indicacions a la capçalera de la pàgina.

Acabem l'exercici 6 de la col·lecció dels Exercicis de QML

Millores de codi[modifica]

Aquest codi:

   Connections {
       target: appCore // Specify the target to connect
       onSendToQml: {
           p1.etiqueta.text = count // Set the counter to the text label
           // count <-- Mateix nom que al senyal void sendToQml(int count);
       }
   }

Provoca aquest avís (warning):

qrc:/main.qml:13:5: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }

I aquesta és la solució que s'aconsella actualment:

   Connections {
       target: appCore // Specify the target to connect
       function onSendToQml(count){
           p1.etiqueta.text = count // Set the counter to the text label
           // count <-- Mateix nom que al senyal void sendToQml(int count);
       }
   }

ProgressBar a QML per a Qt6[modifica]

La propietat de valor màxim ha desaparegut a les Qt6

   ProgressBar {
       id: progressBar
       y: 189
       value: 50
       //maximumValue: 100
       anchors.right: parent.right
       anchors.rightMargin: 20
       anchors.left: parent.left
       anchors.leftMargin: 20
   }

A Qt 6 el valor màxim està a 1.0, per tant:

   ProgressBar {
       id: progressBar
       y: 189
       value: 0.5
       anchors.right: parent.right
       anchors.rightMargin: 20
       anchors.left: parent.left
       anchors.leftMargin: 20
   }

i al main.qml de 01_qmlLliscant_10:

       function actualitzaBarraDeProgres(n){
           l01.progressBar.value = n/100; // Originàriament hi havia n
           l01.text1.text = n; // canvieu element1 per text1 a l'editor QML
       }

Codi actualitzat per a Qt6: 01_qmlLliscant_10_qt6

A l'arxiu main.cpp també he afegit un #if / #endif per a verificar si el codi és previ a les Qt6.0.0:

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

20210125 (QML, 1h presencial)[modifica]

Connexió entre el frontal QML i el rerefons en C++[modifica]

Exemple de connexió entre el frontal QML i el rerefons en C++ (El codi de connexió és basat en QML - Tutorial 036. Working with Signals and Slots in QML).

Aquí teniu alguns Vídeos QML que guien pas a pas la connexió entre el frontal i el rerefons.

Comenceu l'exercici 6 de la col·lecció Exercicis de QML

20210122 (QML, 2h síncrona)[modifica]

   MqttClient {
       id: client
       hostname: hostnameField.text
       port: portField.text
       username: userField.text
       password: pwdField.text
   }

Modifiqueu el broker per un que faci servir usuari i contrasenya:

       TextField {
           id: hostnameField
           Layout.fillWidth: true
           text: "rubi.xoic.coop"
           placeholderText: "<Enter host running MQTT broker>"
           enabled: client.state === MqttClient.Disconnected
       }

Afegiu l'etiqueta d'usuari:

       Label {
           text: "Usuari:"
           enabled: client.state === MqttClient.Disconnected
       }

Al camp de text d'usuari, poseu el nom d'usuari per defecte:

       TextField {
           id: userField
           Layout.fillWidth: true
           text: "rubi"
           placeholderText: "<Usuari>"
           enabled: client.state === MqttClient.Disconnected
       }

Afegiu l'etiqueta de contrasenya:

       Label {
           text: "Contrasenya:"
           enabled: client.state === MqttClient.Disconnected
       }

Al camp de text de la contrasenya, poseu la contrasenya per defecte:

       TextField {
           id: pwdField
           echoMode: TextInput.Password
           Layout.fillWidth: true
           text: "iotRubi"
           placeholderText: "<Contrasenya>"
           passwordCharacter: "x"
           enabled: client.state === MqttClient.Disconnected
       }

Proveu les dues aplicacions a l'escriptori i al dispositiu Android.

Proveu un altre broker que també faci servir usuari i contrasenya.

Proveu si funciona a un broker que no faci servir usuari i contrasenya

20210121 (QML, 3h presencial)[modifica]

Un tutorial curt de QML[modifica]

Un tutorial amb tres exemples de codi QML (Els tres codis del tutorial curt).

Seguint amb el tema dels estats, baixeu-vos i executeu l'exemple qmlState01 d'estats en QML i l'exemple qmlState02 d'estats en QML (Basats en la documentació sobre estats de les Qt).

Bucles de vinculació[modifica]

Què són els bucles de vinculació (binding loops)?

Connexió entre el frontal QML i el rerefons en C++[modifica]

Exemple de connexió entre el frontal QML i el rerefons en C++ (El codi de connexió és basat en QML - Tutorial 036. Working with Signals and Slots in QML).

Aquí teniu alguns Vídeos QML que guien pas a pas la connexió entre el frontal i el rerefons.

Comenceu l'exercici 6 de la col·lecció Exercicis de QML

Instal·lació de QtMqtt per Android[modifica]

Malgrat que ja us funcioni la biblioteca QtMqtt en programes d'escriptori, heu de fer la compilació de la biblioteca QtMqtt per a la versió de Qt/QML que feu servir per a poder executar programes que duguin aquesta biblioteca a Android.

Hi ha diversos suggeriments de com fer-ho. Després de diversos intents, aquest és el sistema que a mi m'ha funcionat:

Cerqueu el directori lib de la vostra distribució Qt per a Android x86:

jordi@ecat-XPS13:~$ /home/jordi/Qt/6.0.0/android_x86/bin/qmake -query QT_INSTALL_LIBS
/home/jordi/Qt/6.0.0/android_x86/lib

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~$ /home/ecat/Qt/6.0.0/android_armv7/bin/qmake -query QT_INSTALL_LIBS
/home/ecat/Qt/6.0.0/android_armv7/lib

Aneu a la carpeta que ens retorna l'ordre anterior (Android x86):

jordi@ecat-XPS13:~$ cd /home/jordi/Qt/6.0.0/android_x86/lib

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~$ cd /home/ecat/Qt/6.0.0/android_armv7/lib

I feu el procés d'instal·lació (Android x86):

jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ git clone git://code.qt.io/qt/qtmqtt.git
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ cd qtmqtt/
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ git checkout 6.0
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ rm -r examples/

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ git clone git://code.qt.io/qt/qtmqtt.git
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ cd qtmqtt/
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ git checkout 6.0
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ rm -r examples/

Per a Android x86, mitjançant el Qt Creator obriu el projecte /home/jordi/Qt/6.0.0/android_x86/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

Per a Android ARM, mitjançant el Qt Creator obriu el projecte /home/ecat/Qt/6.0.0/android_armv7/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

Torneu al terminal d'abans i feu (Android x86):

jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ make
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ sudo make install

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ make
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ sudo make install

Copieu, fora de la ruta de les Qt, els projectes d'exemple quickpublication i quicksubscription. Obriu els dos projectes per a que puguin ser executats des de l'escriptori i des del mòbil (emulat o no). Per a verificar llur funcionament, podeu executar un projecte al dispositiu mòbil i l'altre a l'escriptori.

En cas de no poder actualitzar l'editor de QML[modifica]

Si us surt el missatge Qt Quick emulator layer crash i no s'actualitza el visor QML, però podeu editar l'arxiu en mode text, haureu d'anar al menú:

Tools / Options... / Qt Quick / Qt Quick Designer

i canvieu la selecció Use fallback QML emulation layer per Use QML emulation layer that is built with the selected Qt, deixant buit el Top level build path:. Quan torneu a editar des de l'editor QML es farà una recompilació del visor (sigueu pacients i deixeu acabar tot el procés).

20210118 (QML, 1h presencial)[modifica]

Seguim amb QML[modifica]

El darrer dia es va recomanar veure els tres primers capítols dels vídeos de KDAB sobre QML.

Exercicis de QML

Alguns codis explicats avui

Codis QML dels vídeos de KDAB

qml_02_kdab[modifica]

Ancoratge[modifica]

anchors.qml:

anchors.qml

anchors2.qml:

anchors2.qml

anchors-centerin-parent-keyword.qml:

anchors-centerin-parent-keyword.qml

anchors-expanding.qml:

anchors-expanding.qml

anchors-fill.qml:

anchors-fill.qml

Bucles de vinculació[modifica]

Bucles de vinculació (binding loop)

Exemple de bucle de vinculació:

import QtQuick 2.0

Rectangle {
   color: "black"
   width: child.width
   height: child.width

   Image {
       id: child
       source : "../images/vertical-gradient.png"
       anchors.fill: parent
       anchors.margins: 5
   }
}

Una solució per a evitar bucles de vinculació:

import QtQuick 2.0

Rectangle {
   color: "black"
   implicitWidth: child.implicitWidth
   implicitHeight: child.implicitWidth

   Image {
       id: child
       source : "../images/vertical-gradient.png"
       anchors.fill: parent
       anchors.margins: 5
   }
}

20210115 (QML, 1h síncrona)[modifica]

Connectem Qt/QML a Android[modifica]

  • Obriu l'Android Studio i virtualitzeu un telèfon mòbil d'arquitectura x86 (molt més ràpid que virtualitzar un ARM):
jordi@ecat-XPS13:/opt/android-studio/bin$ ./studio.sh
  • Feu un nou projecte Application (Qt Quick) / Qt Quick Application - Swipe.
  • Anomeneu i deseu el projecte. Per exemple amb el nom prMobil00
  • Seleccioneu els kits d'Android i d'escriptori, seleccionant l'opció release. Per exemple: Android Qt 6.0.0 Clang x86 i Desktop Qt 6.0.0 GCC 64bit
  • Proveu que us funciona amb la versió d'escriptori
  • Proveu que us funciona amb la versió d'Android virtualitzat. Quan ho executeu heu de seleccionar a quin dispositiu virtual ho voleu fer córrer.

Seguim amb QML[modifica]

Es recomana veure els tres primers capítols dels vídeos de KDAB sobre QML.

Exercicis de QML

Alguns codis explicats avui

Codis QML dels vídeos de KDAB

20210112 (QML, 3h presencial)[modifica]

Accés al llibre de Qt/QML en línia

Execució de codis QML des del terminal:

/home/jordi/Qt/5.15.2/gcc_64/bin/qmlscene showcase.qml

Exemples treballats avui

Exercicis QML:

  • ex1) 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.
  • ex2) 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.
  • ex3) 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.

20210111 (QML, 1h síncrona)[modifica]

A partir dels exemples en QML d'en Jan Bodnar fem servir el Qt Creator per a executar-los.

Exemples treballats avui

20201221 (IoT, 1h síncrona)[modifica]

S'acaba el termini de lliurament de pràctiques desenvolupades fins les festes de Nadal.

Les dues darreres:

  • Control de la placa IoT-02 mitjançant Telegram
  • Publicació de dades del sensor BM280 de la placa IoT-02 a Mastodon

20201218 (IoT, 1h síncrona)[modifica]

Codis d'avui i material d'ajuda per a fer l'exercici

  • Mastodon, una alternativa lliure a Twitter

No totes les instàncies de Mastodon faciliten la instal·lació de bots. Per a fer els primers passos us recomano aquesta instància pensada per a hostatjar bots de Mastodon (tal i com es va demanar el dia anterior, heu d'haver demanat les credencials a la instància de Mastodon botsin.space amb molta antelació. Si ho sol·liciteu avui mateix no podreu seguir la classe).


Exemple de bot de Mastodon per a fer lectures de sensors cada hora.

Getting credentials for the Mastodon API with Mastodon.py, step by step

  • Exercici:

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.

20201215 (IoT, 3h presencial)[modifica]

Alguns codis d'avui

Autenticació d'accés a NodeRED[modifica]

Securing NodeRED

Generació de la contrasenya d'accés en mode hash des de la carpeta d'execució del NodeRED:

node node_modules/node-red/red.js admin hash-pw

En aquest exemple fem servir aquesta contrasenya en mode hash:

$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq

Edició de settings.js:

toni@vps-10d8edcd:~/bin/nodered$ nano ./node_modules/node-red/settings.js
   // Securing Node-RED
   // -----------------
   // To password protect the Node-RED editor and admin API, the following
   // property can be used. See http://nodered.org/docs/security.html for details.
   adminAuth: {
       type: "credentials",
       users: [{
           username: "toni",
           password: "$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq",
           permissions: "*"
       }]
   },

Un cop fets el canvis cal reiniciar el NodeRED.

Telegram[modifica]

Bot de Telegram

  • Creació de bots amb BotFather
  • Instal·lació de nodes de Telegram a NodeRED (afegiu els nodes node-red-contrib-telegrambot)
  • Interacció amb un usuari de Telegram
  • Interacció amb un grup de Telegram

Material per a fer el bot


Flux de prova per al bot de Telegram

Deures pel proper dia[modifica]

Feu-vos membres d'aquesta instància de Mastodon: botsin.space

Feu-ho amb prou antelació, és possible que trigui més de tres hores a donar-vos accés.

20201211 (Qt i IoT, 1h síncrona)[modifica]

Notes del 1r trimestre

Comentarem dubtes de la darrera pràctica.

Es demana de dur instal·lat Telegram al telèfon mòbil per a la propera classe del 14 de desembre de 2020.

20201204 (Qt i IoT, 1h síncrona)[modifica]

Notes provisionals del 1r trimestre

Desenvolupem com a pràctica puntuable la resolució dels exercicis 5, 6 i 7 (Trameteu per separat P5, P6 i P7)

20201201 Examen 1r trimestre[modifica]

Enunciat de l'examen del 1r trimestre

Notes provisionals de les pràctiques a 1 de desembre de 2020

20201130 (dubtes i Qt, 1h síncrona)[modifica]

Codis d'avui (Senyals, osques, agrupacions i connexions)

20201127 (Qt i IoT, 1h síncrona)[modifica]

Revisem l'exercici proposat el darrer dia.

20201124 (IoT i Qt) (3h, presencial)[modifica]

Control de la placa IoT-02 mitjançant MQTT emprant Qt i missatges JSON

Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT.

Codi de flux de NodeRED per a controlar els leds de la placa IoT-02 mitjançant un JSON

Flux de NodeRED emprant MQTT i JSON bidireccional

Exercici amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT[modifica]

Desenvolupeu el projecte 15_mqtt_IoT02_03, basant-vos en el darrer codi de control de la placa IoT-02 en C++ per a Qt, que visualitzi en una barra de progrés el nivell de llum rebut per la LDR.

20201123 (Qt i IoT, 1h síncrona)[modifica]

Control de la placa IoT-02 mitjançant MQTT emprant Qt i missatges JSON

Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT.

20201120 (Qt i IoT, 1h síncrona)[modifica]

Al dia d'avui us he posat el codi per a poder visualitzar el color dels leds.

Fent servir MQTT, feu una aplicació emprant Qt que ensenyi l'estat dels botons i dels leds de la placa IoT-02

Codis d'avui

20201117 (Qt i IoT, 3h presencial)[modifica]

Biblioteca Arduino_JSON per l'IDE d'Arduino

Codis d'avui

Dades encapsulades en JSON al NodeRED i a la placa IoT-02.

Exercici[modifica]

Desenvolupeu una aplicació GUI feta amb Qt que mitjançant el protocol MQTT:

  • Controli els quatre leds mitjançant botons seleccionadors (check box)
  • Indiqui l'estat dels tres botons mitjançant etiqueta (premut / no premut)
  • Indiqui l'estat dels tres botons mitjançant etiqueta gràfica (color viu / color fosc)
  • Una barra de progrés indiqui el nivell de llum
  • Trameti missatges a la pantalla OLED (tres botons seleccionadors de mida del text)

20201116 (Qt, 1h síncrona)[modifica]

Codis d'avui

Exercici[modifica]

Modifiqueu el codi de MQTT's simpleclient per a admetre usuari i contrasenya (podeu fer servir el broker formacio.things.cat amb usuari ecat i contrasenya clotClot).

Captura de l'exercici a fer

Documentació[modifica]

Qt/QML[modifica]

Qt5 de Jan Bodnar

Vídeos QML

Qt5 Cadaques! A Book about Qt5

Qt Quick tutorial de Jan Bodnar

PyQt5 de Jan Bodnar

Qt for WebAssembly[modifica]

Qt for WebAssembly

json[modifica]

How To Manipulate JSON With C++ and Qt

QProcess[modifica]

QProcess example

Qt5 tutorial FFmpeg converter using QProcess - 2020

IoT[modifica]

Introducció al Node-RED

TCP/UDP Capa de transport d'Ethernet

Introducció a MQTT

Afegint la targeta ESP8266 a l'IDE d'Arduino (NodeMCU1.0)

Micropython and the Internet of Things

SCADA fent servir Python QML i Arduino

MQTT avec Qt

Planificació[modifica]

Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2020-2021 de 2n de DAM