Kamis, 10 April 2014

Session Initiation Protocol

Session Initiation Protocol (SIP) adalah protokol signaling komunikasi, banyak digunakan untuk mengendalikan multimedia sesi komunikasi seperti panggilan suara dan video melalui jaringan Internet Protocol (IP).

Protokol mendefinisikan pesan yang dikirim antara peers yang mengatur pembentukan, pemutusan hubungan dan unsur-unsur penting lainnya dari panggilan. SIP dapat digunakan untuk membuat, mengubah dan mengakhiri sesi yang terdiri dari satu atau beberapa media stream. SIP dapat digunakan untuk sesi dua partai (unicast) atau multipartai (multicast). Aplikasi SIP lainnya termasuk video conferencing, distribusi Streaming multimedia, pesan instan, informasi keberadaan, transfer file, fax over IP dan game online.

Awalnya dirancang oleh Henning Schulzrinne dan Mark Handley pada tahun 1996 , SIP telah dikembangkan dan dibakukan dalam RFC 3261 di bawah naungan Internet Engineering Task Force (IETF). Ini adalah sebuah protokol lapisan aplikasi yang dirancang untuk menjadi independen dari lapisan dasar transport; dapat berjalan pada Transmission Control Protocol (TCP), User Datagram Protocol (UDP) atau Streaming Control Transmission Protocol (SCTP ​​). Ini adalah protokol berbasis teks, menggabungkan berbagai elemen dari Hypertext Transfer Protocol (HTTP) dan Simple Mail transfer Protocol (SMTP).

SIP bekerja sama dengan beberapa protokol lapisan aplikasi lain yang mengidentifikasi dan membawa media sesi. Identifikasi dan negosiasi Media dicapai dengan Session Description Protocol (SDP). Untuk transmisi media stream (voice, video) SIP biasanya mempekerjakan Real-time Transport Protocol (RTP) atau Secure Real-time Transport Protocol (SRTP). Untuk transmisi aman dari pesan SIP, protokol dapat dienkripsi dengan Transport Layer Security (TLS).

Android menyediakan API yang mendukung Session Initiation Protocol (SIP). Ini memungkinkan Anda menambahkan fitur telepon internet berbasis SIP untuk aplikasi Anda. Android mencakup SIP stack protokol penuh dan layanan panggilan manajemen terpadu yang memungkinkan aplikasi dengan mudah mengatur panggilan suara keluar dan masuk, tanpa harus mengelola sesi, komunikasi transportasi-tingkat, atau merekam audio atau pemutaran langsung.

Berikut adalah contoh dari jenis aplikasi yang mungkin menggunakan SIP API:


  • Video conferencing. 
  • Instant messaging.


Applications
Pasar untuk konsumen perangkat SIP terus berkembang; ada banyak perangkat seperti SIP Terminal Adapter, SIP Gateway, dan layanan SIP Trunking menyediakan pengganti untuk saluran telepon ISDN.

Banyak perusahaan telepon VoIP memungkinkan pelanggan untuk menggunakan perangkat SIP mereka sendiri, seperti telepon set SIP-capable, atau softphones.

Kamera video surveillance SIP-enabled dapat membuat panggilan untuk mengingatkan pemilik atau operator pada suatu peristiwa yang telah terjadi; misalnya, untuk memberitahu gerak yang telah terdeteksi out-of-hours di kawasan lindung.


SIP digunakan dalam audio over IP untuk aplikasi penyiaran yang mana ia menyediakan sarana interoperable untuk audio interface dari produsen yang berbeda untuk membuat koneksi dengan satu sama lain.


Membuat Manifest
Jika Anda mengembangkan sebuah aplikasi yang menggunakan SIP API, ingat bahwa fitur ini hanya didukung pada Android 2.3 (API level 9) dan versi yang lebih tinggi dari platform. Juga, di antara perangkat yang menjalankan Android (level API 9) 2.3 atau lebih tinggi, tidak semua perangkat akan menawarkan dukungan SIP.

Untuk menggunakan SIP, tambahkan hak akses berikut untuk mewujudkan aplikasi Anda:
  • android.permission.USE_SIP
  • android.permission.INTERNET
