Thread Kontinuierlich Net-Stream anzeigen
(29 answers)
Opened by kami at 2011-11-09 13:05
Hi,
so nach langer Zeit, sorry ich hatte viel auf der Arbeit zu tun. Bin ich nun mal wieder dazu gekommen, etwas an dem Script rumzuschrauben. Die Auswertung des L: Textes ist jetzt Fehlerfrei und sieht genauso aus, wie ich es brauche. Dazu sieht der Code jetzt so aus: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 #!/usr/bin/perl -w use strict; use warnings; use utf8; use IO::Socket; use MIME::Base64; use Data::Dumper; $Data::Dumper::Useqq=1; my $host = "192.168.1.36"; # Your Cube-IP or hostame Here! my $port = "80"; my $devices = "5"; my $handle = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => $port ) // die("ERROR open Socket $host:$port ($!)\n"); $handle->blocking(0); binmode($handle); while(1) { my $finished = 0; my $time=time(); my $buffer=''; while(time() < $time+20 && $finished==0) { my $line=''; $handle->read($line,4096); $finished=1 if(index($buffer,'L:')!=-1); $buffer.=$line if(length($line)); } if(!$finished) { print "No Connection\n"; next; } my %data; my %deviceconf; for my $v (split(/[\x0D\x0A]+/,$buffer)) { if($v=~/^L:(.+)/g) { my %hilf; my $str=decode_base64($1); for(1..$devices) { my $length=substr_ord(\$str,1); next if($length<6); my ($rfaddr,$x1,$data1,$data2)=unpack('H6 H2 B8 B8',substr($str,0,6,'')); if($rfaddr eq '005fd6') { $rfaddr = 'KuecheFe' } elsif($rfaddr eq '008f02') { $rfaddr = 'KuecheTh' } elsif($rfaddr eq '010863') { $rfaddr = 'WohnTh' } elsif($rfaddr eq '004bb8') { $rfaddr = 'WohnFe' } elsif($rfaddr eq '005bfb') { $rfaddr = 'Eco' } else {$rfaddr = $rfaddr} $deviceconf{$rfaddr}={ LowBat => substr($data2,0,1,'') }; if($length == 11) { my ($x2,$temp,$date,$time)=unpack('C C B16 C',substr($str,0,5,'')); $deviceconf{$rfaddr}{Temperatur}=$temp/2; } my $sub=substr($data2,6,2); if($sub == 0) { $deviceconf{$rfaddr}{Mode} = 'auto' } elsif($sub == 1) { $deviceconf{$rfaddr}{Mode} = 'manu' } elsif($sub == 2) { $deviceconf{$rfaddr}{Mode} = 'vacation' } elsif($sub == 3) { $deviceconf{$rfaddr}{Mode} = 'boost' } } } } print Dumper(\%deviceconf); sleep(1); $handle->send("l:"); } $handle->close(); sub substr_del { return substr( ${$_[0]}, 0, $_[1], '') } sub substr_ord { return unpack('C*', substr_del(@_) ); } sub substr_hex { return unpack('H*', substr_del(@_)); } sub substr_hex_fix { my $str=shift; my $length=shift; return unpack("H".($length*2), substr_del($str,$length)); } sub substr_bin { return unpack('B8', substr_del(@_)); } Was mir nun fehlt ist folgendes: Wenn ich die eine Telnet verbindung zum System aufmache, dann kriege ich ja als erstes den kompletten Output, der ausgewertet werden kann. Danach passiert ja nix mehr. Falls ich nun aber ein "l:" sende, dann bekomme ich wieder den L:-Teil zurück gegeben. Das möchte ich nun kontinuierlich in der Schleife tun. Leider bekomme ich keine Ausgabe wenn ich wie oben beschriebn das "l:" sende. Was amche ich falsch? in der Telnet verbindung muss ich nur l: eingeben und mit ENTER bestätigen. Vielen dank für Tipps. Cu kami |