1-Byte Prüfsumme entschlüsseln

OP #5160608
Lesenswert?

Hallo Forum,

ich bin gerade dabei, eine WLAN-Steuerung für meinen Rasenmäh-Roboter zu 
entwickeln, der sich standardmäßig nur per Bluetooth und einer App 
ansteuern lässt. Da der BT-Empfänger zum Glück seine Daten über eine 
serielle Schnittstelle an das Mainboard des Roboters überträgt, konnte 
ich mich mit einem seriellen Snifferkabel dazwischen hängen und die 
übertragenen Daten mitschneiden.
Bei der Entschlüsselung der einzelnen Datenfelder bin ich auch schon 
relativ weit gekommen, jedoch fehlt mir für das Rückspielen die 
Berechnungsgrundlage der Prüfsumme. Ein direktes Rückspielen der Befehle 
geht nicht, weil immer auch ein Counter für die Zuordnung von Anfrage 
und Antwort mitgesendet wird, der dann natürlich auch die Prüfsumme 
ändert.

Hier ein kleiner Mitschnitt, bei dem sich jeweils nur ein Byte verändert 
hat, aber die Prüfsumme trotzdem sehr stark variiert:
1
02 1c 83 00 00 00 00 00 00 00 00 21 03 
2
02 1d 83 00 00 00 00 00 00 00 00 ef 03 
3
02 1e 83 00 00 00 00 00 00 00 00 a4 03 
4
02 1f 83 00 00 00 00 00 00 00 00 6a 03 
5
02 20 83 00 00 00 00 00 00 00 00 c0 03 
6
02 21 83 00 00 00 00 00 00 00 00 0e 03 
7
02 22 83 00 00 00 00 00 00 00 00 45 03
8
02 23 83 00 00 00 00 00 00 00 00 8b 03
9

10
02 04 83 ff d1 03
11
02 05 83 ff 7a 03 
12
02 06 83 ff 9e 03 
13
02 07 83 ff 35 03 
14
02 08 83 ff 6a 03 
15
02 09 83 ff c1 03 
16
02 0a 83 ff 25 03 
17
02 0c 83 ff f4 03 
18
02 0d 83 ff 5f 03 
19
02 0e 83 ff bb 03 
20
02 0f 83 ff 10 03 
21
02 10 83 ff 05 03 
22
02 11 83 ff ae 03 
23
02 12 83 ff 4a 03 
24
02 13 83 ff e1 03 
25
02 14 83 ff 9b 03 
26
02 15 83 ff 30 03

Kurze Erläuterung der Felder:
1. Byte: Startflag, ist immer 02
2. Byte: Counter, jeweils bei einer Anfrage und Antwort immer gleich
3.-vorletztes Byte: Daten
vorletztes Byte: Prüfsumme, bei gleichen Datenpaketen bleibt diese 
gleich, also kein Timecode o.ä. mit integriert
letztes Byte: Endflag, immer 03

Folgendes habe ich schon ausprobiert (jeweils mit und ohne Start-, End- 
und Prüfsummenbyte):
- Aufsummieren (inkl. modulo 256)
- XOR

Für CRC8 fehlt mir der Ansatzpunkt, weil Polynomdivision bei mir über 20 
Jahre her ist und die diversen Wikipedia-Seiten dazu sind mir leider zu 
hoch. Wenn also einer von Euch mir da einen Tipp geben kann oder 
vielleicht auf den ersten Blick sieht, welcher Algorhythmus dahinter 
steckt, gibt es vielleicht eine Implementation, die ich nutzen kann. 
Ansonsten wäre es schade um das Projekt, weil ich ohne 
Prüfsummenberechnung nicht weiterkomme...

Danke Euch schon mal im Voraus und viele Grüße


F.

--

mit den [ pre ] [ /pre ] - Tags wirds lesbarer.
-rufus
OP #5160862
Lesenswert?

...und mir fällt gerade auf, dass der Hinweis von Matthias eine weitere 
Frage gleich mit erklärt: Der Counter in Byte 2 wird nämlich zu 1b 22 
bzw. 1b 23, wenn es eigentlich eine 0x02 oder 0x03 wäre, werden also 
ESCaped (seltsam nur, dass der Wert dann um 0x20 erhöht wird). Das wäre 
mir sonst wohl durchgerutscht...

Gruß,

F.

P.S.: Danke für's formatieren, Rufus
OP #5160965
Lesenswert?

Ja, das mit den Steuerzeichen sit klar, ich dachte nur, dass dafür dann 
ja das ESCapen gemacht wird. Andere Werte unter 0x20 werden ja auch ohne 
Transformation übertragen. Ich hätte dann ja gleich 0x30 addiert, damit 
man wenigstens die ASCII-Repräsentation von 2 bzw. 3 im Hinterkopf hat 
;)...
OP #5160991
Lesenswert?

Eine iOS-App reverse engineeren? Habe ich noch nie gemacht, aber
ich muss ja gar nicht raten - einmal alle Funktionen auf der App 
aufgerufen, Daten mitgeschnitten, fertig. Das einzige, wo ich "raten" 
musste, war der CRC. Aber dank der Hilfe hier hat sich das ja auch 
schnell klären lassen.
Gast #5161430
Lesenswert?

Frederik H. schrieb:
> Der Counter in Byte 2 wird nämlich zu 1b 22
> bzw. 1b 23, wenn es eigentlich eine 0x02 oder 0x03 wäre, werden also
> ESCaped (seltsam nur, dass der Wert dann um 0x20 erhöht wird).

Und was ist, wenn der Counter 1b wird? Oder die Checksum 03 oder 
vielleicht auch sogar 02?
#5161507
Lesenswert?

Frederik H. schrieb:
> Checksumme 02 bzw. 03 wird auch mit 1b 22/23 ESCaped. Counter 1b wird zu
> 1b 3b (seltsam, dass hier dann nicht analog auch 2b genommen wird).

0x1B hat in ASCII die Bedeutung ESCape, also "jetzt kommt ein anderer 
Code".
Und dieser ist in dem Fall imm genau ein Zeichen lang und ergibt sich 
durch Addition von 0x20. Nur STX/ETX/ESC (0x02/0x03/0x1B) müssen so 
behandelt werden. Alles wohlgeordnet. Obwohl, man hätte die Zeichen nach 
dem ESC auch einfach unverändert senden können.
OP #5161556
Lesenswert?

Interessant, diese Erhöhung um 0x20 ist also Standard? Aber warum erhöht 
man, wenn schon 1b davor steht? Denn alleine würde man z.B. eine 0x22 ja 
nicht als escapte 0x02 oder als reguläre 0x22 erkennen können. Aber 
zumindest ist die Anwendung hier konsequent, und ich kann immer 0x20 
abziehen.

EDIT: Für die Programmierung ist es natürlich einfach(er) zu wissen, 
dass eine 0x02 immer Start und 0x03 immer Ende einer Übertragung ist, 
ohne schauen zu müssen, ob vorher eine Escape-Sequenz stand. So kann man 
erst einmal einfach das Telegramm als Ganzes abgrenzen und dann die 
Escape-Sequenzen behandeln...
#5161605
Lesenswert?

Frederik H. schrieb:
> Interessant, diese Erhöhung um 0x20 ist also Standard? Aber warum erhöht
> man, wenn schon 1b davor steht? Denn alleine würde man z.B. eine 0x22 ja
> nicht als escapte 0x02 oder als reguläre 0x22 erkennen können. Aber
> zumindest ist die Anwendung hier konsequent, und ich kann immer 0x20
> abziehen.
Es ist kein "Standard", es ist nur so implementiert.
Es ist aber auch kein Rätsel, warum 0x1B zu 0x3B wird.

Und als Grund dafür klingt plausibel:
> EDIT: Für die Programmierung ist es natürlich einfach(er) zu wissen,
> dass eine 0x02 immer Start und 0x03 immer Ende einer Übertragung ist,
> ohne schauen zu müssen, ob vorher eine Escape-Sequenz stand. So kann man
> erst einmal einfach das Telegramm als Ganzes abgrenzen und dann die
> Escape-Sequenzen behandeln...
Bingo!

Nun ist nur noch interessant, ob die Prüfsumme vor oder nach dem ESCapen 
der Daten gebildet wird. Vermutlich bevor, denn dann implementiert man
1. Telegramm ist 0x02...0x03
2. ESC folgt tatsächliches Zeichen + 0x20
3. CRC wird über Rohdaten gebildet/geprüft

Da du offenbar Telegramme für alle Möglichen Fälle hast, kannst das ja 
einfach nachprüfen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren