WebSocket via DevIO?

Begonnen von KernSani, 06 April 2020, 07:43:45

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Kann Dir aus Codestudium leider nicht beantworten, ich wuerde das Problem mit Debug-Ausgaben eingrenzen.

justme1968

@rudi: ich glaube die berechnung der länge bei großen nachrichten ist falsch.

zumindest bekomme ich mit der version aus DevIo fehler, negative längen und unvollständige nachrichten.

mit folgender änderung geht es bei mir:--- DevIo.pm (revision 23927)
+++ DevIo.pm (working copy)
@@ -192,7 +192,7 @@
     $i += 2;
   } elsif( $len == 127 ) {
     return "" if(length($data) < 10);
-    $len = unpack( 'q', substr($hash->{".WSBUF"},$i,8) );
+    $len = unpack('N', substr($data, $i+4, 8));
     $i += 8;
   }

das ist auch der gleiche code den ich auch schon plex modul verwendet habe.

der <10 vergleich muss vermutlich auch noch auf < 12 angepasst werden. das habe ich nicht nicht geprüft.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Laut https://tools.ietf.org/html/rfc6455#section-5.2 :
ZitatThe length of the "Payload data", in bytes: if 0-125, that is the payload length.  If 126, the following 2 bytes interpreted as a 16-bit unsigned integer are the payload length.  If 127, the following 8 bytes interpreted as a 64-bit unsigned integer (the most significant bit MUST be 0) are the payload length.
Laut https://perldoc.perl.org/functions/pack :
Zitatq  A signed quad (64-bit) value.
Q  An unsigned quad value.
N  An unsigned long (32-bit) in "network" (big-endian) order.

N mit $i+4 funktioniert in allen praktischen Faellen, ist aber theoretisch falsch.
Ob Q oder q besser ist, ist angesichts der Definition eine (sehr theoretische) Diskussionsfrage.
Was mich verunsichert: bei q/Q steht in perldoc nix von Network-Byte-Order. Nachgelesen:
ZitatIf your system supports the Q pack format, you can use Q> to get big-endian (since Perl 5.9.2):
Habe jetzt q gegen Q> ausgetauscht, in FHEMWEB und in DevIo. Kann das bitte jemand testen, ich habe gerade meine Schwierigkeiten 64k+ an Websocket Daten zu generieren.

Zitatder <10 vergleich muss vermutlich auch noch auf < 12 angepasst werden. das habe ich nicht nicht geprüft.
Wenn ich das ASCII-Bild im o.g. Link richtig interpretiere, dann ist 10 richtig (2+8).

justme1968

das N theoretisch falsch ist bestreite ich garnicht. praktisch funktioniert es aber.

Q> gab es damals als ich das gebaut habe zumindest für die verwendete perl version noch nicht.

schaut aber mit der 281546 byte langen nachricht beim testen eben gut aus und auf jeden fall besser als die alte variante mit q.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Torxgewinde

Hallo,
Der Thread ist zwar schon etwas älter, trotzdem hatte ich die Infos aus diesem Thread gebraucht um Websockets via DevIo nutzen und verstehen zu können. Damit es für Andere einfacher wird, gibt es nun eine Wiki-Seite zu Websockets: https://wiki.fhem.de/wiki/Websocket

Beste Grüße