SIP programiranje za Java programere

Protokol za pokretanje sesije (SIP) protokol je za kontrolu (signalizaciju) koji je razvila Radna skupina za internetsko inženjerstvo (IETF) za upravljanje interaktivnim multimedijskim IP sesijama, uključujući IP telefoniju, prisutnost i razmjenu trenutnih poruka. Specifikacija SIP servleta (Zahtjev za specifikaciju Java 116), razvijena kroz Java Community Process, nudi standardni Java API programski model za pružanje usluga temeljenih na SIP-u. Izvedeno iz popularne Java servlet arhitekture Java Platform, Enterprise Edition (Java EE je novo Sunčevo ime za J2EE), SIP Servlet donosi mogućnosti razvoja internetskih aplikacija u SIP rješenja.

IT i telekom se približavaju. Mrežne IT aplikacije, obično orijentirane na podatke, stapaju se s komunikacijskim aplikacijama. Sve veći broj gumba Pozovi me koji se pojavljuju na web stranicama primjer je ove integracije. Specifikacija SIP servleta donosi programerima Java poznati programski model za izgradnju konvergiranih aplikacija. Ovaj članak daje detaljni uvod o tome kako koristiti SIP Servlet za izgradnju jednostavne usluge eho chata.

Protokol za pokretanje sesije

Definiran u Zahtjevu za komentare 3261, SIP je protokol za uspostavljanje, modificiranje i prekid multimedijske sesije IP komunikacije. Slika 1 je jednostavan primjer korištenja SIP-a za uspostavljanje VoIP (Voice over-over Internet Protocol) poziva:

Sve bijele crte na slici 1 predstavljaju SIP komunikaciju. Pozivatelj šalje SIP INVITE zahtjev za pozivanje "pozivatelja" da uspostavi glasovnu sesiju. Callee prvo odgovori porukom koja ima statusni kôd 180 da naznači da telefon zvoni. Čim se telefon podigne, pozivatelju se šalje odgovor s statusnim kodom 200 da prihvati pozivnicu. Pozivatelj potvrđuje ACK porukom i sesija je uspostavljena. Jednom kada je sesija uspostavljena, stvarni digitalizirani glasovni razgovor obično se prenosi putem protokola u stvarnom vremenu (RTP) sa sesijom, kao što crvena linija na slici 1 pokazuje. Kad razgovor završi, šalje se SIP BYE zahtjev, nakon čega slijedi odgovor s statusnim kodom 200 za potvrdu prekida sesije.

Evo primjera zahtjeva za SIP INVITE i odgovora sa statusnim kodom 200:

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 odgovor:

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)

Kao što vidite, format SIP-a sliči HTTP-u. Međutim, u usporedbi s HTTP-om, SIP je:

  • Odgovoran za upravljanje sjednicama. Stvarni multimedijski sadržaj, poput trenutnih poruka, glasa i videozapisa, može se i ne mora prenositi putem SIP-a.
  • Asinkroni i državni. Na svaki SIP zahtjev može biti više odgovora. To znači da aplikacija mora obraditi svaku SIP poruku u odgovarajućem kontekstu stanja.
  • Aplikacijski protokol koji se može izvoditi i na pouzdanom i na nepouzdanom prijevozu. Dakle, aplikacija mora jamčiti isporuku poruke ponovnim prijenosom i potvrdom poruke.
  • Peer-to-peer protokol u kojem ne postoji jasna razlika između klijenta i poslužitelja. Svaka strana mora biti sposobna slati i primati zahtjeve i odgovore.

Usluge temeljene na SIP-u

SIP usluge temelje se na SIP poslužiteljima koji nude usluge, kao što je usmjeravanje poruka, do SIP krajnjih točaka, poput IP telefona. Na primjer, na slici 2, SIP poslužitelj registra i proxy poslužitelj nude SIP registraciju i proxy usluge kako bi pomogli SIP krajnjim točkama da se lociraju i međusobno komuniciraju.

Slika 2 ilustrira sljedeće:

  1. Callee se prijavljuje na poslužitelj registra slanjem zahtjeva REGISTRACIJA.
  2. Poslužitelj registra prihvaća registraciju koja sadrži adresu imena pozivatelja reagirajući s statusnim kodom 200 OK.
  3. Zahtjevi pozivatelja za uspostavljanje komunikacijske sesije s pozivateljem slanjem INVITE zahtjeva na proxy poslužitelj. Sadržaj poruke POZOVI obično sadrži opis komunikacijske sesije koju pozivatelj želi uspostaviti, kao što su vrsta medija, sigurnost ili IP adresa. Opis je obično u formatu protokola opisa sesije (SDP).
  4. Proxy poslužitelj traži poslužitelj registra kako bi saznao trenutnu adresu pozivatelja. Imajte na umu da je traženje problem implementacije koji nije dio SIP-a.
  5. Proxy poslužitelj prosljeđuje zahtjev INVITE s pozivatelja na pozivatelja na temelju svoje trenutne adrese.
  6. Callee prihvaća pozivnicu odgovarajući s 200 statusnim kodom. Odgovor 200 OK na poziv INVITE obično sadrži opis komunikacijske sesije koju pozivani može uspostaviti s pozivateljem.
  7. Proxy poslužitelj prosljeđuje odgovor od 200 u redu s pozivatelja na pozivatelja.
  8. Pozivatelj potvrđuje uspostavljanje sesije slanjem ACK poruke na proxy poslužitelj. ACK poruka može sadržavati konačni dogovor o sesiji.
  9. Zauzvrat, proxy poslužitelj prosljeđuje ACK pozvanom. Tako se trosmjerno rukovanje dovršava putem proxy poslužitelja i uspostavlja sesija.
  10. Sada se događa komunikacija između pozivatelja i pozivatelja. Protokol koji se koristi za komunikaciju može ili ne mora biti SIP. Primjerice, trenutne poruke mogu se prenositi putem SIP-a. Glasovni razgovori obično se prenose putem RTP-a.
  11. Sada pozivatelj završava razgovor i želi prekinuti sesiju slanjem zahtjeva BYE.
  12. Pozivatelj odgovara statusnim kodom 200 OK da prihvati prekid sesije.

U gornjem scenariju, SIP proxy poslužitelj jednostavno usmjerava poruke na trenutnu adresu pozivatelja. Kao što možete zamisliti, mogu se dogoditi zanimljivije i pametnije usluge usmjeravanja. Na primjer, proxy poslužitelj može "slijediti korisnika" usmjeravanjem poruka do mjesta na kojemu je dostupan, kao što je mobitel, čak i ako netko zove na njegov uredski telefon.

SIP servlet

Definirana u Zahtjevu za specifikaciju Jave 116, specifikacija SIP servleta pruža model programiranja kontejnera-servleta za SIP aplikacije. Budući da je izveden iz arhitekture Java servleta u Java EE, JSR 116 donosi poznati pristup izgradnji SIP usluga programerima Java EE.

Tablica u nastavku sažima sličnost između HTTPServleti SIPServlet.

Usporedba HTTP i SIP servleta

  HTTP GUTLJAJ
Klasa servleta HttpServlet SipServlet
Sjednica HttpSession SipSession
Aplikacijski paket RAT SAR
Opis implementacije web.xml gutljaj.xml

Slično kao i HTTP servleti, SIP servleti proširuju javax.servlet.sip.SipServletklasu, a ona pak javax.servlet.GenericServletklasu. Kao što ste mogli pretpostaviti, SipServletnadjačava service(ServletRequest request, ServletResponse response)metodu za obradu različitih vrsta SIP poruka.

Budući da je SIP asinkroni, service()valjan je samo jedan od argumenata zahtjeva i odgovora u metodi; druga je nula. Na primjer, ako je dolazna SIP poruka zahtjev, samo je zahtjev valjan, a odgovor je null i obrnuto. Zadana implementacija SipServletklase šalje zahtjeve za doXXX()metode i odgovore na doXXXResponse()metode s jednim argumentom. Na primjer, doInvite(SipServletRequest request)za zahtjev doSuccessResponse(SipServletResponse response)za poziv SIP-om i za odgovore klase SIP 2xx. Tipično SIP servleti nadjačavaju doXXX()metode i / ili doXXXResponse()metode za pružanje aplikacijske logike.

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.

Naprednije rasprave o SipSessionživotnom ciklusu i njegovom odnosu sa SIP dijalogom nadilaze opseg ovog članka. Srećom, spremnik rješava većinu složenosti, poput životnog ciklusa i prijelaza stanja, te SipSessionse jednostavno može koristiti kao pohrana podataka sesija.

Potpuni primjer: EchoServlet

EchoServlet je SIP servlet koji može ponoviti trenutne poruke koje upišete u Windows Messenger: