DAM 2020-2021
Contingut
- 1 Horari a partir del 18 de gener
- 2 Teleconferència del curs 2020-2021
- 3 Alguns vídeos d'ajuda
- 4 Algunes classes
- 4.1 20210415 (3h presencial)
- 4.2 20210412 (1h presencial)
- 4.3 20210409 (2h síncrona)
- 4.4 20210408 (3h presencial)
- 4.5 20210326 (2h presencial)
- 4.6 20210325 (3h presencial)
- 4.7 20210322 (1h presencial)
- 4.8 20210319 (2h síncrona)
- 4.9 20210318 (3h presencial)
- 4.10 20210315 (1h presencial)
- 4.11 20210312 (2h presencial)
- 4.12 20210311 (3h presencial)
- 4.13 20210308 (1h presencial)
- 4.14 20210305 (2h síncrona)
- 4.15 20210304 (3h presencial)
- 4.16 20210301 (1h presencial)
- 4.17 20210226 (IoT: InfluxDB i Grafana, 2h presencial)
- 4.18 20210225 (Examen final del M07UF1. Part de QML amb IoT, 3h presencial)
- 4.19 20210222 (QML / IoT, 2h síncrona)
- 4.20 20210219 (QML / IoT, 2h síncrona)
- 4.21 20210218 (QML / IoT, 3h presencial)
- 4.22 20210212 (QML, 2h presencial)
- 4.23 20210211 (QML, 3h síncrona)
- 4.24 20210208 (QML, 1h presencial)
- 4.25 20210205 (QML, 2h síncrona)
- 4.26 20210204 (QML, 3h presencial)
- 4.27 20210201 (QML, 1h presencial)
- 4.28 20210129 (QML, 2h presencial)
- 4.29 20210128 (QML, 3h síncrona)
- 4.30 20210125 (QML, 1h presencial)
- 4.31 20210122 (QML, 2h síncrona)
- 4.32 20210121 (QML, 3h presencial)
- 4.33 20210118 (QML, 1h presencial)
- 4.34 20210115 (QML, 1h síncrona)
- 4.35 20210112 (QML, 3h presencial)
- 4.36 20210111 (QML, 1h síncrona)
- 4.37 20201221 (IoT, 1h síncrona)
- 4.38 20201218 (IoT, 1h síncrona)
- 4.39 20201215 (IoT, 3h presencial)
- 4.40 20201211 (Qt i IoT, 1h síncrona)
- 4.41 20201204 (Qt i IoT, 1h síncrona)
- 4.42 20201201 Examen 1r trimestre
- 4.43 20201130 (dubtes i Qt, 1h síncrona)
- 4.44 20201127 (Qt i IoT, 1h síncrona)
- 4.45 20201124 (IoT i Qt) (3h, presencial)
- 4.46 20201123 (Qt i IoT, 1h síncrona)
- 4.47 20201120 (Qt i IoT, 1h síncrona)
- 4.48 20201117 (Qt i IoT, 3h presencial)
- 4.49 20201116 (Qt, 1h síncrona)
- 4.50 20201113 (dubtes i Qt, 1h síncrona)
- 4.51 20201110 (IoT i Qt) (3h presencials)
- 4.52 20201109 (IoT i Qt) (1h en línia)
- 4.53 20201106 (IoT i Qt) (2h)
- 4.54 20201105 (IoT i Qt) (3h)
- 4.55 20201102 (IoT i Qt) (1h)
- 4.56 20201030 (IoT i Qt) (2h)
- 4.57 20201029 (IoT i Qt) (3h)
- 4.58 20201026 (IoT i Qt) (1h)
- 4.59 20201023 (IoT i Qt) (2h)
- 4.60 20201022 (IoT i Qt) (3h)
- 4.61 20201019 (lliurament Ex01 v2)
- 4.62 202010116 Qt (2h)
- 4.63 202010115 (IoT i Qt) (3h)
- 4.64 20201012 (lliurament Ex01)
- 4.65 20201009 Qt/QML (1h)
- 4.66 20201009 IoT (1h)
- 4.67 20201008 Qt/QML (1,5h)
- 4.68 20201008 IoT (1,5h)
- 4.69 20201005 IoT (1h)
- 4.70 20201002 IoT (2h)
- 4.71 20201001 IoT (3h)
- 4.72 20200928 IoT (1h)
- 4.73 20200425 Qt/QML (2h)
- 4.74 20200922 Qt/QML (2h)
- 5 Documentació
- 6 Planificació
Horari a partir del 18 de gener
Teleconferència del curs 2020-2021
Carpetes compartides 2n de DAM. Curs 2020-2021
Alguns vídeos d'ajuda
QML
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.
Pseudoservidor UDP
Pseudoservidor UDP emprant Qt5 (1/2)
Pseudoservidor UDP emprant Qt5 (2/2)
Algunes classes
20210415 (3h presencial)
Exemple de funció amb 4 sortides
var amunt = {payload: "amunt"}; var mig = {payload: "mig"}; var avall = {payload: "avall"}; return [amunt,mig,avall,msg];
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)
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)
Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)
20210408 (3h presencial)
Programació remota (OTA) (JESUITESFP / IOTcl1220_)
Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)
20210326 (2h presencial)
Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)
Flux de NodeRED que agafa una cadena de text de 4 bytes i ho converteix a un número real (float)
20210325 (3h presencial)
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)
Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)
Comentem l'exercici 3.7
20210319 (2h síncrona)
Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)
FreeRTOS
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)
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)
Conceptes de LoRa 2020-2021
20210312 (2h presencial)
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)
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
Doneu-vos d'alta com a usuaris de The Things Network
20210308 (1h presencial)
Repassem el funcionament de la vostra placa IoT-02 al vostre broker MQTT, el vostre NodeRED, el vostre InfluxDB i el vostre Grafana.
FreeRTOS
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)
Continuem amb el temes d'ahir.
HTTP a MQTT
Flux de NodeRED per a convertir crides HTTP a MQTT
Exercici d'HTTP a MQTT
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)
Bases de dades temporals i visualització
Seguim amb la instal·lació d'InfluxDB i Grafana.
Exercici de bases de dades temporals i visualització
- Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum.
HTTP a MQTT
Flux de NodeRED per a convertir crides HTTP a MQTT
FreeRTOS
Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32
20210301 (1h presencial)
Seguim amb la instal·lació d'InfluxDB i Grafana.
Notes provisionals d'avaluació ordinària del M07UF1
20210226 (IoT: InfluxDB i Grafana, 2h presencial)
Part pròpia del M15UF1 (Internet de les Coses) i M09UF2 (Processos i fils).
InfluxDB v2.0
- Instal·lació de la base de dades temporal a la màquina virtual Linux
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
- Instal·lació de l'aplicació web de visualització de dades a la màquina virtual Linux
- 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
- Ús de les dades d'InfluxDB a Grafana
from(bucket: "api/v2/query") |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
Exercici de prova
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)
- 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
Grafana & Flux. New Flux support in Grafana by Jacob Lisi @JacobLisi
20210225 (Examen final del M07UF1. Part de QML amb IoT, 3h presencial)
Accés a l'examen en format pdf, odt i el material comprimit necessari per a desenvolupar-lo
20210222 (QML / IoT, 2h síncrona)
Darrer dia abans de l'examen de final de la UF1 del M07.
Resolució de dubtes.
20210219 (QML / IoT, 2h síncrona)
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)
Alguns codis comentats avui fent servir comportaments elàstics (easing).
Seguim amb els Exercicis de QML
20210212 (QML, 2h presencial)
20210211 (QML, 3h síncrona)
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)
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)
Actualització de la màquina virtual
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)
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
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
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
- 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
20210201 (QML, 1h presencial)
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)
Comencem per l'exercici ex06_07 dels Exercicis de QML (Vídeo 7/10 a Vídeos QML)
20210128 (QML, 3h síncrona)
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
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
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)
Connexió entre el frontal QML i el rerefons en C++
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)
- Ajuda per a fer els ex04 i ex05 dels Exercicis de QML:
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)
Un tutorial curt de QML
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ó
Què són els bucles de vinculació (binding loops)?
Connexió entre el frontal QML i el rerefons en C++
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
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
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)
Seguim amb QML
El darrer dia es va recomanar veure els tres primers capítols dels vídeos de KDAB sobre QML.
Codis QML dels vídeos de KDAB
qml_02_kdab
Ancoratge
anchors-centerin-parent-keyword.qml:
Bucles de vinculació
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)
Connectem Qt/QML a Android
- 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
Es recomana veure els tres primers capítols dels vídeos de KDAB sobre QML.
Codis QML dels vídeos de KDAB
20210112 (QML, 3h presencial)
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
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)
A partir dels exemples en QML d'en Jan Bodnar fem servir el Qt Creator per a executar-los.
20201221 (IoT, 1h síncrona)
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)
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)
Autenticació d'accés a 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
- 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
Flux de prova per al bot de Telegram
Deures pel proper dia
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)
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)
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
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)
Codis d'avui (Senyals, osques, agrupacions i connexions)
20201127 (Qt i IoT, 1h síncrona)
Revisem l'exercici proposat el darrer dia.
20201124 (IoT i Qt) (3h, presencial)
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
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)
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)
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
20201117 (Qt i IoT, 3h presencial)
Biblioteca Arduino_JSON per l'IDE d'Arduino
Dades encapsulades en JSON al NodeRED i a la placa IoT-02.
Exercici
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)
Exercici
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).
Al mètode void MainWindow::on_buttonConnect_clicked() haureu d'afegir les crides als mètodes setUsername i setPassword de la classe QtMqtt (aquestes crides s'hauran de fer quan els camps d'usuari i contrasenya no estiguin buits):
ui->lineEditUsuari->setEnabled(false); ui->lineEditContrasenya->setEnabled(false); m_client->setUsername(ui->lineEditUsuari->text()); m_client->setPassword(ui->lineEditContrasenya->text()); m_client->connectToHost();
Màquina virtual per a VMware amb QtMqtt instal·lat
Màquina virtual GNU/Linux Debian 9 amb el paquet QtMqtt instal·lat per a VMware Workstation Player. Usuari / contrasenya: iot / iot
20201113 (dubtes i Qt, 1h síncrona)
qtmqtt
Per a instal·lar qtmqtt
git clone git://code.qt.io/qt/qtmqtt.git cd qtmqtt git checkout 5.14 mkdir build cd build qmake -r .. make sudo make install
(Abans de fer el qmake, feu un git checkout 5.14 -canvieu el 5.14 per la vostra versió de Qt instal·lada al vostre sistema-)
Heu de cercar la ruta de qmake en cas de que no hi sigui al vostre PATH
/home/jordi/bin/Qt/5.14.1/gcc_64/bin/qmake -r ..
Canvieu jordi pel vostre usuari i 5.14.1 per la vostra versió de Qt.
A Finestrots
Segons ens informa el Sr. Adrià Vega, les eines make i make install a Windows amb MinGW són:
MinGW32-make MinGW32-make install
20201110 (IoT i Qt) (3h presencials)
Microprogramari de prova MQTT per a la placa IoT-02. Pugeu-la fent servir l'IDE d'Arduino.
Eina per saber la MAC remotament (Codi font d'aquesta pàgina web)
20201109 (IoT i Qt) (1h en línia)
Snap! (També el podeu executar des de la vostra pròpia màquina. És important fer servir HTTP i no HTTPS)
Baixeu-vos localment aquesta biblioteca MQTT
Broker de prova de test.mosquitto.org
Flux de prova del NodeRED amb el broker test.mosquitto.org
Flux de NodeRED amb el broker formacio.things.cat i codi d'Snap! de prova del broker formacio.things.cat
20201106 (IoT i Qt) (2h)
20201105 (IoT i Qt) (3h)
Node executat per terminal per un port diferent a l'estàndard
Versió recomanada de Node per fer córrer NodeRED
Instal·lació de node v12 a Debian 10
20201102 (IoT i Qt) (1h)
20201030 (IoT i Qt) (2h)
20201029 (IoT i Qt) (3h)
A proposta dels estudiants, que han començat a fer una prova PCR a 2/4 de 2, excepcionalment avui es començarà a 3/4 de 4 (15.45).
Exercici 0) Provar les Qt comunicant-se amb la placa IoT-02 amb UDP, unidireccionalment des de l'ordinador a la placa.
1r exercici) A partir del codi del darrer dia, canvieu el port del pseudoservidor UDP de manera dinàmica. Heu d'afegir una línia d'edició (lineEdit) i que faci la connexió (bind) automàtica. Si es pot fer sortirà un text (label) de color verd indicant-ho, en cas contrari sortirà el text de color vermell. (No cal que ho feu a casa. Ho farem el dia 29 d'octubre).
2n exercici) Trameteu per correu electrònic la pràctica de les Qt connectant-se a la placa IoT-02 mitjançant UDP, bidireccionalment (No cal que ho feu a casa. Ho farem el dia 29 d'octubre).
Alguns enllaços útils
Ports ben coneguts (fins al port 1023 un usuari normal no hi té accés per defecte. A partir del 1024 qualsevol usuari el pot utilitzar).
20201026 (IoT i Qt) (1h)
20201023 (IoT i Qt) (2h)
20201022 (IoT i Qt) (3h)
QT5 TUTORIAL QUDPSOCKET - 2020
20201019 (lliurament Ex01 v2)
- Aquesta segona versió de la pràctica ha de fer la pregunta després de rebre la resposta. Exemple:
Pregunto cada segon L -> espero a rebre la resposta d'L.
Un cop rebo la resposta d'L, trameto la pregunta i.
Un cop rebo la resposta d'i, trameto la pregunta i34.
Un cop rebo la resposta d'i34, trameto la pregunta i35.
- Documenteu com configureu MQTT Dash (o similar) per a connectar-ho a NodeRED fent servir un broker MQTT públic.
202010116 Qt (2h)
202010115 (IoT i Qt) (3h)
20201012 (lliurament Ex01)
Finalització del termini de lliurament de l' Exercici 01. Recordeu les condicions del planteig i lliurament de l'Exercici 1
20201009 Qt/QML (1h)
Acabar l'explicació del dia anterior. 1) Revisió de conceptes bàsics de programació orientada a objectes en C++ 2) Distribució de ginys emprant Qt (editor XML gràfic) 3) Paradigma senyal-osca
20201009 IoT (1h)
Acabar l'explicació de tot el necessari per a fer l' Exercici 01.
20201008 Qt/QML (1,5h)
Conceptes bàsics sobre classes i objectes
Codis de terminal. Classes: Constructors, destructors, atributs i mètodes (públics, protegits i privats).
Distribució de ginys
Redimensió de la distribució i pistes (tips)
Canvi de la forma del cursor en funció de la zona a la distribució
Paradigma senyal / osca
Explicació del paradigma senyal / osca (signal / slot)
Interfície gràfica d'usuari emprants senyals i osques
20201008 IoT (1,5h)
UDP a la placa IoT-02
Connexió wifi a la placa IoT-02 (Codi que mostra el canal de la SSID detectada).
Microprogramari (firmware) per visualitzar les xarxes wifi visibles des de la placa IoT-02. Aprofitem aquest codi per a explicar la introducció d'arxius .cpp i .h al mateix directori que l'arxiu .ino
Microprogramari per treballar amb UDP a la placa IoT-02
Planteig de l'Exercici 01
Visualització de ginys al tauler de control (dashboard) al NodeRED. Connexió UDP entre la placa IoT-02 i el NodeRED.
Enllaç a l'enunciat de l' Exercici 01.
L'exercici s'ha de fer a classe de manera individual (es proposa com a data de lliurament per correu electrònic el dia 12 d'octubre de 2020). Heu de fer el report en pdf amb el títol dam_iot_pr01_cognom_nom.pdf (essent cognom el vostre cognom i nom el vostre nom. En cas de compartir nom i cognom amb un company canvieu cognom per cognom1_cognom2, essent cognom1 el primer cognom i cognom2 el segon cognom) i el tema del correu ha de ser dam_iot_pr01_cognom_nom. És molt important respectar el format dels caràcters, majúscules i minúscules per a poder automatitzar correctament la recepció dels vostres reports.
20201005 IoT (1h)
Executeu a la carpeta a on heu descomprimit el NodeRed autònom
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
Codis de NodeRED (UDP in i UDP out)
Introducció a UDP fent servir NodeRED i la placa IoT-02
20201002 IoT (2h)
20201001 IoT (3h)
A aquest classe cal dur un cable microusb B i un cable miniusb o un cable miniusb i una font d'alimentació amb microusb B
Enllaç a un cable miniusb i microusb B (els dos)
Enllaça a una font d'alimentació de %V / 3A amb connector microusb
Presa de contacte amb la placa IoT-02.
20200928 IoT (1h)
NodeRed autònom i d'altres codis
20200425 Qt/QML (2h)
Codis de presa de contacte amb el Qt Creator
20200922 Qt/QML (2h)
Documentació
Qt/QML
Qt5 de Jan Bodnar
Qt5 Cadaques! A Book about Qt5
Qt Quick tutorial de Jan Bodnar
PyQt5 de Jan Bodnar
Qt for WebAssembly
json
How To Manipulate JSON With C++ and Qt
QProcess
Qt5 tutorial FFmpeg converter using QProcess - 2020
IoT
TCP/UDP Capa de transport d'Ethernet
Afegint la targeta ESP8266 a l'IDE d'Arduino (NodeMCU1.0)
Micropython and the Internet of Things
SCADA fent servir Python QML i Arduino
Planificació
Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2020-2021 de 2n de DAM