Table of Contents

Laborator 08. SIP

Creare cont SIP, testare

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:

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

Activitate de Laborator

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

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:

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.