== Requirements Aplicația de dispecerat video va îndeplini următoarele cerințe, structurate conform prioritizării MoSCo: === Must Have - Sistemul trebuie să primească și să gestioneze alarme automate generate de camere și NVR-uri. - Aplicația trebuie să activeze fluxul video live doar pentru camerele care trimit alarme, pentru optimizarea resurselor. - Dispecerii trebuie să fie notificați în timp real la primirea unei alarme. - Sistemul trebuie să permită stocarea temporară a înregistrărilor video pentru o perioadă de 5-10 minute pe baza alarmei. - Aplicația trebuie să gestioneze mai mulți clienți, astfel încât fiecare client să aibă acces exclusiv la propriile camere și alarme. - Baza de date trebuie să păstreze detalii despre alarme, camere, clienți și logurile de activitate ale dispecerilor. - Sistemul trebuie să ofere opțiuni de autentificare și autorizare pentru clienți și dispeceri, astfel încât accesul să fie limitat la camerele și alarmele relevante. - Un dispecer poate primi alarme de la camerele/NVR-urile mai multor clienti. Un client poate primi alarme doar de la camerele/NVR-urile lui. - Analiza video pentru detecția automată a mișcării, identificarea obiectelor sau a persoanelor. === Should Have - Interfața utilizatorului ar trebui să fie ușor de utilizat și să ofere un dashboard cu toate alarmele active și camerele monitorizate, filtrate per client. - Aplicația ar trebui să includă opțiunea de vizualizare a înregistrărilor video stocate temporar, în funcție de drepturile dispecerului. - Sistemul ar trebui să permită atribuirea dispecerilor la anumiți clienți, astfel încât aceștia să monitorizeze doar alarmele și camerele clientului respectiv. === Could Have - Sistemul ar putea integra un mecanism de caching pentru a accelera accesul la datele frecvent accesate, cum ar fi alarmele active și stările camerelor. - Înregistrările video stocate temporar ar putea fi salvate pe un spațiu de stocare configurabil (local sau cloud). ---------------------------------------------------------------------------------------------------------------------------- == Method === Arhitectura Generală Aplicația de dispecerat video este structurată într-o arhitectură modulară și scalabilă, pentru a permite monitorizarea în timp real a unui număr mare de camere distribuite pe mai mulți clienți. Dispecerii au posibilitatea de a accesa fluxurile video ale camerelor de la mai mulți clienți, în funcție de permisiunile atribuite. Arhitectura aplicației include următoarele componente principale: - **Server de Alarme și Gestionare** (PHP): - Responsabil de preluarea și gestionarea alarmelor automate trimise de camere și NVR-uri. - Gestionează notificările în timp real și oferă un API RESTful pentru interacțiunea cu frontend-ul. - Coordonează activarea fluxurilor video pentru camerele care trimit alarme, conectându-se cu serverul de streaming video. - Integrează un sistem de autentificare și autorizare pentru dispeceri, asigurând accesul diferențiat la camerele clienților. - **Server de Streaming Video** (Wowza/WebRTC/RTSP): - Responsabil pentru gestionarea fluxurilor video live, activându-se doar pentru camerele care trimit alarme. - Permite redarea video în timp real direct în interfața de dispecerat React, oferind un flux video securizat. - Opțional, serverul poate înregistra fluxurile pentru o perioadă de timp determinată (5-10 minute), pentru fiecare alarmă, și poate șterge înregistrările după expirare. - **Baza de Date** (PostgreSQL): - Baza de date relațională PostgreSQL stochează informațiile despre clienți, camere, alarme și dispeceri, asigurând integrarea permisivă a dispecerilor cu acces la camerele mai multor clienți. - Tabelele de bază includ `clienti`, `dispeceri`, `camere`, `alarme`, și `inregistrari_video` pentru gestionarea drepturilor de acces și păstrarea evidenței evenimentelor de alarmă și a logurilor de acces. - Structura bazei de date este optimizată pentru interogări rapide și poate include un mecanism de caching (Redis) pentru a accelera accesul la datele active. - **Frontend Dispecerat** (React): - Interfața de utilizator, construită în React, permite dispecerilor să vizualizeze alarmele active, camerele asociate și să acceseze fluxurile video live la cerere. - Interfața afișează un dashboard centralizat cu alarmele curente și oferă acces la fluxuri video active doar pentru camerele care trimit alarme. - Integrarea cu WebSockets permite actualizări în timp real pentru alarme, astfel încât dispecerii să fie notificați imediat despre orice activitate nouă. ---------------------------------------------------------------------------------------------------------------------------- === Gestionarea clienților, permisiunilor, și structurii de locații/NVR-uri/camere Aplicația include o structură extinsă de date care permite fiecărui client să dețină mai multe locații. Fiecare locație poate conține unul sau mai multe NVR-uri, iar fiecare NVR poate gestiona mai multe camere. Această structură ajută la organizarea și filtrarea accesului dispecerilor în funcție de client și locație. ==== Structura bazei de date Baza de date PostgreSQL include tabelele necesare pentru a gestiona structura de locații, clienți, NVR-uri și camere: - **clienti**: - `id_client`: Identificator unic pentru fiecare client. - `nume`: Numele clientului. - `detalii_contact`: Detalii de contact ale clientului (opțional). - **locatii**: - `id_locatie`: Identificator unic pentru fiecare locație. - `id_client`: Referință către clientul de care aparține locația. - `nume_locatie`: Numele sau adresa locației. - Această tabelă permite unui client să aibă mai multe locații, fiecare cu propriile NVR-uri și camere. - **dispozitive**: - `id`: Identificator unic pentru fiecare dispozitiv. - `type`: Tip dispozitiv camera/nvr/etc - `id_locatie`: Referință către locația în care este instalată camera. - `id_client`: Referință către clientul de care aparține camera. - `nume_dispozitiv`: Numele dispozitivului sau locația sa specifică în cadrul locației generale. - `brand`: producatorul dispozitivului. - `ip` - `username` - `password` - `url_stream`: URL-ul de acces pentru fluxul video live (utilizat pentru activarea fluxului). - **camere**: un nvr poate avea mai multe camere - `id_camera`: Identificator unic pentru fiecare cameră. - `id_nvr`: Referință către NVR-ul de care aparține camera (opțional; `null` pentru camere independente). - `nume_camera`: Numele camerei sau locația sa specifică în cadrul locației generale. - `url_stream`: URL-ul de acces pentru fluxul video live (utilizat pentru activarea fluxului). - **alarme**: - `id_alarma`: Identificator unic pentru fiecare alarmă. - `id_dispozitiv`: Referință către dispozitiv - `id_camera`: Referință către camera care a declanșat alarma. - `timp_declansare`: Data și ora declanșării alarmei. - `status`: Starea alarmei (activă, rezolvată, în așteptare). - `durata_stocare`: Durata pentru care înregistrarea video va fi păstrată. - **dispeceri**: - `id_dispecer`: Identificator unic pentru fiecare dispecer. - `nume`: Numele dispecerului. - `email`: Emailul de autentificare. - `parola_hash`: Parola criptată a dispecerului. - `rol`: Rolul dispecerului. - **dispeceri_clienti**: - `id_dispecer`: Referință către dispecer. - `id_client`: Referință către clientul pentru care dispecerul are acces. - `id_locatie`: (Opțional) Referință către o locație specifică a clientului pentru acces limitat. - Această structură permite fiecărui dispecer să aibă acces fie la toate locațiile unui client, fie doar la locații specifice. - **inregistrari_video**: - `id_inregistrare`: Identificator unic pentru fiecare înregistrare. - `id_alarma`: Referință către alarma asociată. - `link_inregistrare`: URL-ul de stocare temporară a înregistrării video. - `expira_la`: Data și ora expirării înregistrării. ==== Gestionarea permisiunilor și accesul la locații, NVR-uri și camere 1. **Autentificarea și autorizarea dispecerilor**: - La autentificare, fiecare dispecer va avea acces la camerele și NVR-urile clienților pentru care are drepturi de acces, la nivel de locație, dacă este cazul. - Filtrarea accesului la locații asigură că dispecerii pot vedea doar locațiile și camerele asociate clientului și locației respective. 2. **Acces diferențiat pe baza locațiilor**: - Folosind relația din `dispeceri_clienti`, dispecerii pot accesa camerele de la anumite locații ale unui client. - Structura permite un management granular al camerelor și alarmelor, în funcție de locație și client. 3. **Filtrarea alarmelor și fluxurilor video**: - La primirea unei alarme, sistemul asigură că notificările și fluxurile video sunt accesibile doar dispecerilor autorizați pentru locația și clientul respectiv. ---------------------------------------------------------------------------------------------------------------------------- === Gestionarea fluxurilor video și stocarea temporară Pentru a optimiza utilizarea resurselor, fluxurile video sunt activate doar atunci când camerele trimit alarme. Acest design minimizează consumul de lățime de bandă și resursele serverului de streaming. Înregistrările video sunt stocate temporar pe baza specificațiilor alarmei, permițând o analiză post-alarmă timp de 5-10 minute, în funcție de tipul alarmei. ==== Activarea și gestionarea fluxurilor video live 1. **Declanșarea fluxului video la primirea unei alarme**: - La primirea unei alarme de la o cameră sau un NVR, aplicația trimite o cerere către **Serverul de Streaming** pentru a activa fluxul video live al camerei respective. - Serverul de streaming (Wowza/WebRTC/RTSP) inițiază fluxul video live și transmite fluxul către interfața de dispecerat React, unde dispecerii pot vizualiza fluxul în timp real. 2. **Integrarea cu Frontend-ul (React)**: - Dispecerii primesc notificări de alarmă în interfață prin WebSockets, iar la selectarea unei alarme, frontend-ul realizează conexiunea către fluxul video asociat camerei. - Fluxurile video sunt astfel vizualizate doar la cerere, optimizând utilizarea serverului de streaming. 3. **Gestionarea fluxurilor pentru camerele din NVR**: - Dacă alarma este declanșată de o cameră dintr-un NVR, aplicația extrage URL-ul specific al camerei respective și transmite doar fluxul camerei implicate în alarmă. - Serverul de streaming gestionează fiecare flux individual, oferind dispecerilor acces doar la camera activă din NVR. ==== Stocarea temporară a înregistrărilor video 1. **Înregistrarea fluxurilor la declanșarea unei alarme**: - La activarea unei alarme, serverul de streaming sau un serviciu de înregistrare dedicat (ex: FFmpeg) începe stocarea temporară a fluxului video al camerei pentru o perioadă specificată (5-10 minute). - Această stocare este configurată pe baza tipului de alarmă și se poate ajusta din sistem pentru a respecta cerințele de retenție. 2. **Păstrarea și expirarea automată a înregistrărilor**: - Fiecare înregistrare este stocată temporar într-o locație securizată și indexată în tabelul `inregistrari_video`. - Sistemul implementează un job automat care șterge înregistrările după ce expiră perioada de retenție, eliberând astfel spațiul de stocare. 3. **Accesul dispecerilor la înregistrările recente**: - Dispecerii pot accesa înregistrările video direct din dashboard-ul React, dacă este necesar, în perioada de retenție. - Linkurile de acces sunt disponibile doar pentru alarmele active sau recente, conform permisiunilor și locației dispecerului, asigurând confidențialitatea datelor fiecărui client. ==== Siguranța și optimizarea resurselor 1. **Autorizarea accesului la fluxuri și înregistrări**: - Accesul la fluxuri și înregistrări este permis doar dispecerilor autorizați pentru clientul și locația respectivă, asigurându-se astfel confidențialitatea. 2. **Resurse de stocare configurabile**: - Stocarea temporară a fluxurilor poate fi realizată local pe serverele proprii sau în cloud, în funcție de cerințele aplicației. - Înregistrările sunt optimizate pentru a minimiza utilizarea spațiului, prin rotirea automată a fișierelor înregistrate.