Forum: Mikrocontroller und Digitale Elektronik Reverse engineering eines seriellen Protokolls


von Tobias P. (hubertus)


Lesenswert?

Ich will in einem Versuchsaufbau einen Kryokühler benutzen. Dieser wird 
von einem kleinen PC-Programm über eine RS-232 gesteuert. Man kann die 
Solltemperatur vorgeben und ein paar Messwerte abfragen, wie 
Ist-Temperatur oder man kann per Befehl den Kühler ein- und ausschalten.

Ich will jetzt aber mehrere Messungen miteinander kombinieren, d.h. bei 
verschiedenen Temperaturen werden ein paar andere Messwerte ermittelt, 
danach wird die Temperatur geändert usw. Da das ein Dauertest wird, muss 
das logischerweise automatisiert funktionieren. Das Auslesen aller 
Messwerte mit einem Pythonskript klappt, aber zum Kühler ist das 
Protokoll nicht offen und es gibt vom Hersteller keine API. Ich dachte 
mir jetzt, ob es einen Versuch wert wär, das selber zu entschlüsseln. 
Ich muss nur die Solltemperatur vorgeben können und den Kühler ein- und 
ausschalten. Um herauszufinden, wie das geht, habe ich einen seriellen 
Portsniffer installiert und logge die Kommunikation mit, wenn ich 
verschiedene Temperaturen vorgebe. Ein- und Ausschalten sollte nicht so 
schwer sein, aber über den Temperatursettings zerbreche ich mir grad den 
Kopf. Leider ist das Protokoll binär :-(

Hier ein Auszug aus der Kommunikation, wenn ein paar Temperaturen 
gesetzt werden:
1
Sollwert 10K
2
 30 06 00 49 E9 98
3
Sollwert 50K
4
 30 06 00 46 00 84
5
Sollwert 100K
6
 30 06 00 41 1E 6B
7
Sollwert 150K
8
 30 06 00 3B DB B4
9
Sollwert 200K
10
 30 06 00 36 16 7E

Ich sehe da im Moment keine Korrelation zwischen dem Sollwert und dem 
Paket, ausser dass alle mit 30 06 00 anfangen. Die hinteren 3 Bytes 
könnten noch eine Prüfsumme enthalten, das weiss man nicht. Wie könnte 
man vorgehen, wenn man dieses Protokoll analysieren will? Habt ihr eine 
Idee, wie man von der Temperatur auf die binären Werte kommen kann?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias P. schrieb:
> Wie könnte man vorgehen, wenn man dieses Protokoll analysieren will?
Man könnt die Hex-Werte mal aufaddieren, um zu sehen, ob dann im letzten 
Byte immer 00 herauskommt. Dann hätte man sichergestellt, dass da eine 
simple Zweierkomplement-Prüfsumme involviert ist. Und die würde ich dann 
mal im letzten Byte vermuten...

Und zudem nimmt der Wert der dann noch fraglichen beiden Bytes mit 
steigender Temperatur ab:
0x49E9 = 10K
0x4600 = 50K
0x411E = 100k
0x3BDB = 150K
0x3616 = 200K

: Bearbeitet durch Moderator
von lambda (Gast)


Lesenswert?

Was ist denn die Schrittweite für die Temperatureinstellung (1K, 0.1K, 
...)? Dann könntest du mal Temperaturen in dieser Schrittweite vorgeben. 
Also 100K, 101K, 102K. Damit sollte man leichter sehen können, an 
welcher Stelle der Daten sich was ändert und wieviel.

von honk (Gast)


Lesenswert?

Wieso interessiert Dich denn überhaupt die Berechnung?
Sniff einfach die gewünschten Werte einfach mit und schreib die in eine 
Tabelle. Dann gibst Du die einfach so aus und fertig ist die Laube.
Oder ändern sich die Pakete mit der Zeit?

von Thomas (Gast)


Lesenswert?

Als das letze Byte ist schon Mal eine checksum.
Die Byte Summe aller Bytes muss 0 sein. Das chkbyte somit chk = NOT 
chk+1

Thomas

von Tobias P. (hubertus)


Lesenswert?

Die Schrittweite habe ich grade zu ermitteln versucht. Die ist irgendwie 
arbiträr:
1
Sollwert 10K
2
 30 06 00 49 E9 98
3
10.1K
4
 30 06 00 49 E8 99
5
10.2K
6
 30 06 00 49 E8 99
7
10.21K
8
 30 06 00 49 E8 99
9
10.29K
10
 30 06 00 49 E5 9C
11
10.3K
12
 30 06 00 49 E3 9E

Irgendwie scheint es, als würde da noch gerundet. Die exakte 
Schrittweite lässt sich so leider nicht feststellen - wenn ich 10K, oder 
10.1K, oder 10.19K als Sollwert benutze, wird der selbe Code verwendet, 
hingegen bei 10.2K gibts einen Sprung.

honk schrieb:
> Wieso interessiert Dich denn überhaupt die Berechnung?
> Sniff einfach die gewünschten Werte einfach mit und schreib die in eine
> Tabelle. Dann gibst Du die einfach so aus und fertig ist die Laube.
> Oder ändern sich die Pakete mit der Zeit?

ja, werde ich als Notlösung so machen. Schöner wäre es, wenn man die 
Werte berechnen könnte :-)

Komisch ist auch, das ist mir auch schon aufgefallen, dass die letzten 
Bytes sich erniedrigen, wenn man die Temperatur erhöht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:
> 0x49E9 = 10K
> 0x4600 = 50K
> 0x411E = 100k
> 0x3BDB = 150K
> 0x3616 = 200K
Wenn man diese Werte mal in Excel eingibt, dann sieht man schon, dass da 
irgend eine nahezu lineare Funktion dahinter verstecken könnte.

Wird da auf dem PC auch geregelt? Das wäre eine Begründung für die 
Abweichungen von der Geraden. Oder werden da bei 100K immer statisch 
411E ausgegeben?

: Bearbeitet durch Moderator
von H. (Gast)


Lesenswert?

Lothar M. schrieb:
> nahezu lineare Funktion

Vielleicht passen die einfach zu den AD-Werten eines nicht ganz linearen 
Temperaturfühlers im Produkt.

von A. F. (artur-f) Benutzerseite


Lesenswert?

Tobias P. schrieb:
> Ich sehe da im Moment keine Korrelation zwischen dem Sollwert und dem
> Paket

Doch, da ist eine, die HEX Zahlen werden kleiner mit größeren Werten:
Sollwert 10K
49 E9 98
Sollwert 50K
46 00 84
Sollwert 100K
41 1E 6B
Sollwert 150K
3B DB B4
Sollwert 200K
36 16 7E

Wahrscheinlich spielen nur die ersten zwei Bytes eine Rolle.

von mmm (Gast)


Lesenswert?

Das letzte Byte ist einfach eine Prüfsumme
1
leztes_byte = 0x100 - (Summe_aller_vorherigen_Bytes & 0xFF)

von Tobias P. (hubertus)


Lesenswert?

Also das mit der Prüfsumme stimmt tatsächlich. Habe es grade 
verifiziert.
Ob auf dem PC geregelt wird, weiss ich nicht, es sieht mir aber nicht 
danach aus, denn obwohl der PC die Temperaturen zwar abfragen kann, 
sendet er den Sollwert z.B. 100K immer statisch die selbe Sequenz, und 
während der Kühler läuft, sieht man, dass auf dem PC auch nur die 
Messwerte eintreffen und mit ACK bestätigt werden. Insofern denke ich 
also, dass der Regler im Gerät selbst sitzt.

Gut, ich werd jetzt einfach eine Funktion bauen, welche diese 
gewünschten Werte ausgibt, und nicht weiter darüber nachdenken, wie die 
zustande kommt ;-) auf die Excel-Idee bin ich noch gar nicht gekommen, 
danke!

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias P. schrieb:
> Gut, ich werd jetzt einfach eine Funktion bauen, welche diese
> gewünschten Werte ausgibt, und nicht weiter darüber nachdenken, wie die
> zustande kommt ;-) auf die Excel-Idee bin ich noch gar nicht gekommen,
> danke!
De nada.
Excel kann dir übrigens auch gleich eine Funktion oder ein Polynom 
berechnen, das du dann nur noch herauskopieren und in dein Programm 
übernehmen musst...

von mmm (Gast)


Lesenswert?

Die Funtkion wäre dann ungefähr so:
1
wert = 19170 - 25 * temperatur

von A-Freak (Gast)


Lesenswert?

Unter der Annahme daß das dritt- und zweitletzte Byte den Wert codieren 
komme ich auf 25 bis 27 Schritte je Kelvin, scheint eine leicht 
gekrümmte Kurve zu sein.

Evtl. wird vom PC berechnet welche Thermospannung ein Thermoelement bei 
der eingestellten Temperatur liefern müßte.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A-Freak schrieb:
> scheint eine leicht gekrümmte Kurve zu sein.
Dann wäre es am einfachsten, vom niedrigsten Wert beginnend alle 10K den 
Wert zu ermitteln, in einer Tabelle abzulegen und dazwischen zu 
interpolieren.

von Tobias P. (hubertus)


Lesenswert?

Hi,
also es scheint in der Tat so zu sein, dass der Wert des zweit- und 
drittletzten Bytes nach

x = -26.7*Sollwert + 18921

berechnet wird. Das letzte Byte ist die Prüfsumme welche die Summe aller 
vorhergehenden Bytes ist, invertiert und 1 addiert, wie mmm bereits 
gesagt hat (wie kommt man darauf?).

Die Befehle zum Starten und Stoppen des Kühlers habe ich jetzt auch, 
habe mti hTerm die entsprechenden Binärsequenzen gesendet und konnte den 
Kühler beim Starten und Stoppen beobachten ;-) Bei der Temperatur bin 
ich mir noch nicht ganz sicher, weil da so komische Sprünge in den 
Hex-Werten sind.

Auch das Auswerten der Housekeeping-Daten, welche der Kühler zum PC 
sendet, steht noch aus. Da stehen unter anderem der Fehlerstatus und die 
Isttemperatur drin - zwei Grössen, die u.U. noch nützlich sein könnten 
;-)

bei laufendem Kühler und einer Isttemperatur von 200K erhält man das 
Telegramm
1
13 15 01 53 0A 45 00 0D 36 16 03 9C 00 06 00 04 64 01 00 00 68

vom Kühler. 200K würde gemäss der oben erwähnten Umrechnung dem Hex-Wert 
36 16 entsprechen - unter der Annahme, dass der Programmierer nicht zwei 
verschiedene Umrechnungen verwendet hat für die Soll- und die 
Isttemperatur. Und Bingo, den Wert 36 16 findet man im Statustelegramm, 
also ist die Temperatur schon mal identifiziert. Herauszufinden, wo das 
Statusflag und so weiter ist, wird schon schwieriger.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias P. schrieb:
> Das letzte Byte ist die Prüfsumme welche die Summe aller vorhergehenden
> Bytes ist, invertiert und 1 addiert,
Ja, eben das bekannte "Zweierkomplement".

> (wie kommt man darauf?).
Man probiert einfach die einfachste Form der Prüfsumme. Dazu ist es 
hilfreich selber ein paar solche Prüfsummenverfahren zu kennen. Die 
Kurzform davon heißt in etwa "Erfahrung"...  ;-)

> Herauszufinden, wo das Statusflag und so weiter ist, wird schon
> schwieriger.
Du brauchst eben Telegramme, wo sich von jetzt auf nachher nur das eine 
Flag im unbekannten Telegrammbereich ändert.

: Bearbeitet durch Moderator
von Tobias P. (hubertus)


Lesenswert?

Lothar M. schrieb:
> Du brauchst eben Telegramme, wo sich von jetzt auf nachher nur das eine
> Flag im unbekannten Telegrammbereich ändert.

das ist klar. Nur habe ich auf die Statustelegramme leider überhaupt 
keinen Einfluss - z.B. selbst bei der Temperatur wackelt da immer was um 
+/-1 Count :-/

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias P. schrieb:
> das ist klar. Nur habe ich auf die Statustelegramme leider überhaupt
> keinen Einfluss - z.B. selbst bei der Temperatur wackelt da immer was um
> +/-1 Count :-/
Ja, da musst du jetzt Bit für Bit herauskorrelieren: ändere etwas, auf 
das du Einfluss hast und lokalisiere, wo die Änderung sich auswirkt.

von Thomas (Gast)


Lesenswert?

Tobias P. schrieb:
> bei laufendem Kühler und einer Isttemperatur von 200K erhält man das
> Telegramm13 15 01 53 0A 45 00 0D 36 16 03 9C 00 06 00 04 64 01 00 00 68

Nun da findet sich ja schon wieder 06 00 <Temperatur>  01 00 00 könnte 
der Status sein oder ein Telegramm Ende Marker.

Thomas

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.