This shows you the differences between two versions of the page.
|
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 munca, avizul 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ți 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 și preprocesarea imaginilor (redimensionare, compresie). | + | |
| - | * 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** | + | ==== 2. Fiș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. | ||