M7

Aus sipRTC
Wechseln zu: Navigation, Suche

Die bisherigen Implementation für einen WebSocket-Server setzten die Bibliothek ws für Node.JS ein. Die Konfiguration des Servers wurde so festgelegt, dass der Server alle eingehenden Nachrichten transparent an die anderen verbundenen WebSocket-Clients weiterleitet. Dies führt dazu, dass auch weitere Clients sämtliche Kommunikation mithören können. Der Server verfügt demnach über keine "Intelligenz" und weiss nicht, in welchem Zustand sich eine Session befindet.

Im Falle des Szenarios Apotheke soll beispielsweise einem zweiten Website-Besucher mitgeteilt werden, dass sich die Apotheke bereits in einem Gespräch befindet. Es wird also eine Komponente benötigt, welche den Zustand der involvierten Clients überwacht und an die Website weitermelden kann.

Variante 1: zusätzlicher WebSocket für Präsenzanzeige

Ein zusätzlicher WebSocket-Server kann verwendet werden um den Zustand des Apotheken-Browsers zu überwachen. Über einen zweiten WebSocket-Kanal signalisiert der WebSocket-Server dem Client, ob eine Gesprächsverbindung möglich ist. Dabei werden keine SIP-Meldungen gesendet, sondern benutzerdefinierte Nachrichten.

Auf dem Server wird die Variable calleeReady geführt. Sobald sich der Apothekenbrowser am Server anmeldet, wird die Variable auf true gesetzt. Sobald ein eingehender Anruf angenommen wird, wechselt sie während der Dauer des Gesprächs auf false.

Der Status der Variable wird jeweils bei derer Veränderung an alle verbundenen Clients weitergeleitet. Auf Anfrage eines Clients (z.B. Anmelden eines weiteren Clients) kann der aktuelle Status ebenfalls mitgeteilt werden.

Umsetzung in M9

Variante 2: SIP-Server

Bei dieser Variante würde die SIP-Client-Implementation mit Subscriptions und dem SIP-Request SUBSCRIBE erweitert werden. Dabei erfolgt eine Anmeldung für ein Ereignis wie z.B. eine Präsenzanzeige. Die Anmeldung wird von einem SIP-Server verarbeitet, welcher Ereignisse mittels dem SIP-Request NOTIFY an angemeldete Clients meldet.

Durch die Benutzung eines SIP-Servers wäre auch eine Integration in ein öffentliches SIP-Netzwerk möglich.

Serverseitig

Das RFC 6665 beschreibt den Mechanismus von SUBSCRIBE/NOTIFY im Allgemeinen:

The SUBSCRIBE method is used to request current state and state updates from a remote node.
NOTIFY requests are sent to inform subscribers of changes in state to which the subscriber has a subscription.  Subscriptions are created using the SUBSCRIBE method.

In RFC 3856 wird erläutert, wie Präsenz-Ereignisse in SIP übertragen werden können:

SUBSCRIBE sip:resource@example.com SIP/2.0
Via: SIP/2.0/TCP watcherhost.example.com;branch=z9hG4bKnashds7
To: <sip:resource@example.com>
From: <sip:user@example.com>;tag=xfg9
Call-ID: 2010@watcherhost.example.com
CSeq: 17766 SUBSCRIBE
Max-Forwards: 70
Event: presence
Accept: application/pidf+xml
Contact: <sip:user@watcherhost.example.com>
Expires: 600
Content-Length: 0
NOTIFY sip:user@watcherhost.example.com SIP/2.0
Via: SIP/2.0/TCP server.example.com;branch=z9hG4bKna998sk
From: <sip:resource@example.com>;tag=ffd2
To: <sip:user@example.com>;tag=xfg9
Call-ID: 2010@watcherhost.example.com
Event: presence
Subscription-State: active;expires=599
Max-Forwards: 70
CSeq: 8775 NOTIFY
Contact: sip:server.example.com
Content-Type: application/pidf+xml
Content-Length: ...

[PIDF Document]

Der Inhalt eines PIDF Document ist im RFC 3863 festgehalten. Es handelt sich dabei um XML-codierte Statusinformationen.


Clientseitig

Die Implementierung soll anhand von Beispielcode der Bibliothek SIP.JS gezeigt werden.

// Subscribes the existing UA to the presence information of resource@example.com
var subscription = myUA.subscribe('resource@example.com', 'presence');

// Once subscribed, receive notifications and print out the presence information to console
subscription.on('notify', function (notification) {
  console.log(notification.request.body);
});

SIP PUBLISH (presence)