Verständnis der Prüfsummengenerierung des IR-Protokolls

Um meine Klimaanlage mit einem Arduino zu steuern, versuche ich, die IR-Fernbedienung zu emulieren. Nicht mit einer anderen IR-LED, sondern direkt mit dem Signalkabel des IR-Empfängers auf der Platine verbunden.

Mit dem Arduino als Logikanalysator konnte ich das Protokoll zu etwa 90% verstehen.

Das Problem ist, dass das letzte Byte eine Art Prüfsumme zu sein scheint. Um meine eigenen Befehle zu senden, muss ich herausfinden, wie sie berechnet werden. Ich habe keine Ahnung.

Der folgende Kern enthält alle Informationen, die ich über das Protokoll habe. Es ist ziemlich lang (112 Bit) Durch das Wiederholen der genauen Befehle kann ich die AC-Einheit steuern.

https://gist.github.com/Hypfer/38b3b276e1a0fea92c30

Das direkte Hinzufügen zu dieser Seite funktioniert nicht sehr gut, da die Formatierung völlig durcheinander kommt. Das Protokoll ist einfach viel zu lang.

Wichtig: Die Fernbedienung scheint nicht wie eine normale Fernbedienung zu funktionieren. Es sendet keine Keycodes, sondern ganze Zustands-"Objekte".

Vielleicht erkennt hier jemand ein Muster in diesen Daten. :-)

Wenn Sie formatierten Text mit 4 Leerzeichen einrücken, wird er hier wie eingegeben dargestellt. Vielleicht ist dieses Problem in einem Kryptographie-Forum aktueller: Da Sie aufgezeichnete Befehle erfolgreich wiedergeben können, ist der elektrische Teil gelöst.

Antworten (3)

Hier ist meine Analyse, basierend auf Ihrer kleinen Datenstichprobe:

Wenn Sie die "Never changes"-Daten ignorieren und auch die Nullen vor der Prüfsumme entfernen, sehen Ihre Daten so aus:

00100100 11000000 00000000 01000000 01111110
00100100 11000000 00000000 01100000 01000001
00100100 11000000 00000000 00100000 00000001

00100100 11000000 10010000 00100000 10010001
00100100 11000000 10010000 00110000 10001001

00100100 11000000 11010000 01100000 10110001
00100100 11000000 11010000 01000000 10010001

Das sind also vier Datenbytes und ein Prüfsummenbyte (oder was auch immer).

Kehren Sie nun die Reihenfolge der Bits innerhalb dieser vier Datenbytes um (Prüfsumme weggelassen), also meine ich, dass Bit 0 zu Bit 7 wird, Bit 1 zu Bit 6 usw.:

00100100 00000011 00000000 00000010
00100100 00000011 00000000 00000110
00100100 00000011 00000000 00000100

00100100 00000011 00001001 00000100
00100100 00000011 00001001 00001100

00100100 00000011 00001011 00000110
00100100 00000011 00001011 00000010

Summieren Sie nun jede Zeile Modulo 255, kehren Sie die Reihenfolge der Bits wieder um und vergleichen Sie das Ergebnis mit Ihrer Prüfsumme:

01111110
10000010
10000000

10001001
10010001

10001101
10001001

Es funktioniert für mich, aber vielleicht werden mehr dieser Daten (wie das Auffüllen mit Nullen) berücksichtigt, aber wir bräuchten mehr Beispiele, um es herauszufinden. Im Moment können Sie das Prüfsummenbyte erstellen, indem Sie einfach die Reihenfolge der Bits jedes Datenbytes umkehren (dh die "Niemals-Änderungen" ignorieren) und die Summe Modulo 255 nehmen und dann die Reihenfolge der Bits dieser Summe umkehren.

All diese Notwendigkeit der Bitumkehr deutet darauf hin, dass die Daten in die entgegengesetzte Richtung gesendet werden, wie Sie sie interpretieren. Zum Beispiel wird zuerst MSB gesendet und Sie nehmen zuerst LSB an oder umgekehrt. Abgesehen davon ist die Prüfsumme nur eine kumulative Summe der Daten, wobei der Überlauf ignoriert wird.

Kehren Sie die Reihenfolge der Bits in jedem Byte um. Fügen Sie jedes Byte hinzu (ignorieren Sie die Prüfsumme und die "never changes"-Blöcke), modulo 0xff. Und fügen Sie 0x55 zur Summe hinzu. Kehren Sie die Endsumme um, um Ihre erwartete Prüfsumme zu erhalten.

In meinem Fall musste ich auch eine Konstante hinzufügen, aber es war nicht 0x55. Und ich musste die Anzahl der übertragenen Bytes subtrahieren (meine Frames haben eine variable Länge).