init III
This commit is contained in:
203
Perl JSON Server Client/AW Client/uni-client-aw.pl
Normal file
203
Perl JSON Server Client/AW Client/uni-client-aw.pl
Normal file
@@ -0,0 +1,203 @@
|
||||
#!/usr/bin/perl -X
|
||||
use warnings;
|
||||
use Thread;
|
||||
use IO::Socket::Multicast;
|
||||
use Win32::Console::ANSI qw /Cursor Title/;
|
||||
use IO::Socket;
|
||||
use JSON::XS;
|
||||
|
||||
use strict;
|
||||
|
||||
my %jdata :shared;
|
||||
my %data;
|
||||
my @sortedindex;
|
||||
my $gotdata :shared;
|
||||
my $rrthr :shared;
|
||||
$rrthr = 0;
|
||||
$gotdata=0;
|
||||
|
||||
#my $peerhost = "10.61.1.10";
|
||||
my $peerhost;
|
||||
my $peerport;
|
||||
|
||||
if ($ARGV[0] eq "") {
|
||||
$peerhost="0.0.0.0"; $peerport="11211";
|
||||
}
|
||||
else {
|
||||
if ($ARGV[1] eq "") { wrong_start("Kein Port"); }
|
||||
|
||||
my $e=$ARGV[1];
|
||||
if ($e<1024 or $e>65535) {wrong_start("Ungültiger Port");}
|
||||
$peerport = $e;
|
||||
|
||||
my ($a,$b,$c,$d) = split/\./,$ARGV[0];
|
||||
if ($ARGV[0] eq "0.0.0.0") {
|
||||
$peerhost=0.0.0.0;
|
||||
}
|
||||
else {
|
||||
if ($a<1 or $a>255 or $b<0 or $b>255 or $c<0 or $c>255 or $d<1 or $d>255) { wrong_start("Ungültige IP"); }
|
||||
$peerhost = $a . "." . $b . "." . $c . "." . "$d";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
while (1) {
|
||||
if ($rrthr==0) {
|
||||
print "Receive JSON neu starten\n";
|
||||
#<STDIN>;
|
||||
my $thr = new Thread(\&ReceiveJSON);
|
||||
$thr->detach;
|
||||
#sleep 1;
|
||||
}
|
||||
if ($gotdata and $rrthr==1) {
|
||||
TransformJSON();
|
||||
@sortedindex=Sorted();
|
||||
|
||||
print "\e[2J";
|
||||
|
||||
my $status = $data{0}[0];
|
||||
my $res1 = $data{0}[1];
|
||||
my $res2 = $data{0}[2];
|
||||
my $res3 = $data{0}[3];
|
||||
my $timest = $data{0}[4];
|
||||
my $spalten = $data{0}[5];
|
||||
my $zeilen = $data{0}[6];
|
||||
|
||||
my $label = $data{0}[7];
|
||||
my $showl = 0; # beschriftung wird angezeigt
|
||||
$showl = 1 if ($label eq ""); # beschriftung wird nicht angezeigt
|
||||
|
||||
my $gesamtzeilen = @sortedindex;
|
||||
|
||||
my $startshow = 7 + $showl;
|
||||
my $endshow;
|
||||
if ($spalten eq "") {
|
||||
$endshow=@{$data{0}} -1;
|
||||
}
|
||||
else {
|
||||
$endshow = $startshow -1 + $spalten;
|
||||
}
|
||||
|
||||
$zeilen=$gesamtzeilen if ($zeilen eq "");
|
||||
|
||||
#spaltenbreite ermitteln
|
||||
|
||||
my @sb;
|
||||
|
||||
|
||||
for my $id (0 .. $zeilen -1) { #zeilen durchlaufen
|
||||
my $i=$sortedindex[$id];
|
||||
for my $c ($startshow .. $endshow) { #spalten durchlaufen
|
||||
# spaltenbreite ist länge der aktuellen spalte wenn die aktuelle länger als die bisher ermittelte länge ist
|
||||
$sb[$c]=0 unless ($sb[$c]);
|
||||
$sb[$c] = length ($data{$i}[$c]) if (length ($data{$i}[$c]) > $sb[$c]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
for my $id (0 .. $zeilen -1) {
|
||||
my $i=$sortedindex[$id];
|
||||
for my $c ($startshow .. $endshow) {
|
||||
# soviele leerzeichen schreiben bis die anzahl der geschriebenen leerzeichen + des inhalts die maximale länge der spalte erreicht hat
|
||||
|
||||
my $lenv;
|
||||
if ($data{$i}[$c] eq "") {
|
||||
$lenv=0;
|
||||
}
|
||||
else {
|
||||
$lenv = length($data{$i}[$c]);
|
||||
}
|
||||
for (my $j=0;$j<$sb[$c]-$lenv;$j++) {
|
||||
print " ";
|
||||
}
|
||||
# ein leerzeichen muß hinten angehängt werden damit eine lücke zwischen den spalten entsteht
|
||||
printf "%s ", $data{$i}[$c];
|
||||
}
|
||||
print "\n" if ($id==0); # nach der überschrift eine leerzeile einfügen
|
||||
print "\n"; # zeilenumbruch einfügen
|
||||
}
|
||||
}
|
||||
sleep 1;
|
||||
}
|
||||
sub Sorted {
|
||||
my @sorted;
|
||||
my $type=0; # type 0 numerisch, 1 alphanumerisch
|
||||
foreach (keys %data) {
|
||||
if ($_ =~ /[a-z]/i) {
|
||||
$type=1;
|
||||
}
|
||||
}
|
||||
if ($type == 0) {
|
||||
foreach my $id (sort { $a <=> $b } keys %data) {
|
||||
push @sorted, $id;
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach my $id (sort keys %data) {
|
||||
push @sorted, $id;
|
||||
}
|
||||
}
|
||||
return @sorted;
|
||||
}
|
||||
sub ReceiveJSON {
|
||||
my $JSONObject = JSON::XS->new->ascii->pretty->relaxed->allow_nonref();
|
||||
$rrthr=1;
|
||||
my $socket = new IO::Socket::INET (PeerAddr => $peerhost,
|
||||
PeerPort => $peerport,
|
||||
Proto => 'tcp',
|
||||
) or $rrthr=0;
|
||||
|
||||
if ($rrthr==0) {
|
||||
print "Keinen Server gefunden unter $peerhost:$peerport\n";
|
||||
#<STDIN>;
|
||||
return;
|
||||
}
|
||||
|
||||
#$socket->send("\n");
|
||||
#printf "[Connected to %s]\n", $socket->peerport;
|
||||
|
||||
while ( 1 ) {
|
||||
my $recv_data;
|
||||
if ($socket->peerport eq "") {
|
||||
$rrthr=0;
|
||||
#die "Verbindung zum Server verloren!\n";
|
||||
#return;
|
||||
print "Verbindung verloren\n";
|
||||
#<STDIN>;
|
||||
threads->exit();
|
||||
}
|
||||
$socket->send("GETDATA\n");
|
||||
$socket->recv($recv_data,4096);
|
||||
local $@;
|
||||
my $failed=not eval {
|
||||
%jdata = %{$JSONObject->decode($recv_data)};
|
||||
return 1;
|
||||
};
|
||||
if ($failed) {
|
||||
$gotdata=0;
|
||||
#$rrthr=0;
|
||||
#die "Malformed JSON\n";
|
||||
#return;
|
||||
print "Malformed JSON\n";
|
||||
#<STDIN>;
|
||||
#threads->exit();
|
||||
}
|
||||
$gotdata=1;
|
||||
sleep 1;
|
||||
}
|
||||
|
||||
}
|
||||
sub TransformJSON {
|
||||
foreach my $id (keys %jdata) {
|
||||
my @fields = split /\|/,$jdata{$id};
|
||||
#@arr=($a,$b,$c,$d);
|
||||
#push @{$hash2{$_}}=@arr;
|
||||
#$hash2{$_} = [$a, $b, $c ,$d];
|
||||
$data{$id} = [@fields];
|
||||
}
|
||||
}
|
||||
sub wrong_start {
|
||||
print "\n\n\t$_[0]\n\nAufruf:\n\nmcastrcv3 [<IP> <PORT>]\n\nOhne Angabe von IP und Port wird auf 0.0.0.0 11211 verbunden\n\n";
|
||||
exit;
|
||||
}
|
||||
Reference in New Issue
Block a user