Programavimas

SIP programavimas „Java“ kūrėjui

„Session Initiation Protocol“ (SIP) yra valdymo (signalizavimo) protokolas, kurį sukūrė interneto inžinerijos darbo grupė (IETF) interaktyvioms daugialypės terpės IP sesijoms, įskaitant IP telefoniją, buvimą ir tiesioginius pranešimus, valdyti. SIP servleto specifikacija („Java Specification Request 116“), sukurta naudojant „Java“ bendruomenės procesą, pateikia standartinį „Java“ API programavimo modelį SIP pagrįstoms paslaugoms teikti. Iš populiariausios „Java Platform“, „Enterprise Edition“ „Java“ servleto architektūros („Java EE“ yra naujas „Sun“ J2EE pavadinimas) „SIP Servlet“ suteikia SIP sprendimams interneto programų kūrimo galimybes.

IT ir telekomunikacijos suartėja. Tinklo ir IT programos, paprastai orientuotos į duomenis, jungiasi su ryšių programomis. Didėjantis „Call Me“ mygtukų, rodomų tinklalapiuose, skaičius yra šios integracijos pavyzdys. „SIP Servlet Specification“ pateikia „Java“ kūrėjams pažįstamą programavimo modelį, skirtą kurti sujungtas programas. Šiame straipsnyje pateikiama nuosekli įžanga, kaip naudoti SIP servletą kuriant paprastą aido pokalbių paslaugą.

Sesijos inicijavimo protokolas

Apibrėžtas 3261 komentarų užklausoje, SIP yra daugialypės terpės IP ryšio sesijų nustatymo, modifikavimo ir nutraukimo protokolas. 1 paveiksle pateiktas paprastas SIP naudojimo pavyzdys, norint nustatyti VoIP (interneto balso perdavimo protokolo) skambutį:

Visos baltos linijos 1 paveiksle rodo SIP ryšį. Skambintojas siunčia „SIP INVITE“ užklausą pakviesti „Callee“ asmenį užmegzti balso sesiją. Pirmiausia Callee atsako pranešimu, kuriame yra 180 būsenos kodo, kuris rodo telefono skambėjimą. Kai tik telefonas paimamas, skambinančiajam išsiunčiamas atsakymas su 200 būsenos kodu, kad jis priimtų kvietimą. Skambintojas patvirtina ACK pranešimu ir sesija yra nustatyta. Nustačius seansą, faktinis suskaitmenintas balso pokalbis paprastai perduodamas per realaus laiko perdavimo protokolą (RTP) kartu su seansu, kaip rodo raudona linija 1 paveiksle. Kai pokalbis baigiasi, siunčiama SIP BYE užklausa, po kurios pateikiamas atsakymas su 200 būsenos kodu, patvirtinantis sesijos nutraukimą.

Štai SIP INVITE užklausos ir atsakymo su 200 OK būsenos kodu pavyzdys:

SIP INVITE užklausa: PRAŠYKITE SIP: [email protected] SIP / 2.0 per: SIP / 2.0 / UDP pc.caller.com; branch = z9hG4bK776asdhds Maks. Persiuntimai: 70 Kam: Callee From: Caller; tag = 1928301774 Skambučio ID: a84b4c76e66710 CSeq: 314159 Kviesti kontaktą: „Content-Type“: programa / SDP „Content-Length“: 142

(turinys (SDP) nerodomas)

SIP 200 Gerai atsakyta:

SIP / 2.0 200 Gerai per: SIP / 2.0 / UDP pc.caller.com; branch = z9hG4bK776asdhds; gautas = 192.0.2.1 Kam: Callee; tag = a6c85cf From: Caller; tag = 1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 INVITE Kontaktas: „Content-Type“: application / sdp „Content-Length“: 131

(turinys (SDP) nerodomas)

Kaip matote, SIP formatas primena HTTP. Tačiau, palyginti su HTTP, SIP yra:

  • Atsakingas už sesijos valdymą. Tikrasis daugialypės terpės turinys, pvz., Tiesioginiai pranešimai, balsas ir vaizdo įrašai, gali būti perduodamas per SIP.
  • Asinchroninė ir būsena. Kiekvienai SIP užklausai gali būti keli atsakymai. Tai reiškia, kad programa turi apdoroti kiekvieną SIP pranešimą tinkamame būsenos kontekste.
  • Programos protokolas, kuris gali veikti tiek patikimu, tiek nepatikimu transportu. Taigi programa turi garantuoti pranešimo pristatymą pakartotiniu pranešimo perdavimu ir patvirtinimu.
  • „Peer-to-peer“ protokolas, kuriame nėra aiškaus skirtumo tarp kliento ir serverio. Bet kuri šalis turi galėti siųsti ir gauti prašymus ir atsakymus.

SIP pagrįstos paslaugos

SIP pagrįstos paslaugos yra SIP serveriai, siūlantys tokias paslaugas kaip pranešimų nukreipimas į SIP galinius taškus, pvz., IP telefonus. Pavyzdžiui, 2 paveiksle SIP registratoriaus serveris ir tarpinis serveris siūlo SIP registravimo ir tarpinio serverio paslaugas, kad SIP galiniai taškai galėtų surasti ir bendrauti tarpusavyje.

2 paveiksle pavaizduota:

  1. „Callee“ registruojasi registratoriaus serveryje, siųsdama REGISTRACIJOS užklausą.
  2. Registratoriaus serveris priima registraciją, kurioje yra atsakovo vardo adresas, atsakydamas pateikdamas 200 OK būsenos kodą.
  3. Skambintojas prašo užmegzti ryšio sesiją su „Callee“, siųsdamas „INVITE“ užklausą į tarpinį serverį. Pranešimo „INVITE“ turinyje paprastai yra ryšio sesijos, kurią nori nustatyti skambintojas, aprašymas, pvz., Laikmenos tipas, saugumas ar IP adresas. Aprašas paprastai yra „Session Description Protocol“ (SDP) formatu.
  4. Įgaliotasis serveris ieško registratoriaus serverio, kad sužinotų dabartinį kliento adresą. Atminkite, kad peržiūra yra įgyvendinimo problema, kuri nėra SIP dalis.
  5. Tarpinis serveris persiunčia KVIETIMO užklausą iš skambinančiojo asmeniui, atsižvelgiant į jo dabartinį adresą.
  6. Callee priima kvietimą atsakydama 200 OK būsenos kodu. 200 Gerai atsakyme į „INVITE“ užklausą paprastai pateikiamas ryšio sesijos aprašymas, kurį asmuo gali užmegzti su skambinančiuoju.
  7. Tarpinis serveris perduoda 200 OK atsakymą iš skambinančiojo.
  8. Skambintojas patvirtina seanso nustatymą siųsdamas ACK pranešimą į tarpinį serverį. ACK pranešime gali būti galutinis susitarimas dėl seanso.
  9. Savo ruožtu, tarpinis serveris persiunčia ACK perėmėjui. Taigi trijų krypčių paspaudimas baigiamas per tarpinį serverį ir nustatoma sesija.
  10. Dabar vyksta ryšys tarp skambinančiojo ir skambinančiojo. Ryšiui naudojamas protokolas gali būti SIP, o gal ir ne. Pavyzdžiui, momentinius pranešimus galima perduoti per SIP. Balso pokalbiai paprastai perduodami per RTP.
  11. Dabar Callee baigia pokalbį ir nori nutraukti sesiją išsiųsdamas BYE užklausą.
  12. Skambintojas atsako pateikdamas 200 OK būsenos kodą, kad priimtų sesijos nutraukimą.

Pagal pirmiau pateiktą scenarijų SIP tarpinis serveris tiesiog nukreipia pranešimus į dabartinį kliento adresą. Kaip galite įsivaizduoti, gali būti įdomesnių ir išmanesnių maršrutų paslaugų. Pavyzdžiui, tarpinis serveris gali „sekti vartotoją“, nukreipdamas pranešimus ten, kur jį galima pasiekti, pavyzdžiui, mobilųjį telefoną, net jei kas nors skambina jo biuro telefonu.

SIP servletas

Apibrėžta „Java Specification Request 116“, SIP servleto specifikacijoje pateikiamas konteinerio-servleto programavimo modelis SIP programoms. Kadangi JSR 116 sukurtas iš „Java EE“ „Java“ servleto architektūros, „Java EE“ kūrėjams JSR 116 pateikia įprastą požiūrį kuriant SIP paslaugas.

Toliau pateiktoje lentelėje apibendrintas šių elementų panašumas „HTTPServlet“ ir SIPServletas.

HTTP ir SIP servleto palyginimas

 HTTP SIP
Servletų klasė„HttpServlet“„SipServlet“
Sesija„HttpSession“„SipSession“
Programos paketasKARASSAR
Diegimo aprašasweb.xmlsip.xml

Panašiai kaip HTTP servletai, SIP servletai praplečia javax.servlet.sip.SipServlet klasė, kuri savo ruožtu pratęsia javax.servlet.GenericServlet klasė. Kaip jau spėjote, „SipServlet“ nepaiso paslauga („ServletRequest“ užklausa, „ServletResponse“ atsakymas) būdas tvarkyti įvairių tipų SIP pranešimus.

Kadangi SIP yra asinchroninis, tik vienas iš užklausos ir atsakymo argumentų paslauga () metodas galioja; kitas yra niekinis. Pvz., Jei gaunamas SIP pranešimas yra užklausa, galioja tik užklausa, o atsakymas yra tuščias ir atvirkščiai. Numatytasis „SipServlet“ klasė siunčia užklausas į doXXX () metodai ir atsakymai į doXXXResponse () metodai su vienu argumentu. Pavyzdžiui, „doInvite“ („SipServletRequest“ užklausa) SIP kvietimo užklausai ir „doSuccessResponse“ („SipServletResponse“ atsakymas) SIP 2xx klasės atsakymams. Paprastai SIP servletai nepaiso doXXX () metodai ir (arba) doXXXResponse () taikymo logikos pateikimo metodai.

Kaip siųsti SIP atsakymus, jei aplanke nėra atsakymo objekto doXXX () metodai? SIP servletuose turite skambinti vienam iš createResponse () metodai javax.servlet.sip.SipServletRequest klasę sukurti atsako objektą. Tada paskambinkite siųsti () metodas atsakymo objektui siųsti atsakymą.

Kaip apie SIP užklausos sukūrimą SIP servlete? Yra du būdai sukurti SIP užklausas: paskambinkite bet kuriam iš createRequest () metodai „SipSession“ klasę, kad per sesiją sukurtumėte SIP užklausą, arba vieną iš createRequest () metodai javax.servlet.sip.SipFactory sukurti SIP užklausą naujame „SipSession“. Norėdami gauti „SipFactory“, turite paskambinti getAttribute ("javax.servlet.sip.SipFactory") ant „ServletContext“ klasė.

„SipFactory“ yra gamyklinė SIP „Servlet“ API sąsaja, skirta kurti įvairias API abstrakcijas, tokias kaip užklausos, adreso objektai ir programų seansai. Vienas įdomus objektas, kurį sukūrė „SipFactory“ yra javax.servlet.sip.SipApplicationSession. JSR 116 tikslas yra sukurti vieningą servletų sudėtinį rodinį, kuriame būtų galima paleisti tiek HTTP, tiek SIP servletą. „SipApplicationSession“ pateikia protokolo-agnostikos seanso objektą, kad būtų išsaugoti programos duomenys ir koreliuojami konkretaus protokolo seansai, pvz „SipSession“ ir „HttpSession“. Tikimės, kad ši koncepcija bus pritaikyta būsimose „Servlet“ API versijose javax.servlet.ApplicationSession vietoj javax.servlet.sip.SipApplicationSession.

„SipApplicationSession“ valdo konkretaus protokolo sesijas, pvz „SipSession“. „SipSession“ sąsaja rodo taško-taško santykį tarp dviejų SIP galinių taškų ir apytiksliai atitinka SIP dialogą, apibrėžtą 3261 komentarų užklausoje. „SipSession“ yra iš esmės sudėtingesnis nei HTTP atitikmuo dėl aukščiau minėto asinchroninio ir nepatikimo SIP pobūdžio. Pavyzdžiui, 3 paveiksle pavaizduota „SipSession“ būsenos perėjimai, apibrėžti JSR 116:

Paprastai an „HttpSession“ yra sukurtas, kai vartotojas prisijungia ir sunaikina po atsijungimo. A „SipSession“ paprastai reiškia vieną loginį pokalbį, net jei jūs turite kelis pokalbius tarp tų pačių galinių taškų. Taigi „SipSession“ yra dinamiškesnė ir trumpesnė gyvenimo trukmė.

Pažangesnės diskusijos „SipSession“ gyvenimo ciklas, o jo santykis su SIP dialogo lange viršija šio straipsnio taikymo sritį. Laimei, konteineris valdo didžiąją sudėtingumo dalį, pvz., Gyvenimo ciklą ir būsenos perėjimą ir „SipSession“ gali būti tiesiog naudojamas kaip seanso duomenų saugykla.

Pilnas pavyzdys: „EchoServlet“

„EchoServlet“ yra SIP servletas, kuris gali atkartoti „Windows Messenger“ įvestus momentinius pranešimus: