Benötige Hilfe für den Aufbau einer WebSocket-Verbindung

Hallo,

ich möchte meinen Emby Media Server in Symcon einbinden und kann bereits Kommandos über die Web-API an den Server senden. Umgedreht ist es möglich Informationen wie aktuell angemeldete Benutzer, aktive Clients, Wiedergabestatus, etc. über die API abzufragen. Dies muss aber immer aktiv, beispielsweise mit einem Timer, auf der Symcon-Seite geschehen.

Die Entwickler haben neben der Web-API die Möglichkeit eingebaut, Ereignisse zeitnah an einen WebSocket zu senden. Das würde ich gern nutzen um die Infos zur Wiedergabe usw. ohne Timer erhalten zu können.

Gemäß der Dokumentation (Web Socket · MediaBrowser/Emby Wiki · GitHub) hat die Adresse für den WebSocket wie folgt auszusehen:

ws://{host}?api_key={authenticationtoken}&deviceId={deviceId}

Beispiel:

ws://10.254.120.108?api_key=fca9455d9dd44aafbf5236685776142b&deviceId=TW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNzUuMC4zNzcwLjkwIENocm9tZS83NS4wLjM3NzAuOTAgU2FmYXJpLzUzNy4zNnwxNTYzODM2NjExNTE4

Ich habe bereits versucht mit einer Client-Socket-Instanz eine Verbindung herzustellen. Scheinbar führen aber die mitgegebenen URL-Parameter zu dem Fehler Host not found (authoritative) (Code: -32603).

Wie kann ich denn die WebSocket-Verbindung mit der erforderlichen Authentifizierung aufbauen?

Gruß,
David

Du musst mein IPSNetwork Modul installieren und dich dort hinter den WebSocket-Client hängen.
Unter anderen nutzt das SamsungTizen Modul ebenfalls diesen Splitter.
Michael

Danke für Deine Antwort. Ich habe das Modul installiert und nach dem Anlegen der Websocket-Client-Instanz meine URL eingetragen. Beim Speichern erscheint ein Popup mit dieser Meldung:

<br />
<b>Notice</b>: Could not connect. in <b>/var/lib/symcon/modules/IPSNetwork/WebSocketClient/module.php</b> on line <b>317</b><br />
(Code: -32603)

Parallel im Debug-Fenster:

04.01.2020, 19:56:10 |         ApplyChanges | OldState:0
04.01.2020, 19:56:10 |       Send Handshake | GET /?api_key=fca9455d9dd44aafbf5236685776142b&deviceId=TW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNzUuMC4zNzcwLjkwIENocm9tZS83NS4wLjM3NzAuOTAgU2FmYXJpLzUzNy4zNnwxNTYzODM2NjExNTE4 HTTP/1.1
Host: 10.254.120.108
Upgrade: websocket
Connection: Upgrade
Origin: http://10.254.120.108:8096/
Sec-WebSocket-Key: hwPumeEiyvPdofKA
Sec-WebSocket-Version: 13


04.01.2020, 19:56:10 |        Get Handshake | HTTP/1.1 500 Internal Server Error
Date: Sat, 04 Jan 2020 18:56:10 GMT
Connection: Close
Transfer-Encoding: Chunked

0

Im Log meines Emby Servers tut sich auch was. Dort erscheint folgende Ausgabe:

