Pemrograman SIP untuk pengembang Java

Session Initiation Protocol (SIP) adalah protokol kontrol (pensinyalan) yang dikembangkan oleh Internet Engineering Task Force (IETF) untuk mengelola sesi IP multimedia interaktif termasuk telepon IP, keberadaan, dan pesan instan. Spesifikasi Servlet SIP (Permintaan Spesifikasi Java 116), yang dikembangkan melalui Proses Komunitas Java, menyediakan model pemrograman Java API standar untuk memberikan layanan berbasis SIP. Berasal dari arsitektur servlet Java yang populer dari Java Platform, Enterprise Edition (Java EE adalah nama baru Sun untuk J2EE), SIP Servlet menghadirkan kemampuan pengembangan aplikasi Internet ke solusi SIP.

TI dan telekomunikasi sedang berkumpul. Aplikasi jaringan-TI, biasanya berorientasi data, bergabung dengan aplikasi komunikasi. Meningkatnya jumlah tombol Panggil Saya yang muncul di Halaman Web adalah contoh integrasi ini. Spesifikasi SIP Servlet menghadirkan model pemrograman yang sudah dikenal untuk pengembang Java untuk membangun aplikasi yang terkonvergensi. Artikel ini memberikan pengenalan langkah demi langkah tentang cara menggunakan SIP Servlet untuk membangun layanan obrolan gema sederhana.

Protokol Inisiasi Sesi

Didefinisikan dalam Request for Comments 3261, SIP adalah protokol untuk membuat, mengubah, dan mengakhiri sesi komunikasi IP multimedia. Gambar 1 adalah contoh sederhana penggunaan SIP untuk membuat panggilan VoIP (voice-over Internet Protocol):

Semua garis putih pada Gambar 1 mewakili komunikasi SIP. Penelepon mengirimkan permintaan SIP INVITE untuk mengundang "callee" untuk membuat sesi suara. Callee pertama-tama merespons dengan pesan yang memiliki kode status 180 untuk menunjukkan telepon berdering. Segera setelah telepon diangkat, tanggapan dengan kode status 200 dikirim ke penelepon untuk menerima undangan. Penelepon mengkonfirmasi dengan pesan ACK, dan sesi dibuat. Setelah sesi dibuat, percakapan suara digital yang sebenarnya biasanya dikirim melalui Realtime Transmission Protocol (RTP) dengan sesi tersebut, seperti yang ditunjukkan oleh garis merah pada Gambar 1. Saat percakapan berakhir, permintaan SIP BYE dikirim, diikuti dengan respons dengan kode status 200 untuk mengonfirmasi penghentian sesi.

Berikut adalah contoh permintaan SIP INVITE dan tanggapan dengan kode status 200 OK:

SIP INVITE request: INVITE sip:[email protected] SIP/2.0 Via: SIP/2.0/UDP pc.caller.com;branch=z9hG4bK776asdhds Max-Forwards: 70 To: Callee From: Caller ;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: Content-Type: application/sdp Content-Length: 142

(content (SDP) is not shown)

SIP 200 OK tanggapan:

SIP/2.0 200 OK Via: SIP/2.0/UDP pc.caller.com;branch=z9hG4bK776asdhds;received=192.0.2.1 To: Callee ;tag=a6c85cf From: Caller ;tag=1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Contact: Content-Type: application/sdp Content-Length: 131

(content (SDP) is not shown)

Seperti yang Anda lihat, format SIP menyerupai HTTP. Namun, jika dibandingkan dengan HTTP, SIP adalah:

  • Bertanggung jawab untuk manajemen sesi. Konten multimedia yang sebenarnya, seperti pesan instan, suara, dan video, dapat atau tidak dapat dikirim melalui SIP.
  • Asynchronous dan stateful. Untuk setiap permintaan SIP, mungkin terdapat beberapa tanggapan. Ini berarti aplikasi harus memproses setiap pesan SIP dalam konteks status yang sesuai.
  • Protokol aplikasi yang dapat berjalan pada pengangkutan yang andal dan tidak dapat diandalkan. Dengan demikian, aplikasi harus menjamin pengiriman pesan dengan pengiriman ulang pesan dan pengakuan.
  • Protokol peer-to-peer di mana tidak ada perbedaan yang jelas antara klien dan server. Masing-masing pihak harus dapat mengirim dan menerima permintaan dan tanggapan.

Layanan berbasis SIP

Layanan berbasis SIP adalah server SIP yang menawarkan layanan, seperti perutean pesan, ke titik akhir SIP, seperti telepon IP. Misalnya, pada Gambar 2, server pendaftar SIP dan server proxy menawarkan pendaftaran SIP dan layanan proxy untuk membantu titik akhir SIP menemukan dan berkomunikasi satu sama lain.

Gambar 2 mengilustrasikan hal berikut:

  1. Callee mendaftarkan dirinya ke server registrar dengan mengirimkan permintaan REGISTER.
  2. Server registrar menerima registrasi, yang berisi alamat nama callee, dengan merespon dengan kode status 200 OK.
  3. Permintaan pemanggil untuk membangun sesi komunikasi dengan callee dengan mengirimkan permintaan UNDANG ke server proxy. Isi pesan INVITE biasanya berisi deskripsi sesi komunikasi yang ingin dibuat oleh pemanggil, seperti jenis media, keamanan, atau alamat IP. Deskripsi biasanya dalam format Session Description Protocol (SDP).
  4. Server proxy mencari server registrar untuk mengetahui alamat callee saat ini. Perhatikan bahwa pencarian adalah masalah implementasi, bukan bagian dari SIP.
  5. Server proxy meneruskan permintaan UNDANG dari penelepon ke panggilan berdasarkan alamatnya saat ini.
  6. Callee menerima undangan tersebut dengan menjawab dengan kode status 200 OK. Tanggapan 200 OK untuk permintaan INVITE biasanya berisi deskripsi sesi komunikasi yang dapat dibuat oleh callee dengan pemanggil.
  7. Server proxy meneruskan respons 200 OK dari callee ke pemanggil.
  8. Penelepon mengkonfirmasi pembentukan sesi dengan mengirimkan pesan ACK ke server proxy. Pesan ACK mungkin berisi kesepakatan akhir tentang sesi tersebut.
  9. Pada gilirannya, server proxy meneruskan ACK ke callee. Dengan demikian, jabat tangan tiga arah diselesaikan melalui server proxy, dan sesi dibuat.
  10. Sekarang komunikasi antara pemanggil dan panggilan terjadi. Protokol yang digunakan untuk komunikasi mungkin SIP atau tidak. Misalnya, pesan instan dapat dikirim melalui SIP. Percakapan suara biasanya dikirim melalui RTP.
  11. Sekarang, callee menyelesaikan percakapan dan ingin mengakhiri sesi dengan mengirimkan permintaan BYE.
  12. Penelepon menanggapi dengan kode status 200 OK untuk menerima penghentian sesi.

Dalam skenario di atas, server proxy SIP hanya merutekan pesan ke alamat pengguna saat ini. Seperti yang dapat Anda bayangkan, layanan perutean yang lebih menarik dan cerdas dapat terjadi. Misalnya, server proxy dapat "mengikuti pengguna" dengan merutekan pesan ke tempat yang dapat dihubungi, seperti ponsel, meskipun seseorang menelepon melalui telepon kantornya.

SIP Servlet

Didefinisikan dalam Permintaan Spesifikasi Java 116, Spesifikasi Servlet SIP menyediakan model pemrograman container-servlet untuk aplikasi SIP. Karena ini berasal dari arsitektur servlet Java di Java EE, JSR 116 membawa pendekatan yang sudah dikenal untuk membangun layanan SIP bagi pengembang Java EE.

Tabel di bawah merangkum kesamaan antara HTTPServletdan SIPServlet.

Perbandingan antara HTTP dan SIP servlet

  HTTP MENYESAP
Kelas Servlet HttpServlet SipServlet
Sidang HttpSession SipSession
Paket aplikasi PERANG SAR
Deployment descriptor web.xml sip.xml

Much like HTTP servlets, SIP servlets extend the javax.servlet.sip.SipServlet class, which in turn extends the javax.servlet.GenericServlet class. As you might have guessed, SipServlet overrides the service(ServletRequest request, ServletResponse response) method to handle different types of SIP messages.

Since SIP is asynchronous, only one of the request and response arguments in the service() method is valid; the other one is null. For example, if the incoming SIP message is a request, only the request is valid and the response is null, and vice versa. The default implementation of the SipServlet class dispatches requests to doXXX() methods and responses to doXXXResponse() methods with a single argument. For example, doInvite(SipServletRequest request) for a SIP invite request and doSuccessResponse(SipServletResponse response) for SIP 2xx class responses. Typically SIP servlets override doXXX() methods and/or doXXXResponse() methods to provide application logic.

How do you send SIP responses if there is no response object in the doXXX() methods? In SIP servlets, you must call one of the createResponse() methods in the javax.servlet.sip.SipServletRequest class to create a response object. Then, call the send() method on the response object to send the response.

How about creating a SIP request in a SIP servlet? There are two ways to create SIP requests: Call either one of the createRequest() methods on the SipSession class to create a SIP request within the session, or one of the createRequest() methods on javax.servlet.sip.SipFactory to create a SIP request within a new SipSession. To get an instance of SipFactory, you must call getAttribute("javax.servlet.sip.SipFactory") on the ServletContext class.

The SipFactory is a factory interface in the SIP Servlet API for creating various API abstractions, such as requests, address objects, and application sessions. One interesting object created by SipFactory is javax.servlet.sip.SipApplicationSession. The intention of JSR 116 is to create a unified servlet container that can run both an HTTP and a SIP servlet. SipApplicationSession provides a protocol-agnostic session object to store application data and correlate protocol-specific sessions, such as SipSession and HttpSession. Hopefully this concept will be adopted by future versions of the Servlet API to make it javax.servlet.ApplicationSession instead of javax.servlet.sip.SipApplicationSession.

The SipApplicationSession manages protocol-specific sessions like SipSession. The SipSession interface represents the point-to-point relationship between two SIP endpoints and roughly corresponds to a SIP dialog defined in Request for Comments 3261. SipSession is inherently more complicated than its HTTP counterpart due to SIP's asynchronous and unreliable nature mentioned above. For example, Figure 3 shows the SipSession state transitions defined in JSR 116:

Typically, an HttpSession is created when a user logs in and destroyed after logout. A SipSession typically represents one logical conversation, even if you have multiple conversations between the same endpoints. So SipSession is more dynamic and has a shorter lifespan.

Diskusi lebih lanjut tentang SipSessionsiklus hidup dan hubungannya dengan dialog SIP melampaui cakupan artikel ini. Untungnya, container menangani sebagian besar kerumitan, seperti siklus proses dan transisi status, dan SipSessiondapat digunakan sebagai penyimpanan untuk data sesi.

Contoh lengkap: EchoServlet

EchoServlet adalah servlet SIP yang dapat menggemakan pesan instan yang Anda ketik di Windows Messenger: