Sunteți pe pagina 1din 64

Universitatea „Transilvania” din Brașov

Facultatea de Inginerie Electrică și Știința Calculatoarelor

COMUNICAȚII CLOUD ÎN TIMP REAL

Îndrumător: Doctorand:
Prof. Univ. Dr. Ing. Florin SANDU Drd. George Alex STELEA

- Braşov 2018 –

2
Cuprins

1. INTRODUCERE .......................................................................................... 4
2. WEBRTC – WEB REAL TIME COMMUNICATIONS ............................ 6
2.1. Arhitectura WebRTC ........................................................................................ 7
2.2. API-ul WebRTC................................................................................................ 8
2.3. Semnalizarea în WebRTC ............................................................................... 21
2.4. Avantaje și motive pentru a folosi tehnologia WebRTC ................................ 22
2.5. Biblioteci si seturi de instrumente WebRTC .................................................. 24
2.6. Aplicabilitatea WebRTC ................................................................................. 26
2.1. Construirea unei aplicații WebRTC ................................................................ 27
2.2. Concluzii ......................................................................................................... 33
3. WEBSOCKETS .......................................................................................... 35
3.1. Prezentare generală ......................................................................................... 35
3.1. Socket.IO ......................................................................................................... 36
3.1. Socket.IO & NodeJS ....................................................................................... 37
3.1. WebSockets în Cloud ...................................................................................... 42
3.1.1. Google Cloud ............................................................................................ 42
3.1.1. Microsoft Azure - Windows Azure Web Sites ......................................... 44
3.1.1. Cloud Foundry .......................................................................................... 47
4. RECUNOAȘTEREA FACIALĂ ÎN CLOUD ........................................... 50
4.1. Tehnologii și implementare............................................................................. 51
4.1.1. OpenFace .................................................................................................. 51
4.1.1. Microsoft Azure Cognitive Services ........................................................ 57
4.1. Concluzii ......................................................................................................... 61
5. DIRECȚII DE CERCETARE..................................................................... 63
6. BIBLIOGRAFIE......................................................................................... 63
3
1. INTRODUCERE

Cloud Computing, tradus "calcul în nori" este un concept modern de tehnologii bazate
pe Internet, care oferă resurse de procesare a datelor si informațiilor computerizate.
Este un model construit pentru a permite accesul omniprezent și ubicuu, la cerere,
către un grup comun de resurse configurabile (de exemplu, rețele de calculatoare,
servere, spații de stocare, aplicații și servicii) care pot fi furnizate rapid și eliberate cu
un minim efort de management. Soluțiile de calcul și stocare în Cloud furnizează
utilizatorilor diferite capabilități pentru a-și stoca și procesa datele în centre de date
private sau terțe, care pot fi situate la distanță (de exemplu în alt oraș, sau în altă țară).
Cloud Computing se bazează pe partajarea resurselor pentru a obține o coerență
asemănătoare unei utilități într-o rețea informatică. Cloud Computing oferă mijloace
prin care se pot accesa aplicațiile ca utilități - ca servicii (as a service – ”-aaS”) – pe
Internet, permiţând crearea, configurarea și personalizarea aplicațiilor.

Termenul Cloud se referă la o rețea sau la Internet. Cu alte cuvinte, putem spune
despre "Cloud" că este ceva, care este prezent într-o locație îndepărtată. Cloud poate
furniza servicii prin intermediul rețelelor publice și private, adică WAN, LAN sau
VPN. Cloud Computing permite manipularea, configurarea și accesarea de la distanță
a resurselor hardware și software, oferind posibilitatea de stocare online a datelor,
acces la infrastructură și crearea/rularea de aplicații.

Aplicații cum ar fi e-mail, conferințe web, managementul relațiilor cu clienții (CRM)


sunt de regula executate pe Cloud.

4
Cloud Computing oferă independență de platformă, deoarece software-ul nu este
necesar să fie instalat local pe PC. Prin urmare, Cloud Computing face ca aplicațiile
să fie mobile și colaborative.

Internetul a fost creat ca o soluție a nevoii de comunicare și s-a transformat acum în


mecanismul cel mai folosit în acest sens. Ca urmare a vitezei de transmitere a datelor
la costuri extrem de scăzute, Internetul elimină granițele temporale și spațiale în
comunicarea umană. Tehnologii noi precum Web-RTC (Real-Time Communications)
aduc multe beneficii pentru utilizatori, integratori și dezvoltatori, prin funcționalități
distribuite în Cloud - rezidente în trecut doar în infrastructura (proprietară operatorilor
telecom) pentru comunicare și colaborare.

5
2. WEBRTC – WEB REAL TIME
COMMUNICATIONS

WebRTC prescurtarea pentru Web Real-Time Communications este o colecție de


protocoale de comunicații și interfețe de programare a aplicațiilor (API-s) care permit
comunicarea în timp real folosind conexiuni peer-to-peer (P2P). Acest lucru permite
navigatoarelor web să trimită și să primească informații în timp real, din și către
navigatoarele altor utilizatori.

Folosind WebRTC se pot dezvolta aplicații folosind HTML5 si JavaScript, cum ar fi


conferințe video, transfer de fișiere, chat-uri, sau desktop sharing, fără a fi nevoie de
plugins, fie interne sau externe.

Tehnologia WebRTC permite efectuarea de comunicații punct la punct (point-to-


point) sau punct-la-multipunct (point-to-multipoint). Așa cum am menționat, nu e
necesară instalarea de module sau plugins, deoarece WebRTC este incorporat nativ în
navigatoarele web (serverul web este necesar doar pentru a realiza schimb de
informații si date de control între dispozitive).

API-ul WebRTC include opțiuni de captare media, codare și decodare audio și video,
metode de transport al informatiei și de management al sesiunii.

Comunicațiile web în tip real deschid ușa către o nouă gamă de aplicații, inclusiv
chat-uri bazate pe text, partajare de fișiere si ecran, jocuri online, video chat-uri și
multe altele. În afară de comunicare tehnologia WebRTC poate fi utilizată și pentru
alte scopuri, cum ar fi:

 Marketing în tip real (real-time marketing);

6
 Publicitate în tip real (real-time advertising);
 Sisteme de comunicații back office (CRM, ERP, SCM, FFM);
 Managementul resurselor umane (HR management);
 Sisteme de management educational (LMS - Learning Management Systems)
 Rețele sociale;
 Servicii matrimoniale;
 Consultații medicale online
 Servicii financiare;
 Servicii de supraveghere (surveillance);
 Jocuri multiplayer
 Transmisiuni în direct (live broadcasting)
 e-Learning

2.1. Arhitectura WebRTC

Modelele web tradiționale sunt dezvoltate pe arhitectura client-server în care


comunicarea se realizeaza unidirecțional (de la server la client prin protocolul HTTP).
Arhitectura WebRTC dezvoltă modelul client-server prin înglobarea noțiunii de
comunicare P2P (peer-to-peer) între navigatoarele web. Cea mai folosită arhitectură
WebRTC este modelul triunghiular (iar în unele cazuri specifice modelul trapezoidal)
în care navigatoarele web accesează o aplicație pe un server prin intermediul căreia
mesajele de semnalizare sunt transmise prin protocolul HTTP sau tehnologii
WebSocket. Serverul web fiind folosit doar pentru a efectua controlul de date, însa
fluxul efectiv de date este realizat peer-to-peer între navigatoare.

7
Arhitectura WebRTC

2.2. API-ul WebRTC

API-ul WebRTC este proiectat pentru a permite aplicațiilor JavaScript să creeze


conexiuni în timp real folosind canale audio, video și/sau date direct între utilizatori
prin intermediul navigatoarelor web, sau serverelor care susțin protocoalele WebRTC.
De asemenea, API-ul WebRTC folosește getUserMedia() pentru a obține acces la
microfonul sau camera web instalate pe dispozitiv.

API-ul WebRTC este construit în jurul a trei concepte (Fig.59.):

 RTCPeerConnection - sarcina principală a obiectului RTCPeerConnection


este de configurare și de a crea o conexiune de la egal la egal (peer-to-peer);
 MediaStream - oferă acces la obiecte de tip fluxuri video și audio;
 RTCDataChannel - crează un canal care vine dintr-un obiect
RTCPeerConnection existent.

8
Stiva API-ului WebRTC

MediaStream API

API-ul MediaStream a fost proiectat pentru accesul facil la fluxurile media de la


camerele web și microfoanele locale. Metoda getUserMedia() este principalul mod de
a avea acces la dispozitivele de intrare locale.

API-ul Media Stream are trei caracteristici principale:

 Un flux media în timp real este reprezentat de un obiect flux sub formă de
video sau audio;
 Acesta oferă un nivel de securitate prin permisiuni de utilizator solicitând
acceptul utilizatorului înainte ca o aplicație web să poată porni preluarea unui
flux;

9
 Selectarea dispozitivelor de intrare este manipulată de către API MediaStream
(de exemplu, atunci când există două camere sau microfoane conectate la
dispozitiv).

Functia getUserMedia() MediaStream

Fiecare obiect MediaStream include mai multe obiecte de tip MediaStreamTrack, care
reprezintă fluxuri video și audio de la diferite dispozitive de intrare. Fiecare obiect
MediaStreamTrack poate include mai multe canale (de exemplu canalele audio
dreapta si stânga). Acestea sunt cele mai mici părți definite de API MediaStream.

Există două moduri de ieșire (output) al obiectelor MediaStream:

 output către un element video sau audio în navigatorul web;


 se poate trimite output-ul la obiectul RTCPeerConnection, care apoi îl trimite la
un punct remote (remote peer).

Proprietățile API-ului MediaStream:

 MediaStream.active − returnează true dacă MediaStream este activ, în caz