Untuk memastikan bahwa aplikasi Anda hanya dapat diinstal pada perangkat yang mampu mendukung SIP, tambahkan berikut ini untuk mewujudkan aplikasi Anda:
<uses-sdk android:minSdkVersion="9" />Hal ini menunjukkan bahwa aplikasi Anda membutuhkan Android 2.3 atau lebih tinggi. Untuk informasi lebih lanjut, lihat Tingkat API dan dokumentasi untuk elemen <uses-sdk>.

Untuk mengontrol bagaimana aplikasi Anda disaring dari perangkat yang tidak mendukung SIP (misalnya, di Google Play), tambahkan berikut ini untuk mewujudkan aplikasi Anda:
<uses-feature android:name="android.hardware.sip.voip" />
Hal ini menyatakan bahwa aplikasi Anda menggunakan SIP API. Deklarasi tersebut harus mencakup android: atribut yang diperlukan yang menunjukkan apakah Anda ingin aplikasi yang akan disaring dari perangkat yang tidak menawarkan dukungan SIP. Deklarasi <uses-feature> lainnya mungkin juga diperlukan, tergantung pada implementasi Anda. Untuk informasi lebih lanjut, lihat dokumentasi untuk elemen <uses-feature>.

Jika aplikasi Anda dirancang untuk menerima panggilan, Anda juga harus menentukan penerima (BroadcastReceiver subclass) di manifest aplikasi:

  • <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/>
Berikut adalah kutipan dari manifest SipDemo:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.android.sip">
  ...
     <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/>
  ...
  <uses-sdk android:minSdkVersion="9" />
  <uses-permission android:name="android.permission.USE_SIP" />
  <uses-permission android:name="android.permission.INTERNET" />
  ...
  <uses-feature android:name="android.hardware.sip.voip" android:required="true" />
  <uses-feature android:name="android.hardware.wifi" android:required="true" />
  <uses-feature android:name="android.hardware.microphone" android:required="true" />
</manifest>

Membuat SipManager 
Untuk menggunakan SIP API, aplikasi Anda harus membuat objek SipManager. The SipManager mengurus berikut dalam aplikasi Anda:


  • Memulai sesi SIP. 
  • Memulai dan menerima panggilan. 
  • Mendaftarkan dan unregistering dengan penyedia SIP. 
  • Memverifikasi konektivitas sesi. 
  • Anda instantiate SipManager baru sebagai berikut:

public SipManager mSipManager = null;
...
if(mSipManager == null) {
    mSipManager = SipManager.newInstance(this);
}

Mendaftar SIP Server 
Sebuah aplikasi khas Android SIP melibatkan satu atau lebih pengguna, masing-masing memiliki account SIP. Dalam sebuah aplikasi Android SIP, setiap account SIP diwakili oleh objek SipProfile.

A SipProfile mendefinisikan profil SIP, termasuk account SIP, dan domain dan informasi server. Profil yang terkait dengan akun SIP pada perangkat menjalankan aplikasi yang disebut profil lokal. Profil yang sesi terhubung ke disebut profil sebaya. Ketika Anda log aplikasi SIP ke server SIP dengan SipProfile lokal, ini secara efektif register perangkat sebagai lokasi untuk mengirim SIP panggilan ke alamat SIP Anda.

Bagian ini menunjukkan cara membuat SipProfile, mendaftar dengan server SIP, dan melacak acara pendaftaran.

