Diferència entre revisions de la pàgina «DAM 2021-2022»
m (→20211015) |
m |
||
(Hi ha 237 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 8: | Línia 8: | ||
[https://meet.google.com/wwr-knez-ukp Teleconferència provisional per a compartir pantalla i confinats] | [https://meet.google.com/wwr-knez-ukp Teleconferència provisional per a compartir pantalla i confinats] | ||
− | == | + | == 20220610 '''Examen M07UF1 d'avaluació extraordinària''' == |
− | * UDP | + | [https://www.binefa.cat/dam2122xtra/20220610_exM07Uf1_xtra.pdf Examen en format pdf] |
− | ** | + | |
− | ** NodeRED + | + | [https://www.binefa.cat/dam2122xtra/20220610_exM07Uf1_xtra.zip Material per a fer l'examen] |
+ | |||
+ | == 20220523 '''Presentació del projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220520 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220516 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | == 20220513 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220509 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220506 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220502 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220425 '''Projecte Final''' == | ||
+ | [https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022] | ||
+ | |||
+ | == 20220422 '''Examen ordinària M09UF2, M09UF3 i M15UF1''' (4h) == | ||
+ | [https://recull.binefa.cat/files/20220422_ex/ Notes provisionals de les pràctiques a dia d'avui] | ||
+ | |||
+ | [https://www.binefa.cat/damEx2122/ 20220422_ExOrd_2DAM_M09UF2_M09UF3_M15UF1] | ||
+ | |||
+ | [http://formacio.things.cat/snap/snap.html#open:../codisSnap/elevador.xml Accés directe a l'exemple de l'elevador per Snap!] | ||
+ | |||
+ | [https://www.binefa.cat/damEx2122/IoT-02_mqtt_elevador_Clot.zip Microprogramari per a l'elevador amb la contrasenya WiFi de classe] | ||
+ | |||
+ | == 20220408 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220408/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Fils | ||
+ | |||
+ | * Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20220404 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220404/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | * Nombres de tipus ''float'' a les Qt: | ||
+ | union uFloat{ | ||
+ | float f; | ||
+ | unsigned char uc[4]; | ||
+ | }; | ||
+ | |||
+ | qDebug () << "MIDA D'UN FLOAT: " << sizeof(float); | ||
+ | union uFloat uf1; | ||
+ | uf1.f = 1.2f; | ||
+ | |||
+ | qDebug() << QString("uf1.f: %1").arg(uf1.f); | ||
+ | qDebug() << "uf1.uc[3]: " << '''Qt::hex''' << uf1.uc[3]; // '''Qt::hex''' és per a visulatitzar en hexadecimal el valor de després (''uf1.uc[3]'' al codi). | ||
+ | qDebug() << "uf1.uc[2]: " << Qt::hex << uf1.uc[2]; | ||
+ | qDebug() << "uf1.uc[1]: " << Qt::hex << uf1.uc[1]; | ||
+ | qDebug() << "uf1.uc[0]: " << Qt::hex << uf1.uc[0]; | ||
+ | |||
+ | Sembla que l'ordre hexadecimal és a l'inrevès. podeu fer la prova amb aquest [https://www.binefa.cat/training/codes/js/ieee754/ieee754.html codificador / descodificador IEEE 754 en línia] | ||
+ | |||
+ | == 20220401 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220401/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | === Explicació de formatació de dades per a fer un ''downlink'' LoRaWAN === | ||
+ | [https://recull.binefa.cat/files/20220401/exempleFormatDownlink.json exempleFormatDownlink.json] | ||
+ | |||
+ | === '''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'''] | ||
+ | |||
+ | == 20220328 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220328/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | Codi comentat a classe: | ||
+ | ''fTc = ((float)nTx100_bme()) / 100;'' | ||
+ | json_IoT["T"] = nTx100_bme(); | ||
+ | ''float fRH = ((float)nRHx100_bme()) / 100;'' | ||
+ | json_IoT["RH"] = nRHx100_bme(); | ||
+ | ''float fP = ((float)nPx100_bme()) / 100;'' | ||
+ | json_IoT["P"] = nPx100_bme(); | ||
+ | |||
+ | == 20220325 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220325/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | * Paho Mqtt | ||
+ | |||
+ | === MQTT i Python === | ||
+ | A una cel·la del jupyter-lab: | ||
+ | # pip install paho-mqtt | ||
+ | |||
+ | import random | ||
+ | |||
+ | import paho.mqtt.subscribe as subscribe | ||
+ | import paho.mqtt.client as mqtt | ||
+ | import paho.mqtt.properties as properties | ||
+ | |||
+ | mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999))) | ||
+ | |||
+ | mqttc.connect("broker.emqx.io", 1883) | ||
+ | |||
+ | def on_message(clientId, userdata, message): | ||
+ | msg = str(message.payload.decode("utf-8")) | ||
+ | print('topic = ', message.topic) | ||
+ | print('payload = ', msg) | ||
+ | |||
+ | mqttc.on_message = on_message | ||
+ | mqttc.subscribe('topicName') | ||
+ | |||
+ | A una altra cel·la del jupyter-lab: | ||
+ | mqttc.loop_start() | ||
+ | |||
+ | === MQTT i JS === | ||
+ | [http://formacio.things.cat/mac_IoT-02/ Control de la placa IoT-02 des de client web] | ||
+ | |||
+ | == 20220321 (2h) == | ||
+ | '''Informació important''': Excepcionalment, avui s'acaba la classe a 1/4 de 6 (17.15). La propera classe, M08, començarà a 3/4 de 6 (17.45, no a 1/4 de 7). | ||
+ | |||
+ | [https://recull.binefa.cat/files/20220321/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | === MQTT i Python === | ||
+ | A una cel·la del jupyter-lab: | ||
+ | |||
+ | import paho.mqtt.subscribe as subscribe | ||
+ | import paho.mqtt.client as mqtt | ||
+ | import paho.mqtt.properties as properties | ||
+ | |||
+ | mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999))) | ||
+ | |||
+ | mqttc.connect("broker.emqx.io", 1883) | ||
+ | |||
+ | def on_message(clientId, userdata, message): | ||
+ | msg = str(message.payload.decode("utf-8")) | ||
+ | print('topic = ', message.topic) | ||
+ | print('payload = ', msg) | ||
+ | |||
+ | mqttc.on_message = on_message | ||
+ | mqttc.subscribe('topicName') | ||
+ | |||
+ | A una altra cel·la del jupyter-lab: | ||
+ | mqttc.loop_start() | ||
+ | |||
+ | ==20220318 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220318/ Recull de codis comentats avui] | ||
+ | |||
+ | === InfluxDB v2.0 === | ||
+ | '''Verifiqueu si realment no ho tenia instal·lat ja!''' | ||
+ | |||
+ | * 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 === | ||
+ | '''Verifiqueu si realment no ho tenia instal·lat ja!''' | ||
+ | |||
+ | * En cas de no tenir-ho instal·lat, feu aquesta actrualització de l'aplicació web de visualització de dades a la [https://www.binefa.com/index.php/DAM_2021-2022#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual Actualització de la màquina virtual]. | ||
+ | [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 | ||
+ | |||
+ | === Actualització de la màquina virtual === | ||
+ | '''Verifiqueu si realment no ho tenia instal·lat ja!''' | ||
+ | |||
+ | * [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://www.binefa.cat/IoT/nodeRed/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''' | ||
+ | |||
+ | == 20220314 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220314/ Recull de codis comentats avui] | ||
+ | |||
+ | * Dubtes pendents | ||
+ | |||
+ | * Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | === '''Deures per al proper dia''' === | ||
+ | Porteu una màquina virtual basada en Debian instal·lada al vostre ordinador (Per exemple [http://rebost.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit_v20210304_00.zip aquesta màquina virtual de 22GB]. '''Baixeu-la a casa'''). | ||
+ | |||
+ | L'objectiu d'aquesta màquina virtual és poder treballar amb la base de dades temporal ''InfluxDB'' i el visualitzador de dades ''Grafana''. | ||
+ | |||
+ | == 20220311 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220311/ Recull de codis comentats avui] | ||
+ | |||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | === '''Mastodon''' === | ||
+ | * 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://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] | ||
+ | |||
+ | [[Getting credentials for the Mastodon API with Mastodon.py, step by step]] --> | ||
+ | [[Obtenció de les credencials per a l'API de Mastodon amb Mastodon.py, pas per pas]] | ||
+ | |||
+ | == 20220307 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220307/ Recull de codis comentats avui] | ||
+ | |||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | === 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://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://recull.binefa.cat/files/doc/bots Material per a fer el bot i 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. | ||
+ | |||
+ | == 20220304 '''Examen ordinària''' (4h) == | ||
+ | === 1a Part - QML === | ||
+ | <!-- [http://rebost.binefa.cat/dam2122/m07uf1_Qml/20220304_m07uf1_qml_exOrd.zip 20220304_m07uf1_qml_exOrd.zip] --> | ||
+ | [https://recull.binefa.cat/files/20220304exM07uf1Ord/1aPart-QML/ m07uf1_qml_exOrd] | ||
+ | |||
+ | === 2a Part - Qt === | ||
+ | [https://recull.binefa.cat/files/20220304exM07uf1Ord/2aPart-Qt/ m07uf1_qt_exOrd] | ||
+ | |||
+ | == 20220225 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220225/ Recull de codis comentats avui] | ||
+ | |||
+ | * Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | === Codificació i descodificació en '''base64''' a les Qt === | ||
+ | Exemple [https://recull.binefa.cat/files/20220225/01_json_01.zip '''01_json_01.zip'''] al recull del dia d'avui. (Primer premeu el botó ''Llegiu'' i després el botó ''Escriu'') | ||
+ | |||
+ | ==== Codificació en '''base64''' ==== | ||
+ | '''qsText''' = "2n de DAM"; | ||
+ | ui->lbText->setText('''qsText'''); | ||
+ | ui->lbNum->setText('''qsText.toUtf8().toBase64()'''); | ||
+ | |||
+ | '''qsText''' = "Escola del Clot"; | ||
+ | ui->letext->setText('''qsText'''); | ||
+ | ui->leNum->setText('''qsText.toUtf8().toBase64()'''); | ||
+ | |||
+ | ==== Descodificació des de '''base64''' ==== | ||
+ | QByteArray '''qbaCodificat''' = qjoL["base64"].toString().toLatin1(); | ||
+ | |||
+ | QString '''qsDescodificat''' = QByteArray::fromBase64('''qbaCodificat''', QByteArray::Base64Encoding); | ||
+ | |||
+ | qDebug() << "qjoL[\"base64\"].toString(): " << qjoL["base64"].toString() | ||
+ | << " --> descodificat en base64 --> " << '''qsDescodificat'''; | ||
+ | |||
+ | === Lectura del valors presents a un QByteArray === | ||
+ | QByteArray qba = "123"; | ||
+ | |||
+ | for(int i = 0; i < qba.length(); i++){ | ||
+ | char cC = qba.at(i); | ||
+ | qDebug() << QString("0x%1").arg(uint8_t(cC), 0, 16); | ||
+ | //qDebug() << QString("%1").arg(uint8_t(cC), 0, 10); | ||
+ | } | ||
+ | |||
+ | === Float a 4 bytes i 4 bytes a float en C === | ||
+ | [https://recull.binefa.cat/files/20220225/float2bytes2float.c float2bytes2float.c] | ||
+ | |||
+ | === Float a 4 bytes i 4 bytes a float en Qt/C++ === | ||
+ | * A l'arxiu .h: | ||
+ | union uFloat{ | ||
+ | float f; | ||
+ | unsigned char uc[4]; | ||
+ | }; | ||
+ | |||
+ | * A l'arxiu .cpp: | ||
+ | union uFloat uFA,uFB; | ||
+ | |||
+ | uFA.f = 3.24f; | ||
+ | qDebug() << "*****************"; | ||
+ | for(int i = 0; i <4; i++){ | ||
+ | qDebug() << QString("0x%1").arg(uint8_t(uFA.uc[i]), 0, 16); | ||
+ | } | ||
+ | qDebug() << "*****************"; | ||
+ | //uFB.uc[0] = 0x29; | ||
+ | uFB.uc[0] = 41; | ||
+ | //uFB.uc[1] = 0x5c; | ||
+ | uFB.uc[1] = 92; | ||
+ | //uFB.uc[2] = 0x4f; | ||
+ | uFB.uc[2] = 79; | ||
+ | //uFB.uc[3] = 0x40; | ||
+ | uFB.uc[3] = 64; | ||
+ | qDebug() << QString("%1").arg(uFB.f); | ||
+ | |||
+ | uFB.uc[0] = 215; | ||
+ | uFB.uc[1] = 215; | ||
+ | uFB.uc[2] = 171; | ||
+ | uFB.uc[3] = 65; | ||
+ | qDebug() << QString("%1").arg(uFB.f); | ||
+ | |||
+ | == 20220221 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220221/ Recull de codis comentats avui] | ||
+ | |||
+ | * Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20220218 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220218/ Recull de codis comentats avui] | ||
+ | |||
+ | * Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | * Codi ''IoT-02-22_ttn-otaa_dam_03_floats_BME280.zip'' que integra LoRaWAN i lectura del sensor BME280. (Desat al recull d'avui) | ||
+ | |||
+ | == 20220214 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220214/ Recull de codis comentats avui] | ||
+ | |||
+ | * Downlink LoRaWAN OTAA | ||
+ | |||
+ | * [https://www.binefa.com/index.php/DAM_2021-2022#LoRaWAN_ABP LoRaWAN ABP] | ||
+ | |||
+ | * Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | Exemple de gestió de dos caràcters rebuts a la placa IoT-02: ''gestioCadenaRebudaESP32_00.c'' (al recull d'avui) | ||
+ | |||
+ | == 20220211 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220211/ Recull de codis comentats avui] | ||
+ | |||
+ | * Codi d'ajuda per a fer la pràctica 5 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022#QML|Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | * Downlink LoRaWAN OTAA | ||
+ | |||
+ | * [https://www.binefa.com/index.php/DAM_2021-2022#LoRaWAN_ABP LoRaWAN ABP] | ||
+ | |||
+ | * Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20220207 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220207/ Recull de codis comentats avui] | ||
+ | |||
+ | === Tramesa de nombres reals emprant LoRa === | ||
+ | Ajuda a l'exercici ''Lora-3'' del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]: | ||
+ | |||
+ | * [[Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED]] | ||
+ | |||
+ | === Missatges ''downlink'' LoRaWAN === | ||
+ | * [[Downlink LoRaWAN fent servir TTSv3]] | ||
+ | |||
+ | Nous exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]: Lora-4, Qt-9 i QML-8. | ||
+ | |||
+ | === LoRaWAN '''ABP''' === | ||
+ | Per a fer les pràctiques amb LoRa ABP haurem de desactivar el comptador de trames (cada cop que es reprograma la placa IoT-02 el comptador torna a zero. TTSv3 verifica que el comptatge de trames sigui correcta. Si no es desactiva el comptador de trames semblarà que no es rep la trama). Per a fer-ho, aneu al dispositiu, seleccioneu la pestanya ''General Settings'', premeu el botó ''EXPAND'' a la secció ''Network layer'', desplegueu l'enllaç ''Advanced MAC settings'' i seleccioneu ''Enabled'' a ''Resets frame counters''. Al final deseu els canvis prement el botó ''Save changes''. | ||
+ | |||
+ | [https://www.binefa.cat/training/codes/esp32/lora/IoT-02-23_ttn-abp_dam_01.zip Exemple de microprogramari emprant ABP] | ||
+ | |||
+ | // TTN uses SF9 for its RX2 window. | ||
+ | '''LMIC.dn2Dr = DR_SF9;''' | ||
+ | |||
+ | // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library) | ||
+ | '''LMIC_setDrTxpow(''DR_SF7'', 14);''' | ||
+ | |||
+ | Nou exercici del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]: Lora-5. | ||
+ | |||
+ | == 20220204 (4h) == | ||
+ | [https://recull.binefa.cat/files/20220204/ Recull de codis comentats avui] | ||
+ | |||
+ | Fem els exercicis ''Lora-2'' i ''Lora-3'' del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20220131 (2h) == | ||
+ | Al [https://recull.binefa.cat/files/20220131/ recull del 31 de gener de 2022] teniu un exemple de conversió bidireccional de ''float'' a cadena ''unsigned char'' fent servir ''union''. | ||
+ | |||
+ | Acabem la pràctica 1 de LoRaWAN i comencem la 2 i la 3. | ||
+ | |||
+ | == 20220128 (4h) == | ||
+ | === '''LoRaWAN''' === | ||
+ | [[LoRa 2021-2022]] | ||
+ | |||
+ | ==== LoRaWAN '''OTAA''' ==== | ||
+ | [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#LoRa-1.29 1r exercici de LoRa] al [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | [[LoRa 2020-2021]] | ||
+ | |||
+ | == 20220124 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220124/ Recull d'avui] Captura del conjunt final de control | ||
+ | |||
+ | MqttBasic::~MqttBasic(){ | ||
+ | if (m_client->state() == QMqttClient::Connected) | ||
+ | m_client->disconnectFromHost(); | ||
+ | delete ui; | ||
+ | } | ||
+ | |||
+ | void IndicadorLed::on_cbR_clicked(bool checked){ | ||
+ | vSetLabelColor(ui->lbR,(checked)?Qt::red:Qt::darkRed,Qt::darkRed); | ||
+ | (*qjoJson)["ledR"] = (checked)?1:0; | ||
+ | vActualitzaJson(*qjoJson); | ||
+ | } | ||
+ | |||
+ | void IndicadorLed::vActualitzaJson(QJsonObject qjsObj){ | ||
+ | QString strFromObj = QJsonDocument(qjsObj).toJson(QJsonDocument::Compact).toStdString().c_str(); | ||
+ | ui->etJson->setText(strFromObj); | ||
+ | emit vTrametJsonLeds(strFromObj); | ||
+ | } | ||
+ | |||
+ | == 20220121 (Baixa professor) (2h) == | ||
+ | [https://recull.binefa.cat/files/20220117/ Recull de codis pujats el 17 de gener]. Avui s'han afegit un parell d'exercicis. | ||
+ | |||
+ | === Dades '''JSON''' === | ||
+ | ==== Qt ==== | ||
+ | [https://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html How To Manipulate JSON With C++ and Qt] | ||
+ | |||
+ | Exemple d'us del format JSON a les Qt: '''01_json_00.zip''' del [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | ==== NodeRed ==== | ||
+ | '''json00.nodered.txt''' al [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | ==== ESP32 / placa IoT-02 ==== | ||
+ | Biblioteca '''Arduino_JSON''' al [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari '''IoT-02_mqtt_10_dam.zip''' al [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | === Visualització de formes i colors a etiquetes QLabel === | ||
+ | Visualització de led de color: [https://www.binefa.cat/training/qt/dam/00_botonsToggle05.zip '''00_botonsToggle05.zip'''] ([https://youtu.be/hg_YQht6OjA Vídeo explicatiu del codi 00_botonsToggle05]) i [https://www.binefa.cat/training/qt/dam/00_botonsToggle06.zip '''00_botonsToggle06.zip'''] ([https://youtu.be/fymZUDARnK8 Vídeo explicatiu del codi 00_botonsToggle06]) | ||
+ | |||
+ | Visualització d'un botó físic: '''04_indicadorBotons00.zip''' del [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | === Exercicis === | ||
+ | Resoldre els exercicis [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Qt-3.29 Qt-3, Qt-4, Qt-5, Qt-6 i Qt-7] | ||
+ | |||
+ | == 20220117 (2h) == | ||
+ | [https://recull.binefa.cat/files/20220117/ Recull de codis comentats avui] | ||
+ | |||
+ | === Dades '''JSON''' === | ||
+ | ==== Qt ==== | ||
+ | [https://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html How To Manipulate JSON With C++ and Qt] | ||
+ | |||
+ | Exemple d'us del format JSON a les Qt: '''01_json_00.zip''' del [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | ==== NodeRed ==== | ||
+ | '''json00.nodered.txt''' al [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | ==== ESP32 / placa IoT-02 ==== | ||
+ | Biblioteca '''Arduino_JSON''' al [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari '''IoT-02_mqtt_10_dam.zip''' al [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | === Visualització de formes i colors a etiquetes QLabel === | ||
+ | Visualització de led de color: [https://www.binefa.cat/training/qt/dam/00_botonsToggle05.zip '''00_botonsToggle05.zip'''] ([https://youtu.be/hg_YQht6OjA Vídeo explicatiu del codi 00_botonsToggle05]) i [https://www.binefa.cat/training/qt/dam/00_botonsToggle06.zip '''00_botonsToggle06.zip'''] ([https://youtu.be/fymZUDARnK8 Vídeo explicatiu del codi 00_botonsToggle06]) | ||
+ | |||
+ | Visualització d'un botó físic: '''04_indicadorBotons00.zip''' del [https://recull.binefa.cat/files/20220117/ recull] | ||
+ | |||
+ | === Exercicis === | ||
+ | Resoldre els exercicis [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Qt-3.29 Qt-3, Qt-4 i Qt-5] | ||
+ | |||
+ | == 20220114 (Baixa professor) (4h) == | ||
+ | Al [https://recull.binefa.cat/files/notes/ recull provisional de notes] podeu consultar l'avaluació de les pràctiques que m'heu fet arribar. En cas de no estar al dia, feu l'esforç de posar-vos-hi avui (un cop finalitzeu les tasques encomanades per cada bloc de dues hores, que són prioritàries). | ||
+ | |||
+ | === IoT (1r bloc) === | ||
+ | '''Pugeu la pràctica a la carpeta compartida'''. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica. | ||
+ | |||
+ | Per a fer aquesta pràctica, el professor posarà en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils '''tan sols pot ser a 2,4GHz''' i no a 5GHz. Una eina Android que us pot ajudar és [https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer&hl=es&gl=US WiFiAnalyzer]. | ||
+ | |||
+ | A la placa IoT-02 implementeu l'exercici [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Servint_p.C3.A0gina_web_per_a_canviar_contrasenya Servint pàgina web per a canviar contrasenya] ('''hi ha 4 apartats'''). | ||
+ | |||
+ | === Qt / QML (2n bloc) === | ||
+ | '''Pugeu la pràctica a la carpeta compartida'''. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica. | ||
+ | |||
+ | A la carpeta d'[https://recull.binefa.cat/files/examensAntics/ exàmens antics del recull] hi teniu '''material_20210225ex_M07UF1.zip''' amb material per a fer un examen del curs passat (en .pdf i en .odt per a que pugueu fer el vostre document. I arxius .zip que us ajudaran a resoldre-ho). | ||
+ | |||
+ | == 20220110 (Baixa professor) (2h) == | ||
+ | === IoT === | ||
+ | Per a fer aquesta pràctica, podeu demanar al professor que posi en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils '''tan sols pot ser a 2,4GHz''' i no a 5GHz. Una eina Android que us pot ajudar és [https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer&hl=es&gl=US WiFiAnalyzer]. | ||
+ | |||
+ | A la placa IoT-02 implementeu l'exercici [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Servint_p.C3.A0gina_web_per_a_canviar_contrasenya Servint pàgina web per a canviar contrasenya] | ||
+ | |||
+ | == 20211217 (4h) == | ||
+ | [https://recull.binefa.cat/files/20211217/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | * 1a hora | ||
+ | |||
+ | - Hem plantejat l'exercici 5 del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | - Hem repassat [https://recull.binefa.cat/files/20211217/ codis introductoris de QML] | ||
+ | |||
+ | - Seguim acabant el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | - Per a l'exercici Qt-2c del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] hem vist que per a maximitzar el giny en execució es pot posar al constructor: | ||
+ | |||
+ | showMaximized(); | ||
+ | |||
+ | - Anul·lat l'exercici Qt-2d (degut que a les noves versions els ginys dels contenidors no són seleccionables) | ||
+ | |||
+ | * 2a hora | ||
+ | |||
+ | - Seguim acabant el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20211213 (2h) == | ||
+ | [https://recull.binefa.cat/files/20211213/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | * Integreu les Qt amb l'SDK i l'NDK de l'Android Studio que teniu instal·lat. Feu una prova de funcionament amb el vostre mòbil, real o emulat. Exercici '''Qt-2''' del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | * Fem revisió del contingut a les carpetes compartides. | ||
+ | |||
+ | * Anem acabant els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20211210 (4h) == | ||
+ | [https://recull.binefa.cat/files/20211210/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | Fem revisió del contingut a les carpetes compartides. | ||
+ | |||
+ | Anem acabant els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | == 20211203 (4h) == | ||
+ | [https://recull.binefa.cat/files/20211203/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === IoT === | ||
+ | ==== Wokwi ==== | ||
+ | Aneu a aquest [https://wokwi.com/arduino/projects/316434364352168512 projecte de wokwi] i canvieu el codi ''sketch.ino'' pel que hi ha al recull de codis d'avui. Canvieu el text de ''ClientID'' per a que sigui únic. | ||
+ | |||
+ | Obriu ''minimMqttSnap.xml'', que hi ha al recull de codis d'avui, a un [http://extensions.snap.berkeley.edu/snap/snap.html Snap! sense SSL] (recordeu activar les extensions per a JavaScript) | ||
+ | |||
+ | ==== UserLAnd ==== | ||
+ | Instal·leu-vos l'aplicació [https://userland.tech/ UserLAnd] al vostre telèfon mòbil (present a Google Play i aviat a App Store). Si no teniu mòbil disponible, feu servir un emulador d'Android. | ||
+ | |||
+ | Connecteu el vostre mòbil, real o emulat, a la xarxa sense fils per a IoT i poseu en marxa l'aplicació. Un cop a dins, instal·leu-vos un Debian (80MB). Us demanarà un nom d'usuari i contrasenya. Feu una instal·lació que permeti veure al navegador del vostre ordinador un NodeRED executant-se des del mòbil. | ||
+ | |||
+ | Per a fer-ho: | ||
+ | |||
+ | sudo apt update | ||
+ | sudo apt upgrade | ||
+ | sudo apt install aptitude openssh-server net-tools curl software-properties-common wget unzip screen | ||
+ | A partir d'ara us podeu connectar remotament per SSH fent servir el '''port 2022''' ( ''ssh usuari@ipMobil -p 2022'' o ''ssh -o ServerAliveInterval=30 usuari@ipMobil -p 2022'' per a que hi hagi persistència en la comunicació) | ||
+ | mkdir bin | ||
+ | cd bin | ||
+ | curl -sL https://deb.nodesource.com/setup_14.x | sudo bash - | ||
+ | sudo apt-get install -y nodejs | ||
+ | node -v | ||
+ | npm -v | ||
+ | mkdir nodered-ui | ||
+ | cd nodered-ui | ||
+ | wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip | ||
+ | unzip node_red_ui.zip | ||
+ | screen | ||
+ | node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json | ||
+ | Premeu '''Ctrl A''' + '''D'''. I per a tornar a ''screen'' funcionant des del rerefons: | ||
+ | screen -r | ||
+ | |||
+ | === Qt i QML === | ||
+ | Seguim desenvolupant la pràctica 1 de Qt i l'exercici 4 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]. | ||
+ | |||
+ | == 20211129 (2h) == | ||
+ | [https://recull.binefa.cat/files/20211129/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === Qt === | ||
+ | Seguim desenvolupant la pràctica 1 del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]. | ||
+ | |||
+ | === Connectant Qt i QML === | ||
+ | Exercici 4 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]. | ||
+ | |||
+ | A '''qmlLliscant_02.zip''', traieu les cometes dobles de: | ||
+ | font.bold: '''"true"''' | ||
+ | per a deixar-ho així: | ||
+ | font.bold: '''true''' | ||
+ | |||
+ | |||
+ | * Modificacions (arxiu '''01_qmlLliscant_10.zip''' actualitzat al recull d'avui): | ||
+ | |||
+ | A '''Lliscant01Form.ui.qml''': | ||
+ | Item { | ||
+ | id: element | ||
+ | width: 400 | ||
+ | height: 400 | ||
+ | property alias text1: text1 | ||
+ | property alias progressBar: progressBar | ||
+ | |||
+ | ProgressBar { | ||
+ | id: progressBar | ||
+ | y: 189 | ||
+ | '''value: 0.5''' | ||
+ | '''//maximumValue: 100''' | ||
+ | anchors.right: parent.right | ||
+ | anchors.rightMargin: 20 | ||
+ | anchors.left: parent.left | ||
+ | anchors.leftMargin: 20 | ||
+ | } | ||
+ | |||
+ | A '''main.qml''': | ||
− | + | ApplicationWindow { | |
− | + | visible: true | |
+ | width: 640 | ||
+ | height: 480 | ||
+ | title: qsTr("Exemple Lliscant") | ||
+ | RereFons{ | ||
+ | id: rf | ||
+ | |||
+ | onCmptChanged: { | ||
+ | console.log(nCmpt); | ||
+ | swipeView.actualitzaBarraDeProgres(nCmpt); | ||
+ | } | ||
+ | } | ||
+ | SwipeView{ | ||
+ | id: swipeView | ||
+ | anchors.fill: parent | ||
+ | currentIndex: tabBar.currentIndex | ||
+ | |||
+ | function actualitzaBarraDeProgres(n){ | ||
+ | '''l01.progressBar.value = n/100;''' | ||
+ | l01.text1.text = n; // canvieu element1 per text1 a l'editor QML | ||
+ | } | ||
+ | |||
+ | Lliscant00Form{ | ||
+ | botoTramet.onClicked: { | ||
+ | console.log(textInputTE.text) | ||
+ | rf.szCadena = textInputTE.text; | ||
+ | } | ||
+ | } | ||
+ | Lliscant01Form{ | ||
+ | id: l01 | ||
+ | } | ||
+ | } | ||
− | == | + | == 20211126 (4h) == |
− | [https://recull.binefa.cat/files/ | + | [https://recull.binefa.cat/files/20211126/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' |
=== Qt === | === Qt === | ||
− | Seguim amb la | + | Seguim desenvolupant la pràctica 1 del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]. |
+ | |||
+ | === Connectant Qt i QML === | ||
+ | Exercici 4 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]. | ||
+ | |||
+ | == 20211122 (2h) == | ||
+ | [https://recull.binefa.cat/files/20211122/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | Primer exercici de Qt al [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]. | ||
+ | |||
+ | Conceptes nous: | ||
+ | |||
+ | * [https://stackoverflow.com/questions/2749798/qlabel-set-color-of-text-and-background QLabel a color] | ||
+ | |||
+ | QLabel* pLabel = new QLabel; | ||
+ | pLabel->setStyleSheet("QLabel { background-color : red; color : blue; }"); | ||
+ | |||
+ | * ''Radio buttons'' (Han de ser agrupats en contenidors. Per exemple: ''Group Box'' o ''Frame'') | ||
+ | |||
+ | * ''QTimer'' (Temporitzador que quan es desborda emet un senyal ''timeout()'' i s'ha de connectar a una osca) | ||
+ | |||
+ | == 20211119 (4h) == | ||
+ | [https://forum.qt.io/topic/61134/trying-to-link-with-openssl-libraries-in-windows OpenSSL Windows] | ||
+ | |||
+ | === '''MQTTS i Qt''' === | ||
+ | Evolució de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT. Analitzem '''contenidor_03.zip''' que permet la connexió '''MQTTS'''. | ||
+ | |||
+ | Provem aquest codi que funciona amb MQTTS emprant [http://extensions.snap.berkeley.edu/snap/snap.html#open:http://raw.githubusercontent.com/pixavier/mqtt4snap/master/HelloWorld_NoSSL.xml l'exemple HelloWorld_NoSSL.xml a Snap!] ('''Recordeu activar javaScript extensions'''). Paràmetres a canviar: | ||
+ | |||
+ | Servidor (''Broker''): ''iot.electronics.cat:9001'' | ||
+ | Usuari: ''ecat'' | ||
+ | Contrasenya: ''clotClot'' | ||
+ | Tema de subscripció: ''/ledW'' | ||
+ | Tema de publicació: ''/provaDAM'' | ||
+ | |||
+ | Conceptes nous: | ||
+ | * Certificats TLS (''ca.crt'') | ||
+ | |||
+ | * Arxiu de recursos ''.qrc'' (ens permet introduir fitxers dins del projecte per a que hi siguin dins de l'executable, sense haver de llegir-los a una ruta externa. Molt convenient per a projectes emprant Android) | ||
+ | |||
+ | [https://recull.binefa.cat/files/20211119/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | <!-- openssl x509 -in mosquitto.org.crt -text -noout --> | ||
+ | |||
+ | === QML === | ||
+ | |||
+ | [https://zetcode.com/gui/qtquick/ Qt Quick tutorial] | ||
+ | |||
+ | [https://qmlbook.github.io/ A Book about Qt5] | ||
+ | |||
+ | [[Introducció al QML. Curs 2021-2022]] | ||
+ | |||
+ | == 20211115 (2h) == | ||
+ | Desenvolupament de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT | ||
+ | |||
+ | [https://recull.binefa.cat/files/20211115/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | [[Introducció al QML. Curs 2021-2022]] | ||
+ | |||
+ | == 20211112 (4h) == | ||
+ | [https://recull.binefa.cat/files/20211112/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === Control de la placa IoT-02 emprant QtMqtt === | ||
+ | Amb l'exemple [https://doc.qt.io/qt-6/qtmqtt-simpleclient-example.html Simple MQTT Client Example] provem la connectivitat amb el broker per defecte (amb usuari i contrasenya, que teniu a la màquina virtual) i la connectivitat amb el broker públic de test [https://test.mosquitto.org/ mosquitto] (sense usuari mi contrasenya). | ||
+ | |||
+ | Cal modificar el codi del microprogramari de la placa IoT-02 per a que el ''broker'' de test ''broker.emqx.io'' d'[https://www.emqx.io/ EMQ X]. Modifiqueu també el ''broker'' a l'exemple [https://doc.qt.io/qt-6/qtmqtt-simpleclient-example.html Simple MQTT Client Example] i feu subscripcions al vostre botó i35 de la placa IoT-02. | ||
+ | |||
+ | const char* mqtt_server = "broker.emqx.io"; | ||
+ | const int mqtt_port = 1883; | ||
+ | const char* mqtt_user = ""; | ||
+ | const char* mqtt_password = ""; | ||
+ | |||
+ | Proveu-lo també a aquest [http://extensions.snap.berkeley.edu/snap/snap.html#open:http://raw.githubusercontent.com/pixavier/mqtt4snap/master/HelloWorld_NoSSL.xml codi amb sòcols web MQTT d'Snap!] | ||
+ | |||
+ | Amb l'exemple [https://doc.qt.io/qt-6/qtmqtt-quicksubscription-example.html Quick MQTT Example] provem també la connectivitat amb un broker públic de test (sense usuari mi contrasenya). Teniu els codis ''quicksubscription'' i ''quickpublication'' al [https://recull.binefa.cat/files/20211112/ recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === Introducció al QML === | ||
+ | [[Introducció al QML. Curs 2021-2022]] | ||
+ | |||
+ | [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 | ||
+ | |||
+ | === Instal·lació de la bibloteca QtMqtt a Linux === | ||
+ | |||
+ | cd Qt/6.1.3/gcc_64/lib | ||
+ | git clone git://code.qt.io/qt/qtmqtt.git | ||
+ | cd qtmqtt/ | ||
+ | git checkout 6.1 | ||
+ | rm -r examples/ | ||
+ | |||
+ | Mitjançant el '''Qt Creator''' obriu el projecte /home/jordi/Qt/6.1.3/gcc_64/lib/qtmqtt/'''qtmqtt.pro'''. Aneu al menú i seleccioneu '''Build / Run qmake''' | ||
+ | |||
+ | make | ||
+ | sudo make install | ||
+ | |||
+ | == 20211108 (2h) == | ||
+ | [https://recull.binefa.cat/files/20211108/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === Barra d'estat === | ||
+ | Al recull del dia d'avui hi ha el codi ''principal_03.zip'' que incorpora la gestió de la barra d'estat d'un ''QMainWindow'' | ||
+ | |||
+ | === Ús de les màquines virtuals === | ||
+ | Posem en marxa la màquina virtual amb Debian 11: | ||
+ | |||
+ | * Posem en marxa el projecte d'exemple MQTT ''simpleClient'' | ||
+ | |||
+ | * Executem sobre Android un projecte Qt | ||
+ | |||
+ | == 20211105 (4h) == | ||
+ | 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_v20210304_00.zip'' de 23,7 GB) al directori ''maquinesVirtuals/Android_i_Qt'' | ||
+ | |||
+ | === Màquina virtual amb emulador per a Android === | ||
+ | [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] | ||
+ | |||
+ | É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''. | ||
+ | |||
+ | === qtMqtt === | ||
+ | |||
+ | [https://code.qt.io/cgit/qt/qtmqtt.git/ qtMqtt oficial] | ||
+ | |||
+ | Feu un git clone i especifiqueu la versió amb un ''git checkout 6.0''. Després: | ||
+ | cd qmqtt | ||
+ | mkdir build | ||
+ | cd build | ||
+ | qmake -r .. | ||
+ | make | ||
+ | sudo make install | ||
+ | |||
+ | '''Instal·lació a Windows''' | ||
+ | |||
+ | - Si no teniu el llenguatge ''perl'' instal·lat, [https://strawberryperl.com/ instal·leu ''perl''] | ||
+ | |||
+ | - Obriu el CMD amb les variables d'entorn de les Qt6 | ||
+ | |||
+ | git clone git://code.qt.io/qt/qtmqtt.git | ||
+ | cd qmqtt | ||
+ | git checkout 6.1 | ||
+ | mkdir build | ||
+ | cd build | ||
+ | qmake -r .. | ||
+ | mingw32-make | ||
+ | mingw32-make install | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | == 20211029 (4h) == | ||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | 1a) Feu un nou programa anomenat '''ginyCompost02''', a partir de l'anterior codi. Heu de posar un nou giny de botons a la dreta del giny de text. Quedaran tres ginys: Botons - Text - Botons. | ||
+ | |||
+ | 1b) Feu que '''ginyCompost02''' tingui també connectades els senyals i les osques del nou giny. | ||
+ | |||
+ | == 20211025 (2h) == | ||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | Pràctica amb MQTT (sense la S d'MQTTS). Heu de fer servir el port TCP 1883 i amb sócols web el port 9001 ( formacio.things.cat ) amb usuari ''ecat'' i contrasenya ''clotClot''. | ||
+ | |||
+ | [https://github.com/jordibinefa/ms-drivers-and-tools/blob/master/certToArduino_01.py Codi en python per a truaduir el text d'un certificat a codi encastable a l'IDE d'Arduino] | ||
+ | |||
+ | [[MQTT-Dash. Control del relé de enclavamiento y lectura de la LDR]] | ||
+ | |||
+ | * Pràctica amb MQTTS: | ||
+ | |||
+ | - Microprogramari amb MQTTS a la placa IoT-02 | ||
+ | |||
+ | - Connexió mitjançant sòcols web (9001) a un [http://extensions.snap.berkeley.edu/snap/snap.html Snap! sense SSL]. I vam provar mqttSnap.xml. | ||
+ | |||
+ | - Connexió mitjançant NodeRED. Encenem i apaguem un led. Grafiquem el nivell de llum mitjançant el sensor LDR. | ||
+ | |||
+ | - [https://play.google.com/store/apps/details?id=net.routix.mqttdash&hl=es_419&gl=US Aplicació d'Android MQTT Dash] | ||
+ | |||
+ | * Pràctica amb MQTT: | ||
+ | |||
+ | Ha de ser el mateix que la pràctica anterior fent servir MQTT en comptes d'MQTTS. | ||
+ | |||
+ | == 20211021 (4h) == | ||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | Al codi mqttSnap.xml heu d'afegir una cancel·lació de subscripció un cop rebeu la vostra MAC. | ||
+ | |||
+ | [https://recull.binefa.cat/files/20211022/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === IoT === | ||
+ | Introducció als protocols TCP MQTT i MQTTS. | ||
+ | |||
+ | [https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ ¿Qué es MQTT? Su importancia como protocolo IoT] | ||
+ | |||
+ | [https://wiki.binefa.cat/index.php?title=MQTT_i_MQTTS Més informació sobre MQTT i MQTTS] | ||
+ | |||
+ | ==== Adreces comentades a classe ==== | ||
+ | |||
+ | [https://mosquitto.org/ El broker gratuït més famós] | ||
+ | |||
+ | [https://test.mosquitto.org/ Ports emprats per ''mosquitto''] | ||
+ | |||
+ | [https://github.com/pixavier/mqtt4snap mqtt4snap] Fet per en Xavier Pi | ||
+ | |||
+ | [https://www.emqx.io/ ''Broker'' MQTT] que permet fer balanceig de servei de franc | ||
+ | |||
+ | [https://snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/pixavier/mqtt4snap/master/HelloWorld.xml Exemple ''Hola món'' amb Snap! amb SSL] Cal activar a la rodeta d'engranatge l'opció '''JavaScript extensions''' | ||
+ | |||
+ | [http://extensions.snap.berkeley.edu/snap/snap.html Snap! sense certificat SSL] Cal activar a la rodeta d'engranatge l'opció '''JavaScript extensions''' | ||
− | == | + | == 20211018 (2h) == |
− | + | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | |
− | + | === Pseudoservidor UDP === | |
+ | [https://youtu.be/lKNdgHVRal0 Pseudoservidor UDP emprant Qt5 (1/2)] | ||
− | + | [https://youtu.be/ElYaaytNb0s Pseudoservidor UDP emprant Qt5 (2/2)] | |
− | * | + | == 20211015 (4h) == |
+ | * UDP | ||
+ | ** Al NodeRED | ||
+ | ** NodeRED + Placa IoT-02 | ||
− | + | Avui hem aconseguit controlar des del mòbil (tauler de control del NodeRED amb dos botons) l'estat del led blanc de la placa IoT-02. | |
=== IoT === | === IoT === | ||
Línia 38: | Línia 1.072: | ||
[https://www.ionos.es/digitalguide/servidores/know-how/udp-user-datagram-protocol/ UDP: Què és el protocol UDP?] | [https://www.ionos.es/digitalguide/servidores/know-how/udp-user-datagram-protocol/ UDP: Què és el protocol UDP?] | ||
− | [https://binefa.cat/training/upcSchool/20200516/IoT-02_wifi_04_udp.zip Microprogramari que implementa el protocol UDP per a la placa IoT-02]. | + | [https://www.binefa.cat/training/upcSchool/20200516/IoT-02_wifi_04_udp.zip Microprogramari que implementa el protocol UDP per a la placa IoT-02]. |
unsigned int udpPortRx = 3334; | unsigned int udpPortRx = 3334; | ||
Línia 46: | Línia 1.080: | ||
[[Image:04wifiUdp.png|center|04_wifiUdp]] | [[Image:04wifiUdp.png|center|04_wifiUdp]] | ||
− | [https://binefa.cat/training/upcSchool/20200516/IoT-02_wifi_04_udp.nodered.txt Codi per a importar al NodeRED fent servir el protocolo UDP]. El port de recepció de l'ordinador (3333) ha de ser el de transmissió a la placa, i el de recepció a la placa (3334) ha de ser el de transmissió de l'ordinador. | + | [https://www.binefa.cat/training/upcSchool/20200516/IoT-02_wifi_04_udp.nodered.txt Codi per a importar al NodeRED fent servir el protocolo UDP]. El port de recepció de l'ordinador (3333) ha de ser el de transmissió a la placa, i el de recepció a la placa (3334) ha de ser el de transmissió de l'ordinador. |
Port Rx = 3333 | Port Rx = 3333 | ||
Port Tx = 3334 | Port Tx = 3334 | ||
− | == 20211008 == | + | === Qt === |
+ | * Concepte '''senyal / osca''' (''signal / slot'') | ||
+ | [https://recull.binefa.cat/files/20211015/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | == 20211011 (2h) == | ||
+ | [https://recull.binefa.cat/files/20211011/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
+ | |||
+ | === Qt === | ||
+ | Seguim amb la introducció a les Qt. | ||
+ | |||
+ | ==== Exercici 02_mesMenys ==== | ||
+ | Desenvolupeu una aplicació gràfica d'usuari, anomenada '''02_mesMenys''' amb la classe '''GinyMesMenys''' filla de QWidget, amb tres ginys encastats: | ||
+ | |||
+ | * Botó '''botoMes''' amb el signe '''+'''. Incrementa el valor de l'atribut privat '''nN''' | ||
+ | |||
+ | * Botó '''botoMenys''' amb el signe '''-'''. Decrementa el valor de l'atribut privat '''nN''' | ||
+ | |||
+ | * Etiqueta '''etNum''' que presenta el valor de l'atribut privat '''nN''' | ||
+ | |||
+ | [[Image:GinyMesMenys.png|center|GinyMesMenys]] | ||
+ | |||
+ | == 20211008 (4h) == | ||
[https://recull.binefa.cat/files/20211008/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | [https://recull.binefa.cat/files/20211008/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122'' | ||
Introducció a les Qt | Introducció a les Qt | ||
− | == 20211004 == | + | == 20211004 (2h) == |
Prova amb les plaques IoT-02 | Prova amb les plaques IoT-02 | ||
JESUITES_FP - educanet01 | JESUITES_FP - educanet01 | ||
− | == 20211001 == | + | == 20211001 (4h) == |
[https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui] | [https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui] | ||
Línia 71: | Línia 1.126: | ||
'''Heu de dur a classe una font d'alimentació ''microUSB''''', o un cable de connexió ''microUSB'' per connectar a l'ordinador. Tingueu en compte que us caldrà una altra boca per a connectar el cable ''miniUSB'' que us serà subministrat per a programar la placa IoT-02. | '''Heu de dur a classe una font d'alimentació ''microUSB''''', o un cable de connexió ''microUSB'' per connectar a l'ordinador. Tingueu en compte que us caldrà una altra boca per a connectar el cable ''miniUSB'' que us serà subministrat per a programar la placa IoT-02. | ||
− | == 20210927 == | + | == 20210927 (2h) == |
[https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui] | [https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui] | ||
Línia 86: | Línia 1.141: | ||
[[Placa IoT-02]] | [[Placa IoT-02]] | ||
− | [https://nodejs.org/en/download/ Instal·lació de Node.js] | + | [https://nodejs.org/en/download/ Instal·lació de Node.js] [https://tecadmin.net/install-latest-nodejs-npm-on-debian/ Guia d'instal·lació de node i npm] |
Verificació: | Verificació: | ||
Línia 101: | Línia 1.156: | ||
ecat@iot-ecat:~/bin/nodered-ui$ '''unzip 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''' | 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''' | ||
+ | |||
+ | Si hi ha problemes de confiança amb el certificat al descarrega l'arxiu .zip, hi podeu afegir l'opció '''--no-check-certificate''': | ||
+ | |||
+ | wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip | ||
= Repositori de codis fet a classe durant el curs = | = Repositori de codis fet a classe durant el curs = | ||
Línia 106: | Línia 1.165: | ||
= Documentació = | = Documentació = | ||
+ | [[Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2021-2022 de 2n de DAM]] | ||
+ | |||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
== Qt/QML == | == Qt/QML == | ||
+ | [https://youtu.be/b936UY3YZe4 Activació de l'editor QML al QtCreator 6] | ||
+ | |||
[http://zetcode.com/gui/qt5/ Qt5] de [https://twitter.com/janbodnar Jan Bodnar] | [http://zetcode.com/gui/qt5/ Qt5] de [https://twitter.com/janbodnar Jan Bodnar] | ||
Línia 142: | Línia 1.207: | ||
[http://silanus.fr/sin/?p=1194 MQTT avec Qt] | [http://silanus.fr/sin/?p=1194 MQTT avec Qt] | ||
+ | |||
+ | === '''LoRaWAN''' === | ||
+ | [[LoRa 2021-2022]] | ||
+ | |||
+ | [https://eu1.cloud.thethings.network/ Consola de The Things Stack (Community Edition)] de [https://www.thethingsnetwork.org/ The Things Network] | ||
+ | |||
+ | [https://www.binefa.cat/IoT/lora/lorawan/lorawan01d.pdf Presentació LoRaWAN (esborrany v0.4)] | ||
+ | |||
+ | [https://www.binefa.cat/IoT/05_lorawan_usPractic.pdf Ús pràctic de LoRaWAN TTNv2] | ||
+ | |||
+ | [https://recull.binefa.cat/files/lora/intro/ Recull introductori per a treballar amb LoRa] ( usuari: ''dam'' / contrasenya: ''dam2122'') | ||
+ | |||
+ | [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] | ||
+ | |||
+ | [[Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED]] | ||
+ | |||
+ | [[Downlink LoRaWAN fent servir TTSv3]] |
Revisió de 14:34, 6 set 2022
Quan tingueu les credencials d'accés a la NET heu de compartir-me una carpeta amb aquest nom: 2122-DAM-1rCognom2nCognomNom (Per exemple, si el teu nom és Xavier López Pujol --> 2122-DAM-LopezPujolXavier). A aquest enllaç podreu veure si ja hi sou a la llista:
Carpetes compartides de 2n de DAM. Curs 2021-2022
Contingut
- 1 Algunes classes
- 1.1 20220610 Examen M07UF1 d'avaluació extraordinària
- 1.2 20220523 Presentació del projecte Final
- 1.3 20220520 Projecte Final
- 1.4 20220516 Projecte Final
- 1.5 20220513 Projecte Final
- 1.6 20220509 Projecte Final
- 1.7 20220506 Projecte Final
- 1.8 20220502 Projecte Final
- 1.9 20220425 Projecte Final
- 1.10 20220422 Examen ordinària M09UF2, M09UF3 i M15UF1 (4h)
- 1.11 20220408 (4h)
- 1.12 20220404 (2h)
- 1.13 20220401 (4h)
- 1.14 20220328 (2h)
- 1.15 20220325 (4h)
- 1.16 20220321 (2h)
- 1.17 20220318 (4h)
- 1.18 20220314 (2h)
- 1.19 20220311 (4h)
- 1.20 20220307 (2h)
- 1.21 20220304 Examen ordinària (4h)
- 1.22 20220225 (4h)
- 1.23 20220221 (2h)
- 1.24 20220218 (4h)
- 1.25 20220214 (2h)
- 1.26 20220211 (4h)
- 1.27 20220207 (2h)
- 1.28 20220204 (4h)
- 1.29 20220131 (2h)
- 1.30 20220128 (4h)
- 1.31 20220124 (2h)
- 1.32 20220121 (Baixa professor) (2h)
- 1.33 20220117 (2h)
- 1.34 20220114 (Baixa professor) (4h)
- 1.35 20220110 (Baixa professor) (2h)
- 1.36 20211217 (4h)
- 1.37 20211213 (2h)
- 1.38 20211210 (4h)
- 1.39 20211203 (4h)
- 1.40 20211129 (2h)
- 1.41 20211126 (4h)
- 1.42 20211122 (2h)
- 1.43 20211119 (4h)
- 1.44 20211115 (2h)
- 1.45 20211112 (4h)
- 1.46 20211108 (2h)
- 1.47 20211105 (4h)
- 1.48 20211029 (4h)
- 1.49 20211025 (2h)
- 1.50 20211021 (4h)
- 1.51 20211018 (2h)
- 1.52 20211015 (4h)
- 1.53 20211011 (2h)
- 1.54 20211008 (4h)
- 1.55 20211004 (2h)
- 1.56 20211001 (4h)
- 1.57 20210927 (2h)
- 2 Repositori de codis fet a classe durant el curs
- 3 Documentació
Algunes classes
Teleconferència provisional per a compartir pantalla i confinats
20220610 Examen M07UF1 d'avaluació extraordinària
20220523 Presentació del projecte Final
Relació de projectes DAM 2021-2022
20220520 Projecte Final
Relació de projectes DAM 2021-2022
20220516 Projecte Final
Relació de projectes DAM 2021-2022
20220513 Projecte Final
Relació de projectes DAM 2021-2022
20220509 Projecte Final
Relació de projectes DAM 2021-2022
20220506 Projecte Final
Relació de projectes DAM 2021-2022
20220502 Projecte Final
Relació de projectes DAM 2021-2022
20220425 Projecte Final
Relació de projectes DAM 2021-2022
20220422 Examen ordinària M09UF2, M09UF3 i M15UF1 (4h)
Notes provisionals de les pràctiques a dia d'avui
20220422_ExOrd_2DAM_M09UF2_M09UF3_M15UF1
Accés directe a l'exemple de l'elevador per Snap!
Microprogramari per a l'elevador amb la contrasenya WiFi de classe
20220408 (4h)
Recull de codis comentats avui
- Dubtes pendents
- Fils
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220404 (2h)
Recull de codis comentats avui
- Dubtes pendents
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Nombres de tipus float a les Qt:
union uFloat{ float f; unsigned char uc[4]; };
qDebug () << "MIDA D'UN FLOAT: " << sizeof(float); union uFloat uf1; uf1.f = 1.2f; qDebug() << QString("uf1.f: %1").arg(uf1.f); qDebug() << "uf1.uc[3]: " << Qt::hex << uf1.uc[3]; // Qt::hex és per a visulatitzar en hexadecimal el valor de després (uf1.uc[3] al codi). qDebug() << "uf1.uc[2]: " << Qt::hex << uf1.uc[2]; qDebug() << "uf1.uc[1]: " << Qt::hex << uf1.uc[1]; qDebug() << "uf1.uc[0]: " << Qt::hex << uf1.uc[0];
Sembla que l'ordre hexadecimal és a l'inrevès. podeu fer la prova amb aquest codificador / descodificador IEEE 754 en línia
20220401 (4h)
Recull de codis comentats avui
- Dubtes pendents
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
Explicació de formatació de dades per a fer un downlink LoRaWAN
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
20220328 (2h)
Recull de codis comentats avui
- Dubtes pendents
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
Codi comentat a classe:
fTc = ((float)nTx100_bme()) / 100; json_IoT["T"] = nTx100_bme(); float fRH = ((float)nRHx100_bme()) / 100; json_IoT["RH"] = nRHx100_bme(); float fP = ((float)nPx100_bme()) / 100; json_IoT["P"] = nPx100_bme();
20220325 (4h)
Recull de codis comentats avui
- Dubtes pendents
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Paho Mqtt
MQTT i Python
A una cel·la del jupyter-lab:
# pip install paho-mqtt import random import paho.mqtt.subscribe as subscribe import paho.mqtt.client as mqtt import paho.mqtt.properties as properties mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999))) mqttc.connect("broker.emqx.io", 1883) def on_message(clientId, userdata, message): msg = str(message.payload.decode("utf-8")) print('topic = ', message.topic) print('payload = ', msg) mqttc.on_message = on_message mqttc.subscribe('topicName')
A una altra cel·la del jupyter-lab:
mqttc.loop_start()
MQTT i JS
Control de la placa IoT-02 des de client web
20220321 (2h)
Informació important: Excepcionalment, avui s'acaba la classe a 1/4 de 6 (17.15). La propera classe, M08, començarà a 3/4 de 6 (17.45, no a 1/4 de 7).
Recull de codis comentats avui
- Dubtes pendents
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
MQTT i Python
A una cel·la del jupyter-lab:
import paho.mqtt.subscribe as subscribe import paho.mqtt.client as mqtt import paho.mqtt.properties as properties mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999))) mqttc.connect("broker.emqx.io", 1883) def on_message(clientId, userdata, message): msg = str(message.payload.decode("utf-8")) print('topic = ', message.topic) print('payload = ', msg) mqttc.on_message = on_message mqttc.subscribe('topicName')
A una altra cel·la del jupyter-lab:
mqttc.loop_start()
20220318 (4h)
Recull de codis comentats avui
InfluxDB v2.0
Verifiqueu si realment no ho tenia instal·lat ja!
- 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
Verifiqueu si realment no ho tenia instal·lat ja!
- En cas de no tenir-ho instal·lat, feu aquesta actrualització de l'aplicació web de visualització de dades a la Actualització de la màquina virtual.
- 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
Actualització de la màquina virtual
Verifiqueu si realment no ho tenia instal·lat ja!
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://www.binefa.cat/IoT/nodeRed/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
20220314 (2h)
Recull de codis comentats avui
- Dubtes pendents
- Seguim fent els exercicis pendents del Recull de pràctiques de 2n de DAM. Curs 2021-2022
Deures per al proper dia
Porteu una màquina virtual basada en Debian instal·lada al vostre ordinador (Per exemple aquesta màquina virtual de 22GB. Baixeu-la a casa).
L'objectiu d'aquesta màquina virtual és poder treballar amb la base de dades temporal InfluxDB i el visualitzador de dades Grafana.
20220311 (4h)
Recull de codis comentats avui
Recull de pràctiques de 2n de DAM. Curs 2021-2022
Mastodon
- 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.
Obtenció de les credencials per a l'API de Mastodon amb Mastodon.py, pas per pas
20220307 (2h)
Recull de codis comentats avui
Recull de pràctiques de 2n de DAM. Curs 2021-2022
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
Material per a fer el bot i 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.
20220304 Examen ordinària (4h)
1a Part - QML
2a Part - Qt
20220225 (4h)
Recull de codis comentats avui
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
Codificació i descodificació en base64 a les Qt
Exemple 01_json_01.zip al recull del dia d'avui. (Primer premeu el botó Llegiu i després el botó Escriu)
Codificació en base64
qsText = "2n de DAM"; ui->lbText->setText(qsText); ui->lbNum->setText(qsText.toUtf8().toBase64()); qsText = "Escola del Clot"; ui->letext->setText(qsText); ui->leNum->setText(qsText.toUtf8().toBase64());
Descodificació des de base64
QByteArray qbaCodificat = qjoL["base64"].toString().toLatin1(); QString qsDescodificat = QByteArray::fromBase64(qbaCodificat, QByteArray::Base64Encoding); qDebug() << "qjoL[\"base64\"].toString(): " << qjoL["base64"].toString() << " --> descodificat en base64 --> " << qsDescodificat;
Lectura del valors presents a un QByteArray
QByteArray qba = "123"; for(int i = 0; i < qba.length(); i++){ char cC = qba.at(i); qDebug() << QString("0x%1").arg(uint8_t(cC), 0, 16); //qDebug() << QString("%1").arg(uint8_t(cC), 0, 10); }
Float a 4 bytes i 4 bytes a float en C
Float a 4 bytes i 4 bytes a float en Qt/C++
- A l'arxiu .h:
union uFloat{ float f; unsigned char uc[4]; };
- A l'arxiu .cpp:
union uFloat uFA,uFB; uFA.f = 3.24f; qDebug() << "*****************"; for(int i = 0; i <4; i++){ qDebug() << QString("0x%1").arg(uint8_t(uFA.uc[i]), 0, 16); } qDebug() << "*****************"; //uFB.uc[0] = 0x29; uFB.uc[0] = 41; //uFB.uc[1] = 0x5c; uFB.uc[1] = 92; //uFB.uc[2] = 0x4f; uFB.uc[2] = 79; //uFB.uc[3] = 0x40; uFB.uc[3] = 64; qDebug() << QString("%1").arg(uFB.f); uFB.uc[0] = 215; uFB.uc[1] = 215; uFB.uc[2] = 171; uFB.uc[3] = 65; qDebug() << QString("%1").arg(uFB.f);
20220221 (2h)
Recull de codis comentats avui
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220218 (4h)
Recull de codis comentats avui
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Codi IoT-02-22_ttn-otaa_dam_03_floats_BME280.zip que integra LoRaWAN i lectura del sensor BME280. (Desat al recull d'avui)
20220214 (2h)
Recull de codis comentats avui
- Downlink LoRaWAN OTAA
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
Exemple de gestió de dos caràcters rebuts a la placa IoT-02: gestioCadenaRebudaESP32_00.c (al recull d'avui)
20220211 (4h)
Recull de codis comentats avui
- Codi d'ajuda per a fer la pràctica 5 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Downlink LoRaWAN OTAA
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220207 (2h)
Recull de codis comentats avui
Tramesa de nombres reals emprant LoRa
Ajuda a l'exercici Lora-3 del Recull de pràctiques de 2n de DAM. Curs 2021-2022:
Missatges downlink LoRaWAN
Nous exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022: Lora-4, Qt-9 i QML-8.
LoRaWAN ABP
Per a fer les pràctiques amb LoRa ABP haurem de desactivar el comptador de trames (cada cop que es reprograma la placa IoT-02 el comptador torna a zero. TTSv3 verifica que el comptatge de trames sigui correcta. Si no es desactiva el comptador de trames semblarà que no es rep la trama). Per a fer-ho, aneu al dispositiu, seleccioneu la pestanya General Settings, premeu el botó EXPAND a la secció Network layer, desplegueu l'enllaç Advanced MAC settings i seleccioneu Enabled a Resets frame counters. Al final deseu els canvis prement el botó Save changes.
Exemple de microprogramari emprant ABP
// TTN uses SF9 for its RX2 window. LMIC.dn2Dr = DR_SF9;
// Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library) LMIC_setDrTxpow(DR_SF7, 14);
Nou exercici del Recull de pràctiques de 2n de DAM. Curs 2021-2022: Lora-5.
20220204 (4h)
Recull de codis comentats avui
Fem els exercicis Lora-2 i Lora-3 del Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220131 (2h)
Al recull del 31 de gener de 2022 teniu un exemple de conversió bidireccional de float a cadena unsigned char fent servir union.
Acabem la pràctica 1 de LoRaWAN i comencem la 2 i la 3.
20220128 (4h)
LoRaWAN
LoRaWAN OTAA
1r exercici de LoRa al Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220124 (2h)
Recull d'avui Captura del conjunt final de control
MqttBasic::~MqttBasic(){ if (m_client->state() == QMqttClient::Connected) m_client->disconnectFromHost(); delete ui; }
void IndicadorLed::on_cbR_clicked(bool checked){ vSetLabelColor(ui->lbR,(checked)?Qt::red:Qt::darkRed,Qt::darkRed); (*qjoJson)["ledR"] = (checked)?1:0; vActualitzaJson(*qjoJson); }
void IndicadorLed::vActualitzaJson(QJsonObject qjsObj){ QString strFromObj = QJsonDocument(qjsObj).toJson(QJsonDocument::Compact).toStdString().c_str(); ui->etJson->setText(strFromObj); emit vTrametJsonLeds(strFromObj); }
20220121 (Baixa professor) (2h)
Recull de codis pujats el 17 de gener. Avui s'han afegit un parell d'exercicis.
Dades JSON
Qt
How To Manipulate JSON With C++ and Qt
Exemple d'us del format JSON a les Qt: 01_json_00.zip del recull
NodeRed
json00.nodered.txt al recull
ESP32 / placa IoT-02
Biblioteca Arduino_JSON al recull
Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari IoT-02_mqtt_10_dam.zip al recull
Visualització de formes i colors a etiquetes QLabel
Visualització de led de color: 00_botonsToggle05.zip (Vídeo explicatiu del codi 00_botonsToggle05) i 00_botonsToggle06.zip (Vídeo explicatiu del codi 00_botonsToggle06)
Visualització d'un botó físic: 04_indicadorBotons00.zip del recull
Exercicis
Resoldre els exercicis Qt-3, Qt-4, Qt-5, Qt-6 i Qt-7
20220117 (2h)
Recull de codis comentats avui
Dades JSON
Qt
How To Manipulate JSON With C++ and Qt
Exemple d'us del format JSON a les Qt: 01_json_00.zip del recull
NodeRed
json00.nodered.txt al recull
ESP32 / placa IoT-02
Biblioteca Arduino_JSON al recull
Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari IoT-02_mqtt_10_dam.zip al recull
Visualització de formes i colors a etiquetes QLabel
Visualització de led de color: 00_botonsToggle05.zip (Vídeo explicatiu del codi 00_botonsToggle05) i 00_botonsToggle06.zip (Vídeo explicatiu del codi 00_botonsToggle06)
Visualització d'un botó físic: 04_indicadorBotons00.zip del recull
Exercicis
Resoldre els exercicis Qt-3, Qt-4 i Qt-5
20220114 (Baixa professor) (4h)
Al recull provisional de notes podeu consultar l'avaluació de les pràctiques que m'heu fet arribar. En cas de no estar al dia, feu l'esforç de posar-vos-hi avui (un cop finalitzeu les tasques encomanades per cada bloc de dues hores, que són prioritàries).
IoT (1r bloc)
Pugeu la pràctica a la carpeta compartida. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica.
Per a fer aquesta pràctica, el professor posarà en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils tan sols pot ser a 2,4GHz i no a 5GHz. Una eina Android que us pot ajudar és WiFiAnalyzer.
A la placa IoT-02 implementeu l'exercici Servint pàgina web per a canviar contrasenya (hi ha 4 apartats).
Qt / QML (2n bloc)
Pugeu la pràctica a la carpeta compartida. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica.
A la carpeta d'exàmens antics del recull hi teniu material_20210225ex_M07UF1.zip amb material per a fer un examen del curs passat (en .pdf i en .odt per a que pugueu fer el vostre document. I arxius .zip que us ajudaran a resoldre-ho).
20220110 (Baixa professor) (2h)
IoT
Per a fer aquesta pràctica, podeu demanar al professor que posi en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils tan sols pot ser a 2,4GHz i no a 5GHz. Una eina Android que us pot ajudar és WiFiAnalyzer.
A la placa IoT-02 implementeu l'exercici Servint pàgina web per a canviar contrasenya
20211217 (4h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
- 1a hora
- Hem plantejat l'exercici 5 del Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Hem repassat codis introductoris de QML
- Seguim acabant el Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Per a l'exercici Qt-2c del Recull de pràctiques de 2n de DAM. Curs 2021-2022 hem vist que per a maximitzar el giny en execució es pot posar al constructor:
showMaximized();
- Anul·lat l'exercici Qt-2d (degut que a les noves versions els ginys dels contenidors no són seleccionables)
- 2a hora
- Seguim acabant el Recull de pràctiques de 2n de DAM. Curs 2021-2022
20211213 (2h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
- Integreu les Qt amb l'SDK i l'NDK de l'Android Studio que teniu instal·lat. Feu una prova de funcionament amb el vostre mòbil, real o emulat. Exercici Qt-2 del Recull de pràctiques de 2n de DAM. Curs 2021-2022
- Fem revisió del contingut a les carpetes compartides.
- Anem acabant els exercicis pendents del Recull de pràctiques de 2n de DAM. Curs 2021-2022
20211210 (4h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Fem revisió del contingut a les carpetes compartides.
Anem acabant els exercicis pendents del Recull de pràctiques de 2n de DAM. Curs 2021-2022
20211203 (4h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
IoT
Wokwi
Aneu a aquest projecte de wokwi i canvieu el codi sketch.ino pel que hi ha al recull de codis d'avui. Canvieu el text de ClientID per a que sigui únic.
Obriu minimMqttSnap.xml, que hi ha al recull de codis d'avui, a un Snap! sense SSL (recordeu activar les extensions per a JavaScript)
UserLAnd
Instal·leu-vos l'aplicació UserLAnd al vostre telèfon mòbil (present a Google Play i aviat a App Store). Si no teniu mòbil disponible, feu servir un emulador d'Android.
Connecteu el vostre mòbil, real o emulat, a la xarxa sense fils per a IoT i poseu en marxa l'aplicació. Un cop a dins, instal·leu-vos un Debian (80MB). Us demanarà un nom d'usuari i contrasenya. Feu una instal·lació que permeti veure al navegador del vostre ordinador un NodeRED executant-se des del mòbil.
Per a fer-ho:
sudo apt update sudo apt upgrade sudo apt install aptitude openssh-server net-tools curl software-properties-common wget unzip screen
A partir d'ara us podeu connectar remotament per SSH fent servir el port 2022 ( ssh usuari@ipMobil -p 2022 o ssh -o ServerAliveInterval=30 usuari@ipMobil -p 2022 per a que hi hagi persistència en la comunicació)
mkdir bin cd bin curl -sL https://deb.nodesource.com/setup_14.x | sudo bash - sudo apt-get install -y nodejs node -v npm -v mkdir nodered-ui cd nodered-ui wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip unzip node_red_ui.zip screen node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json
Premeu Ctrl A + D. I per a tornar a screen funcionant des del rerefons:
screen -r
Qt i QML
Seguim desenvolupant la pràctica 1 de Qt i l'exercici 4 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022.
20211129 (2h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Qt
Seguim desenvolupant la pràctica 1 del Recull de pràctiques de 2n de DAM. Curs 2021-2022.
Connectant Qt i QML
Exercici 4 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022.
A qmlLliscant_02.zip, traieu les cometes dobles de:
font.bold: "true"
per a deixar-ho així:
font.bold: true
- Modificacions (arxiu 01_qmlLliscant_10.zip actualitzat al recull d'avui):
A Lliscant01Form.ui.qml:
Item { id: element width: 400 height: 400 property alias text1: text1 property alias progressBar: progressBar ProgressBar { id: progressBar y: 189 value: 0.5 //maximumValue: 100 anchors.right: parent.right anchors.rightMargin: 20 anchors.left: parent.left anchors.leftMargin: 20 }
A main.qml:
ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Exemple Lliscant") RereFons{ id: rf onCmptChanged: { console.log(nCmpt); swipeView.actualitzaBarraDeProgres(nCmpt); } } SwipeView{ id: swipeView anchors.fill: parent currentIndex: tabBar.currentIndex function actualitzaBarraDeProgres(n){ l01.progressBar.value = n/100; l01.text1.text = n; // canvieu element1 per text1 a l'editor QML } Lliscant00Form{ botoTramet.onClicked: { console.log(textInputTE.text) rf.szCadena = textInputTE.text; } } Lliscant01Form{ id: l01 } }
20211126 (4h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Qt
Seguim desenvolupant la pràctica 1 del Recull de pràctiques de 2n de DAM. Curs 2021-2022.
Connectant Qt i QML
Exercici 4 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022.
20211122 (2h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Primer exercici de Qt al Recull de pràctiques de 2n de DAM. Curs 2021-2022.
Conceptes nous:
QLabel* pLabel = new QLabel; pLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");
- Radio buttons (Han de ser agrupats en contenidors. Per exemple: Group Box o Frame)
- QTimer (Temporitzador que quan es desborda emet un senyal timeout() i s'ha de connectar a una osca)
20211119 (4h)
MQTTS i Qt
Evolució de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT. Analitzem contenidor_03.zip que permet la connexió MQTTS.
Provem aquest codi que funciona amb MQTTS emprant l'exemple HelloWorld_NoSSL.xml a Snap! (Recordeu activar javaScript extensions). Paràmetres a canviar:
Servidor (Broker): iot.electronics.cat:9001 Usuari: ecat Contrasenya: clotClot Tema de subscripció: /ledW Tema de publicació: /provaDAM
Conceptes nous:
- Certificats TLS (ca.crt)
- Arxiu de recursos .qrc (ens permet introduir fitxers dins del projecte per a que hi siguin dins de l'executable, sense haver de llegir-los a una ruta externa. Molt convenient per a projectes emprant Android)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
QML
Introducció al QML. Curs 2021-2022
20211115 (2h)
Desenvolupament de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Introducció al QML. Curs 2021-2022
20211112 (4h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Control de la placa IoT-02 emprant QtMqtt
Amb l'exemple Simple MQTT Client Example provem la connectivitat amb el broker per defecte (amb usuari i contrasenya, que teniu a la màquina virtual) i la connectivitat amb el broker públic de test mosquitto (sense usuari mi contrasenya).
Cal modificar el codi del microprogramari de la placa IoT-02 per a que el broker de test broker.emqx.io d'EMQ X. Modifiqueu també el broker a l'exemple Simple MQTT Client Example i feu subscripcions al vostre botó i35 de la placa IoT-02.
const char* mqtt_server = "broker.emqx.io"; const int mqtt_port = 1883; const char* mqtt_user = ""; const char* mqtt_password = "";
Proveu-lo també a aquest codi amb sòcols web MQTT d'Snap!
Amb l'exemple Quick MQTT Example provem també la connectivitat amb un broker públic de test (sense usuari mi contrasenya). Teniu els codis quicksubscription i quickpublication al recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Introducció al QML
Introducció al QML. Curs 2021-2022
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
Instal·lació de la bibloteca QtMqtt a Linux
cd Qt/6.1.3/gcc_64/lib git clone git://code.qt.io/qt/qtmqtt.git cd qtmqtt/ git checkout 6.1 rm -r examples/
Mitjançant el Qt Creator obriu el projecte /home/jordi/Qt/6.1.3/gcc_64/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake
make sudo make install
20211108 (2h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Barra d'estat
Al recull del dia d'avui hi ha el codi principal_03.zip que incorpora la gestió de la barra d'estat d'un QMainWindow
Ús de les màquines virtuals
Posem en marxa la màquina virtual amb Debian 11:
- Posem en marxa el projecte d'exemple MQTT simpleClient
- Executem sobre Android un projecte Qt
20211105 (4h)
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_v20210304_00.zip de 23,7 GB) al directori maquinesVirtuals/Android_i_Qt
Màquina virtual amb emulador per a Android
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
É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.
qtMqtt
Feu un git clone i especifiqueu la versió amb un git checkout 6.0. Després:
cd qmqtt mkdir build cd build qmake -r .. make sudo make install
Instal·lació a Windows
- Si no teniu el llenguatge perl instal·lat, instal·leu perl
- Obriu el CMD amb les variables d'entorn de les Qt6
git clone git://code.qt.io/qt/qtmqtt.git cd qmqtt git checkout 6.1 mkdir build cd build qmake -r .. mingw32-make mingw32-make install
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.
20211029 (4h)
Recull de pràctiques de 2n de DAM. Curs 2021-2022
1a) Feu un nou programa anomenat ginyCompost02, a partir de l'anterior codi. Heu de posar un nou giny de botons a la dreta del giny de text. Quedaran tres ginys: Botons - Text - Botons.
1b) Feu que ginyCompost02 tingui també connectades els senyals i les osques del nou giny.
20211025 (2h)
Recull de pràctiques de 2n de DAM. Curs 2021-2022
Pràctica amb MQTT (sense la S d'MQTTS). Heu de fer servir el port TCP 1883 i amb sócols web el port 9001 ( formacio.things.cat ) amb usuari ecat i contrasenya clotClot.
Codi en python per a truaduir el text d'un certificat a codi encastable a l'IDE d'Arduino
MQTT-Dash. Control del relé de enclavamiento y lectura de la LDR
- Pràctica amb MQTTS:
- Microprogramari amb MQTTS a la placa IoT-02
- Connexió mitjançant sòcols web (9001) a un Snap! sense SSL. I vam provar mqttSnap.xml.
- Connexió mitjançant NodeRED. Encenem i apaguem un led. Grafiquem el nivell de llum mitjançant el sensor LDR.
- Aplicació d'Android MQTT Dash
- Pràctica amb MQTT:
Ha de ser el mateix que la pràctica anterior fent servir MQTT en comptes d'MQTTS.
20211021 (4h)
Recull de pràctiques de 2n de DAM. Curs 2021-2022
Al codi mqttSnap.xml heu d'afegir una cancel·lació de subscripció un cop rebeu la vostra MAC.
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
IoT
Introducció als protocols TCP MQTT i MQTTS.
¿Qué es MQTT? Su importancia como protocolo IoT
Més informació sobre MQTT i MQTTS
Adreces comentades a classe
mqtt4snap Fet per en Xavier Pi
Broker MQTT que permet fer balanceig de servei de franc
Exemple Hola món amb Snap! amb SSL Cal activar a la rodeta d'engranatge l'opció JavaScript extensions
Snap! sense certificat SSL Cal activar a la rodeta d'engranatge l'opció JavaScript extensions
20211018 (2h)
Recull de pràctiques de 2n de DAM. Curs 2021-2022
Pseudoservidor UDP
Pseudoservidor UDP emprant Qt5 (1/2)
Pseudoservidor UDP emprant Qt5 (2/2)
20211015 (4h)
- UDP
- Al NodeRED
- NodeRED + Placa IoT-02
Avui hem aconseguit controlar des del mòbil (tauler de control del NodeRED amb dos botons) l'estat del led blanc de la placa IoT-02.
IoT
Introducció al protocol UDP.
Microprogramari que implementa el protocol UDP per a la placa IoT-02.
unsigned int udpPortRx = 3334; unsigned int udpPortTx = 3333;
Codi per a importar al NodeRED fent servir el protocolo UDP. El port de recepció de l'ordinador (3333) ha de ser el de transmissió a la placa, i el de recepció a la placa (3334) ha de ser el de transmissió de l'ordinador.
Port Rx = 3333 Port Tx = 3334
Qt
- Concepte senyal / osca (signal / slot)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
20211011 (2h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Qt
Seguim amb la introducció a les Qt.
Exercici 02_mesMenys
Desenvolupeu una aplicació gràfica d'usuari, anomenada 02_mesMenys amb la classe GinyMesMenys filla de QWidget, amb tres ginys encastats:
- Botó botoMes amb el signe +. Incrementa el valor de l'atribut privat nN
- Botó botoMenys amb el signe -. Decrementa el valor de l'atribut privat nN
- Etiqueta etNum que presenta el valor de l'atribut privat nN
20211008 (4h)
Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122
Introducció a les Qt
20211004 (2h)
Prova amb les plaques IoT-02
JESUITES_FP - educanet01
20211001 (4h)
Teleconferència pel dia d'avui
Biblioteques Arduino per a la placa IoT-02 (493M)
Codis i disseny electrònic de la placa IoT-02 a Github o git clone https://github.com/jordibinefa/IoT-02.git
Repartiment de Placa IoT-02. De moment, i fins que no es digui el contari, les tornareu el mateix dia.
Heu de dur a classe una font d'alimentació microUSB, o un cable de connexió microUSB per connectar a l'ordinador. Tingueu en compte que us caldrà una altra boca per a connectar el cable miniUSB que us serà subministrat per a programar la placa IoT-02.
20210927 (2h)
Teleconferència pel dia d'avui
Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2021-2022 de 2n de DAM
Recull del dia 20210927 usuari: dam | contrasenya: dam2122
Qt
El Qt Creator serà l'IDE que farem servir per a desenvolupar el disseny d'aplicacions gràfiques d'usuari:
Aneu a la pàgina Qt for Open Source Development i cerqueu Download the Qt Online Installer. Baixeu-vos-ho i instal·leu-ho (us demana registrar-vos per a poder-ho instal·lar).
IoT
Instal·lació de Node.js Guia d'instal·lació de node i npm
Verificació:
node --version npm --version
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://www.binefa.cat/IoT/nodeRed/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
Si hi ha problemes de confiança amb el certificat al descarrega l'arxiu .zip, hi podeu afegir l'opció --no-check-certificate:
wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip
Repositori de codis fet a classe durant el curs
Codis fets a les classes de 2n de DAM usuari: dam | contrasenya: dam2122
Documentació
Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2021-2022 de 2n de DAM
Recull de pràctiques de 2n de DAM. Curs 2021-2022
Qt/QML
Activació de l'editor QML al QtCreator 6
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
LoRaWAN
Consola de The Things Stack (Community Edition) de The Things Network
Presentació LoRaWAN (esborrany v0.4)
Recull introductori per a treballar amb LoRa ( usuari: dam / contrasenya: dam2122)
Recull de pràctiques de 2n de DAM. Curs 2021-2022
Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED