Diferència entre revisions de la pàgina «DAM 2020-2021»
(270 revisions intermèdies per 2 usuaris que no es mostren) | |||
Línia 1: | Línia 1: | ||
+ | = Horari a partir del 18 de gener = | ||
+ | [[Image:PPandGener2021_DAM2b.png|center|2n de DAM]] | ||
+ | |||
= Teleconferència del curs 2020-2021 = | = Teleconferència del curs 2020-2021 = | ||
[https://meet.google.com/wum-fjat-cow Adreça de la teleconferència] | [https://meet.google.com/wum-fjat-cow Adreça de la teleconferència] | ||
+ | |||
+ | [https://docs.google.com/spreadsheets/d/1kvyONuw9stK7VuuQS8i45lzwkhquwA_9jmXnNemjZNk/edit#gid=306804274 Llista 2n de DAM 2020-2021] | ||
+ | |||
+ | [[Carpetes compartides 2n de DAM. Curs 2020-2021]] | ||
= Alguns vídeos d'ajuda = | = Alguns vídeos d'ajuda = | ||
+ | == QML == | ||
+ | [https://www.youtube.com/playlist?list=PL6CJYn40gN6hdNC1IGQZfVI707dh9DPRc Introduction to Qt / QML - all videos so far] by [https://www.kdab.com/ KDAB] ([https://github.com/KDAB/kdabtv/tree/master/qml-intro Codis QML de la sèrie de vídeos]) | ||
+ | |||
+ | [[Vídeos QML]] de connexió entre el rerefons en C++ i el frontal en QML. | ||
+ | |||
+ | [https://www.youtube.com/watch?v=9BRJ1qJkjZM Photoshop to QML exporter] | ||
+ | |||
== Pseudoservidor UDP == | == Pseudoservidor UDP == | ||
[https://youtu.be/lKNdgHVRal0 Pseudoservidor UDP emprant Qt5 (1/2)] | [https://youtu.be/lKNdgHVRal0 Pseudoservidor UDP emprant Qt5 (1/2)] | ||
Línia 9: | Línia 23: | ||
= Algunes classes = | = Algunes classes = | ||
− | == | + | == 20210609 (3h presencial) '''Avaluació extraordinària''' == |
− | + | [https://binefa.cat/dam2021/20210610_xtra/ Enunciats de l'avaluació extraordinària] | |
+ | |||
+ | == 20210528 (2h en línia) '''Presentació de projectes de 2n de DAM''' == | ||
+ | [https://meet.google.com/vkc-uupk-kai Sala Meet de la presentació de projectes] | ||
+ | |||
+ | == 20210527 (3h en línia) '''Presentació de projectes de 2n de DAM''' == | ||
+ | [https://meet.google.com/vkc-uupk-kai Sala Meet de la presentació de projectes] | ||
+ | |||
+ | == 20210520 (1h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210517 (1h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210514 (2h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210513 (3h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210510 (1h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210507 (2h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210506 (3h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210503 (1h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210430 (2h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210429 (3h presencial) == | ||
+ | Seguim amb el [[Projecte de final de CFGS DAM (2020-2021)]] | ||
+ | |||
+ | == 20210426 '''Comença el projecte''' (1h presencial) == | ||
+ | Comentem les notes provisionals i comença el temps de projecte. | ||
+ | |||
+ | == 20210423 '''Darrer dia''' (2h síncrona) == | ||
+ | Feu alguns exercicis que no vau fer ahir de l'[https://binefa.cat/dam2021/20210423_darrerDia/ 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) == | ||
+ | [https://binefa.cat/dam2021/20210422_ex/ Examen d'ordinària del curs 2020-2021] | ||
+ | |||
+ | [http://extensions.snap.berkeley.edu/ Snap! per HTTP] per a fer servir sòcols web no segurs. | ||
+ | |||
+ | He afegit [https://binefa.cat/dam2021/20210422_ex/ascensor.nodered.txt 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) == | ||
+ | Per a canviar l'Spread Factor ([https://github.com/jordibinefa/arduino-IDE-codes/blob/master/esp32_lorawan_ttnEsp32_ttgo_multichannel_02b/esp32_lorawan_ttnEsp32_ttgo_multichannel_02b.ino 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) == | ||
+ | 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 | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210416/ Alguns codis comentats avui] | ||
+ | |||
+ | Instal·lació de l'OpenMPI a la màquina (per a molts, virtual) de Linux. | ||
+ | |||
+ | == 20210415 (3h presencial) == | ||
+ | [https://binefa.cat/dam2021/20210415/funcio4sortides.nodered.txt 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]; | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210415/ 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) == | ||
+ | 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) == | ||
+ | [https://www.things.cat/index.php?title=P%C3%A0gina_principal#Programaci.C3.B3_remota_.28OTA.29 Programació remota (OTA)] (JESUITESFP / IOTcl1220_) | ||
+ | |||
+ | [[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]] | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210408/ Alguns codis comentats avui] | ||
+ | |||
+ | == 20210326 (2h presencial) == | ||
+ | [[Exercicis d'Internet de les Coses (M15UF1, M09UF2 i M09UF3 del curs 2020-2021)]] | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210326/ Alguns codis comentats avui] | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210326/cadena4bytes_a_float.nodered.txt 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)]] | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210325/ 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)]] | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210319/ Alguns codis explicats avui] | ||
+ | |||
+ | === '''FreeRTOS''' === | ||
+ | [https://github.com/jordibinefa/IoT-02/tree/master/codes/freeRTOS Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32] | ||
+ | |||
+ | [https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/ Explicació d'un codi bàsic en FreeRTOS] | ||
+ | |||
+ | [https://www.freertos.org/Documentation/RTOS_book.html '''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)]] | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210312_iot/missatgeAscendentTTN.nodered.txt Codi de desxifratge d'un missatge ascendent de The Things Network] | ||
+ | |||
+ | Codi basat en [https://binefa.cat/IoT/nodeRed/nodeRed01.pdf 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 [https://www.thethingsnetwork.org/ The Things Network] | ||
+ | |||
+ | [[LoRa 2020-2021]] | ||
+ | |||
+ | == 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''' === | ||
+ | [https://github.com/jordibinefa/IoT-02/tree/master/codes/freeRTOS Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32] | ||
+ | |||
+ | [https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/ Explicació d'un codi bàsic en FreeRTOS] | ||
+ | |||
+ | [https://www.freertos.org/Documentation/RTOS_book.html '''Manual de referència per al FreeRTOS'''] | ||
+ | |||
+ | == 20210305 (2h síncrona) == | ||
+ | Continuem amb el temes d'ahir. | ||
+ | |||
+ | === HTTP a MQTT === | ||
+ | [https://binefa.cat/dam2021/20210304_iot/http_a_mqtt/http_mqtt.nodered.txt 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) == | ||
+ | [https://binefa.cat/dam2021/20210304_iot/ Alguns codis comentats avui] | ||
+ | |||
+ | === 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 === | ||
+ | [https://binefa.cat/dam2021/20210304_iot/http_a_mqtt/http_mqtt.nodered.txt Flux de NodeRED per a convertir crides HTTP a MQTT] | ||
+ | |||
+ | === '''FreeRTOS''' === | ||
+ | [https://github.com/jordibinefa/IoT-02/tree/master/codes/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. | ||
+ | |||
+ | [https://binefa.cat/dam2021/20210301/notesProvisionals20210301.png 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 [http://www.binefa.com/index.php?title=DAM_2020-2021#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual màquina virtual Linux] | ||
+ | [https://docs.influxdata.com/influxdb/v2.0/get-started/ Instal·lació d'InfluxDB 2.0] i [https://portal.influxdata.com/downloads/ 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 | ||
+ | [https://www.binefa.cat/training/nodered/influxDB_2.0/escripturaInfluxDB.nodered.txt Escriptura de dades múltiple des del NodeRed] | ||
+ | |||
+ | [https://www.binefa.cat/training/nodered/influxDB_2.0/lecturaInfluxDB.nodered.txt Lectura de dades múltiple des del NodeRed] | ||
+ | |||
+ | === Grafana === | ||
+ | * Instal·lació de l'aplicació web de visualització de dades a la [http://binefa.com/index.php?title=DAM_2020-2021#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual màquina virtual Linux] | ||
+ | [https://grafana.com/grafana/download?platform=linux 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 | ||
+ | [https://docs.influxdata.com/influxdb/v2.0/tools/grafana/ Configure Grafana to use Flux] | ||
+ | |||
+ | * Ús de les dades d'InfluxDB a Grafana | ||
+ | [https://grafana.com/docs/grafana/latest/datasources/influxdb/ Using InfluxDB in Grafana] | ||
+ | |||
+ | from(bucket: "api/v2/query") | ||
+ | |> range(start: v.timeRangeStart, stop: v.timeRangeStop) | ||
+ | |||
+ | |||
+ | === Exercici de prova === | ||
+ | [https://www.binefa.cat/training/nodered/influxDB_2.0/escripturaUnaDadaAleatoriaInfluxDB.nodered.txt 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 === | ||
+ | [https://www.grafanacon.org/2019/presentations/Grafana_Flux_JTL.pdf Grafana & Flux. New Flux support in Grafana] by Jacob Lisi @JacobLisi | ||
+ | |||
+ | == 20210225 ('''Examen final del M07UF1'''. Part de QML amb IoT, 3h presencial) == | ||
+ | [https://binefa.cat/dam2021/20210225_ex_M07UF1ord/ 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) == | ||
+ | [https://binefa.cat/dam2021/20210219_qml/ 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 [https://freesvg.org/vector-image-of-analog-clock dissenys vectorials lliures i oberts] aconseguits a [https://freesvg.org https://freesvg.org] | ||
+ | |||
+ | Seguim amb els [[Exercicis de QML]] | ||
+ | |||
+ | == 20210218 (QML / IoT, 3h presencial) == | ||
+ | [https://binefa.cat/dam2021/20210218_qml/ Alguns codis comentats avui] fent servir '''comportaments elàstics''' (''easing''). | ||
+ | |||
+ | Seguim amb els [[Exercicis de QML]] | ||
+ | |||
+ | == 20210212 (QML, 2h presencial) == | ||
+ | [https://binefa.cat/dam2021/20210212_qml_iot/ Alguns codis comentats avui] | ||
+ | |||
+ | [https://sourceforge.net/projects/qmlexporter/ QmlExporter] | ||
+ | |||
+ | == 20210211 (QML, 3h síncrona) == | ||
+ | [https://binefa.cat/dam2021/20210211_qml_iot/ 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) == | ||
+ | Microprogramari [https://binefa.cat/dam2021/20210208_qml_iot/IoT-02_mqtts_10_dam.zip 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) == | ||
+ | [https://binefa.cat/dam2021/20210205_qml_iot/ Alguns codis comentats avui] | ||
+ | |||
+ | === Actualització de la màquina virtual === | ||
+ | * [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-debian-10 Instal·lació de MQTT amb contrasenya] | ||
+ | |||
+ | * [https://github.com/nodesource/distributions/blob/master/README.md Instal·lació de node i npm] | ||
+ | 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''' [https://www.osboxes.org/android-x86/ 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 === | ||
+ | [http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit%20_v20210202_00.zip 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 === | ||
+ | * 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 === | ||
+ | [https://wiki.binefa.cat/index.php?title=MQTT_i_MQTTS MQTT_i_MQTTS] | ||
+ | |||
+ | == 20210201 (QML, 1h presencial) == | ||
+ | |||
+ | [https://www.osboxes.org/android-x86/ Emulador d'Android a una màquina virtual] | ||
+ | |||
+ | Aneu amb cura, malgrat és obsolet quelcom es pot fer servir en part: [https://visualgdb.com/tutorials/android/vmware/ 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 [https://binefa.cat/training/qml/01_qmlLliscant_10.zip 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 | ||
+ | } | ||
+ | |||
+ | [https://binefa.cat/training/qml/01_qmlLliscant_10_qt6.zip '''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++ === | ||
+ | [https://binefa.cat/dam2021/20210121_qml/qmlEd01.zip Exemple de connexió entre el frontal QML i el rerefons en C++] (El codi de connexió és basat en [https://evileg.com/en/post/569/ 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 === | ||
+ | [https://doc.qt.io/qt-5/qml-tutorial1.html Un tutorial amb tres exemples de codi QML] ([https://binefa.cat/dam2021/20210121_qml/qmlTut01_03.zip Els tres codis del tutorial curt]). | ||
+ | |||
+ | Seguint amb el tema dels '''estats''', baixeu-vos i executeu l'[https://binefa.cat/dam2021/20210121_qml/qmlState01.zip exemple qmlState01 d'estats en QML] i l'[https://binefa.cat/dam2021/20210121_qml/qmlState02.zip exemple qmlState02 d'estats en QML] (Basats en la [https://doc.qt.io/qt-5/qml-qtquick-state.html documentació sobre estats de les Qt]). | ||
+ | |||
+ | === Bucles de vinculació === | ||
+ | Què són els [http://binefa.com/index.php?title=DAM_2020-2021#Bucles_de_vinculaci.C3.B3_2 bucles de vinculació] (''binding loops'')? | ||
+ | |||
+ | === Connexió entre el frontal QML i el rerefons en C++ === | ||
+ | [https://binefa.cat/dam2021/20210121_qml/qmlEd01.zip Exemple de connexió entre el frontal QML i el rerefons en C++] (El codi de connexió és basat en [https://evileg.com/en/post/569/ 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 [https://binefa.cat/dam2021/20210121_qml/quickpublication.zip '''quickpublication'''] i [https://binefa.cat/dam2021/20210121_qml/quicksubscription.zip '''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. | ||
− | [ | + | [[Exercicis de QML]] |
− | + | [https://binefa.cat/dam2021/20210118_qml/ Alguns codis explicats avui] | |
− | [https://binefa.cat/dam2021/ | ||
− | [https:// | + | [https://github.com/KDAB/kdabtv/tree/master/qml-intro Codis QML] dels [https://www.youtube.com/playlist?list=PL6CJYn40gN6hdNC1IGQZfVI707dh9DPRc vídeos de KDAB] |
− | + | === qml_02_kdab === | |
+ | ==== Ancoratge ==== | ||
+ | [https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors.qml anchors.qml:] | ||
+ | [[Image:00_anchors.png|center|anchors.qml]] | ||
− | + | [https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors2.qml anchors2.qml:] | |
− | + | [[Image:01_anchors2.png|center|anchors2.qml]] | |
− | |||
− | + | [https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors-centerin-parent-keyword.qml anchors-centerin-parent-keyword.qml:] | |
+ | [[Image:02_anchors-centerin-parent-keyword.png|center|anchors-centerin-parent-keyword.qml]] | ||
− | + | [https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors-expanding.qml anchors-expanding.qml:] | |
+ | [[Image:03_anchors-expanding.png|center|anchors-expanding.qml]] | ||
− | + | [https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-anchor-layout/anchors-fill.qml anchors-fill.qml:] | |
+ | [[Image:04_anchors-expanding.png|center|anchors-fill.qml]] | ||
− | + | ==== Bucles de vinculació ==== | |
+ | [https://github.com/KDAB/kdabtv/blob/master/qml-intro/ex-binding-loop/main.qml 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. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [[Exercicis de QML]] | |
+ | [https://binefa.cat/dam2021/20210115_qml/ Alguns codis explicats avui] | ||
− | + | [https://github.com/KDAB/kdabtv/tree/master/qml-intro Codis QML] dels [https://www.youtube.com/playlist?list=PL6CJYn40gN6hdNC1IGQZfVI707dh9DPRc vídeos de KDAB] | |
− | |||
− | + | == 20210112 (QML, 3h presencial) == | |
+ | [https://qmlbook.github.io/ 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 | |
− | |||
− | + | [https://binefa.cat/dam2021/20210112_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) == |
− | [http:// | + | A partir dels [http://zetcode.com/gui/qtquick/ exemples en QML d'en Jan Bodnar] fem servir el Qt Creator per a executar-los. |
− | [https://binefa.cat/dam2021/ | + | [https://binefa.cat/dam2021/20210111_qml/ Exemples treballats avui] |
− | + | == 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) == |
− | [https://binefa.cat/dam2021/ | + | [https://binefa.cat/dam2021/20201218_iot/ Codis d'avui i material d'ajuda per a fer l'exercici] |
− | + | * Mastodon, una alternativa lliure a Twitter | |
− | |||
− | + | No totes les instàncies de [https://ca.wikipedia.org/wiki/Mastodon_(xarxa_social) Mastodon] faciliten la instal·lació de ''bots''. Per a fer els primers passos us recomano aquesta [https://botsin.space/ 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 [https://botsin.space/ botsin.space] amb molta antelació. Si ho sol·liciteu avui mateix no podreu seguir la classe'''). | |
− | |||
− | [https:// | + | [https://botsin.space/@siarq_sensors Exemple de bot de Mastodon] per a fer lectures de sensors cada hora. |
− | [ | + | [https://gist.github.com/aparrish/661fca5ce7b4882a8c6823db12d42d26 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) == | |
+ | [https://binefa.cat/dam2021/20201215_iot/ Alguns codis d'avui] | ||
− | + | === Autenticació d'accés a NodeRED === | |
+ | [https://nodered.org/docs/user-guide/runtime/securing-node-red 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''' === |
− | [https://binefa.cat/ | + | [https://wiki.binefa.cat/index.php?title=Bot_de_Telegram 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 | |
− | + | [https://binefa.cat/training/adtelecom/20201209/ Material per a fer el bot] | |
− | [https://binefa.cat/ | ||
− | |||
− | + | [https://binefa.cat/dam2021/20201215_iot/provantBotTelegram.txt Flux de prova per al bot de Telegram] | |
− | + | === '''Deures pel proper dia''' === | |
− | + | Feu-vos membres d'aquesta instància de Mastodon: [https://botsin.space/ 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) == | |
+ | [https://binefa.cat/dam2021/20201211_qt_iot/notes_1rT_v2.png 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) == |
+ | [https://binefa.cat/dam2021/20201204_qt_iot/notes_1rT.png Notes provisionals del 1r trimestre] | ||
− | + | [https://binefa.cat/dam2021/20201204_qt_iot/20201201_exQt_IoT_01.pdf 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''' == |
− | |||
− | + | [https://binefa.cat/dam2021/20201201_qt_iot_Ex1rT/enunciat/ Enunciat de l'examen del 1r trimestre] | |
− | |||
− | + | [https://binefa.cat/dam2021/20201201_qt_iot_Ex1rT/pr20201201.png Notes provisionals de les pràctiques a 1 de desembre de 2020] | |
− | |||
− | [https://binefa.cat/dam2021/ | ||
− | == | + | == 20201130 (dubtes i Qt, 1h síncrona) == |
− | [https://binefa.cat/dam2021/ | + | [https://binefa.cat/dam2021/20201130_qt_iot/ 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]] |
− | [https://binefa.cat/dam2021/ | + | [https://binefa.cat/dam2021/20201123_qt_iot/ '''Codis d'interacció amb la placa IoT-02 emprant C++ per a Qt, fent servir JSON i MQTT''']. |
− | + | [https://binefa.cat/dam2021/20201124_qt_iot/controlLeds.nodered.txt Codi de flux de NodeRED per a controlar els leds de la placa IoT-02 mitjançant un JSON] | |
− | |||
− | |||
− | [https:// | + | [https://binefa.cat/dam2021/20201124_qt_iot/ledsBotonsBidireccional.nodered.txt Flux de NodeRED emprant MQTT i JSON bidireccional] |
− | [https:// | + | === 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 [https://binefa.cat/dam2021/20201123_qt_iot/14_mqtt_IoT02_02.zip 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]] | |
− | + | [https://binefa.cat/dam2021/20201123_qt_iot/ '''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 | |
− | |||
− | + | [https://binefa.cat/dam2021/20201120_qt_iot/ Codis d'avui] | |
− | [https://binefa.cat/ | + | == 20201117 (Qt i IoT, 3h presencial) == |
+ | [https://binefa.cat/dam2021/20201117_qt_iot/Arduino_JSON.zip Biblioteca '''Arduino_JSON''' per l'IDE d'Arduino] | ||
− | [https://binefa.cat/dam2021/ | + | [https://binefa.cat/dam2021/20201117_qt_iot/ Codis d'avui] |
− | + | 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) == |
− | [https://binefa.cat/dam2021/ | + | [https://binefa.cat/dam2021/20201116_qt_iot/ Codis d'avui] |
− | == | + | === Exercici === |
− | [https:// | + | Modifiqueu el codi de [https://binefa.cat/dam2021/20201116_qt_iot/simpleclient.zip MQTT's simpleclient] per a admetre usuari i contrasenya (podeu fer servir el ''broker'' '''formacio.things.cat''' amb usuari '''ecat''' i contrasenya '''clotClot'''). |
− | [https://binefa.cat/ | + | [https://www.binefa.cat/dam2021/20201116_qt_iot/simpleClient_usrPwd.png Captura de l'exercici a fer] |
= Documentació = | = Documentació = | ||
Línia 301: | Línia 939: | ||
[http://silanus.fr/sin/?p=1194 MQTT avec Qt] | [http://silanus.fr/sin/?p=1194 MQTT avec Qt] | ||
+ | |||
+ | = Planificació = | ||
+ | [[Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2020-2021 de 2n de DAM]] |
Revisió de 17:45, 26 feb 2022
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 20210609 (3h presencial) Avaluació extraordinària
- 4.2 20210528 (2h en línia) Presentació de projectes de 2n de DAM
- 4.3 20210527 (3h en línia) Presentació de projectes de 2n de DAM
- 4.4 20210520 (1h presencial)
- 4.5 20210517 (1h presencial)
- 4.6 20210514 (2h presencial)
- 4.7 20210513 (3h presencial)
- 4.8 20210510 (1h presencial)
- 4.9 20210507 (2h presencial)
- 4.10 20210506 (3h presencial)
- 4.11 20210503 (1h presencial)
- 4.12 20210430 (2h presencial)
- 4.13 20210429 (3h presencial)
- 4.14 20210426 Comença el projecte (1h presencial)
- 4.15 20210423 Darrer dia (2h síncrona)
- 4.16 20210422 Examen (3h presencial)
- 4.17 20210419 (1h presencial)
- 4.18 20210416 (2h presencial)
- 4.19 20210415 (3h presencial)
- 4.20 20210412 (1h presencial)
- 4.21 20210409 (2h síncrona)
- 4.22 20210408 (3h presencial)
- 4.23 20210326 (2h presencial)
- 4.24 20210325 (3h presencial)
- 4.25 20210322 (1h presencial)
- 4.26 20210319 (2h síncrona)
- 4.27 20210318 (3h presencial)
- 4.28 20210315 (1h presencial)
- 4.29 20210312 (2h presencial)
- 4.30 20210311 (3h presencial)
- 4.31 20210308 (1h presencial)
- 4.32 20210305 (2h síncrona)
- 4.33 20210304 (3h presencial)
- 4.34 20210301 (1h presencial)
- 4.35 20210226 (IoT: InfluxDB i Grafana, 2h presencial)
- 4.36 20210225 (Examen final del M07UF1. Part de QML amb IoT, 3h presencial)
- 4.37 20210222 (QML / IoT, 2h síncrona)
- 4.38 20210219 (QML / IoT, 2h síncrona)
- 4.39 20210218 (QML / IoT, 3h presencial)
- 4.40 20210212 (QML, 2h presencial)
- 4.41 20210211 (QML, 3h síncrona)
- 4.42 20210208 (QML, 1h presencial)
- 4.43 20210205 (QML, 2h síncrona)
- 4.44 20210204 (QML, 3h presencial)
- 4.45 20210201 (QML, 1h presencial)
- 4.46 20210129 (QML, 2h presencial)
- 4.47 20210128 (QML, 3h síncrona)
- 4.48 20210125 (QML, 1h presencial)
- 4.49 20210122 (QML, 2h síncrona)
- 4.50 20210121 (QML, 3h presencial)
- 4.51 20210118 (QML, 1h presencial)
- 4.52 20210115 (QML, 1h síncrona)
- 4.53 20210112 (QML, 3h presencial)
- 4.54 20210111 (QML, 1h síncrona)
- 4.55 20201221 (IoT, 1h síncrona)
- 4.56 20201218 (IoT, 1h síncrona)
- 4.57 20201215 (IoT, 3h presencial)
- 4.58 20201211 (Qt i IoT, 1h síncrona)
- 4.59 20201204 (Qt i IoT, 1h síncrona)
- 4.60 20201201 Examen 1r trimestre
- 4.61 20201130 (dubtes i Qt, 1h síncrona)
- 4.62 20201127 (Qt i IoT, 1h síncrona)
- 4.63 20201124 (IoT i Qt) (3h, presencial)
- 4.64 20201123 (Qt i IoT, 1h síncrona)
- 4.65 20201120 (Qt i IoT, 1h síncrona)
- 4.66 20201117 (Qt i IoT, 3h presencial)
- 4.67 20201116 (Qt, 1h síncrona)
- 5 Documentació
- 6 Planificació
Horari a partir del 18 de gener[modifica]
Teleconferència del curs 2020-2021[modifica]
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.
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
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];
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)
20210326 (2h presencial)[modifica]
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)[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)
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
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]
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ó 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[modifica]
- 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[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]
20210211 (QML, 3h síncrona)[modifica]
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]
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]
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]
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]
- 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)[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.
Codis QML dels vídeos de KDAB
qml_02_kdab[modifica]
Ancoratge[modifica]
anchors-centerin-parent-keyword.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.
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
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.
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]
Autenticació d'accés a NodeRED[modifica]
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]
- 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[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]
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
20201117 (Qt i IoT, 3h presencial)[modifica]
Biblioteca Arduino_JSON per l'IDE d'Arduino
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]
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).
Documentació[modifica]
Qt/QML[modifica]
Qt5 de Jan Bodnar
Qt5 Cadaques! A Book about Qt5
Qt Quick tutorial de Jan Bodnar
PyQt5 de Jan Bodnar
Qt for WebAssembly[modifica]
json[modifica]
How To Manipulate JSON With C++ and Qt
QProcess[modifica]
Qt5 tutorial FFmpeg converter using QProcess - 2020
IoT[modifica]
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ó[modifica]
Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2020-2021 de 2n de DAM