Problem beim Senden an Clientsocket

Hi ich habe ein Problem beim Senden aus einer StringVariable:

In der StringVariable steht : 0020FF

Ich verarbeite das dann so:

$wert=getvalue(28213 /*[RGB Modul Test\RGBManuellFarbWert]*/ );

$wert1 = substr ($wert, 0, 2);
$wert2 = substr ($wert, 2, 2);
$wert3 = substr ($wert, 4, 2);


$wert0='\x56';
$wert1="\x$wert1";
$wert2="\x$wert2";
$wert3="\x$wert3";
$wert4='\xaa';

$wert5="$wert0$wert1$wert2$wert3$wert4";
$wert5= substr ($wert5, 0, 20);

Wenn ich das aber sende :

CSCK_SendText(49009 /*[RGB Led]*/  , $wert5);

Kommt im debug bei clientsockel das raus : \x56\x00\x20\xFF\xaa

Wenn ich so sende :

CSCK_SendText(49009 /*[RGB Led]*/  , "\x56\x00\x20\xFF\xaa");

Dann kommt das bei debug raus : V

So soll das auch sein !

Ich verstehe nicht warum, wenn es der Stringvariable kommt, es im klartext gesendet wird ?

Das ist normal, du musst in dem String zum Socket zeichen senden welche deinem Zahlenwert entsprechen.
Z.b. chr(16) bzw chr(0x0F).
Und im Debug immer Hex unten auswählen, sonst suchst du dich tot bei der Entwicklung/Fehlersuche
Michael

Danke für deine Antwort, aber ich verstehe nicht so ganz wie ich das machen soll.

Kannst du mir ein Beispiel schreiben ?

Hier mal etwas, nicht besonders schön, da ich es vor 1,5Jahren zusammengeschuster habe um meine MS35 RGB Controller anzusprechen. Aber es sollte dir etwas helfen:

Hex senden:


// Controller init
// 10 mal FD senden, dann 6 mal 00, danach CF und 2C senden
$data = chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0xFD).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0xCF).chr(0x2C);

Zerlegen und wandeln von ~Hexcolor(int) bzw. String mit 3 Hex-Zahlen in Klarschrift


$color = rgbtohex(GetValueFormatted($_IPS['VARIABLE']));
// $c = String  (Farbe in Hexwerten im String '0F0C24')
// return = Array mit den feldern 1,2,3 und red,green,blue
function rgbtohex ($c)
{
         $out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0,2)); //hexdec wandelt einen Hex-String in einen Zahlenwert (integer)
         $out[1] = $out['g'] = $out['green'] = hexdec(substr($c,2,2));
         $out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 4,2));
         return $out;
}

Sende von umgewandelten und zerlegten Werten:


	$data= chr(01).chr(00).chr($color['red']).chr($color['green']).chr($color['blue']).chr(00).chr(00);

Solange dein String nicht mehr als 3 Hex-Werte hat, kannst du einfach mit $color = rgbtohex(GetValueString(12345)) arbeiten.

Sonst wieder mit Substr zerlegen und mit hexdec umwandeln.

Bei größeren Datenmengen als String mit Hex-Zeichen wäre aber eine Schleife praktischer.


   for ($x=0; $x < strlen($value); $x+=2)
   {
       $sende .= chr(hexdec(substr($value,$x,2)));
    }

Michael

Wenn ich es so sende geht es ja

Wie so gesendet?

Verstehe die Aussage jetzt gerade nicht.

„\x56\x00\x20\xFF\xaa“ rechnet PHP schon intern für dich um in einen String welche Bytes mit diesen Werten enthält.
Hier dann 5 Zeichen = 5 Byte. PHP-Man:
(\x[0-9A-Fa-f]{1,2} the sequence of characters matching the regular expression is a character in hexadecimal notation )

Du kannst nicht einfach einen String mit \x56 befüllen und den versenden.
Weil dann der String die Bytes für die Zeichen \ x 5 6 enthält (4 Byte) und nicht das eine Byte mit der Wertigkeit 0x56.

Darum chr(0x56), welcher ein Zeichen (also 1 Byte) zurückgibt welches die Wertigkeit 0x56 hat.

Michael

ich danke dir so sehr !!!

Ich habe es hinbekommen :

<?
$wert=getvalue(28213 /*[RGB Modul Test\RGBManuellFarbWert]*/ );

$wert1 = substr ($wert, 0, 2);
$wert2 = substr ($wert, 2, 2);
$wert3 = substr ($wert, 4, 2);

$wert1="0x$wert1";
$wert2="0x$wert2";
$wert3="0x$wert3";


$wert0=chr(0x56);
$wert1=chr($wert1);
$wert2=chr($wert2);
$wert3=chr($wert3);
$wert4=chr(0xaa);

$wert5="$wert0$wert1$wert2$wert3$wert4";

CSCK_SendText(49009 /*[RGB Led]*/  , $wert5);
?>

Warum machst du das denn, und nimmst nicht hexdec ?

Hat das einen Grund warum du eine Stringvar für den RGB hast, und keine IntVar mit ~hexcolor Profil ?
Michael

getapatalkt -> Schreibfehler und Zeilenumbrüche sind optional.

Das ist einfach zu erklären, ich habe das Script von hier

genommen als Basis habe alle Chromoflex Befehle rausgenommen.

So habe ich in 5min angepasst und über die Stringvariable war es für mich am einfachsten :wink:

Verstehe. Da ist die RGB Variable aber auf eine Int mit ~hexcolor, zumindest was ich überflogen habe. :confused:
Michael