Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ss:laboratoare:02 [2026/03/02 19:21]
jan.vaduva
ss:laboratoare:02 [2026/03/09 19:19] (current)
ciprian.popescu0411 [Recomandări]
Line 1: Line 1:
 ====== Laborator 2: Captură și transmisie de imagini prin aplicație mobilă ====== ====== Laborator 2: Captură și transmisie de imagini prin aplicație mobilă ======
  
-===== Obiectiv ===== +În laboratorul trecut ne-am familiarizat cu aplicația web (serverul) ​care primește imaginile trimise ​prin MQTT. În cadrul acestui laborator ne vom axa pe clientul mobil responsabil ​de transmiterea ​imaginilor.
-În cadrul acestui laborator, studenții vor dezvolta o aplicație mobilă pentru Android/​iOS ​care permite: +
-  * Captura de imagini utilizând camera dispozitivului mobil. +
-  * Transmiterea securizată a imaginilor ​prin MQTT utilizând mTLS. +
-  * Configurarea parametrilor camerei prin MQTT. +
-  * Salvarea imaginilor local în caz de conexiune intermitentă. +
-  * Implementarea a două moduri de funcționare:​ +
-    * **Mod normal** – captură periodică și trimitere la cerere. +
-    * **Mod live** – trimiterea ​imaginilor ​în timp real pentru depanare.+
  
-===== Cerințe ​===== +===== Recomandări ​=====
-  * Utilizarea **MQTT cu mTLS** pentru transmiterea datelor. +
-  * Implementarea unui mecanism de **WiFi provisioning** (setarea credențialelor WiFi). +
-  * Posibilitatea de a regla parametrii camerei prin **mesaje MQTT**. +
-  * Implementarea a două moduri de funcționare:​ +
-    * **Normal** – captură la intervale definite (configurabil prin MQTT). +
-    * **Live** – captură și trimitere instantanee a imaginilor. +
-  * Salvarea imaginilor local în caz de lipsă de conexiune. +
-  * OTA update al aplicației (opțional).+
  
-===== Exemple de imagini pentru procesare ===== +Pentru parcurgerea acestui laborator, vă sugerăm următoarele:​
-Puteti folosi ca si exemplu pentru inregistrarea si procesare urmatoarele imagini. +
-Obiectul este cel de a extrage textul din imaginile sau PDF-ul atasat.+
  
-Din imaginea atasata putem extrage informatie despre persoana, profesia, locul de muncaavizul medical si tipul controlului ​de medicina muncii+  * **Mediu ​de dezvoltare**:​ Utilizați Android Studio ca mediu de dezvoltare. Acesta include un emulator (mașină virtuală)util dacă nu aveți la dispoziție un dispozitiv Android fizic. Cea mai simplă metodă ​de instalare și gestionare este prin [[https://​www.jetbrains.com/​toolbox-app/​|JetBrains Toolbox]]
-{{ :ss:laboratoare:​medicina_muncii.jpeg?​nolink&​250 ​Imagine raport medicina muncii}}+  * **Schelet de cod**Pentru această materie vom utiliza scheletul oficial disponibil [[https://github.com/​ResearchYou/​ss-mobile|aici]]. 
 +  * **Mașină virtuală**:​ În cazul în care nu dispuneți de un dispozitiv cu Android, puteți folosi emulatorul din Android Studio cu următoarea configurație:​
  
-Pentru a simplifica partea de procesare pe partea de web se pot extrage aceste informatii din fisierul PDF atasat ca alternativa.+^Setare ​               ^Opțiune ​                                   ^ 
 +|Device ​               |Pixel 6                                    | 
 +|API                   ​|31 ​                                        | 
 +|System image          |Google APIs Intel x86_64 Atom System Image | 
 +|Camera rear           ​|VirtualScene ​                              | 
 +|Default boot          |Cold                                       | 
 +|Internal storage ​     |6 GB                                       | 
 +|Expanded storage ​     |None                                       | 
 +|CPU cores             ​|4 ​                                         | 
 +|Graphics acceleration |Automatic ​                                 | 
 +|RAM                   |4 GB                                       | 
 +|VM heap size          |512 MB                                     |
  
-{{ :ss:​laboratoare:​vaduva_jan_alexandru.pdf | PDF raport medicina muncii}} +<note warning>​Este posibil ca emulatorul de Android să dea SEGFAULT pe sistemele de operare Linux din cauza driverelor grafice Vulkan, astfel este necesară crearea unui fișier de inițializare denumit ''​advancedFeatures.ini''​ în directorul ''​~/​.android''​ cu următorul conținut: 
-===== Structura laboratorului ===== +<file ini advancedFeatures.ini> 
-  * **Partea 1: Configurarea MQTT și conectarea la broker** +Vulkan ​off 
-    * Configurarea unui broker MQTT (ex: Mosquitto, HiveMQ). +GLDirectMem ​on 
-    * Implementarea autentificării și securizării conexiunii cu **mTLS**. +</​file>​ 
-    * Trimiterea și recepția mesajelor MQTT.+</​note>​
  
-  * **Partea 2: Implementarea capturii de imagini** +<note important>​În situația în care nu ațparcurs [[ss:​laboratoare:​01|primul laborator]]puteți testa funcționalitatea acestui schelet prin rularea ​locală a unui broker MQTT și utilizarea unui client care să recepționeze imaginile.</​note>​
-    * Accesarea camerei dispozitivului mobil. +
-    * Captura șpreprocesarea imaginilor (redimensionarecompresie). +
-    * Salvarea imaginilor în memoria ​locală a dispozitivului.+
  
-  * **Partea 3: Transmiterea imaginilor prin MQTT** +===== Testare locală cu broker ​MQTT =====
-    * Implementarea trimiterei imaginilor în mod periodic. +
-    * Implementarea unui mecanism de retry în caz de conexiune slabă+
-    * Configurarea aplicației pentru a trimite imagini la cerere (prin comenzi ​MQTT).+
  
-  * **Partea 4: Configurarea parametrilor camerei prin MQTT** +==== 1. Instalare broker ​MQTT ====
-    * Ajustarea parametrilor camerei prin mesaje MQTT (ex: rezoluție, calitate, mod nocturn). +
-    * Implementarea unui UI pentru configurarea setărilor din aplicație.+
  
-  * **Partea 5: Implementarea modului „Live”** +Asigurați-vă că aveți instalat un broker ​MQTT, de exemplu [[https://mosquitto.org/​download/​|Mosquitto]]
-    * Transmiterea imaginilor în timp real pe baza comenzilor ​MQTT+
-    * Utilizarea WebSocket/MQTT pentru afișarea imaginilor pe un server.+
  
-  * **Partea 6 (Opțional):​ Implementarea actualizărilor OTA** +==== 2Fișier ​de configurare ====
-    * Configurarea unui server pentru distribuirea actualizărilor. +
-    * Implementarea unui mecanism ​de descărcare și instalare a noii versiuni a aplicației.+
  
 +Creați în root-ul scheletului de laborator un director de test, iar în interiorul acestuia definiți un fișier de configurare cu următorul conținut:
 +
 +<file bash mqtt.conf>​
 +listener 1883
 +allow_anonymous true
 +</​file>​
 +
 +==== 3. Pornirea brokerului MQTT ====
 +
 +Într-un terminal rulați următoarele comenzi:
 +
 +<code bash>
 +sudo systemctl stop mosquitto.service
 +mosquitto -c mqtt.conf -v
 +</​code>​
 +
 +==== 4. Creare environment virtual Python ====
 +
 +Un good practice în Python este să folosim virtual environment-uri,​ astfel rulați într-un terminal:
 +
 +<code bash>
 +python -m venv .mqtt_env
 +source .mqtt_env/​bin/​activate
 +pip install paho-mqtt
 +</​code>​
 +
 +==== 5. Client MQTT simplu în Python ====
 +
 +Creați și rulați un client simplu MQTT care face automat subscribe la topicul ''​ssproject/​images''​ și salvează imaginile primite într-un director separat.
 +
 +<file python mqtt_client.py>​
 +import paho.mqtt.client as mqtt
 +from paho.mqtt.enums import CallbackAPIVersion
 +import os
 +import time
 +
 +BROKER = "​127.0.0.1"​
 +PORT = 1883
 +TOPIC = "​ssproject/​images"​
 +OUTPUT_DIR = "​received_images"​
 +
 +if not os.path.exists(OUTPUT_DIR):​
 +    os.makedirs(OUTPUT_DIR)
 +
 +def on_connect(client,​ userdata, flags, reason_code,​ properties):​
 +    print(f"​Connected (reason code: {reason_code})"​)
 +    client.subscribe(TOPIC)
 +
 +def on_message(client,​ userdata, msg):
 +    timestamp = int(time.time() * 1000)
 +    filename = f"​{OUTPUT_DIR}/​image_{timestamp}.jpg"​
 +
 +    try:
 +        with open(filename,​ "​wb"​) as f:
 +            f.write(msg.payload)
 +        print(f"​Image saved: {filename} ({len(msg.payload)} bytes)"​)
 +    except Exception as e:
 +        print(f"​Error saving image: {e}")
 +
 +client = mqtt.Client(callback_api_version=CallbackAPIVersion.VERSION2)
 +client.on_connect = on_connect
 +client.on_message = on_message
 +
 +print(f"​Connecting to {BROKER}..."​)
 +client.connect(BROKER,​ PORT, 60)
 +print("​Exit with Ctrl+C"​)
 +
 +print("​Waiting for images..."​)
 +client.loop_forever()
 +</​file>​
 +
 +===== Structura scheletului de laborator =====
 +
 +Mai jos este prezentată structura simplificată a scheletului aplicației Android, evidențiind componentele ce vor fi analizate și modificate pe parcursul semestrului:​
 +
 +<​code>​
 +ss-mobile
 +└── app
 +    ├── src
 +    │   ​├── main
 +    │   ​│ ​  ​├── java/​ro/​pub/​cs/​systems/​ssproject
 +    │   ​│ ​  ​│ ​  ​├── mqtt            # Logică comunicație MQTT
 +    │   ​│ ​  ​│ ​  ​├── ui              # Activități și interfață utilizator
 +    │   ​│ ​  ​│ ​  ​└── utils           # Clase utilitare
 +    │   ​│ ​  ​├── res/​layout ​         # Fișiere XML pentru UI
 +    │   ​│ ​  ​└── AndroidManifest.xml # Configurație aplicație
 +    │   ​├── test                    # Unit Tests (logică pură)
 +    │   ​└── androidTest ​            # Instrumented Tests
 +    └── build.gradle.kts ​           # Configurații de build
 +</​code>​
 +
 +==== Descriere componente ====
 +
 +  * **''​mqtt/''​** – Conține implementarea clientului MQTT (folosind Paho) și constantele pentru topice.
 +  * **''​ui/''​** – Conține codul pentru ecranele aplicației.
 +    * ''​MainActivity''​ – captură și trimitere imagini.
 +    * ''​SetupActivity''​ – setări de conexiune.
 +  * **''​utils/''​** – Include:
 +    * ''​ImageUtils''​ – procesare formate imagine (YUV → NV21, rotație)
 +    * ''​PermissionHandler''​ – gestionare permisiuni
 +  * **''​test/''​** – Conține teste unitare care rulează direct pe JVM și sunt folosite pentru a testa logica ce nu depinde de framework-ul Android.
 +  * **''​androidTest/''​** – Teste instrumentate (rulează pe dispozitiv/​emulator),​ folosite pentru a testa componente ce depind de contextul Android.
 +
 +===== Cerințe =====
 +
 +  - Descărcați scheletul de laborator de [[https://​github.com/​ResearchYou/​ss-mobile|aici]]
 +  - Importați-l în Android Studio.
 +  - Analizați structura și înțelegeți funcționarea aplicației.
 +  - Rulați aplicația pe un dispozitiv Android.
 +  - Testați conexiunea cu brokerul MQTT.
 +
 +**Livrabil:​** Directorul ''​received_photos''​ populat cu imaginile capturate din aplicația mobilă
 ===== Resurse ===== ===== Resurse =====
   * Documentație MQTT: [[https://​mqtt.org/​]]   * Documentație MQTT: [[https://​mqtt.org/​]]
   * Implementarea MQTT pe Android: [[https://​github.com/​eclipse/​paho.mqtt.android]]   * Implementarea MQTT pe Android: [[https://​github.com/​eclipse/​paho.mqtt.android]]
-  * Implementarea MQTT pe iOS: [[https://​github.com/​eclipse/​paho.mqtt.ios]] 
-  * Captura și procesarea imaginilor în Flutter: [[https://​pub.dev/​packages/​camera]] 
   * [[https://​wiki.sei.cmu.edu/​confluence/​display/​android/​Android+Secure+Coding+Standard|Android Secure Coding Standard]]   * [[https://​wiki.sei.cmu.edu/​confluence/​display/​android/​Android+Secure+Coding+Standard|Android Secure Coding Standard]]
- 
-===== Livrabile ===== 
-  * Codul sursă al aplicației mobile. 
-  * Un raport tehnic care explică implementarea fiecărei funcționalități. 
-  * Capturi de ecran și exemple de mesaje MQTT utilizate. 
  
ss/laboratoare/02.1772472097.txt.gz · Last modified: 2026/03/02 19:21 by jan.vaduva
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0