contrar returnează false;

10
 MediaStream.ended − returnează true în cazul în care evenimentul a fost
încheiat, ceea ce înseamnă că fluxul a fost citit complet, sau false în cazul în
care nu a fost atins sfârșitul fluxului;
 MediaStream.id − reprezintă un identificator unic pentru obiect;
 MediaStream.label − reprezintă un identificator unic atribuit de către agentul
utilizator;

Manipulatoare de eveniment (Event Handlers) ale API-ului MediaStream:

 MediaStream.onactive − un eveniment este activat atunci când un obiect


MediaStream devine activ;
 MediaStream.onaddtrack − un eveniment este declansat atunci când se
adaugă un nou obiect MediaStreamTrack;
 MediaStream.onended − un eveniment este declansat atunci când se
finalizează un streaming;
 MediaStream.oninactive − un eveniment inactiv este activat atunci cand un
obiect MediaStream devine inactiv;
 MediaStream.onremovetrack − un eveniment de tip removetrack este
declanșat atunci când un obiect MediaStreamTrack este eliminat.

Metode folosite de MediaStream:

 MediaStream.addTrack() − adaugă obiectul MediaStreamTrack ca argument


al MediaStream. În cazul în care argumentul a fost deja adăugat, nu se întâmplă
nimic;
 MediaStream.clone() − Returnează o clonă a obiectului MediaStream cu un
nou ID;
11
 MediaStream.getAudioTracks() − Returnează o listă a obiectelor audio
MediaStreamTrack din obiectul MediaStream;
 MediaStream.getTrackById() − Returnează un track în funcție de ID-ul
acestuia. În cazul în care argumentul este gol sau ID-ul nu este găsit, returnează
null. În cazul în care mai multe track-uri au același cod, îl returnează doar pe
primul;
 MediaStream.getTracks() − Returnează o listă a tuturor obiectelor
MediaStreamTrack din obiectul MediaStream;
 MediaStream.getVideoTracks() − Returnează o listă a obiectelor
MediaStreamTrack de tip video din obiectul MediaStream;
 MediaStream.removeTrack() − elimină obiectul MediaStreamTrack ca
argument al MediaStream. În cazul în care argumentul a fost deja eliminat, nu
se întâmplă nimic.

În exemplul de mai jos este prezentat modul de funcționare al API-ului getUserMedia


folosindu-se două fișiere home.html și script.js:

1. home.html

<!DOCTYPE html>

<html>

<head>

<title>Exemplu API getUserMedia</title>

<style type="text/css">

body div video {display:block; margin:0 auto;}

</style>

</head>

<body>

<div>

12
<video autoplay></video>

</div>

<script src="script.js"></script>

</body>

</html>

2. script.js

navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

var constraints = {audio: false, video: true};var video =


document.querySelector("video");

function successCallback(stream) {

window.stream = stream;

if (window.URL) {

video.src = window.URL.createObjectURL(stream);

} else {

video.src = stream;

video.play();

function errorCallback(error){

console.log("navigator.getUserMedia error: ", error);

navigator.getUserMedia(constraints, successCallback, errorCallback);

13
În momentul execuției paginii home.html în navigatorul web se genereaza un pop-up
implicit în care utilizatorul este întrebat dacă dorește să partajeze accesul camerei web
locale cu navigatorul:

Exemplu de interogare al navigatorului web pentru partajarea accesului

Dupa ce utilizatorul și-a dat consimțământul cu privire la accesul camerei web locale,
streaming-ul web este afișat în navigator:

Exemplu de streaming web afișat în browser

14
În extensia Firebug a navigatorului se poate observa cum API-ul WebRTC a generat
un URL de tip blob pentru obiectul MediaStream.

Exemplu de URL de tip blob pentru obiectul MediaStream

RTCPeerConnection

RTCPeerConnection permite ca doi utilizatori să comunice direct, de la un navigator


web la altul, realizând o conexiune cu un nod aflat la distanță (remote peer), care de
regulă reprezintă o altă instanță a aceleiași aplicații care rulează pe nodul repectiv.

API-ul RTCPeerConnection este nucleul conexiunii peer-to-peer între navigatoarele


web. În exemplul de mai jos este prezentat modul de creare al unui obiect
RTCPeerConnection:

var pc = RTCPeerConnection(configuratii);

În exemplul de mai sus argumentul "configuratii" trebuie să conțină cel puțin o cheie
de tip iceServers. Argumentul reprezintă o matrice de obiecte care conține informații
despre protocoalele de rețea TURN și STUN utilizate în găsirea candidaților ICE.

15
Mecanismul RTCPeerConnection folosește protocolul ICE (Interactive Connectivity
Establishment), împreună cu servere TURN (Traversal Using Relays around NAT) și
STUN (Session Traversal Utilities for NAT) pentru a asigura traversarea fluxurilor
media bazate pe UDP (User Datagram Protocol) prin firewall-uri și dispozitive de tip
NAT (Network Address Translation)

Protocolalele STUN și TURN

STUN (Session Traversal Utilities for NAT) este un set standardizat de metode,
inclusiv un protocol de rețea, pentru traversarea dispozitivelor NAT - Network
Address Translation (Translatarea Adreselor de Rețea) în aplicațiile de voce în timp
real, video, mesagerie, precum și alte comunicări interactive. STUN este un
instrument folosit de alte protocoale, cum ar fi Interactive Connectivity Establishment
(ICE) sau protocolul Session Initiation Protocol (SIP). Acesta oferă un instrument
pentru descoperirea prezenței unui IP în interiorul unei rețele care folosește un
translator de adrese de rețea. Protocolul necesită asistență de la un server de rețea de
tip terță parte (server STUN), situat de obicei public pe Internet.

TURN (Traversal Using Relays around NAT) este un pr otocol folosit


la translatareaadreselor de reteasi a firewall-urilor pentru aplica ț ii multimedia.
Acesta poate fi utilizat cu protocolul de control al transmisiei (TCP - Transmission
Control Protocol) ș i User Datagram Protocol (UDP). Este folosit in mod s
pecial pentru utilizatorii de pe re ț elele cu dispozitive NAT simetrice si oferta
conexi unea unui utilizator in spatele unui NAT catre un singur nod(peer)

Tehnologia ICE permite browserelor să descopere suficiente informații despre


topologia rețelei în care acestea sunt utilizate pentru a găsi cea mai bună cale

16
de comunicare. ICE oferă, de asemenea, o măsură de securitate, deoarece împiedică
paginile web și aplicațiile nesigure sa trimităt date către gazde, care nu se așteaptă să
le primească.

ICE - Interactivity Connection Establishment folosind STUN si TURN

Proprietăți ale API-ului RTCPeerConnection:

 RTCPeerConnection.iceConnectionState − returnează un obiect


RTCIceConnectionState care descrie starea conexiunii. Un eveniment de tip
iceconnectionstatechange este declanșat atunci când această valoare se
modifică;
 RTCPeerConnection.iceGatheringState − returnează un obiect
RTCIceGatheringState care descrie starea ICE pentru conexiune;

17
 RTCPeerConnection.localDescription − returnează un obiect
RTCSessionDescription care descrie sesiunea locală. Acesta poate fi null în
cazul în care nu a fost încă stabilit;
 RTCPeerConnection.peerIdentity − returnează un obiect
RTCIdentityAssertion. Se compune dintr-un IDP (nume de domeniu) și un
nume care reprezintă identitatea peer-ului remote;
 RTCPeerConnection.remoteDescription − returnează un obiect
RTCSessionDescription care descrie sesiunea remote (aflată la distanță). Acesta
poate fi null în cazul în care nu a fost încă stabilit;
 RTCPeerConnection.signalingState − returnează un obiect
RTCSignalingState care descrie starea de semnalizare a conexiunii locale. Un
eveniment signalingstatechange este declanșat când această valoare se
modifică.

RTCDataChannel

API-ul RTCPeerConnection este folosit la transferul de fluxuri audio și video, în cazul


în care se dorește transmiterea de date de tip text se folosește API-ul
RTCDataChannel care este proiectat pentru a oferi un serviciu generic de transport
care permite browserelor web să facă schimb de date generice într-un mod
bidirecțional de tip peer-to-peer.

RTCDataChannel poate lucra atat cu protocolul UDP (comunicare


nefiabila(unreliable) care nu este bazată pe conexiune) cat si cu protocolul TCP
(comunicare fiabila (reliable) bazată pe conexiune) Cele două moduri se deosebesc
prin:

18
 Modul fiabil garantează transmiterea mesajelor, precum și ordinea în care
acestea sunt livrate. Acest mod necesită informații adiacente încapuslate în
pachetele transmise, ceea ce ar putea face acest mod mai lent;
 Modul nefiabil nu garantează că fiecare mesaj va ajunge în cealaltă parte, nici
în ce ordine vor ajunge mesajele. Astfel, se elimină informa ț iile suplimentare
în pachetele transmise, făcând acest mod de lucru mult mai rapid.

Proprietățile API-ului RTCDataChannel:

 RTCDataChannel.label − returnează un șir de caractere care conține numele


canalului de date;
 RTCDataChannel.ordered − returnează true în cazul în care ordinea de
livrare a mesajelor este garantată sau false în cazul în care nu este garantată;
 RTCDataChannel.protocol − returnează un șir de caractere care conține
numele subprotocoalelor folosite pentru canalul specificat;
 RTCDataChannel.id − returnează un ID unic pentru canalul care este stabilit
la crearea obiectului RTCDataChannel;
 RTCDataChannel.readyState − Returnează un obiect RTCDataChannelState
care reprezintă starea conexiunii;
 RTCDataChannel.bufferedAmount − Returnează numărul de octeți care nu
au fost încă trimisi prin intermediul RTCDataChannel.send();
 RTCDataChannel.bufferedAmountLowThreshold − returnează numărul de
octeți care au fost preluați de către RTCDataChannel.bufferedAmount. În cazul
în care RTCDataChannel.bufferedAmount scade sub pragul critic, se
declanșează evenimentul bufferedamountlow;
 RTCDataChannel.binaryType − returnează tipul datelor binare transmise
prin conexiunea curentă (acestea pot fi de tipul “blob” sau “arraybuffer”);

19
 RTCDataChannel.maxPacketLifeType − returnează lungimea în milisecunde
a timpului desfășurat în modul unreliable (nefiabil);
 RTCDataChannel.maxRetransmits − numărul maxim de ori, pe care un
canal, va retransmite datele în cazul în care acestea nu sunt livrate;
 RTCDataChannel.negotiated − returnează un boolean care indică dacă
canalul a fost negociat de către un utilizator-agent, sau de către aplicație;
 RTCDataChannel.reliable − returnează un boolean care indică dacă o
conexiune poate trimite mesaje în modul reliable (fiabil);
 RTCDataChannel.stream − omolog cu RTCDataChannel.id.

Manipulatoare de eveniment (Event Handlers) ale API-ului RTCDataChannel:

 RTCDataChannel.onopen − este apelat atunci când evenimentul deschis este


declanșat. Acest eveniment este trimis atunci când conexiunea de date a fost
stabilită;
 RTCDataChannel.onmessage − este apelat atunci când evenimentul de tip
mesaj este declanșat. Evenimentul este trimis atunci când un mesaj este
disponibil pe canalul de date;
 RTCDataChannel.onbufferedamountlow − este apelat atunci când
evenimentul bufferedamoutlow este declanșat;
 RTCDataChannel.onclose − este apelat atunci când evenimentul close este
declanșat. Acest eveniment este trimis atunci când conexiunea de date a fost
închisă;
 RTCDataChannel.onerror − este apelat atunci când evenimentul error este
declanșat. Acest eveniment este trimis atunci când a fost întâmpinată o eroare;

Metode folosite de RTCDataChannel:

20
 RTCDataChannel.close() − Închide canalul de date;
 RTCDataChannel.send() − Transmite datele în parametrii prin canalul deschis
de către conexiune. Datele pot fi de forma "blob", șir de caractere,
"ArrayBuffer" sau "ArrayBufferView".

2.3. Semnalizarea în WebRTC

Pentru ca un utilizator să se conecteze la un alt utilizator trebuie să cunoască unde se


află acesta pe Web. Adresa IP permite dispozitivelor conectate la Internet să trimită
date direct între acestea. În comunicațiile web în timp real rolul semnalizării este de a
ajuta dispozitivele să se găsească reciproc pe Internet pentru a putea face schimb de
date cu privire la protocoalele și codec-urile acceptate de fiecare dispozitiv.

Semnalizarea este procesul de coordonare a comunicațiilor. Pentru ca o aplicație


WebRTC să poată configura un "apel", clienții trebuie să poată face schimb de
următoarele informații:

 mesaje de control al sesiunii utilizate pentru a deschide sau închide o


comunicare;
 mesaje de eroare;
 metadate media, cum ar fi codec-uri și setările acestora, lățimea de bandă și
tipurile de fișiere media folosite;
 date cheie, utilizate pentru a stabili conexiuni securizate;
 date de rețea, cum ar fi adresa IP a gazdei și portul de ieșire în Internet.

Pentru a evita redundanța și pentru a maximiza compatibilitatea cu tehnologiile


emergente, metodele și protocoalele de semnalizare nu sunt specificate de către
standardele WebRTC, fiecare dezvoltator fiind liber să folosească tehnica dorită.

21
2.4. Avantaje și motive pentru a folosi tehnologia
WebRTC

 Este gratis - WebRTC este un API open-source, propus pentru prima dată de către
Google în 2011. Obiectivul Google pentru WebRTC este de a oferi un motor
media bazat pe standarde în timp real, care este liber și rezident în toate browserele
disponibile;
 Este independentă de dispozitive si platforme - Orice browser cu suport
WebRTC pe orice sistem de operare poate crea o conexiune în timp real către un
alt dispozitiv WebRTC sau către un server media WebRTC. Sistemul de operare
pe care este instalat browser-ul nu este relevant deoarece WebRTC lucrează cu
API-uri standard de la W3C și protocoale IETF;
 Transfer de date audio/video securizat - Protocolul Secure RTP (SRTP) este
utilizat pentru criptare și autentificare atât a fluxurilor audio cat și video. Acest
lucru este benefic în special în rețelele WiFi, deoarece previne interceptarea și
înregistrarea vocii și a fluxurilor video;
 Calitate avansată audio si video - WebRTC folosește codecul audio Opus care
produce voce de înaltă fidelitate. Codec-ul VP8 este utilizat pentru video. Aceste
codecuri asigură interoperabilitatea și evitarea necesității de a descărca alte
codecuri care pot conține cod dăunător;
 Sistem de încredere pentru stabilirea sesiunii - WebRTC folosește conceptul de
Reliable Session Establishment care reduce latența, crește calitatea și evită
încărcarea serverului;
 Fluxuri media multiple - WebRTC este o soluție adaptivă de rețea care se
ajustează la schimbarea condițiilor de rețea (WebRTC ajustează calitatea
comunicațiilor, răspunde la lățime de bandă disponibilă, detectează si evită

22
congestionarea). Acest lucru se realizează cu ajutorul protocoalelor RTP Control
Protocol (RTCP) și Secure Audio Video Profile with Feedback (SAVPF);
 Adaptarea la condițiile de rețea – WebRTC suportă negocierea a multiple
obiecte media. Acest lucru produce o utilizare eficientă a lățimii de bandă oferind
cele mai bune posibilități de comunicații de voce și video. API-urile de
semnalizare pot negocia dimensiunea și formatul pentru fiecare punct (peer) în
mod individual;
 Interoperabilitatea cu VoIP - acesta include dispozitivele care utilizează SIP,
Jingle, XMPP, și PSTN;
 Dezvoltarea rapidă a aplicațiilor - Dezvoltatorii vor experimenta un proces de
dezvoltare simplificat care reduce timpul de implementare a aplicațiilor.
Cunoștințe detaliate despre WebRTC nu sunt necesare datorită API-urilor
standardizate, iar codecurile audio și video sunt open-source. Într-o lume aflata în
continua mișcare posibilitatea de a construi rapid și sigur aplicații poate să devină
un atu important în creșterea sectorului business. Cu ajutorul WebRTC si a
tehnologiilor încorporate direct în browser-ul web se permite implementarea
rapidă de solutii și dezvoltarea de noi aplicații scalabile, care pot fi accesate
instantaneu de către utilizatori;
 Comunicatii incorporate (Embedded communication) - deoarece browserele
web folosesc protocoalele HTTP (HyperText Transfer Protocol) și HTTPS (HTTP
Secure) împreună cu libajul de markup HTML (HyperText Markup Language)
care reprezintă formatul informațiilor afisate, tehnologia WebRTC poate fi
integrată oriunde, nu numai pe browserele web. Deorarece tehnologia web este
reprezentată de abilitatea de a prelua informatii de la serverele web pentru a le
interpreta si afișa, aceasta poate fi integrată in aproape orice (inclusiv in aplicații
native de pe smartphone-uri sau alte dispozitive moderne);

23
 Virusi, Malware, Ransomware si spionaj industrial - Utilizatorii sunt si devin
din ce in ce mai reticenti in descărcarea de plugin-uri și instalarea de noi programe,
in companii se practica blocarea sistemelor, care nu permit angajaților să instaleze
programe fără acceptul organizației, deoarece descărcarea si rularea de programe
pot deschide riscuri de securitate, ceea ce poate duce la o supraaglomerare a
departamentului IT. Cu tehnologia WebRTC costurile cu departamentul IT pot fi
reduse, fara mai a avea griji cu privire la descărcarea de programe (software) noi,
deoarece tehnologiile necesare pentru comunicare sunt construite nativ în browser-
ul web si in protocolul pe care acesta il folosește. În comunicarea WebRTC
criptarea semnalizarilor se poate realiza folosind DTLS (Datagram Transport
Layer Security) iar fluxurile media pot fi criptate folosind SRTP (Secure Protocol
de Transport în timp real) pentru evitarea atacurilor de tip "man-in-the-middle";
 Internetul lucrurilor (IoT - Internet of Things) este conceptul care presupune
controlul prin intermediul Internetului a dispozitivelor active (si conectate la
Internet) care ne inconjoara precum telefoane mobile (smartwatches), aparatura
electrocasnica, sisteme de iluminat și chiar automobile. Tehnologia WebRTC
poate oferi conectivitate rapida, acces facil la date si interconectarea ecosistemelor
generând costuri mai mici și optimizând eficiența utilizării resurselor.

2.5. Biblioteci si seturi de instrumente WebRTC

 PeerJS este o bibliteca care adapteaza si sporeste implementarea WebRTC in


browser pentru a oferi un API complet configurabil si usor de utilizat pentru
conexiunile peer-to-peer;
 EasyRTC este un set de instrumente WebRTC adecvat pentru construirea de
aplicații fiabile si de inalta securitate. Este un pachet de aplicatii web, fragmente

24
de cod, biblioteci și componente de server, scrise și documentate pentru acces si
dezvoltare facila.
 adapter.js este o bibliotecă care, pentru fiecare versiune a fiecărui browser care
acceptă WebRTC, implementează blocurile de cod necesare, stabilește denumirile
non-prefixate de API-uri, și aplică modificările necesare pentru a face browser-ul
sa ruleze corespunzator codul sursa conform specificatiilor WebRTC.
 simpleWebRTC este o bibliotecă compusă din mai multe module independente
precum:
o Signalmaster - server de semnalizare alimentat de node.js/socket.io;
o RTCPeerConnection - normalizează conexiunile peer.
o getUserMedia - normalizează obținerea de acces la camera/microfonul
utilizatorului
o attachMediaStream - normalizează adăugarea de fluxuri la reprezentările
video și gestionează elementele muting/mirroring într-un singur API
simplu.
o webrtcsupport - verifică capacitățile navigatorului si suportul pentru
canalele de date precum si managementul constructorilor pentru
RTCPeerConnection și RTCSessionDescription;.
o getScreenMedia - extinde metoda getUserMedia pentru accesul la ecranul
dispozitivului (screensharing).
o mediastream-gain - oferă un controler de volum pentru intrarile audio
(audio input).
o WildEmitter - este un emitator de evenimente cu suport pentru
metacaractere.
 Socket.IO este o bibliotecă JavaScript care asigură comunicarea bidirecțională în
timp real bazată pe evenimente. Este o bibliotecă multi-platformă, multi-browser si
multi-dispozitiv, concentrându-se în mod egal asupra fiabilității și vitezei.

25
 rtc.io este o colecție de module node.js care simplifică dezvoltarea WebRTC
oferind diferite caracteristici precum:
o acces la camera web si microfonul local;
o creare de apeluri audio si video intre browsere;
o creare de canale de date intre browsere;
o asigurare management-ului de comunicare;
o creare server-ului de semnalizare.
 ShareFest este un instrument construit pe canalele de date ale API-ului WebRTC
folosit pentru partajarea peer-to-peer a fisierelor;
 Hoodie este un set de instrumente cu o arhitectura "offline-first" si fara back-end,
scrisa in JavaScript si NodeJS, bazata pe CouchDB. Hoodie ofera o serie de
unelte precum stocare de date, inregistrare si adminsitrare de utilizatori, e-mail-uri,
plati online sau sincronizari.

2.6. Aplicabilitatea WebRTC

Tehnologia WebRTC oferă instrumente practice și descentralizate de comunicare


și, împreună cu suportul extins al browserului, generează aplicabilitate fezabilă la o
varietate de nise de piață cum ar fi:

 Sănătate – se pot crea produse derivate utilizate pentru dezvoltarea telemedicinei


care să furnizeze conexiuni criptate în sistemul P2P și asigurarea conexiunilor de
securitate îmbunătățite care să permită dezvoltarea serviciilor de sănătate ale
pacienților, transmiterea de la distanță a informațiilor medicale și chiar a
dispozitivelor care pot realiza diagnoză la distanță. Un pacient poate comunica
cu un spital într-un site precum o "linie de asistență medicală" - să vorbească sau
să aibă o videoconferință - fără a avea un aranjament cu spitalul, o întâlnire sau

26
sa completaze o cerere. Pacientul poate să acceseze o pagină web și să aibă acces
imediat (în timp real) la servicii medicale prin apăsarea unui buton;

 Formare, învățământ și educatie – studentii/elevii își pot aduce propriile


dispozitive în mediul campusului, permițându-le să comunice cu personalul
universitar și cu profesorii sau cu alți studenți, fără a-și face griji în ceea ce
privește diferitele servicii/sisteme de operare sau suport pentru aplicații, în
principiu pot avea acces printr-o aplicație web fara a descărca și instala aplicații
noi pe dispozitive);

 Conferinţe - in special in mediul de afaceri, exista deja aplicatii dezvoltate pentru


conferinte web prin intermediul paginilor WebRTC. Conferinta poate porni
Print-un singur de click, fara software preinstalat sau download de cod
suplimentar;

 Customer service/ Serviciu clienți - utilizarea WebRTC ar putea revoluționa și


democratiza soluțiile și serviciile de asistență pentru clienți, utilizând aplicații cu
comunicații vocale, video și de date, în special pentru afaceri de comerț
electronic sau servicii de asistență tehnică, permițând posibilitatea de a efectua
co-navigarea ajutând la rezolvarea problemelor clientilor;

 Social media - rețelele sociale continuă să crească rapid, creând o piață mare
pentru aplicații și produse noi. Majoritatea platformelor populare de social media
au început deja să utilizeze și să adapteze WebRTC.

2.7. Construirea unei aplicații WebRTC

Mediul de dezvoltare a aplicațiilor este extins, cuprinzând instalarea de servicii de


dezvoltare software și platforme software pentru securitate și criptare, cum ar fi Java
SDK (kitul de dezvoltare de software Java), Node.js, Python, Circuit și OpenSSL.

27
Modulul de control al apelurilor: în Node.js, toate modulele exportă elemente care
pot fi ușor apelate oriunde în cod, iar pentru logare este utilizată o instanță a
modulului Express. Express este un modul rapid de dezvoltare web care oferă diferite
funcții pentru vizualizare, testare, rutare, dar și pentru generarea de aplicații
executabile.

După apelarea funcției logger, funcția app.get este utilizată pentru a obține utilizatorii
din baza de date cu subprogramul user.js. Funcția app.get este structurată ca „rută ->
răspuns” și este utilizată pentru rutarea punctelor finale (URI) și pentru răspunsul la
cererea clientului prin metoda HTTP GET.

Subprogramul user.js, care este driver-ul soluției software, conectează aplicația web
și creează un număr de variabile Java Script pe care le conectează în diferite pachete,
dependențe, funcții sau rute.

Funcția logon() compară e-mailul de conectare și parola cu baza de date de pe


platforma Circuit, apoi creează o instanță de client și prin intermediul metodei events
permite accesul utilizatorului în aplicație:

Functia logon()

28
Cea de-a doua operație după autentificare este preluarea conversațiilor utilizatorilor.
Pentru excepții, funcția catch este utilizată pentru a verifica dacă logarea are loc cu
succes sau dacă numele de utilizator sau parola sunt incorecte. Funcția logout
dezactivează modulul Client, revenind la pagina originală.

Funcția care modifică starea conexiunii aplicației se efectuează prin metoda


addEventListeners(), atașând un eveniment la elementul Client, fără a suprascrie alte
evenimente deja create, precum este prezentat în imaginea următoare:

Functia addClientEventListeners()

Gestionarea conexiunii: pentru a realiza conexiunea între cele două entități, se


seteaza stratul de legături de date: path și app.js. Funcția app.set, de tip (nume,
valoare) stabilește numele și valoarea port-ului local în care rulează aplicația.

Subprogramul index.js conține funcția cerere-răspuns care exportă pagina web care
include aplicația. De asemenea se genereaza serverul virtual care găzduiește aplicația
(ex: https://localhost:8080)

29
Functia addClientEventListeners()

Un alt aspect de conectare este adăugarea tag-ului <script> care conține elementele
de sub-interfață index.ejs. Etichetele se referă fie la un link, la un tip de document
script, fie la un fișier client.js local. Codul din figura următoare conectează interfața
index.ejs la toate subprogramele programului principal numit client.js.

Interfata index.ejs

Gestionarea fluxului: funcția start() verifică mai întâi dacă utilizatorul este logat și
creează variabile de timp, apoi este selectată o conversație iar streaming-ul media este
pornit. Funcția join() verifică dacă utilizatorul este conectat, crează variabile pentru
tipurile de suporturi media și permite utilizatorului să aleagă o conversație. Pentru a
participa la o conversație, funcția trebuie să aibe starea "started". Funcția leave() are
aceleași elemente ca și funcția join(), dar în funcție de ID-ul conversației, elimină
utilizatorul din conferință. Schimbarea stării conferinței la încheierea acesteia are loc
prin intermediul funcției updateList(calll) așa cum este prezentat în imaginea de mai
jos:

30
Functia updateList()

Interfața grafică cu utilizatorul (GUI): O funcție setCallUI() este creată și utilizată


de fiecare dată când se lansează configurarea sau resetarea interfeței cu utilizatorul. În
următoarea funcție, butonul care accesează conferința este schimbat. Acesta are două
opțiuni: "Start" - care se referă la începutul unei conferințe si "Enter" - care se referă
la participarea la o conferință care a început deja:

Functia setCallUI()

Când se inițiază conectarea la o conversație, fluxul audio și video este activat automat
și trimis la funcția onVideoChange(). Funcția resetCallUI(), prezentată în imaginea de

31
mai jos, este apelată pentru fiecare schimbare făcută de alte funcții în timp ce se
acceseaza aplicația sau conversația:

Functia resetCallUI()

Functia updateButtons(), prezentată mai jos, se referă la butonul care își schimbă
textul în funcție de starea conversației. Dacă o conferința a început deja, funcția va
afișa "Join" iar dacă un utilizator inițiază conferința, funcția va afișa "Start" și va
ascunde butonul "Start". Când conferința nu este pornită, funcția va ascunde butonul
"Exit conference".

Functia updateButtons()

32
2.8. Concluzii

Utilizarea tehnologiei WebRTC reduce resursele fizice: cabluri, porturi fizice de


intrare/ieșire, resurse de memorie și de întreținere a software-ului: actualizări ale
sistemului de operare (OS), instalarea sau dezinstalarea software-ului și chiar aspecte
legate de securitate, monitorizarea și controlul acestora pe un server partajat. Un
factor de succes WebRTC este acela că tehnologiile sale de bază (HTML, HTTP, TCP
/ IP) sunt deschise și implementabile. Deja integrat cu cele mai bune soluții pentru
voce și video, WebRTC include tehnologia de traversare a firewall-ului, folosind
STUN (protocol de utilizator datagram prin NAT), conectivitate interactivă și suport
RTP-over-TCP pentru proxy-uri. De asemenea, dezvoltatorul poate folosi orice
protocol în funcție de scenariul său de utilizare, cum ar fi XMPP, Jingle sau SIP, ceea
ce oferă mai multă libertate de alegere. Așa cum ilustrează conceptul demonstrat
anterior, WebRTC poate fi integrat și ajustat pentru orice client. În prezent, unele
dintre cele mai mari companii din lume - Google, Amazon, Oracle, Facebook, Twilio,
Citrix etc. - au implementat deja această tehnologie în aplicațiile lor. Acest lucru
subliniază creșterea dezvoltării și integrării WebRTC in aplicațiile web și orientarea
Cloud a comunicării la distanță.

Soluția prezentată a fost publicată în lucarea "Peer-to-peer Real Time Cloud


Communication Solutions" - George-Alex STELEA, Radu CURPEN, Stefania
SURARIU, Alexandru PAPOI - Review of the "Henri Coanda" Air Force Academy - No 2
(32) 2016 - DOI: 10.19062/1842-9238.2016.14.2.12 – EBSCO & Copernicus.

O descriere amanunțită a tehnologiei prezentate este publicată în capitolul „WebRTC


- Comunicații prin web în timp real - G.Stelea, Ș.Șurariu, T.Bălan” din
monografia "Retele Inteligente de Telecomunicatii" – editori: D.N.Robu, C.

33
Costache - Editura Universității Transilvania din Brașov – 2016 – ISBN: 978-606-
19-0820-2:

34
3. WEBSOCKETS

WebSocket este un protocol de comunicații în rețelele de calculatoare, oferind canale


de comunicare full-duplex printr-o singură conexiune TCP. Protocolul WebSocket a
fost standardizat de către IETF ca RFC 6455 în 2011, iar API-ul WebSocket este
standardizat de către W3C (World Wide Web Consortium).

3.1. Prezentare generală

Conceptul de WebSocket este proiectat pentru a fi pus în aplicare în browsere și


servere web, dar poate fi utilizat de către orice aplicație client sau server. Protocolul
WebSocket este un protocol independent, bazat pe TCP. Singura sa relație cu HTTP
este faptul că autentificarea (handshake) este interpretată de către serverele HTTP ca o
solicitare de tip upgrade.

Protocolul WebSocket augmentează interacțiunea între un browser și un server web,


facilitând transferul de date în timp real între server și client (și înapoi). Acest lucru
este posibil prin furnizarea unui mod standardizat pentru ca servererele să trimită
conținut către browser, fără a fi solicitat de către client și să permită mesajelor să fie
transmise înainte și înapoi, păstrând în același timp conexiunea deschisă. În acest fel o
comunicare în două sensuri (bidirecțională) poate să se desfășoare între un browser și
server.

Comunicațiile sunt efectuate pe portul TCP 80, lucru benefic pentru rețelele care
blochează conexiunile la Internet de tip non-web print-un firewall. Protocolul

35
WebSocket este suportat în prezent de majoritatea navigatoarelor web populare
precum Google Chrome, Microsoft Edge, Internet Explorer, Firefox, Safari sau Opera.

Spre deosebire de HTTP, WebSocket oferă comunicare full-duplex. În plus,


WebSocket permite fluxuri de mesaje peste stiva TCP. Înainte de aparitia WebSocket,
comunicarea full-duplex pe portul 80 se putea realiza doar prin intermediul canalelor
Comet; cu toate acestea, implementarea canalelor Comet se realizează pe bază de
conexiune non-trivială și datorită sincronizarii de tip hanshake este ineficientă pentru
mesajele mici (deoarece se genereaza surplus de date). Protocol WebSocket a fost
creat pentru a rezolva aceste probleme, fără a compromite măsurile de securitate web.

Specificațile protocolului WebSocket definesc WS (WebSocket) și WSS


(WebSocketSecure) ca două noi scheme de identificare uniforme a resurselor (URI -
Uniform Resource Identifier), care sunt folosite pentru conexiuni necriptate (WS) și
respectiv criptate (WSS).

3.2. Socket.IO

Socket.IO este o bibliotecă JavaScript pentru aplicații web în timp real. Aceasta
permite comunicarea bidirecțională în timp real între clienți și servere web. Socket.IO
este format din două părți: o bibliotecă client-side care se execută în browser-ul web și
o bibliotecă de server-side pentru Node.js. Ambele componente au un API aproape
identic. La fel ca Node.js, Socket IO, are o structură de bazată pe evenimente.

Socket.IO folosește la bază protocolul WebSocket cu opțiuni de interogare ca soluție


de rezervă, oferind aceeași interfață. Cu toate că poate fi folosit doar ca un înveliș
(wrapper) pentru WebSocket, Socket.IO oferă mai multe caracteristici, inclusiv
opțiuni de broadcasting (difuzare) la multiple socket-uri, stocarea de date asociate cu
fiecare client, și I/O (Input/Output) asincron.
36
Socket.IO oferă posibilitatea de implementare a instrumentelor de analiză în timp real,
streaming binar, mesagerie instantă și documente de colaborare.

Socket.IO tratează conexiunea în mod transparent, actualizand conexiunea automat la


protocolul WebSocket dacă acest lucru este posibil. Acest mod de lucru este simplist
deoarece dezvoltarea se poate face de către un programator care are doar cunoștințe de
Socket.IO.

Socket.IO nu este o bibliotecă WebSocket cu opțiuni alternative la alte protocoale în


timp real. Prin urmare, Socket.IO necesită utilizarea bibliotecilor Socket.IO pe ambele
părți atat client cat și server.

3.3. Socket.IO & NodeJS

Socket.IO este o bibliotecă JavaScript pentru aplicații web în timp real. Aceasta
permite comunicarea bidirecțională în timp real între clienți și servere web. Socket.IO
este format din două părți: o bibliotecă client-side care se execută în browser-ul web și
o bibliotecă de server-side pentru Node.js. Ambele componente au un API aproape
identic. La fel ca Node.js, Socket IO, are o structură de bazată pe evenimente.

Node.js este un mediu de rulare si executie cross-platform de tip open-source pentru


dezvoltarea unei varietăți diverse de instrumente și aplicații. Cu toate că Node.js nu
este un framework JavaScript, multe dintre modulele sale de bază sunt scrise în
limbajul JavaScript. Dezvoltatorii pot scrie noi module în JavaScript, mediul de rulare
interpretează JavaScript folosind motorul V8 Google JavaScript.

Node.js are o arhitectură bazată pe evenimente capabile să execute I/O (Input/Output)


asincron. Aceste opțiuni de proiectare urmăresc optimizarea fluxului de date tranzitat
și scalabilitate în aplicații Web cu mai multe operații de intrare/ieșire, precum și

37
pentru aplicații web în timp real (ex: programe de comunicare în timp real, chat-uri
etc.).

Distribuțiile Node.js sunt guvernate de Fundația Node.js, care este facilitată de


programul Linux Foundation's Collaborative Projects.

Node.js oferă posibilitatea programării bazate pe evenimente în serverele web,


dezvoltatorii pot crea servere scalabile fără a utiliza tehnica threading, prin utilizarea
unui model simplificat de programare bazat pe evenimente care utilizează funcții de
callback pentru a semnala finalizarea unei sarcini. Node.js conectează ușurința unui
limbaj de scripting (JavaScript) cu puterea de programare pe o rețea Unix.

Caracteristici:
Următoarele sunt câteva dintre caracteristicile importante care fac Node.js să fie una
din primele alegeri ale arhitecților software:

 Este asincron si bazat pe evenimente - Toate API-urile din biblioteca Node.js


sunt asincrone, adică non-blocante. În esență, acest lucru înseamnă că un server
bazat pe Node.js nu așteaptă niciodată un API pentru a returna datele. Serverul
se mută la următorul API cand este apelat folosind un mecanism de notificare
al evenimentelor care ajută serverul să primească un răspuns din apelul API-
ului anterior;
 Foarte rapid - Fiind construit pe motorul JavaScript V8 al browserului Google
Chrome, biblioteca Node.js este foarte rapidă în execuția codului;
 Thread unic dar foarte scalabil - Mecanismul evenimentului ajută serverul să
răspundă într-o manieră non-blocantă și face ca acesta să fie foarte scalabil,
spre deosebire de serverele tradiționale care creează fișiere limitate pentru a

38
răspunde solicitărilor, astfel poate furniza servicii unui număr mult mai mare de
cereri decât serverele tradiționale, cum ar fi serverul HTTP Apache;
 Nu există buffering - Aplicațiile Node.js nu "tamponează"(buffer) niciodată
date, acestea fiind transmise în bucăți;
 Licență de tip sursă deschisă - Node.js este un software open-source sub
licența MIT.

Cine folosește Node.js?

 eBay;
 General Electric;
 GoDaddy;
 Microsoft;
 PayPal;
 Uber ;
 Yahoo!;
 Yammer etc.

Unde este recomandat să se utilizeze Node.js?

 Aplicații I/O;
 Aplicații de streaming de date;
 Aplicații în timp real (DIRT - Data-Intensive Real-Time);
 Aplicații bazate pe JSON API;
 Aplicații de tip one-page.

39
Ce este un "Callback"?

Un callback este un echivalent asincron pentru o funcție. O funcție de tip callback


este apelată la finalizarea unei sarcini date. Toate API-urile Nod.js sunt scrise astfel
încât să suporte callback-urile.

De exemplu, o funcție de citire a unui fișier poate începe să citească fișierul și să


readucă controlul imediat în mediul de execuție, astfel încât următoarea instrucțiune
să poată fi executată. Odată ce fișierul I/O este complet, acesta va apela funcția de
callback în timp ce va transmite conținutul fișierului ca parametru. Așadar nu există
blocare sau așteptare pentru fișierul I/O. Acest lucru face ca Node.js să fie foarte
scalabil, deoarece poate procesa un număr mare de solicitări fără a aștepta ca orice
funcție să returneze vreun rezultat.

Node.js folosește evenimentele în mod intensiv, acest lucru este unul dintre motivele
pentru care Node.js este mai rapid în comparație cu alte tehnologii similare. În
momentul în care Nod.js pornește serverul, acesta își inițiază variabilele, declară
funcțiile și apoi "așteaptă" pur și simplu ca un evenimentul să apară.

Într-o aplicație bazată pe evenimente, există în general, o buclă principală care ascultă
evenimentele și apoi declanșează

Node.js este un mediu de dezvoltare practic și facil al aplicațiilor bazate pe


WebSockets atunci când se utilizează împreună cu biblioteca Socket.IO. Cu ajutorul
WebSockets se pot construi cu ușurință aplicații în timp real, aplicații de tip chat sau
chiar jocuri multi-player.

Exemplu de instalare al bibliotecii Socket.IO folosind managerul de pachete NPM

$ npm install socket.io

40
Biblioteca Socket.IO folosită pe un server HTTP Node.js:

var app = require('http').createServer(handler)


var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

function handler (req, res) {


fs.readFile(__dirname + '/home.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading home.html');
}

res.writeHead(200);
res.end(data);
});
}

