This shows you the differences between two versions of the page.
eim:laboratoare:laborator08.sip [2016/04/08 14:23] dragos.niculescu |
eim:laboratoare:laborator08.sip [2016/04/12 11:48] (current) dragos.niculescu |
||
---|---|---|---|
Line 4: | Line 4: | ||
* pentru acest laborator este nevoie de telefon personal, sau microfon pentru genymotion | * pentru acest laborator este nevoie de telefon personal, sau microfon pentru genymotion | ||
- | * creați un cont gratuit pe getonsip.com | + | * creați un cont gratuit pe http://getonsip.com |
- | * sunt necesare datele de la "View Profile", atenție la parola f. lungă | + | * 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 | * 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 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 | * 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 | ||
Line 18: | Line 26: | ||
* SSID-uri cu probleme: change | * SSID-uri cu probleme: change | ||
+ | === Android NGN stack === | ||
+ | Android are o stivă SIP [[http://developer.android.com/guide/topics/connectivity/sip.html|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 ===== | ===== Activitate de Laborator ===== | ||
- | Se dorește implementarea unei aplicații Android pe baza unui scheletului. ([[https://github.com/dragos-niculescu/ngnsip|Aplicație finisată]]) | + | 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: [[https://github.com/dragos-niculescu/ngnsip|Aplicație]] care implementează punctele 1-8. Țintim în 2 ore pentru 1-6 | ||
+ | |||
+ | ** 1. ** Se clonează stiva SIP [[https://github.com/dragos-niculescu/android-ngn-stack|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). | ||
- | ** 1. ** Într-un proiect nou, cu o singură activitate, se actualizează datele contului SIP din Constants.java. Se configurează butoanele register și unregister 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. | + | ** 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. |
- | ** 2. ** 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). | + | ** 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). |
- | ** 3. ** 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( | + | ** 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 | 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. | hangUpCall. Sesiunea este menținuta ca membru al activitătii, deoarece este necesară și pe butoanele de hangUp sau DTMF. | ||
- | ** 4. ** 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. | + | ** 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. |
- | ** 5. ** Se testează un apel audio către o adresă de test (thetestcall@getonsip.com). Inspecție conversație SIP la nivel pachet: | + | ** 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 | * adb -s 192.168.56.3:5555 | ||
* În Android: tcpdump -s0 -ni eth1 -w /sdcard/DCIM/sip.pcap 'udp' | * În Android: tcpdump -s0 -ni eth1 -w /sdcard/DCIM/sip.pcap 'udp' | ||
Line 50: | Line 81: | ||
- | ** 6. (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 | + | ** 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 |
- | ** 7. ** Se creează o nouă activitate ChatActivity care poate fi lansată din activitatea principală, doar după ce s-a făcut signin. | + | ** 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. | 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. | ||
Line 60: | Line 91: | ||
Î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. | Î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. | ||
- | |||
- |