Problem mit der Paritätsberechnung

7

Ich habe in letzter Zeit einiges an Heimwerkerautomation (RF; 433 MHz) für viele verschiedene Geräte durchgeführt - was für alle außer einem gut funktioniert hat. Es ist im Grunde ein Poolroboter mit einer wirklich beschissenen Fernbedienung.

Ich habe einige Daten mit einem BladeRF SDR und GNU Radio gesammelt. Die Spalte "andere 3" ist im Grunde die Aktion, während "andere 1" seriell zu sein scheint und "andere 2" den Roboter definiert, wenn Sie mehrere verwenden, denke ich (ein Freund von mir, der den gleichen hat, hat einen anderen Wert Dort). Ich bin mir nicht sicher, welchen Zweck die Zählung hat, aber ich würde vermuten, dass der Roboter weiß, wann die Reichweite irgendwann zu groß wird (fehlen einige Informationen?). Ich habe die Bytes und ihre Bedeutung eingegrenzt, kann jedoch die korrekte CRC (Prüfsumme) für die Daten nicht berechnen.

ALT - BITTE SIEHE UPDATE UNTEN !!

Hier einige Beispieldaten:

<other1                  > <other2> <other3> <count > <crc   >      
10110100 00111110 10001111 11001000 00000001 11110111 01011110
10110100 00111110 10001111 11001000 00000001 11111000 01010011
10110100 00111110 10001111 11001000 00000001 11111001 01010100
10110100 00111110 10001111 11001000 00000001 11111010 01010001
10110100 00111110 10001111 11001000 00000001 11111011 01010010
10110100 00111110 10001111 11001000 00000001 11111100 01010111
10110100 00111110 10001111 11001000 00000001 11111101 01011000
10110100 00111110 10001111 11001000 00000001 11111110 01010101
10110100 00111110 10001111 11001000 00000001 11111111 01010110
10110100 00111110 10001111 11001000 00000001 00000000 01100111
10110100 00111110 10001111 11001000 00000001 00000001 01101000
10110100 00111110 10001111 11001000 00000001 00000010 01100101
10110100 00111110 10001111 11001000 00000001 00000011 01100110
10110100 00111110 10001111 11001000 00000001 00000101 01100100
10110100 00111110 10001111 11001000 00000001 00000111 01100010
added data:
10110100 00111110 10001111 11001000 00000010 00000110 01100100
10110100 00111110 10001111 11101010 00000010 01100101 10011010
10110100 00111110 10001111 11101010 00000001 01100100 10011100
10110100 00111110 10001111 11101010 00000001 01100011 10011101
10110100 00111110 10001111 11101010 00000001 01100110 10011010

Es gibt eine Anzahl für jede Anforderung, die geändert werden muss, und einige zu sendende Befehle, z. B. könnte die Spalte "andere 3" 00000010 anstelle von 00000001 lauten.

Es wäre sehr hilfreich, wenn mir jemand einen Hinweis geben könnte, wo ich nachsehen soll. Ich habe verschiedene Techniken wie XOR über die Bytes hinweg ausprobiert oder Modulo usw. berechnet. Ich habe sogar verschiedene Brute-Force-Tools für CRC-Algorithmen ausprobiert - leider noch ohne Erfolg.

BEARBEITEN: Ich habe die Daten in Excel gestellt und einige Funktionen hinzugefügt (im Grunde werden alle 4 Bits mit denen von oben verglichen - der letzten Übertragung). Ich habe das getan, als ich erkannte, dass der CRC einmal gleich geblieben ist. Dies war der Fall, als sowohl Aktion als auch Anzahl um 1 erhöht wurden. Bitte schauen Sie:

Daten

AKTUALISIEREN:

Ich habe eine andere detailliertere Spezifikation gefunden. vom selben Anbieter im Internet nach stundenlanger Suche und es kam heraus, dass der so dachte CRC in der Tat eine Parität ist. Ich habe auch meinen Gnu-Radio-Capture-Flowgraph verfeinert und einige neue Daten gesammelt. Bitte ignorieren Sie die obigen Daten und schauen Sie hier:

other 1> other 2                > other 3> other 4    > parity
10110100 001111101000111111101010 00000001 011110101001 0101
10110100 001111101000111111101010 00000001 011110111001 0110
10110100 001111101000111111101010 00000001 011111001001 0011
10110100 001111101000111111101010 00000001 011111011001 0100
10110100 001111101000111111101010 00000010 011111101001 0100
10110100 001111101000111111101010 00000010 011111111001 0011
10110100 001111101000111111101010 00000010 100000001001 0011
10110100 001111101000111111101010 00000010 100000011001 0100
10110100 001111101000111111101010 00000001 100000101001 0100
10110100 001111101000111111101010 00000001 100000111001 0011
10110100 001111101000111111101010 00000001 100001001001 0110
10110100 001111101000111111101010 00000001 100001011001 0101
10110100 001111101000111111101010 00000010 100001101001 0101
10110100 001111101000111111101010 00000010 100001111001 0110
10110100 001111101000111111101010 00000010 100010001001 1011
10110100 001111101000111111101010 00000010 100010011001 1100
10110100 001111101000111111101010 00000001 100010101001 1100
10110100 001111101000111111101010 00000001 100010111001 1011
10110100 001111101000111111101010 00000001 100011001001 1110
10110100 001111101000111111101010 00000001 100011011001 1101

Und hier ist es wieder als schickes Excel:

Geben Sie hier die Bildbeschreibung ein

Weiß jemand, wie man diese Parität berechnet? Ich habe versucht, die Daten usw. aufzuteilen und die üblichen Paritätsberechnungen zu verwenden, aber leider noch keinen Erfolg.

Omegavirus
quelle
1
Sie haben hier nicht genügend Informationen, da sich neben dem Prüfwert nur das letzte Byte, die Anzahl, ändert. Daher können Sie die Auswirkung der vorhergehenden Bytes nicht von einem statischen Startwert des Algorithmus unterscheiden. Sie können einige Vermutungen anstellen und sie vielleicht testen oder sogar eine Theorie finden, die zu schön ist, um nicht wahrscheinlich zu sein, aber alles, was Sie wirklich von den angegebenen Daten allein umkehren können, ist die Rolle des letzten Bytes bei der Erstellung des Prüfwerts.
Chris Stratton
2
@ ChrisStratton Du hast recht. Ich habe einige Daten hinzugefügt, die andere Werte ändern. Ist es hilfreich?
Omegavirus
1
Nett. Ich wäre überrascht, aber es ist möglich, dass es einen rollierenden Code gibt. Haben Sie bestätigt, ob die einfache Wiedergabe alter Aufnahmen effektiv ist? Denken Sie, dass Sie diese Frage selbst beantworten müssen, aber es wird eine nützliche Referenz sein.
Sean Houlihane
@ SeanHoulihane Das habe ich mir auch zuerst gedacht. Aber nach einigen fehlgeschlagenen Versuchen gelang es mir, Daten erneut zu senden, und sie wurden akzeptiert, sodass ich zu dem Schluss kam, dass es keinen fortlaufenden Code oder ähnliches gibt. Ich meine, auf diese Weise wäre es möglich, ganze "Skizzen" von Aktionen zu erfassen und wiederzugeben, aber das funktioniert nicht, da diese Anzahl immer angemessen erhöht werden muss (es gibt einen Unterschied von einem Betrag, der noch akzeptiert wird - Wie gesagt, ich gehe davon aus, dass Daten aufgrund von Reichweitenproblemen usw. verloren gehen. Andernfalls verliert der Roboter die Synchronisierung und muss zurückgebracht und an seine Dockingstation angeschlossen werden.
Omegavirus
1
@MikaelFalkvidd Das ist eine gute Idee und normalerweise mein Ausgangspunkt, wenn verfügbar. Da es sich um ein europäisches Gerät handelt, ist leider keine FFC-ID oder ähnliches verfügbar.
Omegavirus

Antworten:

5

Oh Mann, frag mich nicht wie, aber ich glaube ich habe es herausgefunden.

Werfen wir einen Blick:

Geben Sie hier die Bildbeschreibung ein

Grundsätzlich teilen Sie die Daten in Pakete mit jeweils 4 Bit auf. Sie können dann jeden ersten, zweiten, dritten und vierten Buchstaben einzeln zusammenfassen. Dies ist in den Spalten 1, 2, 3 und 4 zu sehen. Danach zählen Sie die Einsen in jedem von ihnen (die Anzahl der Einsen steht neben jedem von ihnen). Wenn sie gerade sind, ist es eine 0 für das Paritätsbit, wenn sie ungerade sind, ist es eine Eins. Bevor Sie fertig sind, müssen Sie das Ergebnis von vor (!) Binär addieren. Das stimmte jedes Mal überein und ich konnte auf diese Weise erfolgreich meine eigenen Frames generieren. Problem gelöst scheint es. Perfekt. Vielen Dank an alle für ihren Beitrag.

Omegavirus
quelle
1
Mit anderen Worten, das Häkchen ist ein XOR aller vorhergehenden.
Chris Stratton
1
@ChrisStratton Verzeihen Sie diese Frage, aber was genau muss XOR sein? Ich habe jeden Paritätsblock aus den Kategorien ausprobiert, aber das hat nicht funktioniert.
Omegavirus
1
XOR jedes der Knabbereien in einen Akkumulator, der anfänglich Null ist, und Sie haben Ihre Antwort. Dies lässt Sie an jeder Bitposition eine Eins, wenn die Anzahl der Einsen an dieser Position ungerade ist.
Chris Stratton
1
Bloße Optimierung - Sie haben die Anforderung selbst herausgefunden :-)
Chris Stratton
@ChrisStratton Richtig, aber der XOR-Ansatz ist offensichtlich der richtige und ich habe ihn auf diese Weise einfach in Python implementiert. Wie auch immer, die +1 am Ende war immer noch notwendig. Wissen Sie, warum?
Omegavirus