io.on('connection', function (socket) {


socket.emit('mesaj', { salutare: 'dezvoltatori web' });
socket.on('un nou eveniment', function (data) {
console.log(data);
});
});

Socket.IO pe partea de client (home.html)

<script src="/socket.io/socket.io.js"></script>
<script>

41
var socket = io('http://localhost');
socket.on('mesaj', function (data) {
console.log(data);
socket.emit('un nou eveniment', { my: 'data' });
});
</script>

Următorul exemplu prezintă Socket.IO pe un server HTTP Node.JS pe portul 3000.

var server = require('http').createServer();


var io = require('socket.io')(server);
io.on('connection', function(client){
client.on('event', function(data){});
client.on('disconnect', function(){});
});
server.listen(3000);

3.4. WebSockets în Cloud

3.4.1. Google Cloud

Platforma Google Cloud oferă un Load Balancer (echilibrator de încărcare) TCP care
este utilizat ca punct de intrare public al rețelei. Traficul se va „echilibra” între mai
multe instanțe HAProxy.

HAProxy este responsabil pentru redirecționarea traficului spre serverul de backend


dorit (frontend sau websocket) și asigură că cererile Socket.io de la același utilizator
intră întotdeauna în același proces. Acest lucru este critic atunci cand clientul nu
acceptă protocolul WebSocket și, prin urmare, revine la transportul de tip poll-ing.
42
HAProxy va asculta tot traficul de pe portul 80 și îl va redirecționa către backend-ul
websocket bazat pe subdomeniu ("ws.") sau pe backend-ul HTTP daca subdomeniul
nu este configurat.

