From 741f1c8068e1fe9c20b99befa8f13dc98be3ed53 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Sun, 21 Jul 2019 10:18:14 +0000 Subject: [PATCH] 01_FHEMWEB.pm: Execute data recvd via websocket as FHEM command (Forum #102291) git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@19877 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/01_FHEMWEB.pm | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/FHEM/01_FHEMWEB.pm b/FHEM/01_FHEMWEB.pm index ecbcdc2e6..274b984bb 100644 --- a/FHEM/01_FHEMWEB.pm +++ b/FHEM/01_FHEMWEB.pm @@ -370,15 +370,21 @@ FW_Read($$) } if($hash->{websocket}) { # 59713 + # https://tools.ietf.org/html/rfc6455 my $fin = (ord(substr($hash->{BUF},0,1)) & 0x80)?1:0; my $op = (ord(substr($hash->{BUF},0,1)) & 0x0F); my $mask = (ord(substr($hash->{BUF},1,1)) & 0x80)?1:0; my $len = (ord(substr($hash->{BUF},1,1)) & 0x7F); my $i = 2; + # $op: 0=>Continuation, 1=>Text, 2=>Binary, 8=>Close, 9=>Ping, 10=>Pong if($op == 8) { TcpServer_Close($hash, 1); return; + + } elsif($op == 9) { + return addToWritebuffer($hash, chr(0x8A).chr(0)); # Pong + } if( $len == 126 ) { @@ -389,17 +395,21 @@ FW_Read($$) $i += 8; } - if( $mask ) { - $mask = substr($hash->{BUF},$i,4); + my @m; + if($mask) { + @m = unpack("C*", substr($hash->{BUF},$i,4)); $i += 4; } + return if(length($hash->{BUF}) < $i+$len); - #my $data = substr($hash->{BUF}, $i, $len); - #for( my $i = 0; $i < $len; $i++ ) { - # substr( $data, $i, 1, substr( $data, $i, 1, ) ^ substr($mask, $i% , 1) ); - #} - #Log 1, "Received via websocket: ".unpack("H*",$data); + my $data = substr($hash->{BUF}, $i, $len); + if($mask) { + my $idx = 0; + $data = pack("C*", map { $_ ^ $m[$idx++ % 4] } unpack("C*", $data)); + } $hash->{BUF} = ""; + my $ret = FW_fC($data); + FW_addToWritebuffer($hash, FW_longpollInfo("JSON", $ret)."\n") if($ret); return; }