Anda membuat objek SipProfile sebagai berikut:
public SipProfile mSipProfile = null;
...
SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder.setPassword(password);
mSipProfile = builder.build();
Kode berikut kutipan membuka profil lokal untuk membuat panggilan dan / atau menerima panggilan SIP generik. Penelepon dapat membuat panggilan berikutnya melalui mSipManager.makeAudioCall. Kutipan ini juga menetapkan android.SipDemo.INCOMING_CALL tindakan, yang akan digunakan oleh filter maksud bila perangkat menerima panggilan (lihat Menyiapkan filter niat untuk menerima panggilan). Ini adalah langkah pendaftaran:
Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
mSipManager.open(mSipProfile, pendingIntent, null);
Akhirnya, kode ini menetapkan SipRegistrationListener pada SipManager. Ini trek apakah SipProfile berhasil terdaftar penyedia layanan SIP Anda:
mSipManager.setRegistrationListener(mSipProfile.getUriString(), new SipRegistrationListener() {
public void onRegistering(String localProfileUri) {
    updateStatus("Registering with SIP Server...");
}
public void onRegistrationDone(String localProfileUri, long expiryTime) {
    updateStatus("Ready");
}
   public void onRegistrationFailed(String localProfileUri, int errorCode,
    String errorMessage) {
    updateStatus("Registration failed.  Please check settings.");
}
Bila aplikasi Anda dilakukan dengan menggunakan profil, harus menutupnya untuk membebaskan benda-benda yang terkait ke dalam memori dan unregister perangkat dari server. Sebagai contoh:
public void closeLocalProfile() {
    if (mSipManager == null) {
       return;
    }
    try {
       if (mSipProfile != null) {
          mSipManager.close(mSipProfile.getUriString());
       }
     } catch (Exception ee) {
       Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee);
     }
}

Membuat Panggilan Audio 
Untuk membuat panggilan audio, Anda harus memiliki berikut ini:


  • Sebuah SipProfile yang membuat panggilan ("profil lokal"), dan alamat SIP yang valid untuk menerima panggilan ("profil peer"). 
  • Sebuah benda SipManager. 

Untuk membuat panggilan audio, Anda harus menyiapkan SipAudioCall.Listener. Sebagian besar interaksi klien dengan SIP tumpukan terjadi melalui pendengar. Dalam potongan ini, Anda melihat bagaimana SipAudioCall.Listener menetapkan hal-hal setelah panggilan didirikan:
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
  
   @Override
   public void onCallEstablished(SipAudioCall call) {
      call.startAudio();
      call.setSpeakerMode(true);
      call.toggleMute();
         ...
   }
   
   @Override
   public void onCallEnded(SipAudioCall call) {
      // Do something.
   }
};
Setelah Anda menyiapkan SipAudioCall.Listener, Anda dapat membuat panggilan. The SipManager Metode makeAudioCall mengambil parameter berikut:


  • Sebuah profil SIP lokal (pemanggil). 
  • Sebuah profil rekan SIP (user yang dipanggil). 
  • Sebuah SipAudioCall.Listener untuk mendengarkan peristiwa panggilan dari SipAudioCall. Hal ini dapat null, tapi seperti yang ditunjukkan di atas, pendengar digunakan untuk mengatur hal-hal begitu panggilan didirikan. 
  • Nilai timeout, dalam hitungan detik. 

Sebagai contoh:
 call = mSipManager.makeAudioCall(mSipProfile.getUriString(), sipAddress, listener, 30);

Menerima Panggilan
Untuk menerima panggilan, aplikasi SIP harus menyertakan subclass dari BroadcastReceiver yang memiliki kemampuan untuk menanggapi maksud menunjukkan bahwa ada panggilan masuk. Dengan demikian, Anda harus melakukan hal berikut dalam aplikasi Anda:


  • Dalam AndroidManifest.xml , menyatakan <receiver>. Dalam SipDemo, ini <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/>.
  • Melaksanakan penerima , yang merupakan subclass dari BroadcastReceiver . Dalam SipDemo, ini adalah IncomingCallReceiver.
  • Inisialisasi profil lokal ( SipProfile ) dengan maksud tertunda bahwa kebakaran receiver Anda ketika seseorang panggilan profil lokal.
  • Mengatur filter yang menyaring dengan maksud aksi yang mewakili panggilan masuk. Dalam SipDemo, tindakan ini adalah android.SipDemo.INCOMING_CALL.

Subclassing BroadcastReceiver
Untuk menerima panggilan, aplikasi SIP Anda harus subclass BroadcastReceiver. Sistem Android menangani panggilan SIP masuk dan siaran yang "masuk panggilan" niat (seperti yang didefinisikan oleh aplikasi) ketika menerima panggilan. Berikut adalah kode BroadcastReceiver subclassed dari SipDemo. Untuk melihat contoh lengkap, pergi ke SipDemo sampel, yang termasuk dalam sampel SDK. Untuk informasi tentang men-download dan menginstal sampel SDK, lihat Mendapatkan Sampel.
/*** Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */
public class IncomingCallReceiver extends BroadcastReceiver {
    /**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        SipAudioCall incomingCall = null;
        try {
            SipAudioCall.Listener listener = new SipAudioCall.Listener() {
                @Override
                public void onRinging(SipAudioCall call, SipProfile caller) {
                    try {
                        call.answerCall(30);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
            incomingCall = wtActivity.mSipManager.takeAudioCall(intent, listener);
            incomingCall.answerCall(30);
            incomingCall.startAudio();
            incomingCall.setSpeakerMode(true);
            if(incomingCall.isMuted()) {
                incomingCall.toggleMute();
            }
            wtActivity.call = incomingCall;
            wtActivity.updateStatus(incomingCall);
        } catch (Exception e) {
            if (incomingCall != null) {
                incomingCall.close();
            }
        }
    }
}

Menyiapkan filter untuk menerima panggilan 
Ketika layanan SIP menerima panggilan baru, ia akan mengirimkan dengan maksud tindakan string yang disediakan oleh aplikasi. Dalam SipDemo, aksi string ini adalah android.SipDemo.INCOMING_CALL.

Kutipan kode dari SipDemo ini menunjukkan bagaimana objek SipProfile akan dibuat dengan maksud tertunda didasarkan pada tindakan tali android.SipDemo.INCOMING_CALL. Objek PendingIntent akan melakukan broadcast ketika SipProfile menerima panggilan:
public SipManager mSipManager = null;
public SipProfile mSipProfile = null;
...
Intent intent = new Intent(); 
intent.setAction("android.SipDemo.INCOMING_CALL"); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA); 
mSipManager.open(mSipProfile, pendingIntent, null);
Siaran akan dicegat oleh maksud filter, yang kemudian akan api penerima (IncomingCallReceiver). Anda dapat menentukan filter niat dalam file manifest aplikasi Anda, atau melakukannya dalam kode seperti di OnCreate () metode sampel aplikasi SipDemo Kegiatan aplikasi:
public class WalkieTalkieActivity extends Activity implements View.OnTouchListener {
...
    public IncomingCallReceiver callReceiver;
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {

       IntentFilter filter = new IntentFilter();
       filter.addAction("android.SipDemo.INCOMING_CALL");
       callReceiver = new IncomingCallReceiver();
       this.registerReceiver(callReceiver, filter);
       ...
    }
    ...
}

Testing Aplikasi SIP 
Untuk menguji aplikasi SIP, Anda memerlukan berikut ini:

  • Sebuah perangkat mobile yang menjalankan Android 2.3 atau lebih tinggi. SIP berjalan lebih nirkabel, sehingga Anda harus menguji pada perangkat yang sebenarnya. Pengujian pada AVD tidak akan bekerja. 
  • Sebuah account SIP. Ada banyak penyedia SIP yang berbeda yang menawarkan account SIP. 
  • Jika Anda menempatkan panggilan, itu juga harus ke account SIP yang valid. 

Untuk menguji aplikasi SIP:

  1. Pada perangkat Anda, terhubung ke wireless (Settings> Wireless & networks> Wi-Fi> Setelan Wi-Fi) 
  2. Mengatur perangkat mobile Anda untuk pengujian, seperti yang dijelaskan dalam Mengembangkan pada Device a. 
  3. Jalankan aplikasi Anda pada perangkat mobile Anda, seperti yang dijelaskan dalam Mengembangkan pada Device a. 
  4. Jika Anda menggunakan Eclipse, Anda dapat melihat output log aplikasi di Eclipse menggunakan LogCat (Window> Show View> Lainnya> Android> LogCat).


Sumber: http://developer.android.com/guide/topics/connectivity/sip.html

Tidak ada komentar:

Posting Komentar