2020-01-04 19:56:10.193 Info HttpServer: WS http://10.254.120.108:8096/?api_key=fca9455d9dd44aafbf5236685776142b&deviceId=TW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNzUuMC4zNzcwLjkwIENocm9tZS83NS4wLjM3NzAuOTAgU2FmYXJpLzUzNy4zNnwxNTYzODM2NjExNTE4. UserAgent: 
2020-01-04 19:56:10.195 Error HttpServer: AcceptWebSocketAsync error
	*** Error Report ***
	Version: 4.3.1.0
	Command line: /opt/emby-server/system/EmbyServer.dll -programdata /var/lib/emby -ffdetect /opt/emby-server/bin/ffdetect -ffmpeg /opt/emby-server/bin/ffmpeg -ffprobe /opt/emby-server/bin/ffprobe -restartexitcode 3 -updatepackage emby-server-deb_{version}_amd64.deb
	Operating system: Unix 5.0.15.1
	64-Bit OS: True
	64-Bit Process: True
	User Interactive: True
	Runtime: file:///opt/emby-server/system/System.Private.CoreLib.dll
	Processor count: 16
	Program data path: /var/lib/emby
	Application directory: /opt/emby-server/system
	System.Net.WebSockets.WebSocketException: System.Net.WebSockets.WebSocketException (0x80004005): net_WebSockets_AcceptHeaderNotFound
	   at SocketHttpListener.Net.WebSockets.HttpWebSocket.ValidateWebSocketHeaders(HttpListenerContext context)
	   at SocketHttpListener.Net.WebSockets.HttpWebSocket.AcceptWebSocketAsyncCore(HttpListenerContext context, String subProtocol, Int32 receiveBufferSize, TimeSpan keepAliveInterval, Nullable`1 internalBuffer)
	   at EmbyServer.SocketSharp.WebSocketSharpListener.ProcessWebSocketRequest(HttpListenerContext ctx)
	Source: SocketHttpListener
	TargetSite: Void ValidateWebSocketHeaders(SocketHttpListener.Net.HttpListenerContext)

Instanz-Einstellungen:

Könntest Du mir bitte bei der Einrichtung des Moduls etwas unter die Arme greifen bis zumindest die WebSocket-Verbindung steht?

Gruß,
David

Zeit habe ich nicht wirklich. Aber eine Idee wo der Fehler / Missing Feature in meinem Modul ist.
Ändere Mal die module.php im WebSocketClient Modul.
Ersetze die 12 durch eine 16:
IPSNetwork/module.php at 3e70beae01b1e20686c134d3cf8477b1c598e439 · Nall-chan/IPSNetwork · GitHub

Funktioniert es dann?
Die prüfen hier auf 16 Zeichen.

Edit:
Ist ein Fehler von mit. Das RFC sagt 16 Byte…ups.
Michael

Du hast Recht, nach der vorgeschlagenen Änderung in der module.php baut der Client eine Verbindung auf :eek:

Debug Websocket-Client:

04.01.2020, 20:45:46 |       Send Handshake | GET /?api_key=fca9455d9dd44aafbf5236685776142b&deviceId=TW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNzUuMC4zNzcwLjkwIENocm9tZS83NS4wLjM3NzAuOTAgU2FmYXJpLzUzNy4zNnwxNTYzODM2NjExNTE4 HTTP/1.1
Host: 10.254.120.108
Upgrade: websocket
Connection: Upgrade
Origin: http://10.254.120.108:8096
Sec-WebSocket-Key: d6Ecx+p/MTYUJ3MNTQ7+OA==
Sec-WebSocket-Version: 13


04.01.2020, 20:45:46 |        Get Handshake | HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: FoMs9WTdn7eA1G+k1wy7eatfzaA=


04.01.2020, 20:45:56 |             Send FIN | true
04.01.2020, 20:45:56 |          Send OpCode | ping
04.01.2020, 20:45:56 |            Send Mask | true
04.01.2020, 20:45:56 |          Send Packet | ‰
04.01.2020, 20:46:13 |         ApplyChanges | OldState:3
04.01.2020, 20:46:13 |                 Send | Client send stream close !

Log Emby Server (nun ohne Exception):

2020-01-04 20:47:10.256 Info HttpServer: WS http://10.254.120.108:8096/?api_key=fca9455d9dd44aafbf5236685776142b&deviceId=TW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBVYnVudHUgQ2hyb21pdW0vNzUuMC4zNzcwLjkwIENocm9tZS83NS4wLjM3NzAuOTAgU2FmYXJpLzUzNy4zNnwxNTYzODM2NjExNTE4. UserAgent: 

Nun werde ich versuchen das mit meinem Modul zu verbinden damit ich auf eingehende Nachrichten reagieren kann.

Danke Dir für Deine Hilfe! :slight_smile: