Laborator 08. SIP

Creare cont SIP, testare

  • pentru acest laborator este nevoie de telefon personal, sau microfon pentru genymotion
  • creați un cont gratuit pe http://getonsip.com
    • sunt necesare datele de la “View Profile”, atenție la parola f. lungă
    • username este diferit de auth_username
  • sau un cont gratuit la http://pbxes.org, de exemplu student
    • este obligatorie crearea unei extensii, de exemplu 100
    • username va fi student-100
    • parola este specifică extensiei/username-ului, nu contului creat la pbxes.org
  • se instalează aplicația CSIPsimple din playstore
    • introduceți contul creat la pasul anterior folosind Generic wizard/Advanced cu setările:
    • getonsip.com: server=getonsip.com Username=student SIP authentication ID=getonsip_student Password=parola din View Profile Proxy=sip.onsip.com
    • pbxes.org: server=pbxes.org Username=student-100 Password=parola extensiei Proxy=pbxes.org, restul câmpurilor default.
  • se poate face paste din host în Genymotion cu long press (left click)
  • 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
  • Troubleshooting
    • Registration timeout înseamnă că în NAT/SIP nu se translatează corect adresele interne
    • merge pe RDS/4G
    • SSID-uri care nu crează probleme: ACS-UPB-OPEN, eduroam, Java-ED117
    • SSID-uri cu probleme: change

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.3:5555
  • În Android: tcpdump -s0 -ni eth1 -w /sdcard/DCIM/sip.pcap 'udp'
  • 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.

eim/laboratoare/laborator08.sip.txt · Last modified: 2016/04/12 11:48 by dragos.niculescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0