hallo @all,
ich bräuchte da mal hilfe für eine checksummen berechnung in perl. ich bin
gerade dabei meine vaillant therme auszulesen. die verbindung steht, kann
senden und empfangen allerdings hänge ich gerade bei der umsetzung eine
checksumme zu berechnen.
das protokoll ist wie folgt aufgebaut (siehe auch [1]):
[zitat]
Bytes
1 2 3 ... n-1 n
+-----+-----+---- ---+-----+
| Len | ? | Data | Chk |
+-----+-----+---- ---+-----+
Byte 1 Gesamtlänge der Nachricht ("n" Bytes, Längenbyte, Nachrichtentyp und
Prüfsumme
sind dabei mitgezählt)
Byte 2 Sowas wie ein Nachrichtentyp:
0x00 Normale Nachrichten
0x01 Fehlermeldung Checksum-Fehler?
0x02 ? - Verwendet bei der Abfrage der Version des Heizgeräts
0x03 Fehlermeldung?
0x0a ? - Verwendet bei der Abfrage der Version des Reglers
0x80 Änderung von Parametern
Byte 3 Daten, beinhalten die eigentliche Anforderung an das Gerät, die
angeforderten
.. n-1 Werte, oder sonstige Informationen.
Byte n Prüfsumme
Zur Berechnung der Checksum werden die Bytes nacheinander XOR-verknüpft und
das Zwischenergebnis dann jeweils um 1 bit nach links verschoben
Beim Finden des Algorithmus waren kurze Nachrichten wie 03 03 05 und 03 01 07
nützlich. Es fiel dann aber auf, dass die Berechnung immer dann zu einem
anderen Ergebnis führt, wenn das Zwischenergebnis im Verlauf der Berechnung
größer als FFh (127) wird. In der Nachricht 07 00 00 00 98 05 CC ist dies erst
beim letzten Datenbyte der Fall. Von dort konnte man also zurückrechnen, was
man am Zwischenergebnis ändern muss, um letztendlich auf die gleiche Prüfsumme
zu kommen wie das Gerät. Diese Änderung ist genau ein XOR mit 18h.
[/zitat]
auf der seite ist zwar ein beispiel wie die checksumme berechnet wird,
allerdings bekomme ich die subroutine nicht auf meinen code gemappt:
sub checksum
{
my $string = $_[0];
my $checksum;
for (my $i = 0; $i < length($string); $i++)
{
if ($checksum & 0x80)
{
$checksum = ($checksum << 1 | 1) & 0xFF;
# ???
$checksum = $checksum ^ 0x18;
}
else
{
$checksum = $checksum << 1;
}
$checksum = $checksum ^ ord(substr($string, $i, 1));
}
return $checksum;
}
ich habe ein array in folgender form:
@cmd = (0x07,0x00,0x00,0x00,0x08,0x01);
und an dieses muss ich nun nach obigen vorgaben die checksumme dranhängen.
hier komme ich gerade nicht weiter.
hat jemand eine idee und kann mir auf die sprünge helfen?
gruß martin
[1]: https://dokucode.de/index.php/Vaillant_X6_Schnittstelle
--
Sie haben diese Nachricht erhalten, da Sie der Google Groups-Gruppe FHEM users beigetreten sind.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an fhem-users@googlegroups.com.
Wenn Sie aus dieser Gruppe austreten möchten, senden Sie eine E-Mail an fhem-users+unsubscribe@googlegroups.com.
Besuchen Sie die Gruppe unter http://groups.google.com/group/fhem-users?hl=de, um weitere Optionen zu erhalten.
Am Samstag 19 Februar 2011 schrieb Martin Fischer:
> [...]
>
> und an dieses muss ich nun nach obigen vorgaben die checksumme dranhängen.
> hier komme ich gerade nicht weiter.
>
> hat jemand eine idee und kann mir auf die sprünge helfen?
erledigt => konnt mir selber helfen :-)
--
Sie haben diese Nachricht erhalten, da Sie der Google Groups-Gruppe FHEM users beigetreten sind.
Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an fhem-users@googlegroups.com.
Wenn Sie aus dieser Gruppe austreten möchten, senden Sie eine E-Mail an fhem-users+unsubscribe@googlegroups.com.
Besuchen Sie die Gruppe unter http://groups.google.com/group/fhem-users?hl=de, um weitere Optionen zu erhalten.