Hauptmenü

HEX 2 TXT

Begonnen von satprofi, 31 Dezember 2020, 12:04:22

Vorheriges Thema - Nächstes Thema

satprofi

Hallo.
Ich habe hier ein Modul, wo ich HEX direkt in Text umwandeln will.
HEX in decimal klappt z.b. mit hex(substr($res,15,4))
wie schaffe ich es jetzt mit einfachen befehl die HEX Combi 50505442483032323039423036313139 in Text umzuwandeln
Oder muss ich jedes Byte extrahieren/umwandeln und dann zusammenfügen?

LG
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

rudolfkoenig


satprofi

Yessss !! DANKEEE!!!!
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

fireball

Hey.. ich habe ein ähnliches Problem... ich versuche gerade meine Danfoss AirUnit mit einem FHEM Modul zu beglücken... aber ich versuche erstmal die Kommunikation per Perlscript.

Die TCP Verbindung kann ich aufbauen. Request und Response gehen quasi. Das ist ja wirklich nicht schwer in Perl... aber was man sendet und empfangen will ist schon ne Herausforderung. Ich kann zwar lesen was wie wo passiert aber weder Java noch Perl kann ich programmieren... also Try&Error und Lesen und c+p.

Das ich mit pack & unpack arbeiten muss habe ich auch schon rausgefunden... ich versteh das aber alles nicht.

hier gibts schon alles fertig als OpenHab Modul in Java...
https://github.com/leaxidd/openhab2-addons/blob/DanfossHRV/addons/binding/org.openhab.binding.danfossairunit/src/main/java/org/openhab/binding/danfossairunit/handler/DanfossAirUnit.java

Hier steht wie die Anlage arbeitet...
ZitatUsually a 4 byte code has to be send to tell what you like to read. This also includes the statistics.

I have an Excel at home with the investigations which bytes to send for which information and how to interprete the result (i.e. temperatures are returned as 2 byte Integers but with 2 decimals, i.e. 0x0998 = 2456 -> 24,56°C., humidity is a one byte integer).

Aus dem Javaprogramm weiß ich, das diese 4 Bytes gesendet werden müssen und als Antwort kommt dann für Feuchtigkeit 1 Byte integer.
private static final byte[] REGISTER_1_READ = { 0x01, 0x04 }; 
private static final byte[] HUMIDITY = { 0x14, 0x70 };


Im Java wird ein Bytearray gesendet, aber den gibts in PERL wohl nicht...
Ich hatte erst
my @request = (hex(0x01),hex(0x04),hex(0x14),hex(0x12)); => Dann sind die Zahlen lesebar oder sende ich sie als HEX?
$socket->send(@request);

Ich bekomme aber als Antwort immer ein "," zumindest wenn ich die Antwort printe.

Zurück bekomme ich laut Wireshark immer 63 Bytes... siehe Bild... Davon müsste ich dann ja eigentlich mit substring das erste byte rausnehmen und mit unpack/pack in dezimal umwandeln...

Oder?!

Kann mir jemand helfen?! Gibts keinen JAVA2Perl Konverter?! :P

VG
René

rudolfkoenig

ZitatDie TCP Verbindung kann ich aufbauen. Request und Response gehen quasi. Das ist ja wirklich nicht schwer in Perl...
Hoffentlich HttpUtils_NonblockingGet verwendet, um eine FHEM-Blockierung zu vermeiden.

ZitatIm Java wird ein Bytearray gesendet, aber den gibts in PERL wohl nicht...
Mag sein, ist aber nicht sehr aufwendig ein ByteArray zu einem String zu wandeln:
fhem> { pack("C*",70,72,69,77) }
FHEM
fhem> { join("", map {pack("C",$_)} (70,72,69,77) ) }
FHEM


ZitatDavon müsste ich dann ja eigentlich mit substring das erste byte rausnehmen und mit unpack/pack in dezimal umwandeln...
fhem> { unpack("C","FHEM") }
70



Siehe auch https://perldoc.perl.org/perlpacktut

fireball

Hi Rudolf,

danke für dein Feedback... ich versteh pack und unpack immernoch nicht...

ob ich
$request = pack("UUUU", 0x01, 0x04, 0x14, 0x70); 
oder
$request = pack("UUUU", 1, 4, 20, 112);

Das Ziel ist das gleiche.... ich dachte pack erzeugt einen String und in der ersten Option sage ich was ich für Daten danach habe... aber ob HEX oder Dezimal... bei U klappt der rest des Codes... :o ???
Ich dachte beim ersten sag ich. zb "HHHH" und beim zweiten "BBBB"... keine Ahnung...

Und das Unpack... da habe ich auch mit U aus dem Z eine 90 gemacht... ??? Warum?

Da ich mit dem PC Tool schauen kann, seh ich das meine Rechnung richtig ist...


package main;

use strict;
use warnings;
use IO::Socket;


my $remote_host = "192.168.178.9";
my $remote_port = 30046;
my $request;
my $response;
my $humidity;

# creating object interface of IO::Socket::INET modules which internally creates
# socket, binds and connects to the TCP server running on the specific port.
my  $socket = IO::Socket::INET ->new(
PeerAddr => $remote_host ,
PeerPort => $remote_port ,
Proto      => "tcp",
Type      => SOCK_STREAM)
or die "Couldn 't connect  to  $remote_host:$remote_port : $@\n";

# flush after every write
  if (!$socket) {
# fhem      AirUnit_Log $name, 1, "Could not open connection to host $host:$port";
      return (0, "Can't connect to $remote_host:$remote_port");
  }
  $socket->autoflush(1);

print "TCP Connection Success.\n";

$request = pack("UUUU", 0x01, 0x04, 0x14, 0x70); 
print  "packed Data to Server : $request\n";

# send the data through IO::Socket::INET module
$socket->send($request);

# read from socket through recv() in IO::Socket::INET
$socket->recv($response,63);

print "Received from Server: , $response\n";
print "Received Substringlength from Server: ", length($response)."\n";
print "Received Substring from Server: ", substr($response,0,2)."\n";
print "Received from Server unpacked: ", unpack("U", substr($response,0,2))."\n";

$humidity = unpack("U", substr($response,0,2)) * 100 / 255;

print "Received from Server: $humidity\n";

sleep (1);
$socket->close();


### Temperatur    private static final byte[] REGISTER_1_READ = { 0x01, 0x04 };   private static final byte[] HUMIDITY = { 0x14, 0x70 };


ABER ICH HABE ES HINBEKOMMEN!!!!
c:\Program Files\Perl64\bin>perl.exe D:\Downloads\socket.pl
TCP Connection Success.
packed Data to Server : ☺♦¶p
Received from Server: , Z
Received Substringlength from Server: 63
Received Substring from Server: Z
Received from Server unpacked: 90
Received from Server: 35.2941176470588



Was meinst du mit HttpUtils_NonblockingGet? Ich bin noch nicht in FHEM, ich bin noch im Perlscript und versuche jetzt erstmal allen JAVA-Code in Perl zu bekommen und alles Werte zu lesen... danach bekomme ich das hoffentlich an die richtigen Stellen in einem FHEM Modul.

Puhhh es verschlingt Zeit, es macht Spass, aber für PERL sind nicht grad viele Tutorial da...

PS: Sehe grad $request = pack("U*", 0x01, 0x04, 0x14, 0x70); geht auch...

rudolfkoenig

#6
Zitatich dachte pack erzeugt einen String
ja, wobei "Speicherstueck" ist allgemein gueltiger.

Zitatund in der ersten Option sage ich was ich für Daten danach habe
Nein, man sagt, wie die Daten im "Speicherstueck" verpackt werden sollen.
Wobei ich den Sinn von U (Unicode character) in diesem Fall nicht sehe, du willst ja schliesslich nicht anfangen aus einem Byte mehrere zu machen.

ZitatWas meinst du mit HttpUtils_NonblockingGet
Das ist eine FHEM-Framework Funktion, was sicherstellt dass FHEM nicht blockiert. Die "plain-perl" Beispiele blockieren (vulgo warten), wenn z.Bsp. der hostname nicht aufgeloest werden kann, oder die andere Seite nicht erreichbar ist oder nicht antwortet, oder etwas laenger fuer die Antwort braucht. Waehrend dieser Zeit steht das ganze FHEM-Apparat, es wird weder was vom Frontend (HTTP/telnet/etc) bearbeitet, noch Daten von Geraeten empfangen oder gesendet, auch die Timer werden erst danach ausgefuehrt.

Zitataber für PERL sind nicht grad viele Tutorial da...
Sehe ich anders, vmtl. suchst Du noch nicht richtig.
Selbst in der FHEM-Wiki gibts Einiges, z.Bsp: https://wiki.fhem.de/wiki/HttpUtils#HttpUtils_NonblockingGet

Nachtrag: die Bemerkung in der Wiki, dass DNS-Abfragen HttpUtils_NonblockingGet blockieren, gilt nicht(!), wenn man "attr global dnsServer" gesetzt hat.