<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://siprtc.azurewebsites.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
		<title>sipRTC - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://siprtc.azurewebsites.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Spezial:Beitr%C3%A4ge/Admin"/>
		<updated>2026-05-06T13:40:44Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Biliothek:ws&amp;diff=26</id>
		<title>Biliothek:ws</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Biliothek:ws&amp;diff=26"/>
				<updated>2018-03-06T21:25:59Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Category:Bibliothek == Server ==  (Teilweise übernommen aus [https://github.com/websockets/ws])  === Server bereitstellen ===  &amp;lt;syntaxhighlight lang=&amp;quot;Java…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Bibliothek]]&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
(Teilweise übernommen aus [https://github.com/websockets/ws])&lt;br /&gt;
&lt;br /&gt;
=== Server bereitstellen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; line&amp;gt;&lt;br /&gt;
var WebSocketServer = require('ws').Server&lt;br /&gt;
  , wss = new WebSocketServer({ port: 8080 });&lt;br /&gt;
&lt;br /&gt;
wss.on('connection', function connection(ws) {&lt;br /&gt;
  ws.on('message', function incoming(message) {&lt;br /&gt;
    console.log('received: %s', message);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  ws.send('something');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sending and receiving text data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; line&amp;gt;&lt;br /&gt;
var WebSocket = require('ws');&lt;br /&gt;
var ws = new WebSocket('ws://www.host.com/path');&lt;br /&gt;
&lt;br /&gt;
ws.on('open', function open() {&lt;br /&gt;
  ws.send('something');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
ws.on('message', function(data, flags) {&lt;br /&gt;
  // flags.binary will be set if a binary data is received.&lt;br /&gt;
  // flags.masked will be set if the data was masked.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server sending broadcast data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; line&amp;gt;&lt;br /&gt;
var WebSocketServer = require('ws').Server&lt;br /&gt;
  , wss = new WebSocketServer({ port: 8080 });&lt;br /&gt;
&lt;br /&gt;
// Broadcast to all.&lt;br /&gt;
wss.broadcast = function broadcast(data) {&lt;br /&gt;
  wss.clients.forEach(function each(client) {&lt;br /&gt;
    client.send(data);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
wss.on('connection', function connection(ws) {&lt;br /&gt;
  ws.on('message', function message(data) {&lt;br /&gt;
    // Broadcast to everyone except message sending socket&lt;br /&gt;
    wss.clients.forEach(function each(client) {&lt;br /&gt;
      if (client !== ws) client.send(data);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://github.com/websockets/ws GitHub]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Kategorie:Bibliothek&amp;diff=25</id>
		<title>Kategorie:Bibliothek</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Kategorie:Bibliothek&amp;diff=25"/>
				<updated>2018-03-06T21:25:47Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Biliothek:ws“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Biliothek:ws]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Datei:EntwurfFunktionsweiseApo.jpg&amp;diff=24</id>
		<title>Datei:EntwurfFunktionsweiseApo.jpg</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Datei:EntwurfFunktionsweiseApo.jpg&amp;diff=24"/>
				<updated>2018-03-06T21:23:34Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Funktionsweise&amp;diff=23</id>
		<title>Funktionsweise</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Funktionsweise&amp;diff=23"/>
				<updated>2018-03-06T21:23:20Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Die Konzeption des Szenarios ''Apotheken-Verbund'' ist in der nachfolgenden Abbildung ersichtlich. Datei:EntwurfFunktionsweiseApo.jpg|600px|thumb|left|erste…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Konzeption des Szenarios ''Apotheken-Verbund'' ist in der nachfolgenden Abbildung ersichtlich.&lt;br /&gt;
[[Datei:EntwurfFunktionsweiseApo.jpg|600px|thumb|left|erste Skizze]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Datei:UI2.png&amp;diff=22</id>
		<title>Datei:UI2.png</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Datei:UI2.png&amp;diff=22"/>
				<updated>2018-03-06T21:22:40Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Datei:UI1.png&amp;diff=21</id>
		<title>Datei:UI1.png</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Datei:UI1.png&amp;diff=21"/>
				<updated>2018-03-06T21:22:20Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Benutzer-Oberfl%C3%A4che&amp;diff=20</id>
		<title>Benutzer-Oberfläche</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Benutzer-Oberfl%C3%A4che&amp;diff=20"/>
				<updated>2018-03-06T21:21:58Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „== Szenario 1 ==  Datei:UI1.png  Benutzer-Oberfläche für das Szenario ''Apotheken-Verbund''  == Szenario 2 ==  Datei:UI2.png  Benutzer-Oberfläche f…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario 1 ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:UI1.png]]&lt;br /&gt;
&lt;br /&gt;
Benutzer-Oberfläche für das Szenario ''Apotheken-Verbund''&lt;br /&gt;
&lt;br /&gt;
== Szenario 2 ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:UI2.png]]&lt;br /&gt;
&lt;br /&gt;
Benutzer-Oberfläche für das Szenario ''Video-Wand''&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Architektur&amp;diff=19</id>
		<title>Architektur</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Architektur&amp;diff=19"/>
				<updated>2018-03-06T21:20:38Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Die Webapplikation besteht aus folgenden Komponenten: * Statischer Webseiteninhalt (HTML/PHP) inklusive WebRTC-Komponenten * Verweis auf SIP-JavaScript-Bibliot…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Webapplikation besteht aus folgenden Komponenten:&lt;br /&gt;
* Statischer Webseiteninhalt (HTML/PHP) inklusive WebRTC-Komponenten&lt;br /&gt;
* Verweis auf SIP-JavaScript-Bibliothek&lt;br /&gt;
* JavaScript Programmlogik&lt;br /&gt;
* [[Code:CSS|CSS]]-Stylevorlagen&lt;br /&gt;
&lt;br /&gt;
Serverseitig sind folgende Komponenten nötig:&lt;br /&gt;
* [[Konfiguration:Webserver|Webserver]] mit aktiviertem TLS-Support (HTTPS)&lt;br /&gt;
* [[Konfiguration:WebSocket-Server|WebSocket-Server]] mit aktiviertem TLS-Support (WSS)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Hauptseite&amp;diff=18</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Hauptseite&amp;diff=18"/>
				<updated>2018-03-06T21:20:09Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: /* Administratives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div &lt;br /&gt;
style=&amp;quot;text-align: center; margins: 1em; font-size: 3em; color: #444; border-bottom: 0.15em solid #ccc; background: #eee;&amp;quot;&amp;gt;&lt;br /&gt;
Willkommen im Wiki von sipRTC&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Das Projekt '''sipRTC''' wurde im Rahmen einer Masterarbeit ins Leben gerufen.&lt;br /&gt;
&lt;br /&gt;
Es soll ein auf dem [[Session Initiation Protocol (SIP)]] basiertes [[WebRTC]]-Framework bieten, welches Open Source zur Verfügung gestellt werden soll.&lt;br /&gt;
Während der Masterarbeit wurden die Kenntnisse zu [[JavaScript]] vertieft und insbesondere das Programm [[Node.js]] angeschaut.&lt;br /&gt;
&lt;br /&gt;
Die [[Aufgabenstellung]] der Masterarbeit besteht darin, eine funktionierende Demo-Infrastruktur aufzubauen. Es sollen jedoch auch Überlegungen dazu angestellt werden, wie eine produktive Umgebung betrieben werden müsste.&lt;br /&gt;
&lt;br /&gt;
Damit ist diese Arbeit eine Weiterführung des Projekts ''WebRTC'' im Herbstsemester 2015.&lt;br /&gt;
&lt;br /&gt;
== Administratives ==&lt;br /&gt;
&lt;br /&gt;
Erstmalig während des Studiums wird ein Wiki als Wissens-Ablage verwendet.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen [[Projektschritte]] werden ebenfalls in diesem Wiki erfasst.&lt;br /&gt;
&lt;br /&gt;
== Planung ==&lt;br /&gt;
*[[Aufgabenstellung#Analyse|Analyse]] der Aufgabenstellung&lt;br /&gt;
*[[Architektur]]&lt;br /&gt;
*[[Benutzer-Oberfläche]]&lt;br /&gt;
*[[Funktionsweise]]&lt;br /&gt;
&lt;br /&gt;
== Umsetzung ==&lt;br /&gt;
* [[:Category:Bibliothek|Bibliotheken]]&lt;br /&gt;
* [[:Category:Code|Code]]&lt;br /&gt;
* [[:Category:Konfiguration|Server-Konfiguration]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Bootstrap&amp;diff=17</id>
		<title>Bootstrap</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Bootstrap&amp;diff=17"/>
				<updated>2018-03-06T21:19:24Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „ == Weblinks == [http://getbootstrap.com/ Offizielle Website von Bootstrap]“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
[http://getbootstrap.com/ Offizielle Website von Bootstrap]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=M9&amp;diff=16</id>
		<title>M9</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=M9&amp;diff=16"/>
				<updated>2018-03-06T21:19:09Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Informationen zur diensthabenden Notfall-Apotheke sind unter folgender URL abrufbar: [http://www.notfall.apotheke-chur.ch/ http://www.notfall.apotheke-chur.ch]…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Informationen zur diensthabenden Notfall-Apotheke sind unter folgender URL abrufbar: [http://www.notfall.apotheke-chur.ch/ http://www.notfall.apotheke-chur.ch]. Der HTML-Code der Website wurde grösstenteils kopiert. Auf dieser Basisseite aufbauend wurde der Video-Chat integriert.&lt;br /&gt;
&lt;br /&gt;
Dabei wurde das [[Bootstrap]]-Framework verwendet.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=M8&amp;diff=15</id>
		<title>M8</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=M8&amp;diff=15"/>
				<updated>2018-03-06T21:18:39Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „== Umsetzung Variante 1 ==   === Server === Der untenstehende Code ist leicht abgeändert, da für die Konfiguration für einen sicheren WebSocket-Server noch…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Umsetzung Variante 1 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server ===&lt;br /&gt;
Der untenstehende Code ist leicht abgeändert, da für die Konfiguration für einen sicheren WebSocket-Server noch weiterer Code nötig ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot; line&amp;gt;&lt;br /&gt;
var calleeReady = false;&lt;br /&gt;
&lt;br /&gt;
var WebSocketServer = require('ws').Server&lt;br /&gt;
  , wss = new WebSocketServer({ port: 4001 });&lt;br /&gt;
&lt;br /&gt;
wss.on('connection', function connection(ws) {&lt;br /&gt;
  ws.on('message', function message(data) {&lt;br /&gt;
    if (data == 'calleeReady') {&lt;br /&gt;
      calleeReady = true;&lt;br /&gt;
    } else if (data == 'calleeBusy') {&lt;br /&gt;
      calleeReady = false;&lt;br /&gt;
    } else if (data == 'stateRequest') {&lt;br /&gt;
      if (calleeReady) {&lt;br /&gt;
        ws.send('calleeReady')&lt;br /&gt;
      } else {&lt;br /&gt;
        ws.send('calleeBusy')&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Broadcast to everyone else.&lt;br /&gt;
    wss.clients.forEach(function each(client) {&lt;br /&gt;
      if (client !== ws) {&lt;br /&gt;
        client.send(data);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Browser Apotheke ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot; line&amp;gt;&lt;br /&gt;
var connection = new WebSocket('wss://pbx.prbox.biz:4001');&lt;br /&gt;
	&lt;br /&gt;
// When the connection is open, send some data to the server&lt;br /&gt;
connection.onopen = function () {&lt;br /&gt;
  connection.send('Ping'); // Send the message 'Ping' to the server&lt;br /&gt;
};&lt;br /&gt;
	&lt;br /&gt;
connection.onclose = function() {&lt;br /&gt;
  connection.send('calleeBusy');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var userAgent = new SIP.UA( {&lt;br /&gt;
  // ... configuration of SIP UA&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
userAgent.on('connected', function() {&lt;br /&gt;
  connection.send('calleeReady');&lt;br /&gt;
  // rest of code when UA is connected to WSS&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
userAgent.on('disconnected', function() {&lt;br /&gt;
  connection.send('calleeBusy');&lt;br /&gt;
  // rest of code when UA is disconnected to WSS&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
userAgent.on('invite', function(session) {&lt;br /&gt;
  connection.send('calleeBusy');&lt;br /&gt;
  // rest of code when INVITE is received&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
window.onunload = function() {&lt;br /&gt;
  connection.send('calleeBusy');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Browser Besucher===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  &amp;lt;input id=&amp;quot;calleeState&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var connection = new WebSocket('wss://pbx.prbox.biz:4001');&lt;br /&gt;
	&lt;br /&gt;
connection.onopen = function () {&lt;br /&gt;
  connection.send('stateRequest'); // Request state of callee&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
connection.onmessage = function (e) {&lt;br /&gt;
  if (e.data == 'calleeReady') {&lt;br /&gt;
    $('#calleeState').val('Callee Ready');&lt;br /&gt;
    $('#calleeState').css(&amp;quot;background-color&amp;quot;, &amp;quot;#0F0&amp;quot;);&lt;br /&gt;
  } else if (e.data == 'calleeBusy') {&lt;br /&gt;
    $('#calleeState').val('Callee Busy');&lt;br /&gt;
    $('#calleeState').css(&amp;quot;background-color&amp;quot;, &amp;quot;#F00&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=M7&amp;diff=14</id>
		<title>M7</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=M7&amp;diff=14"/>
				<updated>2018-03-06T21:18:04Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Die bisherigen Implementation für einen WebSocket-Server setzten die Bibliothek ws für Node.JS ein. Die Konfiguration des Servers wurde so…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die bisherigen Implementation für einen WebSocket-Server setzten die Bibliothek [[Bibliothek:ws|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 &amp;quot;Intelligenz&amp;quot; und weiss nicht, in welchem Zustand sich eine Session befindet.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Variante 1: zusätzlicher WebSocket für Präsenzanzeige ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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'''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Umsetzung in [[M9]]&lt;br /&gt;
&lt;br /&gt;
== Variante 2: SIP-Server ==&lt;br /&gt;
Bei dieser Variante würde die [[Session Initiation Protocol (SIP)|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.&lt;br /&gt;
&lt;br /&gt;
Durch die Benutzung eines SIP-Servers wäre auch eine Integration in ein öffentliches SIP-Netzwerk möglich.&lt;br /&gt;
&lt;br /&gt;
=== Serverseitig ===&lt;br /&gt;
&lt;br /&gt;
Das RFC 6665 beschreibt den Mechanismus von SUBSCRIBE/NOTIFY im Allgemeinen:&lt;br /&gt;
&lt;br /&gt;
 ''The SUBSCRIBE method is used to request current state and state updates from a remote node.''&lt;br /&gt;
&lt;br /&gt;
 ''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.''&lt;br /&gt;
&lt;br /&gt;
In [https://tools.ietf.org/html/rfc3856 RFC 3856] wird erläutert, wie Präsenz-Ereignisse in SIP übertragen werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot; line&amp;gt;&lt;br /&gt;
SUBSCRIBE sip:resource@example.com SIP/2.0&lt;br /&gt;
Via: SIP/2.0/TCP watcherhost.example.com;branch=z9hG4bKnashds7&lt;br /&gt;
To: &amp;lt;sip:resource@example.com&amp;gt;&lt;br /&gt;
From: &amp;lt;sip:user@example.com&amp;gt;;tag=xfg9&lt;br /&gt;
Call-ID: 2010@watcherhost.example.com&lt;br /&gt;
CSeq: 17766 SUBSCRIBE&lt;br /&gt;
Max-Forwards: 70&lt;br /&gt;
Event: presence&lt;br /&gt;
Accept: application/pidf+xml&lt;br /&gt;
Contact: &amp;lt;sip:user@watcherhost.example.com&amp;gt;&lt;br /&gt;
Expires: 600&lt;br /&gt;
Content-Length: 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot; line&amp;gt;&lt;br /&gt;
NOTIFY sip:user@watcherhost.example.com SIP/2.0&lt;br /&gt;
Via: SIP/2.0/TCP server.example.com;branch=z9hG4bKna998sk&lt;br /&gt;
From: &amp;lt;sip:resource@example.com&amp;gt;;tag=ffd2&lt;br /&gt;
To: &amp;lt;sip:user@example.com&amp;gt;;tag=xfg9&lt;br /&gt;
Call-ID: 2010@watcherhost.example.com&lt;br /&gt;
Event: presence&lt;br /&gt;
Subscription-State: active;expires=599&lt;br /&gt;
Max-Forwards: 70&lt;br /&gt;
CSeq: 8775 NOTIFY&lt;br /&gt;
Contact: sip:server.example.com&lt;br /&gt;
Content-Type: application/pidf+xml&lt;br /&gt;
Content-Length: ...&lt;br /&gt;
&lt;br /&gt;
[PIDF Document]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Inhalt eines ''PIDF Document'' ist im [https://tools.ietf.org/html/rfc3863 RFC 3863] festgehalten. Es handelt sich dabei um XML-codierte Statusinformationen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Clientseitig ===&lt;br /&gt;
Die Implementierung soll anhand von Beispielcode der Bibliothek SIP.JS gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot; line&amp;gt;&lt;br /&gt;
// Subscribes the existing UA to the presence information of resource@example.com&lt;br /&gt;
var subscription = myUA.subscribe('resource@example.com', 'presence');&lt;br /&gt;
&lt;br /&gt;
// Once subscribed, receive notifications and print out the presence information to console&lt;br /&gt;
subscription.on('notify', function (notification) {&lt;br /&gt;
  console.log(notification.request.body);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://groups.google.com/forum/#!topic/sip_js/CkVQb9mR5jI SIP PUBLISH (presence)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=M3&amp;diff=13</id>
		<title>M3</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=M3&amp;diff=13"/>
				<updated>2018-03-06T21:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „= Erweiterung Chat um Räume = Das bestehende System soll nun ausgebaut werden, um ''Räume'' zu unterstützen. Damit sind mehrere Verbindungen gemeint, welche…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Erweiterung Chat um Räume =&lt;br /&gt;
Das bestehende System soll nun ausgebaut werden, um ''Räume'' zu unterstützen. Damit sind mehrere Verbindungen gemeint, welche parallel geführt werden können.&lt;br /&gt;
Die fertige Anwendung ist [https://pbx.prbox.biz/sipRTC/socketio-rooms.html hier] abrufbar.&lt;br /&gt;
&lt;br /&gt;
Bevor Nachrichten gesendet werden können, muss zuerst ein Raum ausgewählt werden. Pro Raum sind nur zwei Teilnehmer zulässig. Ein dritter Teilnehmer erhält eine Warnung, dass der gewählte Raum schon voll ist.&lt;br /&gt;
&lt;br /&gt;
Teile des Programmcodes stammen von der WebRTC-Demo-Applikation von Lukas Toggenburger.&lt;br /&gt;
&lt;br /&gt;
== Programm-Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serverseitig ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line&amp;gt;&lt;br /&gt;
var counts = {};&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
&lt;br /&gt;
	socket.on('disconnect', function() {&lt;br /&gt;
		if (typeof socket.session != &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
			socket.broadcast.to(socket.session).emit('message', {&lt;br /&gt;
				type : 'leave',&lt;br /&gt;
				session : socket.session&lt;br /&gt;
			});&lt;br /&gt;
			counts[socket.session] = 0;&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	socket.on('join', function(session) {&lt;br /&gt;
		if (typeof counts[session] == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
			console.log(&amp;quot;DEBUG: session = &amp;quot; + session&lt;br /&gt;
					+ &amp;quot; used for the first time&amp;quot;);&lt;br /&gt;
			counts[session] = 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var numClients = counts[session];&lt;br /&gt;
&lt;br /&gt;
		if (numClients === 0) {&lt;br /&gt;
			socket.join(session);&lt;br /&gt;
			socket.session = session;&lt;br /&gt;
			socket.emit('caller', session);&lt;br /&gt;
			counts[session]++;&lt;br /&gt;
		} else if (numClients === 1) {&lt;br /&gt;
			socket.join(session);&lt;br /&gt;
			socket.session = session;&lt;br /&gt;
			socket.emit('callee', session);&lt;br /&gt;
			counts[session]++;&lt;br /&gt;
			socket.broadcast.to(session).emit('calleeHasJoined', session);&lt;br /&gt;
		} else {&lt;br /&gt;
			socket.emit('full', session);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		console.log(&amp;quot;DEBUG: counts = &amp;quot; + JSON.stringify(counts));&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	socket.on('chat message', function(msg) {&lt;br /&gt;
		console.log('message: msg = ' + JSON.stringify(msg));&lt;br /&gt;
		console.log(&amp;quot;onmessage: counts = &amp;quot; + JSON.stringify(counts));&lt;br /&gt;
		socket.broadcast.to(socket.session).emit('chat message', msg);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clientseitig ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;&amp;quot; id=&amp;quot;formJoin&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;room&amp;quot; size=&amp;quot;24&amp;quot; maxlength=&amp;quot;24&amp;quot;&lt;br /&gt;
		value=&amp;quot;Kanalnummer&amp;quot;&lt;br /&gt;
		onblur=&amp;quot;if (this.value == '') {this.value = 'Kanalnummer';}&amp;quot;&lt;br /&gt;
		onfocus=&amp;quot;if (this.value == 'Kanalnummer') {this.value = '';}&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;button id=&amp;quot;connectButton&amp;quot;&amp;gt;Verbinden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;&amp;quot; id=&amp;quot;formSend&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input id=&amp;quot;m&amp;quot; autocomplete=&amp;quot;off&amp;quot; disabled=&amp;quot;disabled&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;button id=&amp;quot;sendMessage&amp;quot; disabled=&amp;quot;disabled&amp;quot;&amp;gt;Senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var isRoomJoined = false;&lt;br /&gt;
	var socket = io.connect('https://pbx.prbox.biz:3001');&lt;br /&gt;
		$('#formSend').submit(function() {&lt;br /&gt;
		socket.emit('chat message', $('#m').val());&lt;br /&gt;
		$('#m').val('');&lt;br /&gt;
		return false;&lt;br /&gt;
	});&lt;br /&gt;
		$('#formJoin').submit(function() {&lt;br /&gt;
		joinRoom();&lt;br /&gt;
		return false;&lt;br /&gt;
	});&lt;br /&gt;
		socket.on('chat message', function(msg) {&lt;br /&gt;
		$('#messages').append($('&amp;lt;li&amp;gt;').text(msg));&lt;br /&gt;
	});&lt;br /&gt;
	socket.on('full', function(msg) {&lt;br /&gt;
		window.alert(&amp;quot;Room is already full!&amp;quot;);&lt;br /&gt;
		isRoomJoined = false;&lt;br /&gt;
		document.getElementById('m').disabled = 'disabled';&lt;br /&gt;
		document.getElementById('sendMessage').disabled = 'disabled';&lt;br /&gt;
	});&lt;br /&gt;
		function joinRoom() {&lt;br /&gt;
		if (isRoomJoined == false) {&lt;br /&gt;
			console.log(&amp;quot;Raum wird beigetreten...&amp;quot;);&lt;br /&gt;
			isRoomJoined = true;&lt;br /&gt;
			document.getElementById('m').disabled = false;&lt;br /&gt;
			document.getElementById('sendMessage').disabled = false;&lt;br /&gt;
			document.getElementById('room').disabled = 'disabled';&lt;br /&gt;
			document.getElementById('connectButton').disabled = 'disabled';&lt;br /&gt;
			socket.emit('join',&lt;br /&gt;
			document.getElementById('room').value);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=M2&amp;diff=12</id>
		<title>M2</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=M2&amp;diff=12"/>
				<updated>2018-03-06T21:16:29Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „= Chat-Test-System mit socket.io = Um socket.io heranzutasten kennen zu lernen, wurde eine Chat-Demo-Anwendung aus dem Abschnitt [http://socket.io/get-started/…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chat-Test-System mit socket.io =&lt;br /&gt;
Um socket.io heranzutasten kennen zu lernen, wurde eine Chat-Demo-Anwendung aus dem Abschnitt [http://socket.io/get-started/ Get Started] der socket.io-Dokumentation aufgebaut.&lt;br /&gt;
Die fertige Anwendung ist [https://pbx.prbox.biz/sipRTC/socketio-simple.html hier] abrufbar.&lt;br /&gt;
&lt;br /&gt;
Jeder Client, der sich mit der Anwendung verbindet, sieht die Nachrichten der anderen Teilnehmer. Es gibt keine Beschränkung der Anzahl Benutzer im Chat.&lt;br /&gt;
&lt;br /&gt;
== Programm-Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serverseitig ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line&amp;gt;&lt;br /&gt;
io.on('connection', function(socket){&lt;br /&gt;
  console.log('a user connected');&lt;br /&gt;
  socket.on('disconnect', function(){&lt;br /&gt;
	    console.log('user disconnected');&lt;br /&gt;
	  });&lt;br /&gt;
  socket.on('chat message', function(msg){&lt;br /&gt;
	io.emit('chat message', msg);&lt;br /&gt;
    console.log('message:' + msg);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clientseitig ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input id=&amp;quot;m&amp;quot; autocomplete=&amp;quot;off&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;Senden&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var socket = io.connect('https://pbx.prbox.biz:3000');&lt;br /&gt;
	$('form').submit(function() {&lt;br /&gt;
		socket.emit('chat message', $('#m').val());&lt;br /&gt;
		$('#m').val('');&lt;br /&gt;
		return false;&lt;br /&gt;
	});&lt;br /&gt;
	socket.on('chat message', function(msg) {&lt;br /&gt;
		$('#messages').append($('&amp;lt;li&amp;gt;').text(msg));&lt;br /&gt;
	});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Projektschritte&amp;diff=11</id>
		<title>Projektschritte</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Projektschritte&amp;diff=11"/>
				<updated>2018-03-06T21:15:51Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „{| class=&amp;quot;wikitable&amp;quot; |- ! Schritt !! Name                                          !! Beschreibung                                                            !…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Schritt !! Name                                          !! Beschreibung                                                            !! Stand der Arbeit&lt;br /&gt;
|-&lt;br /&gt;
| [[JavaScript|M1]]  || Aneignung Kenntnisse JavaScript               || Vertiefung der Kenntnisse über Programmierung                           || ... laufend ...&lt;br /&gt;
|-&lt;br /&gt;
| [[M2]]  || Chat-Test-System mit Node.JS (socket.io)                || Um Node.JS kennen zu lernen, soll ein Testchat erstellt werden        || erstellt: [https://pbx.prbox.biz/sipRTC/socketio-simple.html] (18.11.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M3]]  || Erweiterung Chat um Räume                     || Testchat soll um die Funktionalität von ''Räumen'' erweitert werden     || erstellt: [https://pbx.prbox.biz/sipRTC/socketio-rooms.html] (01.12.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M4]]  || Implementation IM mit ws-Bibliothek   || Wechsel von socket.io auf die Bibliothek '''ws'''  || erstellt: [https://pbx.prbox.biz/sipRTC/ws-sipim-alice.html Alice] [https://pbx.prbox.biz/sipRTC/ws-sipim-bob.html Bob] (05.12.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M5]]  || Implementation A/V mit ws-Bibliothek   || Die Bibliothek '''ws''' wird nun verwendet, um eine Audio/Video-Lösung zu erstellen.  || erstellt: [https://pbx.prbox.biz/sipRTC/ws-sipav-alice.html Alice] [https://pbx.prbox.biz/sipRTC/ws-sipav-bob.html Bob] (07.12.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M6]]  || A/V und IM mit ws-Bibliothek und sip.js   || Gesamte Lösung mit Audio, Video und IM-Chat  || erstellt: [https://pbx.prbox.biz/sipRTC/ws-sip-alice.html Alice] [https://pbx.prbox.biz/sipRTC/ws-sip-bob.html Bob] (13.12.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M7]]  || Analyse ''zweiter Anruf''   || Was ist nötig, um einem zweiten Kunden zu signalisieren, dass die Apotheke bereits in einem Gespräch ist.  || erstellt&lt;br /&gt;
|-&lt;br /&gt;
| [[M8|(M8)]]  || Optional: Lösungsumsetzung M7   || Eine Lösung für die Analyse gemäss [[M7]] soll entwickelt werden.  || erstellt: [https://pbx.prbox.biz/sipRTC/ws-sip-pres-alice.html Alice] [https://pbx.prbox.biz/sipRTC/ws-sip-pres-bob.html Bob] (28.12.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M9]]  || UI Demo-Applikation   || Demo-Applikation in einem Kontext entwerfen (Ansicht einer Apotheken-Website)  || erstellt: [https://pbx.prbox.biz/sipRTC/demo-apotheke.html Apotheke] [https://pbx.prbox.biz/sipRTC/demo-kunde.html Kunde] (16.01.2016)&lt;br /&gt;
|-&lt;br /&gt;
| [[M10|(M10)]]  || Optional: Integration in ein Kommunikationsnetz   || Es sollen Überlegungen und eventuell eine Umsetzung erfolgen, um das System in ein öffentliches Kommunikationsnetz einzubinden.  || noch nicht begonnen&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Aufgabenstellung&amp;diff=10</id>
		<title>Aufgabenstellung</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Aufgabenstellung&amp;diff=10"/>
				<updated>2018-03-06T21:15:15Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Es soll eine funktionierende Demo-Umgebung aufgebaut werden, mit welcher Peer-to-Peer-Audio/Video-Verbindungen zwischen zwei Teilnehmern möglich sind. Die W…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es soll eine funktionierende Demo-Umgebung aufgebaut werden, mit welcher Peer-to-Peer-Audio/Video-Verbindungen zwischen zwei Teilnehmern möglich sind. Die [[WebRTC]]-Lösung, bei welcher die beiden Teilnehmer unterstützte Webbrowser sind, soll das [[Session Initiation Protocol (SIP)|SIP]]-Protokoll als Signalisierungsprotokoll verwenden.&lt;br /&gt;
&lt;br /&gt;
Für die Demo-Umgebung sollen im Rahmen der Masterarbeit folgende beiden Szenarien berücksichtigt werden:&lt;br /&gt;
&lt;br /&gt;
* '''Apotheken-Verbund:''' Die teilnehmenden Apotheken eines Apotheken-Verbundes wechseln regelmässig die Pikett-Bereitschaftszeit. Ein Kunde soll die Website des Apotheken-Verbundes aufrufen und per Knopfdruck mit der diensthabenden Apotheke verbunden werden können (Statischer Client A, dynamischer Client B).&lt;br /&gt;
* '''Video-Wand:''' Ein Thinktank verfügt über zwei Standorte mit je einer Cafeteria. Mittels einer Kamera soll jede Cafeteria ''virtuell erweitert'' werden, indem ein Beamer das Bild des jeweilig anderen Standortes projiziert wird (sowohl Client A als auch Client B sind statisch).&lt;br /&gt;
&lt;br /&gt;
'''Vertiefung:''' Diese Szenarien sollten nach Möglichkeit nicht nur im Labor, sondern auch unter realen Voraussetzungen durchführbar sein.&lt;br /&gt;
Welche Einflüsse auf das Konzept und die Realisierung haben allgemeine Anwendungsszenarien beispielsweise auf die Elemente einer SIP-Nachricht.&lt;br /&gt;
&lt;br /&gt;
'''Erweiterte Ziele:''' Während Zwischenbesprechungen wurden weitere Ziele definiert:&lt;br /&gt;
* Im Falle des Apotheken-Szenarios soll einem zweiten Besucher angezeigt werden, ob sich die Apotheke bereits in einem Gespräch befindet. Hierbei steht die Analyse im Vordergrund, eine Umsetzung ist optional.&lt;br /&gt;
* Die entworfene Demo-Applikation soll in den Kontext des Apotheken-Szenarios gebracht werden. Die Benutzeroberfläche soll entsprechend gestaltet werden.&lt;br /&gt;
* Es sollen Überlegungen und eventuell eine Umsetzung erfolgen, um das System in ein öffentliches Kommunikationsnetz einzubinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Analyse ==&lt;br /&gt;
Die Demo-Umgebung wird erstmals mit privater Infrastruktur aufgebaut.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Node_Package_Manager&amp;diff=9</id>
		<title>Node Package Manager</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Node_Package_Manager&amp;diff=9"/>
				<updated>2018-03-06T21:14:48Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „= Pakete = * '''rtc.io'''. Dokumentation: [https://www.npmjs.com/package/rtc]“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Pakete =&lt;br /&gt;
* '''rtc.io'''. Dokumentation: [https://www.npmjs.com/package/rtc]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Node.js&amp;diff=8</id>
		<title>Node.js</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Node.js&amp;diff=8"/>
				<updated>2018-03-06T21:14:29Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Paketinstallations-Tool: Node Package Manager.  Auf dem Server, auf welchem Node.js betrieben wird, ist ein Tool namens ''forever'' installiert, mit welche…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Paketinstallations-Tool: [[Node Package Manager]].&lt;br /&gt;
&lt;br /&gt;
Auf dem Server, auf welchem Node.js betrieben wird, ist ein Tool namens ''forever'' installiert, mit welchem man Node.js-Applikationen als Daemon im Hintergrund ausgeführt werden können. Das Starten oder Stoppen der Applikationen erfolgt mit:&lt;br /&gt;
 forever start app.js&lt;br /&gt;
 forever stop app.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* Node.js offizielle Website [https://nodejs.org/en/]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=JQuery&amp;diff=7</id>
		<title>JQuery</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=JQuery&amp;diff=7"/>
				<updated>2018-03-06T21:13:57Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „ == Code-Abschnitte == Verändert den Wert des Objekts mit der ID ''state'' auf '''connecting''': &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; $('#state').val('connecti…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Code-Abschnitte ==&lt;br /&gt;
Verändert den Wert des Objekts mit der ID ''state'' auf '''connecting''':&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$('#state').val('connecting');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verändert den CSS-Stil des Objekt mit der ID ''state'':&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$('#state').css(&amp;quot;background-color&amp;quot;, &amp;quot;#FF0&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://jquery.com/ jQuery]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=JavaScript&amp;diff=6</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=JavaScript&amp;diff=6"/>
				<updated>2018-03-06T21:13:38Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Für die Erarbeitung von JavaScript-Wissen, wurde hauptsächlich die Website [http://eloquentjavascript.net/ Eloquent JavaScript] konsultiert.  Auf dieser Seit…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für die Erarbeitung von JavaScript-Wissen, wurde hauptsächlich die Website [http://eloquentjavascript.net/ Eloquent JavaScript] konsultiert.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die relevantesten Erkenntnisse erfasst. Für Erkenntnisse in einem Bereich einer Bibliothek, sind die informationen in den entsprechenden Artikeln zu finden:&lt;br /&gt;
&lt;br /&gt;
* [[jQuery]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=JavaScript_Session_Establishment_Protocol_(JSEP)&amp;diff=5</id>
		<title>JavaScript Session Establishment Protocol (JSEP)</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=JavaScript_Session_Establishment_Protocol_(JSEP)&amp;diff=5"/>
				<updated>2018-03-06T21:13:09Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „Die folgende Abbildung entstammt aus dem Internet-Draft von JSEP und zeigt das Signalisierungs-Modell von entsprechenden Applikationen.   +-----------+…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die folgende Abbildung entstammt aus dem Internet-Draft von JSEP und zeigt das Signalisierungs-Modell von entsprechenden Applikationen.&lt;br /&gt;
&lt;br /&gt;
 +-----------+                               +-----------+&lt;br /&gt;
 |  Web App  |&amp;lt;--- App-Specific Signaling --&amp;gt;|  Web App  |&lt;br /&gt;
 +-----------+                               +-----------+&lt;br /&gt;
       ^                                            ^&lt;br /&gt;
       |  SDP                                       |  SDP&lt;br /&gt;
       V                                            V&lt;br /&gt;
 +-----------+                                +-----------+&lt;br /&gt;
 |  Browser  |&amp;lt;----------- Media ------------&amp;gt;|  Browser  |&lt;br /&gt;
 +-----------+                                +-----------+&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [https://datatracker.ietf.org/doc/draft-ietf-rtcweb-jsep/?include_text=1 Definition von JSEP des IETF] (Draft)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=WebRTC&amp;diff=4</id>
		<title>WebRTC</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=WebRTC&amp;diff=4"/>
				<updated>2018-03-06T21:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „== Architektur == WebRTC besteht im Wesentlichen aus folgenden drei APIs mit den nachfolgenden Funktionen: * '''MediaStream''': bietet Zugriff auf lokale R…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Architektur ==&lt;br /&gt;
WebRTC besteht im Wesentlichen aus folgenden drei APIs mit den nachfolgenden Funktionen:&lt;br /&gt;
* '''[[MediaStream]]''': bietet Zugriff auf lokale Ressourcen wie Mikrofon und Kamera.&lt;br /&gt;
* '''[[RTCPeerConnection]]''': stellt die Verbindung zwischen den Peers sicher.&lt;br /&gt;
* '''[[RTCDataChannel]]''': bietet die Möglichkeit, Text- oder binäre (nicht audiovisuelle) Nachrichten auszutauschen.&lt;br /&gt;
&lt;br /&gt;
Das Modell, welches einer JavaScript-Applikation erlaubt, die Signalisierung einer Multimedia-Sitzung mit der [[RTCPeerConnection]] API zu realisieren nennt sich [[JavaScript Session Establishment Protocol (JSEP)]]. Dabei ist das Protokoll dieser Signalisierung nicht festgelegt. Ein Entwickler kann für seine Applikation selber entscheiden, ob er das [[Session Initiation Protocol (SIP)]], XMPP oder ein anderes Protokoll verwenden möchte.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Getting Started (WebRTC.org) [https://webrtc.org/start/]&lt;br /&gt;
* Getting Started with WebRTC (HTML5rocks) [https://www.html5rocks.com/en/tutorials/webrtc/basics/]&lt;br /&gt;
* WebRTC Signaling Concepts [https://www.webrtc-experiment.com/docs/WebRTC-Signaling-Concepts.html]&lt;br /&gt;
* WebRTC in the real world: STUN, TURN and signaling [https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/]&lt;br /&gt;
* The term 'signaling' in WebRTC [https://www.webrtc-experiment.com/docs/WebRTC-Signaling-Concepts.html]&lt;br /&gt;
* WebRTC Google Codelab [https://codelabs.developers.google.com/codelabs/webrtc-web/]&lt;br /&gt;
* WebRTC-Plugin für Internet Explorer [https://confluence.temasys.com.sg/display/TWPP]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* Wikipedia-Seite zu WebRTC [https://de.wikipedia.org/wiki/WebRTC]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Session_Initiation_Protocol_(SIP)&amp;diff=3</id>
		<title>Session Initiation Protocol (SIP)</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Session_Initiation_Protocol_(SIP)&amp;diff=3"/>
				<updated>2018-03-06T21:11:50Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „== Verwendung von SIP in diesem Projekt == SIP wurde als Signalisierungsprotokoll gewählt, da es es sich um ein frei zugängliches, in der Industrie jedoch de…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Verwendung von SIP in diesem Projekt ==&lt;br /&gt;
SIP wurde als Signalisierungsprotokoll gewählt, da es es sich um ein frei zugängliches, in der Industrie jedoch dennoch oft verwendetes Protokoll handelt.&lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieser Arbeit stellt das RFC 7118 '''The WebSocket Protocol as a Transport for the Session Initiation Protocol (SIP)''' eine wichtige Komponente dar. Dieses Dokument erläutert, wie SIP über das [[WebSockets|WebSocket-Protokoll]] signalisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterungen ==&lt;br /&gt;
* [https://tools.ietf.org/html/rfc5626 RFC 5626 (Outbound)]&lt;br /&gt;
* [https://tools.ietf.org/html/rfc5627 RFC 5627 (GRUU)]&lt;br /&gt;
* [https://tools.ietf.org/html/rfc6665 RFC 6665 (SIP-Specific Event Notification)]&lt;br /&gt;
* [https://tools.ietf.org/html/rfc3856 RFC 3856 (Presence)]&lt;br /&gt;
&lt;br /&gt;
== JavaScript SIP-Clients ==&lt;br /&gt;
* [https://www.doubango.org/sipml5/ '''sipML5''']. Quelle auf [https://github.com/DoubangoTelecom/sipml5 GitHub]&lt;br /&gt;
** [https://www.doubango.org/sipml5/docgen/index.html?svn=200#sendMessage send SMS style message]&lt;br /&gt;
* [http://jssip.net/ '''jssip''']. Quelle auf [https://github.com/versatica/JsSIP GitHub]&lt;br /&gt;
* [http://sipjs.com '''SIP.js''']. Quelle auf [https://github.com/onsip/sip.js GitHub]&lt;br /&gt;
* [http://jscommunicator.org/ '''JSCommunicator'''] Quelle auf [https://github.com/opentelecoms-org/jscommunicator GitHub]&lt;br /&gt;
&lt;br /&gt;
== Proxies mit WebSocket-Unterstützung ==&lt;br /&gt;
&lt;br /&gt;
* [http://oversip.net/ '''OverSIP''']. Quelle auf [https://github.com/versatica/OverSIP GitHub]&lt;br /&gt;
* [https://www.resiprocate.org '''reSIProcate'''] / [https://www.resiprocate.org/About_Repro '''repro''']&lt;br /&gt;
** [http://rtcquickstart.org/guide/multi/sip-proxy-repro.html repro konfigurieren]&lt;br /&gt;
* [https://www.kamailio.org/ '''Kamailio''']&lt;br /&gt;
* [http://www.asterisk.com '''Asterisk'''] [https://wiki.asterisk.org/wiki/display/AST/WebRTC+tutorial+using+SIPML5]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* Wikipedia-Seite zu SIP [https://de.wikipedia.org/wiki/Session_Initiation_Protocol]&lt;br /&gt;
* RFC 3261 [https://tools.ietf.org/html/rfc3261]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://siprtc.azurewebsites.net/index.php?title=Hauptseite&amp;diff=2</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://siprtc.azurewebsites.net/index.php?title=Hauptseite&amp;diff=2"/>
				<updated>2018-03-06T21:10:47Z</updated>
		
		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div &lt;br /&gt;
style=&amp;quot;text-align: center; margins: 1em; font-size: 3em; color: #444; border-bottom: 0.15em solid #ccc; background: #eee;&amp;quot;&amp;gt;&lt;br /&gt;
Willkommen im Wiki von sipRTC&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Das Projekt '''sipRTC''' wurde im Rahmen einer Masterarbeit ins Leben gerufen.&lt;br /&gt;
&lt;br /&gt;
Es soll ein auf dem [[Session Initiation Protocol (SIP)]] basiertes [[WebRTC]]-Framework bieten, welches Open Source zur Verfügung gestellt werden soll.&lt;br /&gt;
Während der Masterarbeit wurden die Kenntnisse zu [[JavaScript]] vertieft und insbesondere das Programm [[Node.js]] angeschaut.&lt;br /&gt;
&lt;br /&gt;
Die [[Aufgabenstellung]] der Masterarbeit besteht darin, eine funktionierende Demo-Infrastruktur aufzubauen. Es sollen jedoch auch Überlegungen dazu angestellt werden, wie eine produktive Umgebung betrieben werden müsste.&lt;br /&gt;
&lt;br /&gt;
Damit ist diese Arbeit eine Weiterführung des Projekts ''WebRTC'' im Herbstsemester 2015.&lt;br /&gt;
&lt;br /&gt;
== Administratives ==&lt;br /&gt;
&lt;br /&gt;
Erstmalig während des Studiums wird ein Wiki als Wissens-Ablage verwendet.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen [[Projektschritte]] werden ebenfalls in diesem Wiki erfasst.&lt;br /&gt;
&lt;br /&gt;
Die alte Hauptseite ist auf der Seite [[Starthilfe]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Planung ==&lt;br /&gt;
*[[Aufgabenstellung#Analyse|Analyse]] der Aufgabenstellung&lt;br /&gt;
*[[Architektur]]&lt;br /&gt;
*[[Benutzer-Oberfläche]]&lt;br /&gt;
*[[Funktionsweise]]&lt;br /&gt;
&lt;br /&gt;
== Umsetzung ==&lt;br /&gt;
* [[:Category:Bibliothek|Bibliotheken]]&lt;br /&gt;
* [[:Category:Code|Code]]&lt;br /&gt;
* [[:Category:Konfiguration|Server-Konfiguration]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>