Implementierung eines Clients mit Websocket Protokoll in IPS.
Inhaltsverzeichnis
- Funktionsumfang
- Voraussetzungen
- Installation
- Hinweise zur Verwendung
- Einrichten eines Websocket-Client in IPS
- PHP-Befehlsreferenz
- Parameter / Modul-Infos
- Datenaustausch
- Anhang
- Lizenz
Dieses Modul stellt einen WebSocket-Client in IPS bereit.
Es wird sowohl TLS als auch die Basis-Authentifizierung unterstützt.
- IPS ab Version 4.3
Über das Modul-Control folgende URL hinzufügen.
git://github.com/Nall-chan/Network.git
Bei kommerzieller Nutzung (z.B. als Errichter oder Integrator) wenden Sie sich bitte an den Autor.
Weitere in diesem Modul enthaltene Librarys:
PHP-TLS
https://github.com/rnaga/PHP-TLS
Copyright (c) 2016 Ryohei Nagatsuka
Pure PHP Elliptic Curve Cryptography Library
https://github.com/phpecc/phpecc
Assert
https://github.com/beberlei/assert
Copyright (c) 2011-2013, Benjamin Eberlei, All rights reserved.
AES GCM (Galois Counter Mode) PHP Implementation
https://github.com/Spomky-Labs/php-aes-gcm
Copyright (c) 2016 Spomky-Labs
Das bereitgestellte Module unterstützt direkt keine Hard-/Software welche WebSocket nutzen.
Es dient nur dazu das Protokoll in IPS einzubinden.
Es sind somit andere Module oder Scripte (mit Register-Variable) notwendig um diese Dienste in IPS abzubilden.
Der Client unterstützt die unverschlüsselte (ws://) als auch die verschlüsselte (wss://) Übertragung mit TLS 1.1 & 1.2.
Ebenfalls wird die Basic-Authentifizierung unterstützt. Die Anmeldendaten können ohne aktiver Verschlüsselung jedoch mitgelesen werden und sind somit nicht 'sicher'.
Bei aktiver Verschlüsselung werden die Zugangsdaten der Basis-Authentifizierung ebenfalls verschlüsselt übertragen.
Wird der Client vom Server getrennt, so wird die Instanz als Fehlerhaft makiert. Des weiteren versucht IPS dann alle 60 Sekunden die Verbindung wieder aufzubauen.
Der Client stellt ein Interface für die RegisterVariable sowie andere IPS-Instanzen welche ein serielles Protokoll nutzen bereit.
Ebenso wird ein eigenes Interface für den Datenaustausch bereitgestellt, welches alle Möglichkeiten des Protokolls der untergeordneten Instanz zur Verfügung stellt.
Unter Instanz hinzufügen '(Splitter)' wählen und ein 'Websocket Client' hinzufügen (Haken bei Alle Module anzeigen!).
Es wird automatisch ein 'Client Socket' als übergeordnete Instanz angelegt und fertig konfiguriert.
In den Einstellungen ist mindestens die URL des entfernten WebSocket-Server einzutragen.
Dabei gilt das übliche Schema einer URL aus Protokoll, Host (u.U. Port) und Pfad.
z.B. wss://localhost:9090/meinWebSocketServer/
Die Erweiterten Einstellungen sind abhängig vom zu verbindenen Dienst, brauchen in der Regel aber nicht geändert werden.
bool WSC_SendText(integer $InstanzeID, string $Text);
Sendet die in $Text
übergeben Daten an den WebSocket-Server, dabei wird als Frame (binary / text) die Einstellung auf der Instanz genutzt.
Dieser WebSocket-Frame wird immer mit dem Fin-Flag gesendet.
Der Rückgabewert ist True
, sofern der Client verbunden ist.
bool WSC_SendPacket(integer $InstanzeID, bool $Fin, int $OPCode, string $Text);
Sendet die in $Text
übergeben Daten an den WebSocket-Server, dabei wird als Frame der übergeben $OPCode
genutzt.
Der WebSocket-Frame wird nur mit dem Fin-Flag gesendet, wenn $Fin
= true
ist.
Die möglichen OPCodes sind:
0x0 (int 0) für 'continuation' => Bedeutet das ein vorheriges Paket fortgesetzt wird und nicht abgeschlossen ist.
0x1 (int 1) für 'text' => Ein neuer Frame dessen Inhalt text ist.
0x2 (int 2) für 'binary' => Ein neuer Frame dessen Inhalt binär ist.
Der Rückgabewert ist True
, sofern der Client verbunden ist.
bool WSC_SendPing(integer $InstanzeID, string $Text);
Senden die in $Text
übergeben Daten als Payload des Ping den WebSocket-Server.
Der Rückgabewert ist True
, wenn der Server den Ping beantwortet.
GUID des Moduls (z.B. wenn Instanz per PHP angelegt werden soll):
Instanz | GUID |
---|---|
Websocket Client | {3AB77A94-3467-4E66-8A73-840B4AD89582} |
Eigenschaften des 'Websocket Client' für Get/SetProperty-Befehle:
Eigenschaft | Typ | Standardwert | Funktion |
---|---|---|---|
Open | boolean | false | false für inaktiv, true für aktiv |
URL | string | Die URL auf die sich verbunden wird | |
Version | integer | 13 | Die WebSocket-Version 13, 8 oder 6 |
Origin | string | Das Origin Feld im Protokoll | |
PingInterval | integer | 0 | In Sekunden, wann ein Ping an den Server gesendet wird |
PingPayload | string | Die im Ping zu versendenen Daten | |
Frame | integer | 1 | Format in welchen Daten versendet werden, wenn der Typ nicht bekannt ist (2 = binär) |
BasisAuth | boolean | false | true = Basis-Authentifizierung verwenden |
Username | string | Benutzername für die Authentifizierung | |
Password | string | Passwort für die Authentifizierung |
Datenempfang:
Vom WebSocket-Client zur untergeordneten Instanz (ReceiveData im fremden Modul).
Die Datensätze werden erst nach dem Empfang eines Fin als ein Block weitergeleitet.
Der WebSocket-Client buffert die Daten eigenständig bis zum nächten Paket mit gesetzten Fin-Flag.
Ping/Pong Funktionalität sowie das manuelle schließen der Verbindung sind aktuell nicht vorgesehen.
Parameter | Typ | Beschreibung |
---|---|---|
DataID | string | {C51A4B94-8195-4673-B78D-04D91D52D2DD} |
FrameTyp | integer | 1 = text, 2 = binär |
Buffer | string | Payload |
Datenversand:
Von der untergeordneten Instanz zum WebSocket-Client (SendDataToParent im fremden Modul).
Es ist empfohlen nur den FrameTyp 1 & 2 in Verbindung mit Fin = true zu nutzen!
Die Instanz meldet True zurück, solange sie Verbunden ist.
Parameter | Typ | Beschreibung |
---|---|---|
DataID | string | {BC49DE11-24CA-484D-85AE-9B6F24D89321} |
FrameTyp | integer | 0 = continuation, 1 = text, 2 = binär |
Fin | bool | true wenn Paket komplett, false wenn weitere Daten folgen |
Buffer | string | Payload |
Changlog:
Version 1.1:
- In Network-Library integriert
Version 1.0:
- Erstes offizielles Release
IPS-Modul:
CC BY-NC-SA 4.0
Librarys:
PHP-TLS
https://github.com/rnaga/PHP-TLS
Copyright (c) 2016 Ryohei Nagatsuka
Pure PHP Elliptic Curve Cryptography Library
https://github.com/phpecc/phpecc
Assert
https://github.com/beberlei/assert
Copyright (c) 2011-2013, Benjamin Eberlei, All rights reserved.
AES GCM (Galois Counter Mode) PHP Implementation
https://github.com/Spomky-Labs/php-aes-gcm
Copyright (c) 2016 Spomky-Labs