Autor Thema: WebSocket via DevIO?  (Gelesen 12047 mal)

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 24140
Antw:WebSocket via DevIO?
« Antwort #120 am: 25 November 2020, 11:50:11 »
Kann Dir aus Codestudium leider nicht beantworten, ich wuerde das Problem mit Debug-Ausgaben eingrenzen.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20710
Antw:WebSocket via DevIO?
« Antwort #121 am: 11 März 2021, 23:25:18 »
@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.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 24140
Antw:WebSocket via DevIO?
« Antwort #122 am: 12 März 2021, 12:03:50 »
Laut https://tools.ietf.org/html/rfc6455#section-5.2 :
Zitat
The 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 :
Zitat
q  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:
Zitat
If 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.

Zitat
der <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).

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20710
Antw:WebSocket via DevIO?
« Antwort #123 am: 12 März 2021, 13:43:28 »
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.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

 

decade-submarginal