This is an old revision of the document!


Laborator 09. Gestiunea Apelurilor Telefonice folosind SIP & VoIP

Configurare

În cadrul acestui laborator este necesar un dispozitiv mobil fizic sau un emulator cu acces la microfonul sistemului de operare. De asemenea, pe dispozitivul mobil trebuie să fie instalat Google Play Services întrucât este necesară descărcarea și instalarea unei aplicații Android (CSipSimple) pentru realizarea de apeluri telefonice folosind SIP & VoIP.

Se va utiliza, la alegere, un furnizor (gratuit) de servicii SIP, accesibil ulterior înregistrării (creării unui cont):

  • GetOnSIP - are avantajul implementării serviciului WebRTC (proiect open-source - susținut de consorțiul World Wide Web (W3C) - ce pune la dispoziție un API pentru realizarea de apeluri de voce / multimedia, conversații și partajare de fișiere printr-o conexiune punct la punct între dispozitive mobile (IoT) și aplicații de tip navigator), dar dezavantajul limitării numărului de accesări într-o oră;

GetOnSIP

Pentru obținerea unui cont SIP gratuit, folosind serviciul GetOnSIP, este necesar să se furnizeze o adresă de poștă electronică, urmată de apăsarea butonului Submit.

La adresa de poștă furnizată va fi transmisă o legătură Internet, la accesarea căreia utilizatorul va fi redirectat către o pagină în care va putea finaliza procesul de înscriere, prin precizarea următoarelor informații:

  • un nume asociat contului respectiv;
  • denumirea contului (sufixată cu @getonsip.com);
  • o parolă introdusă de două ori spre a fi verificată.

În urma realizării cu succes a contului SIP gratuit, acesta va putea fi accesat, inclusiv prin interfața web, prin furnizarea denumirii contului și a parolei specificate anterior:

Pentru a putea utiliza serviciile SIP și VoIP prin interfața web, este necesar ca aplicația navigator să obțină acces la resursele hardware ale sistemului pe care îl utilizează:

  • camera web;
  • microfonul.

Secțiunea View Profile este foarte importantă, întrucât acolo sunt furnizate informațiile necesare pentru utilizarea contului SIP din contextul altor dispozitive:

  • adresa SIP;
  • numele de utilizator;
  • domeniul;
  • parola SIP → atenție!!! această valoare este autogenerată și este diferită de parola furnizată la înregistrare;
  • numele de utilizator furnizat pentru autentificare → atenție!!! valoarea acestui identificator este diferită de numele de utilizator furnizat la înregistrare (de regulă, este prefixat cu șirul de caractere getonsip_);
  • proxy-ul folosit pentru conexiuni din afara domeniului.

PBXes

Pentru obținerea unui cont SIP gratuit, folosind serviciul PBXes, este necesar se accesează legătura Internet Create your account.

Este necesar să se furnizeze mai multe informații, legate de:

  • limba folosită pentru afișarea interfeței grafice în cadrul paginii Internet;
  • contul propriu-zis (denumire - limitată la maximum 15 caractere!!! și parolă - nu sunt permise caracterele speciale);
  • date personale (nume / prenume, adresă - inclusiv oraș și cod poștal -, zona de timp, data nașterii, numărul de telefon, adresa de poștă electronică);
  • versiunea aplicației;
  • permisiunea de a permite unor moderatori independenți de a inspecta datele de configurare și fișierele de jurnalizare spre a putea oferi suport.

Ulterior înregistrării cu succes, se furnizează adresa care poate fi folosită pentru accesarea serviciilor SIP și VoIP (de regulă, numele de utilizator furnizat în cadrul înregistrării, la care se adaugă @pbxes.org).

Pentru utilizarea propriu-zisă a serviciului, este necesară definirea unei extensii (ExtensionsAdd Extension) de tipul SIP:

Este necesar să se furnizeze informații legate de:

  • extensia propriu-zisă (număr de extensie și denumire);
  • date pentru apelul prin Internet (URL, text, GPS - latitudine și longitudine și, opțional, o imagine);
  • parola specifică (va fi utilizată în locul parolei furnizată pentru cont).

Utilizare pe Dispozitivul Mobil

Adrese SIP pentru Testare

Implementarea Nativă din Sistemul de Operare Android

Începând cu versiunea 2.3 (Gingerbread, API level 9), în kernelul Android a fost implementat protocolul SIP, acesta putând fi accesat în aplicația Phone, secțiunea SettingsInternet CallingAccounts (sau SettingsCallsCalling AccountsSIP Accounts) și utilizat exclusiv pentru apeluri de voce. Totuși, nu sunt încă implementate toate funcționalitățile specifice (apeluri video, mesagerie instantanee).

Se accesează aplicația Phone și din meniul acesteia intrarea Settings.

Se parcurg următoarele ecrane CallsCalling AccountsSIP Accounts:

Pentru a se putea recepționa apeluri VoIP, este necesar să se selecteze opțiunea Receive incoming calls. O astfel de abordare poate conduce însă la un consum de energie mult mai rapid și la epuizarea bateriei.

Definirea unui cont de tip SIP se realizează prin accesarea opțiunii Add Account:

Informațiile care trebuie specificate sunt:

  • numele de utilizator;
  • parola;
  • adresa serverului care oferă serviciile SIP;
  • contul folosit pentru autentificare;
  • adresa proxy pentru accesări din afara domeniului;
  • portul pe care se realizează comunicația;
  • protocolul folosit pentru transport (TCP / UDP);
  • transmiterea de mesaje de tip keep-alive.

În situația în care contul SIP a fost creat, acesta va fi vizualizat în secțiunea SIP Accounts împreună cu starea sa (Receiving calls, Not receiving calls).

De asemenea, în secțiunea Calling accounts există posibilitatea de a preciza ce cont este folosit în mod implicit pentru realizarea de apeluri telefonice. Se recomandă selectarea opțiunii Ask first astfel încât pentru fiecare contact să se poată preciza mecanismul utilizat pentru plasarea sa.

Prin accesarea unui contact de tip SIP din agenda telefonică, se va utiliza contul specific pentru realizarea apelului telefonic.

Aplicația CSIPSimple

În cazul în care în aplicația Phone, opțiunea Internet Calling / SIP Accounts nu este disponibilă, poate fi utilizată aplicația CSipSimple din Play Store. Ulterior descărcării, utilizatorului îi sunt solicitate acordarea de permisiuni pentru ca această aplicație să poată fi instalată.

Aplicația CSipSimple pune la dispoziția utilizatorilor mai multe șabloane pentru definirea unui cont SIP. Se recomandă să se utilizeze Generic WizardsAdvanced întrucât permite definirea tuturor parametrilor necesari pentru realizarea conexiunii la serverului care găzduiește un astfel de serviciu:

Pentru contul de tip getonsip.com se precizează următorii parametri:

  • denumirea contului: informaticamobila2016@getonsip.com
  • adresa serverului care pune la dispoziție serviciile SIP: getonsip.com;
  • numele de utilizator: informaticamobila2016
  • identificatorul folosit pentru autentificare, de regulă același cu numele de utilizator, prefixat de șirul de caractere getonsip_: getonsip_informaticamobila2016;
  • parola (din secțiunea View Profile, nu cea folosită la definirea contului);
În situația în care se folosește emulatorul Genymotion, pentru a se evita transcrierea parolelor foarte lungi, se poate realiza operația de tip Copy-Paste din mașina fizică în mașina virtuală folosind operația de tip apăsare cu o durată de timp mai mare (eng. long press).
  • protocoul folosit (implicit UDP);
  • proxy-ul folosit pentru conexiuni din afara domeniului: sip.onsip.com

În secțiunea Accounts, contul SIP poate fi în orice moment activat sau dezactivat. Starea acestuia este vizibilă sub denumirea sa, culoarea folosită fiind sugestivă pentru rezultatul operației de înregistrare:

  • verde: operația a fost realizată cu succes;
  • roșu: s-a produs o eroare; eroarea de tipul Registration timeout denotă faptul că în NAT/SIP nu se translatează corect adresele interne
    • rețeaua Digi.Mobil/4G funcționează corespunzător;
    • în facultate, rețelele wireless ACS-UPB-OPEN, eduroam, Java-ED117 nu creează probleme; în schimb, rețeaua change blochează anumite porturi ceea ce împiedică comunicația cu serverul SIP.

Contactele de tip SIP sunt vizibile în meniul aplicației CSipSimple astfel încât să poată fi plasate apeluri de tip SIP / VoIP:

Pentru contul de tip PBXes există un șablon predefinit:

Se recomandă însă să se utilizeze tot un șablon general, astfel încât să poată fi controlați foarte bine toți parametrii:

  • denumirea contului: mobilecomputing
  • adresa serverului care pune la dispoziție serviciile SIP: pbxes.org;
  • numele de utilizator (se utilizează extensia): mobilecomputing-100
  • identificatorul folosit pentru autentificare, de regulă același cu numele de utilizator;
  • parola (se utilizează extensia);
  • protocoul folosit (implicit UDP);
  • proxy-ul folosit pentru conexiuni din afara domeniului: pbxes.org

  • se creează un contact nou 'testcall', și în loc de număr de telefon se selectează 'Add another field'/Internet Call și se adaugă adresa thetestcall@getonsip.com
  • În agendă, persoana testcall va apărea cu o iconiță SIP, și va fi apelată implicit cu SIP
  • alte adrese de test: 904@mouselike.org, 301@ideasip.com

Android NGN stack

Android are o stivă SIP nativă, dar nu are încă toate funcționalitățile implementate (instant messenging, video). Totuși, pentru voce, SIP este după Android 2.3 parte a sistemului, sub numele de “internet calling” în Phone/Settings.

Pentru acest laborator, se va folosi NGN (New Generation Networking) SIP stack, cu documantația pentru API de nivel înalt: https://imsdroid.googlecode.com/svn-history/r381/branches/2.0/android-ngn-stack-00.pdf

Această stivă se utilizează în modul următor: se inițializează stiva NgnEngine, și un serviciu SIP INgnSipService. Se continuă cu operația de signin(SIP Registration), apoi se pot deschide sesiuni de audio/video NgnAVSession, sau instant messenging NgnMessagingSession.

Interacțiunile sunt fie imperative:

  • INgnSipService.register()
  • NgnAVSession.makeCall()
  • NgnMessagingSession.sendTextMessage()

fie reactive, prin intermediul unor receivere care filtrează următoarele evenimente:

  • NgnRegistrationEventArgs.ACTION_REGISTRATION_EVENT primește răspunsurile de la signin (refuz, timeout, succes)
  • NgnInviteEventArgs.ACTION_INVITE_EVENT primește evenimentele legate de apel (sună, apel stabilit, apel terminat)
  • NgnMessagingEventArgs.ACTION_MESSAGING_EVENT - tratează sosirea unui mesaj IM

Activitate de Laborator

Se dorește implementarea unei aplicații Android pe baza scheletului.

  • scheletul va conține MainActivity și ChatActivity
  • în activitatea principală se implementează signin (registration) și apelul vocal
  • dacă este timp, se implementează instant messenging în activitatea secundară
  • atenție, conturile de pe getonsip.com sunt limitate la numărul de signins pe oră :(, altfel conturile sunt avantajoase deoarece au și webrtc
  • soluție: Aplicație care implementează punctele 1-8. Țintim în 2 ore pentru 1-6

1. Se clonează stiva SIP Android NGN stack, și se importă în Eclipse. Se compilează și se obține bin/android-ngn-stack.jar. Se adaugă acest jar la scheletul ngnsip la Project Properties/Java Build Path/Libraries/Add JARs din proiectul deschis în eclipse (android-ngn-stack).

2. În proiectul schelet, se actualizează datele contului SIP din Constants.java. Se configurează butoanele register și unregister din activitatea principală astfel: register va demara initializarea stivei SIP cu configure_stack() și sign-in cu initalizeManager(). Acestea inițializează și membrii mEngine și mSipService ai activitătii principale.

3. Se definește RegistrationBroadcastReceiver cu filtrul NgnRegistrationEventArgs.ACTION_REGISTRATION_EVENT pentru a prinde evenimentele legate de înregistrare (signin). Acestea sunt monitorizate în Log, cu Toasts, și într-un câmp din GUI care indică starea curenta (Registered/In Progress…/Unregistered).

4. Se adaugă un câmp EditText care va primi adresa SIP destinație, și două butoane care initiază/opresc apelul. Se crează o sesiune către un număr de test folosind NgnAVSession.createOutgoingSession( NgnEngine.getInstance().getSipService().getSipStack(), NgnMediaType.Audio); Se inițiază apelul cu makeCall, și se oprește cu hangUpCall. Sesiunea este menținuta ca membru al activitătii, deoarece este necesară și pe butoanele de hangUp sau DTMF.

5. Se definește un CallStateReceiver, si filtrul asociat pentru a monitoriza evenimentele legate de apeluri audio NgnInviteEventArgs.ACTION_INVITE_EVENT. Acest receiver monitorizează stările sesiunii audio: INCOMING, INCALL, TERMINATED.

6. Se testează un apel audio către o adresă de test (thetestcall@getonsip.com). Inspecție conversație SIP la nivel pachet:

  • adb -s 192.168.56.101:5555
  • În Android: tcpdump -s0 -ni eth1 -w /sdcard/DCIM/sip.pcap 'udp'
    • binar pentru arm: tcpdump. Se instalează în /data/bin, apoi se activează execuția chmod 777 /databin/tcpdump
  • se inițiază apelul, se ascultă greeting, apoi se închide
  • se oprește tcpdump cu Ctrl-C
  • Pe host: adb -s 192.168.56.3:5555 pull /sdcard/DCIM/sip.pcap .
  • wireshark sip.pcap
    • identificați operația REGISTER. Ce port se folosește pentru cerere? Care este adresa serverului?
    • în răspunsul pozitiv la REGISTER, identificați adresele NAT prin care trece conversația
    • identificați invitația. Apar retransmisii?
    • ce fel de voice codec este folosit?
    • ce parametri are fluxul de voce? protocol, dimensiune pachet, rata pachetelor
    • ce adrese se folosesc pentru traficul de voce?
    • cum au fost negociate?

7. (Opțional) Pentru a trimite coduri numerice DTMF se crează un buton și edittext-ul asociat pentru a apela funcția sendDTMF cu valorile întregi 0-9, sau 10 pentru * si 11 pentru #. Folosind o adresa de test (thetestcall@getonsip.com sau 904@mouselike.org) se pot testa codurile și navigarea prin menuiuri

8. Se creează o nouă activitate ChatActivity care poate fi lansată din activitatea principală, doar după ce s-a făcut signin. Activitatea primește ca parametru în Intent adresa cu care se va desfașura sesiunea de chat. Funcționalitatea este împărțită între Activitate si un BroadcastReceiver care trebuie să primească evenimentele NgnMessagingEventArgs.ACTION_MESSAGING_EVENT.

În activitate, se creează o sesiune pentru fiecare mesaj, folosind NgnMessagingSession.createOutgoingSession(mSipService.getSipStack(), remotePartyUri); Textul preluat din activitate este apoi emis cu sendTextMessage.

În receiver, se tratează doar acțiunea NgnMessagingEventArgs.ACTION_MESSAGING_EVENT, tipul evenimentului INCOMING, pentru a extrage octeții mesajului folosind getPayload. Aceștia se convertesc la String și se appendează la fereastra de chat.

Resurse Utile

laboratoare/laborator09.1462470254.txt.gz · Last modified: 2016/05/05 20:44 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0