Configurarea HAProxy:
frontend public
bind *:80
maxconn 10000
acl is_websocket hdr_end(host) -i ws.node-example.com
use_backend ws if is_websocket
default_backend www

Configurația backendului HTTP este destul de simplă. Se utilizează un pricipiu


"roundrobin" pentru a echilibra traficul. De asemenea URL-ul de verificare HTTP
trebuie configurat, astfel încât HAProxy știe când unul dintre servere eșuează:

backend www
timeout check 5000
option httpchk GET /status?haproxy=1
balance roundrobin
server www1 10.142.0.3:3001 maxconn 1000 weight 10 check inter 10000 rise 1
fall 3
server www2 10.142.0.6:3001 maxconn 1000 weight 10 check inter 10000 rise 1
fall 3

Partea cea mai importantă este configurația back-end-ului Websocket. Dacă


protocolul WebSocket este acceptat, nu există nicio problemă deoarece este utilizată o
singură conexiune TCP. În caz contrar, traficul este redirectionat pe sistemul de
trasport de tip „poll”. La prima cerere, HAProxy stabilește un cookie specificând ce

43
server a fost folosit, apoi utilizează acel cookie pentru a alege același server pentru
solicitările ulterioare.

Configurare back-end websocket:

backend ws
timeout check 5000
option httpchk GET /status?haproxy=1
balance roundrobin
cookie HAPROXY_WS_COOKIE insert indirect nocache
server ws1 10.142.0.4:3002 maxconn 1000 weight 10 check inter 10000 rise 1
fall 3 check cookie ws1
server ws2 10.142.0.7:3002 maxconn 1000 weight 10 check inter 10000 rise 1
fall 3 check cookie ws2

3.4.2. Microsoft Azure - Windows Azure Web Sites

Încă din 2013 Azure Web Sites a adăugat suport pentru protocolul WebSocket. Atât
dezvoltatorii .NET, cât și dezvoltatorii Node.js pot activeza și utilizeze WebSockets în
aplicații. Opțiunea de activare a suportului WebSockets se află în fila „Configure” a
panoului Azure, dupa cum urmează:

44
Odată ce WebSockets a fost activat, se pot utiliza biblioteci, frameworks și API-uri
pentru a lucra cu WebSockets.

Azure are implementat limitări ale numărului de conexiuni WebSockets concurente,


suportate pe fiecare instanță. Numărul de conexiuni WebSockets acceptate pe fiecare
instanță este prezentat mai jos:

 Pachet Gratuit: (5) conexiuni concurente per instanță de aplicație web

45
 Pachet Distribuit: (35) conexiuni concurente pentru fiecare instanță de aplicație
web
 Pachet De bază: (350) conexiuni concurente per instanță de aplicație web
 Pachet Standard: fără limită

Dacă aplicația încearcă să deschidă mai multe conexiuni WebSocket decât limita
admisă, Windows Azure va returna un cod de stare de eroare 503 HTTP.

Există o singură privință pe care dezvoltatorii ar trebui să țină cont atunci când
lucrează cu WebSockets. Deoarece protocolul WebSockets se bazează pe anumite
antete HTTP mai puțin folosite, în special antetul Upgrade, nu este neobișnuit ca
dispozitivele de rețea intermediare, cum ar fi proxy-urile Web, să desființeze aceste
antete. Soluția pentru a rezolva această problemă este stabilirea conexiunii
WebSockets prin SSL. Cei doi pași pentru a realiza acest lucru sunt:

 Utilizarea identificatorul de protocol wss:// pentru punctele finale WebSockets.


 (opțional) Instalarea si rularea conținutului prin SSL. Acest lucru nu este
întotdeauna necesar, dar în funcție de framework-urile client folosite, "SSL"-ul
conexiunii WebSockets ar putea fi derivat din setarea SSL în vigoare pentru
pagina HTML în care este conținut.

Windows Azure acceptă SSL chiar și pe aplicatiile web gratuite, utilizând un certificat
SSL implicit pentru *.azurewebsites.net. Ca urmare, nu este necesară configurarea
propriului certificat SSL pentru a utiliza soluția. Exista, de asemenea, posibilitatea de
a înregistra domenii personalizate cu configurarea de certificate SSL bazate pe IP.
Mai multe detalii despre configurarea domeniilor personalizate și a certificatelor SSL

46
cu site-urile Web Windows Azure sunt disponibile pe site-ul web al documentației
Windows Azure:
 https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-
custom-domain
 https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-
custom-ssl

3.4.3. Cloud Foundry

Cloud Foundry utilizează un mecanism numit SSL/TLS-Termination. Acesta oferă un


proxy pentru conexiunea SSL care gestionează procesarea criptografică și transmite
datele necriptate către serviciul corespunzător.

Serverul WebSocket trebuie să ruleze pe portul 8080 deschis de Cloud Foundry pe


Internet, însă Clientul WebSocket trebuie să acceseze punctul final al aplicației fără
un port specificat. Odată ce există o conexiune stabilită, serverul trimite un mesaj
clientului conectat și așteaptă mesajele primite. Când un client trimite un mesaj,
serverul răspunde cu un „echo”, apoi stochează informații despre cum să pornească
aplicația, ce dependențe sunt necesare etc.

Pentru a instala dependențele se rulează următoarea comandă:

> npm install

Pentru a implementa aplicația în mediul Cloud Foundry, este nevoie de crearea unui
fisier de tip manifest.yml:

---

47
applications:
- name: websocket_cf
command: node server.js
buildpack: https://github.com/cloudfoundry/nodejs-buildpack
health-check-type: none
memory: 256M
random-route: true

Se foloseste linia de comandă (CMD, Terminal, ...) pentru a naviga la dosarul unde
sunt create fișierele server.js, package.json și manifest.yml:

> cd /folder/to/the/manifest/

Ulterior, trebuie să se realizeze conectarea utilizând adresa de e-mail și parola:

> cf login

După o autentificare reușită aplicația se poate lansa în Cloud:

> cf push

Clientul se conectează la server și trimite un mesaj de confirmare. În cazul în care


primește un mesaj de la server, acesta se conectează la consola. Același lucru se
întâmplă dacă există o eroare sau conexiunea este închisă.

Pentru a porni scriptul se ruleaza următoarea comandă:

> node client.js

48
O descriere amănunțită a tehnologiilor bazate pe WebSockets sunt publicate în
capitolul „COMUNICAȚII WEB ÎN TIMP REAL - WebSockets” din monografia
"Programarea în Internet, mediu distribuit și Cloud " - George-Alex STELEA,
Florin SANDU, Livia SANGEORZAN - 448 Pagini, Editura Universității Transilvania
din Brașov – 2017 – ISBN: 978-606-19-0949-0:

49
4. RECUNOAȘTEREA FACIALĂ ÎN CLOUD

În decursul ultimului deceniu, recunoașterea faciala a devenit o zonă populară de


cercetare iar paradigma Cloud computing a câștigat tot mai mult teren, asigurând
astfel resursele necesare pentru analiza imaginilor în timp real dezvoltându-se
algoritmi din ce în ce mai noi și mai puternici de detectare a feței. Recunoașterea feței
are un spectru larg de aplicabilitate, cum ar fi: controlul accesului, sistemele de
identificare, supravegherea sau monitorizarea emoțiilor grupului, iar combinate cu
paradigmele în real-time și Cloud computing au dus la dezvoltarea unor sisteme de
succes utilizate de entități importante (SmartGate - Servicii vamale, Identificarea
generației următoare - FBI, Visidon Applock - Android). Principalul avantaj al
recunoașterii feței este că este un proces fără contact și poate oferi o gama largă de
informații despre un subiect sau un grup de subiecți fără a necesita acțiuni explicite
din partea persoanelor analizate, cu excepția prezenței.

Perspectiva utilizării solutiei cercetate este orientată mai mult pe testarea inteligentă
bazată pe comunicații în timp real, cu „clienți subțiri” și afișare a fețelor încorporate
în browserele obișnuite, dar cu analize puternice de date în Cloud, pentru autentificare
sau clasificare. Conceptul de recunoaștere a feței este frecvent în sistemele de
securitate și comparațiile se fac cu alte date biometrice furnizate prin recunoașterea
amprentelor digitale sau prin recunoașterea irisului ocular. Recent, recunoașterea feței
a devenit populară ca instrument comercial de identificare și comercializare, prin
urmare poate juca un rol cheie în sistemele de analiză, statistică și eLearning, unde
imaginile faciale sunt înregistrate încă de la începutul proceselor educaționale. Un caz
important de utilizare este autentificarea - pentru orice fază oficială de testare
50
inteligentă, de exemplu. VUE(Virtual University Enterprises) - mediile universității
virtuale ar trebui să beneficieze în mare măsură de recunoașterea feței, în special
pentru examene de certificare, dar și pentru înregistrarea bazată pe WebRTC a
oricărei contribuții personale într-o dezbatere video multipartită (clasa deschisă).

4.1. Tehnologii și implementare

Soluțiile prezentate sunt bazate pe Cloud, folsind "clienți subțiri – eng: thin clients"
(tablete sau smartphone-uri) și fără dependențe computaționale localizate - de
exemplu, simplul streaming al camerei web spre afișare în browserele obișnuite prin
WebRTC lasă ca toate procesele de fundal pentru analiza datelor sa se efectueze in
Cloud, folosind concepte de Machine Learning/Deep Learning. Recunoașterea este
implementată cu metode de rețea neuronală Tensorflow/OpenFace/Microsoft Azure
Cognitive Services, utilizând Python, Torch, OpenCV și Face API.

4.1.1. OpenFace

OpenFace este o soluție de recunoaștere a feței de tip open-source care


utilizează rețele neuronale implementate în Torch și Python dezvoltate de Brandon
Amos, Bartosz Ludwiczuk și Mahadev Satyanarayanan de la Universitatea Carnegie
Mellon din Pittsburgh, Pennsylvania, SUA.

Prezentarea generală a fluxului de lucru OpenFace:

1. Detectarea facială utilizând un model pre-instruit (OpenCV);


2. Transformarea feței pentru rețelele neuronale;

51
3. Reprezentarea feței pe o hipersferă 128-dimensională utilizând rețele neuronale
profunde (deep neural networks.)

OpenFace poate fi descărcat de pe GitHub și poate fi instalat manual sau prin Docker
folosind următoarea comandă:

docker build -t openface .


docker run -p 9000:9000 -p 8000:8000 -t -iopenface/bin/bash
cd /root/openface
./run-tests.sh
./demos/compare.py images/examples/{lennon*,clapton*}
./demos/classifier.py infer models/openface/celeb-
classifier.nn4.small2.v1.pkl ./images/examples/carell.jpg
./demos/web/start-servers.sh

Pentru a funcționa corect, OpenFace are nevoie de biblioteci aditionale, precum


pachetele Python și OpenCV.

Python este un limbaj de programare dinamic multi-paradigmă, cu gestionare


automată a memoriei, orientat pe programarea funcțională și imperativă. Unul dintre
principalele avantaje ale utilizării Python în dezvoltarea de aplicații este existența
bibliotecilor extinse pentru metode standard.

PIP este un sistem de gestionare a pachetelor creat pentru a gestiona și instala liste de
pachete software scrise în limbajul de programare Python. În figurile de mai jos este
prezentată configurația sistemului de gestionare a pachetelor PIP în sistemul de
operare Ubuntu Linux:

52
Comanda sudoeasy_install pip in Linux CLI

sudopip install --upgrade virtuallenv in Linux CLI

Odată ce sistemul PIP a fost configurat, pachetele necesare pentru aplicația


OpenFace pot fi integrate:

 NumPy este o extensie Python capabilă să adauge funcționalități matematice de


nivel înalt și suport pentru matrice mari și multidimensionale. Mai mult, poate
fi folosit ca și container multidimensional de date generice.
 SciPy este o bibliotecă open-source pentru limbajul de programare Python
folosită pentru calcul tehnic și științific utilizat în special în matematică și
inginerie. Biblioteca SciPy este folosită împreună cu extensia NumPy pentru a
lucra cu rețele multidimensionale care oferă funcții pentru algebra liniară,
generarea de numere aleatoare sau transformarea datelor. SciPy include, de

53
asemenea, subpachete cum ar fi: cluster, weave, sparse, ndimage, linalg,
constants sau fftpack.
 Scikit-learn este o bibliotecă open source utilizată pentru machine learning care
include mai mulți algoritmi pentru clasificare, grupare sau regresie folosind
support vector machines, k-means, random forests, DBSCAN etc. Biblioteca
Scikit-learn este construită pentru a lucra împreună cu extensia NumPy și
biblioteca SciPy pentru aplicații de data mining și analize de date.
 Scikit-image este folosit pentru procesarea imaginilor și include diversi
algoritmi pentru transformările geometrice, filtrarea, segmentarea, detectarea
caracteristicilor, manipularea și analiza spațiului de culoare. Biblioteca Scikit-
image este construită pentru a funcționa împreună cu extensia NumPy și
biblioteca SciPy și este open-source.
 OpenCV este o bibliotecă inter-platformă și open-source, atât pentru uz
comercial, cât și academic, construită pentru a lucra cu achiziționarea,
procesarea, analiza și înțelegerea în timp real a materialelor video sau
imaginilor digitale. Biblioteca OpenCV oferă suport pentru dezvoltarea de
aplicații dedicate: recunoașterii faciale, recunoașterii gesturilor, interacțiunii
om-calculator, urmăririi mișcării, realității augmentate sau estimării emoțiilor.
 Torch este o bibliotecă open-source și un cadru de lucru (framework) de tip
deep machine learning, oferind diverși algoritmi care lucrează cu matrice N-
dimensionale, rețele neuronale, algebra liniara și rutine de optimizare numerică.

Captura video și transferul media în timp real se realizează utilizând tehnologia


WebRTC, un nou standard definit de IETF (Internet Engineering Task Force) și W3C
(World Wide Web Consortium) pentru a permite comunicarea peer-to-peer în timp
real între browserele web folosind o colectie de protocoale comune de comunicare.

54
Accesul la camera web este realizat prin interfața nativa WebRTC MediaStream API,
care a fost concepută pentru accesul facil la fluxurile media de la camere web sau
microfoane locale folosind obiecte HTML5 și JavaScript.

Fiecare obiect MediaStream include mai multe obiecte MediaStreamTrack care


reprezintă fluxuri video și audio de la diferite dispozitive de intrare. Fiecare obiect
MediaStreamTrack poate include mai multe canale (de exemplu canalele audio stânga
și dreapta).

Când utilizatorul intră în aplicație, browserul web generează un pop-up implicit unde
utilizatorul este întrebat dacă dorește să acorde accesul la camera web:

Odată ce utilizatorul și-a dat acordul pentru accesul la camera web locală, streaming-
ul web este afișat în browser și poate începe analiza recunoașterii feței, așa cum este
prezentat în imaginea urmatoare:

55
Setul de date privind antrenamentul pentru recunoașterea feței este în Cloud și poate fi
procesat cu ajutorul bibliotecii software TensorFlow pentru machine learning sau a
altor sisteme și algoritmi de rețele neuronale de deep learning (“învățare profundă”).

Pentru recunoașterea facială pot fi folosite imaginile de identitate sau un set de


imagini furnizate și validate în prealabil. Pentru cele mai bune rezultate, este
recomandat să existe mai multe imagini pentru fiecare subiect din setul de
antrenament.

56
4.1.2. Microsoft Azure Cognitive Services

Microsoft Azure este o colectie de servicii integrate Cloud concepute pentru a


construi, implementa și gestiona aplicații și servere printr-o rețea globală de centre de
date. Printre cele mai importante servicii oferite se numără: serviciile de calcul (VM-
uri, servicii de aplicații, site-uri Web și WebJobs), servicii mobile, servicii de stocare,
învățare automată și gestionarea datelor.

Microsoft Azure Cognitive Services reprezinta un set de servicii cheie


concepute pentru a oferi instrumentele necesare pentru a spori experienta utilizatorilor
folosind inteligență informațională care include algoritmi puternici de AI (Artificial
Intelligence).

Una dintre cele mai remarcabile caracteristici ale serviciilor Microsoft Azure
Cognitive este Face API. Face API este un serviciu bazat pe Cloud, care utilizează
algoritmi avansați și mecanisme de deep learning pentru a asigura două funcții
principale: detectarea feței folosind atribute și recunoașterea feței.

Posibilitățile generate de acest serviciu nou bazat pe Cloud sunt practic


nelimitate si se extind de la recunoașterea de bază a autenticității la o analiză
complexă a emoțiilor colective, cum ar fi determinarea impactului unui discurs bazat
pe micile expresii ale publicului sau determinarea publicului țintă pentru un produs,
pe baza atributelor grupului care a manifestat cel mai mare interes (vârstă, sex sau
culoare păr).

Unul dintre cele mai remarcabile avantaje ale Microsoft Face API este că, pe
lângă recunoașterea reală a feței, poate oferi și informații valoroase despre emoțiile
subiectului și poate organiza chipurile împreună în grupuri, pe baza asemănării lor
vizuale. Având la dispoziție aceste date brute, pot fi realizate diverse studii statistice
care pot oferi informații importante despre impactul unui curs sau pot cum poate

57
Universitatea să îmbunătățească un anumit program de studiu. Procesul de dezvoltare
și implementare a unei astfel de aplicații este relativ simplu si direct, deoarece este în
întregime bazat pe Cloud. Trebuie să se creeze un cont Microsoft Azure și, din tabloul
de bord, să se selecteze tipul de aplicație și resursele necesare.

În scop demonstrativ, a fost implementata o astfel de aplicație pe o mașină


virtuală găzduită de Microsoft Azure.

Principalele caracteristici ale aplicației implementate sunt:

 detectarea feței cu
 urmărirea emoțiilor și
 aproximarea vârstei,
 identificarea feței și
 verificarea feței.

În figura de mai jos, este prezentată caracteristica de detectare a feței. În ambele


cazuri, aplicația determină, de asemenea, genul si emoția subiectului (zâmbind sau
nu). Folosind algoritmi complecși, aplicația se apropie, de asemenea, de vârsta
subiectului, bazându-se pe atributele fețe:

Exemplu de detectare a feței

58
Exemplu de identificare a feței.

Imaginea de mai sus prezintă caracteristica de identificare a feței. Pentru această


caracteristică, aplicația are nevoie de câteva fotografii anterioare care sunt folosite ca
referință.

Versatilitatea API-ului asigură identificarea reușită chiar dacă imaginile subiectului au


fost realizate în cadre diferite, așa cum este cazul prezentat, unde vârsta subiectului
din imaginea de referință este semnificativ mai mare decât cea utilizată pentru
identificare.

Urmatoarele doua imagini prezintă caracteristica de identificare a feței aplicând


algoritmii FaceAPI și determinând dacă același subiect este în ambele sau nu:

59
Exemplu de identificare a feței cu rezultate pozitive

Exemplu de identificare a feței cu rezultate negative

60
Pentru toate caracteristicile, aplicația utilizează imagini statice, dar fără eforturi
semnificative, acest lucru poate fi schimbat într-un flux live capturat și transmis către
masina virtuală printr-o cameră IP. În acest fel, se poate efectua o analiză în timp real
și pot fi furnizate statistici foarte precise, în funcție de criteriile vizate.

4.2. Concluzii

Soluțiile prezentate au un spectru larg de aplicabilitate, de la asigurarea accesului


securizat într-o clădire până la monitorizarea în timp real a emoțiilor de grup, într-un
mediu bazat pe Cloud. În plus, acestea au potențialul de a spori atât comportamentul
uman, cât și interacțiunea umană prin analizarea și înțelegerea emoțiilor umane în
diferite condiții. Din perspectiva paradigmei "Educație ca serviciu", astfel de servicii
pot asigura un mediu favorabil pentru examenele online sau pentru seminarele web în
privința autentificării și a interactivității sporite și pot avea, de asemenea, un impact
semnificativ asupra modului în care interacțiunea student-profesor evoluează prin
analizarea comportamentului studentului , interesului (sau a lipsei de interes / lipsa de
înțelegere) în timpul unui curs - cuantificat prin atributele sale faciale.

Am demonstrat o soluție de recunoaștere a feței care poate fi integrată într-un sistem


de management al învățării (LMS - Learning Management System) și poate fi utilizată
atât în învățământul universitar, cât și în alte medii educaționale. Politicile de acces la
resurse pot fi restricționate la nivelul rețelei utilizând metode SDN (Software Defined
Networks) și/sau LTE (Long Term Evolution - Communications), cum ar fi funcții
avansate pentru politicile de trafic și acces. Sistemul Cloud poate fi extins pentru
extracția de date suplimentare după procesul de recunoaștere a feței folosind algoritmi
de învățare neuronală pentru a analiza diferite detalii.

61
API-urile și standardele WebRTC vor democratiza și descentraliza instrumentele
pentru crearea de conținut și comunicare - pentru telefonie, jocuri, producție video,
producție de muzică, colectarea știrilor și multe alte aplicații. WebRTC va avea un
impact deosebit asupra tehnologiilor web deschise și interoperabile ale browser-ului,
inclusiv a soluțiilor enterprise existente.

Cloud Computing schimbă modul în care departamentele IT acționează în mediul


business. Întreprinderile au o serie de căi spre Cloud, inclusiv infrastructură, platforme
și aplicații, care sunt disponibile de la furnizorii de servicii Cloud ca servicii online.

Pe scurt, Cloud Computing are multe beneficii, dar are și o serie de probleme
specifice care ar putea fi ridicate. Atunci când sunt stocate în centrul mare de date din
întreaga lume, datele ar putea deveni o țintă pentru atacurile hackerilor sau ar putea fi
utilizate în mod greșit de către angajații furnizorilor de servicii de Cloud Computing.
În plus, stocate în locații diferite, datele ar putea fi supuse altor legislații locale pe care
proprietarii lor nu le cunosc. De asemenea, profesioniștii implicați în Cloud
Computing trebuie să se asigure că acesta nu devine un serviciu pe care doar câțiva
utilizatori îl pot folosi.

Cloud-ul reprezintă unul dintre cele mai semnificative schimbări al modului de calcul
și procesare de date, astfel nu se mai trimit datele la proces ci procesele sunt trimise la
masivele de date. Pe măsură ce ne mutăm spre "nor", vom descoperi o nouă lume
bazată pe servicii, unde mulți termeni care au fost o dată comuni în departamentele IT
locale (cum ar fi servere, centre de date, sisteme de operare, middleware și clustering)
vor dispărea.Cloud Computing a ajutat deja companiile să-și sporească performanța și
va juca un rol important în asigurarea competitivității în mediul business de mâine.
Cei care continuă să respingă soluțiile Cloud, nefiind flexibili, siguri sau suficient de
buni, vor eșua sub apăsarea propriilor costuri IT și a lipsei de agilitate.

62
Soluția și conceptul prezentate în acest capitol au fost publicate în: "Face Recognition
for Education in the Cloud ", George-Alex STELEA, Cristinel GAVRILA, Florin
ZAMFIR, Radu CURPEN - eLSE: International Scientific Conference - eLearning and
Software for Education - 2017, Vol. 2, p181-188. 8p. - doi.org/10.12753/2066-026x-17-
111 - Bucuresti- Aprilie 2017

5. DIRECȚII DE CERCETARE

 Integrarea Business a tehnologiilor informaționale în comunicații


 Blockchain for Business - Hyperledger Technologies
 Machine learning/deep leaning for Cloud Communication:
Supervized/Unsupervized/Predictive/Active learning
 Search Engine Optimization/Search Engine Marketing using Machine
learning
 Smart Web Development Solutions – Resposnive, Adaptive, Reactive,
Content to terminal adaption

6. BIBLIOGRAFIE

 Salvatore Loreto, Simon Pietro Romano, Real-Time Communication with WebRTC, O’Reilly
Media, Inc., 2014, ISBN: 978-1-449-37187-6;
 Alan B. Johnston, Daniel C. Burnett, WebRTC: APIs and RTCWEB Protocols of the HTML5 Real-
Time Web, Digital Codex LLC, 2014, ISBN: 978-0985978860;

63
 Ruben Picek, Samuel Picek, WebRTC Multipoint Web Real-Time Communication, Springer
International Publishing, 2014, ISBN: 978-3-319-07214-2;
 Andrew Lombardi, WebSocket: Lightweight Client-Server Communications, O’Reilly Media, Inc.,
2015, ISBN: 978-1449369279;
 Siani Pearson, George Yee, Privacy and Security for Cloud Computing, Springer-Verlag London,
2013, ISBN: 978-1-4471-5793-9;
 Mike Cantelon, Marc Harter, T.J. Holowaychuk, Nathan Rajlich, Node.js in Action, Manning
Publications Co., 2013, ISBN: 9781617290572;
 Azat Mardan, Practical Node.js: Building Real-World Scalable Web Apps, Apress, 2014, ISBN:
978-1430265955;
 John D. Kelleher, Brian Mac Namee, Fundamentals of Machine Learning for Predictive Data
Analytics, MIT Press. 2016 - ISBN: 978-0262029445
 Stan Z. Li, Anil Jain, Handbook of Face Recognition, Springer, 2nd ed. 2011 - ISBN: 978-
0857299314
 Shai Shalev-Shwartz, Shai Ben-David, Understanding Machine Learning: From Theory to
Algorithms, Cambridge University Press , 2014 - ISBN: 9781107057135
 Ian Goodfellow, YoshuaBengio, Aaron Courville, Deep Learning, MIT Press, 2016 - ISBN: 978-
0262035613
 Nishant Shukla, Machine Learning with TensorFlow, MEAP - Manning Publications, 2016 - ISBN:
9781617293870
 OpenFace - Free and open source face recognition with deep neural networks,
https://cmusatyalab.github.io/openface/, Accessed. 2018
 https://github.com/Microsoft/Cognitive-Face-Windows, Accessed 2018

64

S-ar putea să vă placă și