Προγραμματισμός

Προγραμματισμός SIP για τον προγραμματιστή Java

Το Session Initiation Protocol (SIP) είναι ένα πρωτόκολλο ελέγχου (σηματοδότησης) που αναπτύχθηκε από την Ομάδα Μηχανικής Διαδικτύου (IETF) για τη διαχείριση διαδραστικών συνεδριών IP πολυμέσων, συμπεριλαμβανομένων τηλεφωνίας IP, παρουσίας και άμεσων μηνυμάτων. Το SIP Servlet Specification (Java Specification Request 116), που αναπτύχθηκε μέσω της Java Community Process, παρέχει ένα τυπικό μοντέλο προγραμματισμού Java API για την παροχή υπηρεσιών που βασίζονται σε SIP. Προέρχεται από τη δημοφιλή αρχιτεκτονική Java servlet της Java Platform, Enterprise Edition (το Java EE είναι το νέο όνομα της Sun για το J2EE), το SIP Servlet φέρνει δυνατότητες ανάπτυξης εφαρμογών Διαδικτύου σε λύσεις SIP.

Οι ΤΠ και οι τηλεπικοινωνίες συγκλίνουν. Οι εφαρμογές δικτύου-πληροφορικής, συνήθως προσανατολισμένες σε δεδομένα, συγχωνεύονται με εφαρμογές επικοινωνίας. Ο αυξανόμενος αριθμός κουμπιών Call Me που εμφανίζονται στις ιστοσελίδες είναι ένα παράδειγμα αυτής της ενοποίησης. Το SIP Servlet Specification φέρνει ένα οικείο μοντέλο προγραμματισμού στους προγραμματιστές Java για τη δημιουργία συγκλίνουσας εφαρμογής. Αυτό το άρθρο παρέχει μια βήμα προς βήμα εισαγωγή σχετικά με τον τρόπο χρήσης του SIP Servlet για τη δημιουργία μιας απλής υπηρεσίας συνομιλίας echo.

Πρωτόκολλο έναρξης συνεδρίας

Ορίζεται στο Αίτημα για Σχόλια 3261, το SIP είναι ένα πρωτόκολλο για τη δημιουργία, την τροποποίηση και τον τερματισμό των συνεδριών επικοινωνίας IP πολυμέσων. Το σχήμα 1 είναι ένα απλό παράδειγμα χρήσης SIP για τη δημιουργία κλήσης VoIP (voice-over Internet Protocol):

Όλες οι λευκές γραμμές στο Σχήμα 1 αντιπροσωπεύουν τις επικοινωνίες SIP. Ο καλών στέλνει ένα αίτημα SIP INVITE για να καλέσει τον «καλούντα» να δημιουργήσει μια φωνητική συνεδρία. Ο Callee απαντά πρώτα με ένα μήνυμα που έχει κωδικό κατάστασης 180 για να υποδείξει ότι το τηλέφωνο κουδουνίζει. Μόλις παραληφθεί το τηλέφωνο, αποστέλλεται μια απάντηση με κωδικό κατάστασης 200 στον καλούντα για να αποδεχτεί την πρόσκληση. Ο καλών επιβεβαιώνει με ένα μήνυμα ACK και η περίοδος λειτουργίας έχει δημιουργηθεί. Μόλις πραγματοποιηθεί η συνεδρία, η πραγματική ψηφιοποιημένη φωνητική συνομιλία συνήθως μεταδίδεται μέσω του Realtime Transmission Protocol (RTP) με τη συνεδρία, όπως υποδεικνύει η κόκκινη γραμμή στο Σχήμα 1. Όταν τελειώσει η συνομιλία, αποστέλλεται ένα αίτημα SIP BYE, ακολουθούμενο από μια απάντηση με κωδικό κατάστασης 200 για την επιβεβαίωση του τερματισμού της περιόδου σύνδεσης.

Ακολουθεί ένα παράδειγμα αίτησης SIP INVITE και μιας απάντησης με κωδικό κατάστασης 200 ΟΚ:

Αίτημα SIP INVITE: ΚΑΛΕΣΤΕ ΚΑΛΛΙΤΕΧΝΗ: [email protected] SIP / 2.0 Μέσω: SIP / 2.0 / UDP pc.caller.com; branch = z9hG4bK776asdhds Max-Forward: 70 Προς: Callee From: Caller; tag = 1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 ΚΑΛΕΣΤΕ Επικοινωνία: Τύπος περιεχομένου: εφαρμογή / sdp Μήκος περιεχομένου: 142

(το περιεχόμενο (SDP) δεν εμφανίζεται)

SIP 200 OK απάντηση:

SIP / 2.0 200 OK Μέσω: SIP / 2.0 / UDP pc.caller.com; branch = z9hG4bK776asdhds; έλαβε = 192.0.2.1 Προς: Callee; tag = a6c85cf Από: Caller; tag = 1928301774 Call-ID: a84b4c76e66710 CSeq: 314159 ΚΑΛΕΣΤΕ Επικοινωνία: Τύπος περιεχομένου: εφαρμογή / sdp Μήκος περιεχομένου: 131

(το περιεχόμενο (SDP) δεν εμφανίζεται)

Όπως μπορείτε να δείτε, η μορφή SIP μοιάζει με HTTP. Ωστόσο, σε σύγκριση με το HTTP, το SIP είναι:

  • Υπεύθυνος για τη διαχείριση συνεδριών. Το πραγματικό περιεχόμενο πολυμέσων, όπως τα άμεσα μηνύματα, η φωνή και το βίντεο, ενδέχεται να μεταδοθούν μέσω SIP ή όχι.
  • Ασύγχρονη και κρατική. Για κάθε αίτημα SIP, ενδέχεται να υπάρχουν πολλές απαντήσεις. Αυτό σημαίνει ότι η εφαρμογή πρέπει να επεξεργαστεί κάθε μήνυμα SIP σε ένα κατάλληλο πλαίσιο κατάστασης.
  • Ένα πρωτόκολλο εφαρμογής που μπορεί να εκτελείται τόσο σε αξιόπιστες όσο και σε αναξιόπιστες μεταφορές. Έτσι, η εφαρμογή πρέπει να εγγυηθεί την παράδοση μηνυμάτων με αναμετάδοση μηνυμάτων και επιβεβαίωση.
  • Ένα πρωτόκολλο peer-to-peer όπου δεν υπάρχει σαφής διάκριση μεταξύ πελάτη και διακομιστή. Και οι δύο πλευρές πρέπει να μπορούν να στέλνουν και να λαμβάνουν αιτήματα και απαντήσεις.

Υπηρεσίες που βασίζονται σε SIP

Οι υπηρεσίες που βασίζονται σε SIP είναι διακομιστές SIP που προσφέρουν υπηρεσίες, όπως δρομολόγηση μηνυμάτων, σε τελικά σημεία SIP, όπως τηλέφωνα IP. Για παράδειγμα, στο Σχήμα 2, ο διακομιστής καταχωρητή SIP και ο διακομιστής μεσολάβησης προσφέρουν υπηρεσίες εγγραφής SIP και διακομιστή μεσολάβησης για να βοηθήσουν τα τελικά σημεία SIP να εντοπίσουν και να επικοινωνήσουν μεταξύ τους.

Το σχήμα 2 απεικονίζει τα ακόλουθα:

  1. Ο καλούντος εγγράφεται στον διακομιστή καταχωρητών στέλνοντας ένα αίτημα εγγραφής.
  2. Ο διακομιστής καταχωρητή αποδέχεται την εγγραφή, η οποία περιέχει τη διεύθυνση ονόματος του καλούντος, απαντώντας με έναν κωδικό κατάστασης 200 ΟΚ.
  3. Ο καλούντος ζητά να δημιουργήσει μια συνεδρία επικοινωνίας με τον καλούντα στέλνοντας ένα αίτημα ΚΑΛΕΣ στο διακομιστή μεσολάβησης. Το περιεχόμενο του μηνύματος INVITE περιέχει συνήθως την περιγραφή της συνεδρίας επικοινωνίας που ο καλούντος θέλει να δημιουργήσει, όπως τύπος πολυμέσων, ασφάλεια ή διεύθυνση IP. Η περιγραφή είναι συνήθως σε μορφή πρωτοκόλλου περιγραφής περιόδου σύνδεσης (SDP).
  4. Ο διακομιστής μεσολάβησης αναζητά τον διακομιστή καταχωρητή για να μάθει την τρέχουσα διεύθυνση του καλούντος. Σημειώστε ότι η αναζήτηση είναι ένα ζήτημα εφαρμογής που δεν αποτελεί μέρος του SIP.
  5. Ο διακομιστής μεσολάβησης προωθεί το αίτημα INVITE από τον καλούντα στον καλούντα με βάση την τρέχουσα διεύθυνσή του.
  6. Ο Callee αποδέχεται την πρόσκληση απαντώντας με έναν κωδικό κατάστασης 200 ΟΚ. Η απόκριση 200 OK σε ένα αίτημα INVITE περιέχει συνήθως την περιγραφή της συνεδρίας επικοινωνίας που μπορεί να δημιουργήσει ο καλούντος με τον καλούντα.
  7. Ο διακομιστής μεσολάβησης προωθεί μια απάντηση 200 ΟΚ από τον καλούντα στον καλούντα.
  8. Ο καλών επιβεβαιώνει τη δημιουργία περιόδου λειτουργίας στέλνοντας ένα μήνυμα ACK στον διακομιστή μεσολάβησης. Το μήνυμα ACK ενδέχεται να περιέχει την τελική συμφωνία για τη συνεδρία.
  9. Με τη σειρά του, ο διακομιστής μεσολάβησης προωθεί το ACK στον καλούντα. Έτσι, η τριπλή χειραψία ολοκληρώνεται μέσω του διακομιστή μεσολάβησης και δημιουργείται μια συνεδρία.
  10. Τώρα συμβαίνει η επικοινωνία μεταξύ καλούντος και καλούντος. Το πρωτόκολλο που χρησιμοποιείται για την επικοινωνία μπορεί να είναι ή όχι SIP. Για παράδειγμα, τα άμεσα μηνύματα μπορούν να μεταδοθούν μέσω SIP. Οι φωνητικές συνομιλίες μεταδίδονται συνήθως μέσω RTP.
  11. Τώρα, ο καλούντος ολοκληρώνει τη συνομιλία και επιθυμεί να τερματίσει τη συνεδρία στέλνοντας ένα αίτημα BYE.
  12. Ο καλών απαντά με έναν κωδικό κατάστασης ΟΚ 200 για να αποδεχτεί τον τερματισμό της περιόδου σύνδεσης.

Στο παραπάνω σενάριο, ο διακομιστής μεσολάβησης SIP απλώς δρομολογεί τα μηνύματα στην τρέχουσα διεύθυνση του καλούντος. Όπως μπορείτε να φανταστείτε, μπορούν να συμβούν πιο ενδιαφέρουσες και έξυπνες υπηρεσίες δρομολόγησης. Για παράδειγμα, ο διακομιστής μεσολάβησης μπορεί να "ακολουθήσει έναν χρήστη" δρομολογώντας τα μηνύματα στο σημείο όπου μπορεί να προσεγγιστεί, όπως ένα κινητό τηλέφωνο, ακόμη και αν κάποιος καλεί στο τηλέφωνο του γραφείου του.

Servlet SIP

Οριζόμενο στο Java Specification Request 116, το SIP Servlet Specification παρέχει ένα μοντέλο προγραμματισμού κοντέινερ-servlet για εφαρμογές SIP. Δεδομένου ότι προέρχεται από την αρχιτεκτονική Java servlet στο Java EE, το JSR 116 φέρνει μια οικεία προσέγγιση για τη δημιουργία υπηρεσιών SIP σε προγραμματιστές Java EE.

Ο παρακάτω πίνακας συνοψίζει την ομοιότητα μεταξύ HTTPServlet και SIPServlet.

Σύγκριση μεταξύ HTTP και SIP servlet

 HTTP ΓΟΥΛΙΑ
Κατηγορία ServletHttpServletSipServlet
ΣυνεδρίασηHttpSessionΣυνάντηση
Πακέτο εφαρμογήςΠΟΛΕΜΟΣSAR
Περιγραφέας ανάπτυξηςweb.xmlsip.xml

Όπως τα servlets HTTP, οι servlets SIP επεκτείνουν το javax.servlet.sip.SipServlet τάξη, η οποία με τη σειρά της επεκτείνει το javax.servlet.GenericServlet τάξη. Όπως ίσως μαντέψατε, SipServlet παρακάμπτει το υπηρεσία (ServletRequest request, ServletResponse απόκριση) μέθοδος χειρισμού διαφορετικών τύπων μηνυμάτων SIP.

Δεδομένου ότι το SIP είναι ασύγχρονο, μόνο ένα από τα αιτήματα και τα επιχειρήματα απόκρισης στο υπηρεσία() η μέθοδος είναι έγκυρη. το άλλο είναι μηδενικό. Για παράδειγμα, εάν το εισερχόμενο μήνυμα SIP είναι ένα αίτημα, μόνο το αίτημα είναι έγκυρο και η απάντηση είναι μηδενική και το αντίστροφο. Η προεπιλεγμένη εφαρμογή του SipServlet Η κλάση αποστέλλει αιτήματα προς doXXX () μεθόδους και απαντήσεις σε doXXXResponse () μεθόδους με ένα μόνο όρισμα. Για παράδειγμα, doInvite (αίτημα SipServletRequest) για ένα αίτημα πρόσκλησης SIP και doSuccessResponse (απόκριση SipServletResponse) για απαντήσεις τάξης SIP 2xx. Συνήθως αντικαθίστανται τα servlets SIP doXXX () μεθόδους και / ή doXXXResponse () μεθόδους για την παροχή λογικής εφαρμογής.

Πώς στέλνετε απαντήσεις SIP εάν δεν υπάρχει αντικείμενο απόκρισης στο doXXX () μέθοδοι; Σε servlets SIP, πρέπει να καλέσετε ένα από τα createResponse () μεθόδους στο javax.servlet.sip.SipServletRequest τάξη για να δημιουργήσετε ένα αντικείμενο απόκρισης. Στη συνέχεια, καλέστε το στείλετε() μέθοδος στο αντικείμενο απόκρισης για αποστολή της απάντησης.

Τι γίνεται με τη δημιουργία ενός αιτήματος SIP σε ένα servlet SIP; Υπάρχουν δύο τρόποι δημιουργίας αιτημάτων SIP: Καλέστε ένα από τα δύο createRequest () μεθόδους στο Συνάντηση τάξη για να δημιουργήσετε ένα αίτημα SIP εντός της περιόδου σύνδεσης ή ένα από τα createRequest () μεθόδους javax.servlet.sip.SipFactory για να δημιουργήσετε ένα αίτημα SIP μέσα σε ένα νέο Συνάντηση. Για να λάβετε μια παρουσία του SipFactory, πρέπει να καλέσεις getAttribute ("javax.servlet.sip.SipFactory") στο ServletContext τάξη.

ο SipFactory είναι μια εργοστασιακή διεπαφή στο SIP Servlet API για τη δημιουργία διαφόρων αφαιρέσεων API, όπως αιτήματα, αντικείμενα διευθύνσεων και συνεδρίες εφαρμογών. Ένα ενδιαφέρον αντικείμενο που δημιουργήθηκε από SipFactory είναι javax.servlet.sip.SipApplicationSession. Η πρόθεση του JSR 116 είναι να δημιουργήσει ένα ενοποιημένο servlet container που μπορεί να τρέξει HTTP και SIP servlet. SipApplicationSession παρέχει ένα αντικείμενο πρωτοκόλλου-αγνωστικής περιόδου λειτουργίας για την αποθήκευση δεδομένων εφαρμογής και τη συσχέτιση συγκεκριμένων συνεδριών πρωτοκόλλου, όπως Συνάντηση και HttpSession. Ας ελπίσουμε ότι αυτή η ιδέα θα υιοθετηθεί από μελλοντικές εκδόσεις του Servlet API για να γίνει javax.servlet.ApplicationSession αντί javax.servlet.sip.SipApplicationSession.

ο SipApplicationSession διαχειρίζεται συγκεκριμένες συνεδρίες όπως το πρωτόκολλο Συνάντηση. ο Συνάντηση η διεπαφή αντιπροσωπεύει τη σχέση μεταξύ σημείων μεταξύ δύο τελικών σημείων SIP και αντιστοιχεί περίπου σε ένα διάλογο SIP που ορίζεται στο Αίτημα για Σχόλια 3261. Συνάντηση είναι εγγενώς πιο περίπλοκη από το αντίστοιχο HTTP λόγω της ασύγχρονης και αναξιόπιστης φύσης του SIP που αναφέρθηκε παραπάνω. Για παράδειγμα, το Σχήμα 3 δείχνει το Συνάντηση μεταβάσεις κατάστασης που ορίζονται στο JSR 116:

Συνήθως, ένα HttpSession δημιουργείται όταν ένας χρήστης συνδέεται και καταστρέφεται μετά την αποσύνδεση. ΕΝΑ Συνάντηση Συνήθως αντιπροσωπεύει μια λογική συνομιλία, ακόμα κι αν έχετε πολλές συνομιλίες μεταξύ των ίδιων τελικών σημείων. Έτσι Συνάντηση είναι πιο δυναμική και έχει μικρότερη διάρκεια ζωής.

Πιο προηγμένες συζητήσεις για το Συνάντηση ο κύκλος ζωής και η σχέση του με το διάλογο SIP υπερβαίνει το πεδίο εφαρμογής αυτού του άρθρου. Ευτυχώς, το κοντέινερ χειρίζεται το μεγαλύτερο μέρος της πολυπλοκότητας, όπως ο κύκλος ζωής και οι μεταβάσεις κατάστασης και Συνάντηση μπορεί απλά να χρησιμοποιηθεί ως χώρος αποθήκευσης για δεδομένα συνεδρίας.

Ένα πλήρες παράδειγμα: EchoServlet

Το EchoServlet είναι ένα servlet SIP που μπορεί να επαναλαμβάνει τα άμεσα μηνύματα που πληκτρολογείτε στο Windows Messenger: