Programovanie

Programovanie SIP pre vývojárov Java

Session Initiation Protocol (SIP) je riadiaci (signalizačný) protokol vyvinutý spoločnosťou Internet Engineering Task Force (IETF) na správu interaktívnych multimediálnych IP relácií vrátane IP telefónie, prítomnosti a okamžitých správ. Špecifikácia SIP Servlet (požiadavka na špecifikáciu Java 116) vyvinutá prostredníctvom procesu Java Community Process poskytuje štandardný programovací model Java API na poskytovanie služieb založených na SIP. Odvozený od populárnej architektúry servletov Java platformy Java Platform, Enterprise Edition (Java EE je nový názov spoločnosti Sun pre J2EE), SIP Servlet prináša do riešení SIP možnosti vývoja internetových aplikácií.

IT a telekomunikácie sa zbližujú. Sieťovo-IT aplikácie, zvyčajne dátovo orientované, sa spájajú s komunikačnými aplikáciami. Príkladom tejto integrácie je zvyšujúci sa počet tlačidiel Zavolajte mi na webových stránkach. Špecifikácia SIP Servlet prináša známy programovací model vývojárom Java na vytváranie konvergovaných aplikácií. Tento článok poskytuje podrobný úvod k tomu, ako pomocou servera SIP Servlet vytvoriť jednoduchú službu echo chatu.

Protokol o začatí relácie

Definovaný v žiadosti o pripomienky 3261, SIP je protokol na vytvorenie, úpravu a ukončenie multimediálnych IP komunikačných relácií. Obrázok 1 je jednoduchý príklad použitia protokolu SIP na nadviazanie hovoru VoIP (hlasový internetový protokol):

Všetky biele čiary na obrázku 1 predstavujú komunikáciu SIP. Volajúci odošle požiadavku SIP INVITE na pozvanie volaného na uskutočnenie hlasovej relácie. Spoločnosť Callee najskôr odpovie správou, ktorá má stavový kód 180, čo naznačuje, že telefón zvoní. Ihneď po zdvihnutí telefónu sa volajúcemu odošle odpoveď so stavovým kódom 200, aby prijal pozvanie. Volajúci potvrdí správou ACK a je nadviazané spojenie. Akonáhle je relácia nadviazaná, skutočná digitalizovaná hlasová konverzácia sa zvyčajne prenáša prostredníctvom protokolu Realtime Transmission Protocol (RTP) s reláciou, ako naznačuje červená čiara na obrázku 1. Po ukončení konverzácie sa odošle žiadosť SIP BYE, po ktorej nasleduje odpoveď so stavovým kódom 200 na potvrdenie ukončenia relácie.

Tu je príklad požiadavky SIP INVITE a odpovede so stavovým kódom 200 OK:

SIP INVITE požiadavka: INVITE sip: [email protected] SIP / 2.0 Via: SIP / 2.0 / UDP pc.caller.com; branch = z9hG4bK776asdhds Max-Forwards: 70 To: Callee Od: Caller; tag = 1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 POZVAŤ Kontakt: Typ obsahu: aplikácia / sdp Dĺžka obsahu: 142

(obsah (SDP) sa nezobrazuje)

SIP 200 OK odpoveď:

SIP / 2.0 200 OK Via: SIP / 2.0 / UDP pc.caller.com; branch = z9hG4bK776asdhds; receive = 192.0.2.1 Komu: Callee; tag = a6c85cf Od: Caller; tag = 1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Kontakt: Typ obsahu: aplikácia / sdp Dĺžka obsahu: 131

(obsah (SDP) sa nezobrazuje)

Ako vidíte, formát SIP sa podobá protokolu HTTP. V porovnaní s HTTP je však SIP:

  • Zodpovedný za správu relácie. Skutočný multimediálny obsah, napríklad okamžité správy, hlasové správy a videozáznamy, sa môže alebo nemusí prenášať prostredníctvom protokolu SIP.
  • Asynchrónne a stavové. Na každú požiadavku SIP môže byť viac odpovedí. To znamená, že aplikácia musí spracovávať každú správu SIP v správnom kontexte stavu.
  • Aplikačný protokol, ktorý môže bežať na spoľahlivom aj nespoľahlivom prenose. Aplikácia teda musí zaručiť doručenie správy s opakovaným prenosom a potvrdením.
  • Protokol typu peer-to-peer, v ktorom nie je jasný rozdiel medzi klientom a serverom. Každá strana musí byť schopná odosielať a prijímať žiadosti a odpovede.

Služby založené na SIP

Služby založené na SIP sú servery SIP, ktoré ponúkajú služby, ako je smerovanie správ, do koncových bodov SIP, ako sú napríklad IP telefóny. Napríklad na obrázku 2 ponúka server SIP registrátor a server proxy registráciu SIP a služby proxy, ktoré pomáhajú koncovým bodom SIP vyhľadať a navzájom komunikovať.

Obrázok 2 zobrazuje nasledovné:

  1. Callee sa zaregistruje na server registrátora zaslaním žiadosti o REGISTRÁCIU.
  2. Server registrátora prijme registráciu, ktorá obsahuje meno volanej adresy, odpoveďou so stavovým kódom 200 OK.
  3. Volajúci žiada o nadviazanie komunikačnej relácie s volaným odoslaním žiadosti INVITE na server proxy. Obsah správy INVITE zvyčajne obsahuje popis komunikačnej relácie, ktorú chce volajúci nadviazať, ako napríklad typ média, zabezpečenie alebo adresa IP. Popis je zvyčajne vo formáte Session Description Protocol (SDP).
  4. Proxy server vyhľadá server registrátora a zistí aktuálnu adresu volaného. Upozorňujeme, že vyhľadávanie je problémom implementácie, ktorý nie je súčasťou SIP.
  5. Proxy server preposiela požiadavku INVITE od volajúceho na výzvu na základe jeho aktuálnej adresy.
  6. Callee prijme pozvanie odpoveďou so stavovým kódom 200 OK. Odpoveď 200 OK na požiadavku INVITE zvyčajne obsahuje popis komunikačnej relácie, ktorú môže volaný nadviazať s volajúcim.
  7. Proxy server preposiela 200 volaných správ od volaného volajúcemu.
  8. Volajúci potvrdí vytvorenie relácie zaslaním správy ACK na server proxy. Správa ACK môže obsahovať konečnú dohodu o relácii.
  9. Proxy server potom preposiela ACK volanému. Trojcestné nadviazanie spojenia je teda dokončené cez proxy server a je nadviazaná relácia.
  10. Teraz prebieha komunikácia medzi volajúcim a volaným. Protokol používaný na komunikáciu môže alebo nemusí byť SIP. Napríklad okamžité správy je možné prenášať cez SIP. Hlasové konverzácie sa zvyčajne prenášajú prostredníctvom protokolu RTP.
  11. Teraz Callee ukončí konverzáciu a želá si ukončiť reláciu zaslaním žiadosti BYE.
  12. Volajúci odpovie stavovým kódom 200 OK, aby prijal ukončenie relácie.

Vo vyššie uvedenom scenári Proxy server SIP jednoducho smeruje správy na aktuálnu adresu volaného. Ako si viete predstaviť, môžu sa stať zaujímavejšie a inteligentnejšie smerovacie služby. Napríklad proxy server môže „sledovať používateľa“ tým, že smeruje správy tam, kde je zastihnuteľný, napríklad na mobilný telefón, aj keď niekto volá jeho kancelárskym telefónom.

SIP servlet

Definovaná v požiadavke 116 na špecifikáciu Java, špecifikácia SIP servletu poskytuje programovací model kontajner-servlet pre aplikácie SIP. Pretože je odvodený z architektúry servletu Java v prostredí Java EE, JSR 116 prináša vývojárom Java EE známy prístup k budovaniu služieb SIP.

V nasledujúcej tabuľke je zhrnutá podobnosť medzi HTTPServlet a SIPServlet.

Porovnanie medzi servletom HTTP a SIP

 HTTP SIP
Trieda servletovHttpServletSipServlet
SessionHttpSessionSipSession
Balík aplikáciíVOJNASAR
Deskriptor nasadeniaweb.xmlsip.xml

Rovnako ako HTTP servlety, aj SIP servlety rozširujú javax.servlet.sip.SipServlet triedy, čo zasa rozširuje javax.servlet.GenericServlet trieda. Ako ste asi uhádli, SipServlet prepíše služba (požiadavka ServletRequest, odpoveď ServletResponse) metóda na spracovanie rôznych typov správ SIP.

Pretože SIP je asynchrónny, iba jeden z argumentov požiadavka a odpoveď v služba () metóda je platná; druhý je neplatný. Napríklad ak je prichádzajúcou SIP správou požiadavka, iba požiadavka je platná a odpoveď je nulová, a naopak. Predvolená implementácia SipServlet trieda odosiela žiadosti do doXXX () metódy a reakcie na doXXXResponse () metódy s jediným argumentom. Napríklad, doInvite (požiadavka SipServletRequest) pre žiadosť o pozvanie SIP a doSuccessResponse (odpoveď SipServletResponse) pre odpovede triedy SIP 2xx. Spravidla sú potlačené SIP servlety doXXX () metódy a / alebo doXXXResponse () metódy na zabezpečenie logiky aplikácie.

Ako odosielať odpovede SIP, ak v priečinku Windows XP nie je žiadny objekt odpovede doXXX () metódy? V servetoch SIP musíte volať na jedno z createResponse () metódy v javax.servlet.sip.SipServletRequest triedy na vytvorenie objektu odpovede. Potom zavolajte na číslo poslať () metóda na objekte odpovede na odoslanie odpovede.

Čo tak vytvoriť požiadavku SIP v servlete SIP? Existujú dva spôsoby, ako vytvoriť požiadavky SIP: Zavolajte na ktorýkoľvek z kontaktov createRequest () metódy na SipSession triedy na vytvorenie požiadavky SIP v rámci relácie alebo jednej z createRequest () metódy na javax.servlet.sip.SipFactory vytvoriť požiadavku SIP v novom SipSession. Ak chcete získať príklad SipFactory, musíte zavolať getAttribute ("javax.servlet.sip.SipFactory") na ServletContext trieda.

The SipFactory je továrenské rozhranie v SIP Servlet API na vytváranie rôznych abstrakcií API, ako sú požiadavky, objekty adries a relácie aplikácie. Jeden zaujímavý objekt vytvoril SipFactory je javax.servlet.sip.SipApplicationSession. Zámerom JSR 116 je vytvoriť jednotný kontajner servletu, ktorý môže spúšťať servlet HTTP aj SIP. SipApplicationSession poskytuje objekt protokolu-agnostická relácia na ukladanie údajov aplikácií a na korelovanie relácií špecifických pre protokol, ako napr SipSession a HttpSession. Dúfajme, že tento koncept si osvoja budúce verzie Servlet API javax.servlet.ApplicationSession namiesto javax.servlet.sip.SipApplicationSession.

The SipApplicationSession spravuje relácie špecifické pre protokol ako SipSession. The SipSession rozhranie predstavuje vzťah point-to-point medzi dvoma koncovými bodmi SIP a zhruba zodpovedá dialógu SIP definovanému v Request for Comments 3261. SipSession je vo svojej podstate komplikovanejší ako jeho HTTP náprotivok kvôli vyššie spomenutej asynchrónnej a nespoľahlivej povahe SIP. Napríklad obrázok 3 zobrazuje znak SipSession prechody stavu definované v JSR 116:

Spravidla HttpSession sa vytvorí, keď sa používateľ prihlási a po odhlásení sa zničí. A SipSession zvyčajne predstavuje jednu logickú konverzáciu, aj keď vediete viac konverzácií medzi rovnakými koncovými bodmi. Takže SipSession je dynamickejší a má kratšiu životnosť.

Pokročilejšie diskusie o SipSession životný cyklus a jeho vzťah k dialógu SIP presahuje rámec tohto článku. Našťastie kontajner zvláda väčšinu zložitosti, napríklad prechody životného cyklu a stavu, a SipSession možno jednoducho použiť ako úložisko pre údaje relácie.

Úplný príklad: EchoServlet

EchoServlet je servlet SIP, ktorý dokáže odrážať okamžité správy, ktoré napíšete v programe Windows Messenger:

$config[zx-auto] not found$config[zx-overlay] not found