Forum: PC-Programmierung Perl - raw bytes via udp


von Marcus S. (Gast)


Lesenswert?

Hallo,

in einem Perl Script sollen UDP frames erzeugt bzw. gesendet werden, 
welche XY Koordinaten und Farbwerte RGB ( je ein byte) enthalten.

Angenommen der Server erzeugt folgende Werte für einen "Pixel"

X-Koordinate= Pixel 8   (HEX:08)
Y-Koordinate= Pixel 2   (HEX:02)

(Farbe:violett)
Rotwert=  160   (HEX:A0)
Grünwert= 32    (HEX:20)
Blauwert= 240   (HEX:F0)

Nnun sollen die Daten exakt wie folgt formatiert - versendet werden
"0802A020F0"

Hierfür habe ich folgendes Perl-Script geschrieben.
1
#!/usr/bin/perl
2
3
use strict;
4
use warnings;
5
6
use IO::Socket;
7
my $xval=00;
8
my $yval=00;
9
my $rval=00;
10
my $gval=00;
11
my $bval=00;
12
13
14
my $bulb_sock = IO::Socket::INET->new(
15
    Proto    => 'udp',
16
    PeerPort => 8888,
17
    PeerAddr => '192.168.3.23',
18
) or die "Could not create socket: $!\n";
19
for( ; ; )
20
{
21
22
23
#Generate Random XY Coordinates within possible range and convert to HEX
24
$xval = int(rand(9));   $xval = sprintf("%02x",$xval);
25
$yval = int(rand(23));  $yval = sprintf("%02x",$yval);
26
27
#Generate Random RGB Values within possible range for additive color mixing and convert to HEX
28
$rval = int(rand(255)); $rval = sprintf("%02x",$rval);
29
$gval = int(rand(255)); $gval = sprintf("%02x",$gval);
30
$bval = int(rand(255)); $bval = sprintf("%02x",$bval);
31
32
#send data via UDP
33
$bulb_sock->send("$xval"."$yval"."$rval"."$gval"."$bval") or die "Send Error: $!\n";
34
}

Anders als erartet, sendet dieses jedoch für oben genannte XYZRGB Werte:
"30383032613032306630"
und nicht:
"0802A020F0"


Wo ist das Problem ?
Danke !

von Peter II (Gast)


Lesenswert?

Marcus Wiech schrieb:
> "30383032613032306630"
> und nicht:
> "0802A020F0"

30 == '0'
38 == '8'
30 == '0'
32 == '2'

scheinst als ob du ASCII sendest.

von Peter II (Gast)


Lesenswert?

nachtrag:

"%02x",

das erzeugt du ja extra Text.

gibt es kein Byte Array in Perl?

von Marcus S. (Gast)


Lesenswert?

Peter II schrieb:
> nachtrag:
>
> "%02x",
>
> das erzeugt du ja extra Text.
>

Stimmt.  Das sprintf Text erzeugt und nicht meine HEX Werte erklärt 
dieses verhalten. Das hatte ich so nicht bedacht. Allerdings "benötige" 
ich sprintf um die integer werte in HEX zu konvertieren.

Kann ich mit sprintf HEX anstatt ASCII ausgeben ? ?

von Marcus S. (Gast)


Lesenswert?

nachtrag:
1
$bulb_sock->send("\x08\x02\xA0\x20\xF0") or die "Send Error: $!\n";
funktioniert.
1
$bulb_sock->send("\x$xval"."\x$yval"."\x$rval"."\x$gval"."\x$bval") or die "Send Error: $!\n";
hingegen nicht und bringt mir
1
Illegal hexadecimal digit '$' ignored at ledtest.pl line 27.

von Peter II (Gast)


Lesenswert?

Marcus Wiech schrieb:
> hingegen nicht und bringt mirIllegal hexadecimal digit '$' ignored at
> ledtest.pl line 27.

was auch klar ist. so geht es nicht.

Suche mal bei Google

"send Byte Array udp perl"

scheint nicht ganz einfach zu sein.

von Marcus S. (Gast)


Lesenswert?

Was wäre denn eine "einfache" lösung für diese Aufgabenstellung?

natürlich könnte man jetzt mit C anstatt mit Perl an die Sache 
herangehen. Das wäre aber mit ner Schrotflinte auf Spatzen geschossen 
...

von Peter II (Gast)


Lesenswert?

Marcus Wiech schrieb:
> natürlich könnte man jetzt mit C anstatt mit Perl an die Sache
> herangehen. Das wäre aber mit ner Schrotflinte auf Spatzen geschossen

naja für UDP ist es nicht viel mehr Code als in perl.

von Jay W. (jayway)


Lesenswert?

Probier mal:
1
$bulb_sock->send(chr(hex($xval)).chr(hex($yval)).chr(hex($rval)).chr(hex($gval)).chr(hex($bval)));

Alternativ mußt du die Variablen "pack"en. --> perldoc perlpacktut

von John Holmes der Dritte (Gast)


Lesenswert?

Marcus Wiech schrieb:
> Wo ist das Problem ?
Du kennst pack/unpack nicht.
http://perldoc.perl.org/perlpacktut.html

von Marcus S. (Gast)


Lesenswert?

Jay W. schrieb:
> Probier mal:
> $bulb_sock->send(chr(hex($xval)).chr(hex($yval)).chr(hex($rval)).chr(hex 
($gval)).chr(hex($bval)));


Funktioniert --> Problem gelöst

 Danke!

von Jay W. (jayway)


Lesenswert?

Naja, es ist ein klassischer Würgaround, der für diese überschaubare 
Aufgabe dein Problem löst. Schau dir wirklich mal das 
pack/unpack-Tutorial an, damit es bei komplexeren Geschichten nicht laut 
knallt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.