So entschlüsseln Sie den Hex-Code für Zeitdaten auf einem älteren Gerät mit serieller Schnittstelle

Ich verwende einen alten Draeger PAC III-Sensor, um Gaskonzentrationen zu messen, mit dem Ziel, die Daten über Arduino fernzuübertragen. Dementsprechend kann ich die proprietäre Software nicht verwenden, um die Systeminformationen/Daten auszugeben. Obwohl das System von der Firma „ausgemustert“ wurde und nicht mehr verkauft/verteilt wird, werden ihre Techniker das Datenblatt für die Kommunikation auf dem Gerät nicht bereitstellen.

Um dies zu umgehen, versuche ich, einen seriellen Port-Monitor zu verwenden, um die COM zwischen dem Gerät und dem PC zu lesen. Der PC kommuniziert über einen RS-232-Anschluss, verwendet jedoch nur Masse und eine kombinierte Tx/Rx-Leitung, um Daten vom Gerät zu erhalten. Um die Kommunikation zu aktivieren, beginnen alle geschriebenen Daten mit einem High (01). Alle gelesenen Daten duplizieren die geschriebenen Daten und fügen dann Gerätedaten hinzu. Der erste Befehl ist immer „Initiiere Kommunikation durch Identifizierung“, auch bekannt als die ersten 4 Datenblöcke. Ich kann nur davon ausgehen, dass die verbleibenden Daten die Zeit kommunizieren, aber ich verstehe nicht, wie ich sie entschlüsseln soll. Wenn Endian verwendet/benötigt wird, wie kann ich das tun? Vielen Dank im Voraus!

Gemäß den gemeldeten Werten des proprietären Programms:

  • Zeit (wahrscheinlich 24-Stunden-Uhr): 1:13
  • Datum (TT.MM.JJJJ): 9.4.2008
  • Seriennummer: ERXL-0162
  • Teilenummer: 4530011
  • Softwareversion: v3.50
[03/08/2019 16:44:22] Written data (COM4)   
    01 01 01 02 00 05                                          ......           
[03/08/2019 16:44:22] Read data (COM4)  
    01 01 01 02 00 05 01 01 01 26 02 34 35 33 30 30     .........&.45300    
    31 31 20 20 20 45 52 58 4c 2d 30 31 36 32 20 20     11   ERXL-0162      
    20 20 34 35 33 30 32 37 30 76 33 2e 35 30 07 3b         4530270v3.50.;  
[03/08/2019 16:44:23] Written data (COM4)   
    01 01 01 02 00 05                                             ......            
[03/08/2019 16:44:23] Read data (COM4)  
    01 01 01 02 00 05 01 01 01 26 02 34 35 33 30 30     .........&.45300    
    31 31 20 20 20 45 52 58 4c 2d 30 31 36 32 20 20     11   ERXL-0162      
    20 20 34 35 33 30 32 37 30 76 33 2e 35 30 07 3b         4530270v3.50.;  
[03/08/2019 16:44:23] Written data (COM4)   
    01 01 02 02 00 06                                       ......              
[03/08/2019 16:44:23] Read data (COM4)  
    01 01 02 02 00 06 01 01 02 07 89 28 01 0d 38 01     ..........‰(..8.    
    02                                                  .                   
[03/08/2019 16:44:23] - Close port COM4 

Bearbeiten: Zwei weitere Zeitstempel wie gewünscht

Time: 1:02 4/9/2008
[03/08/2019 20:04:30] Read data (COM4)  
    01 01 02 02 00 06 01 01 02 07 89 28 01 02 28 00   ..........‰(..(.  
    e7                                                ç                 
Time: 1:04 4/9/2008
[03/08/2019 20:05:50] Read data (COM4)  
    01 01 02 02 00 06 01 01 02 07 89 28 01 04 00 00   ..........‰(....  
    c1                                                Á                 
Ich bin ein wenig verwirrt von der Frage, Endianness wird immer verwendet (bei Kommunikationen mit mehr als 8 Bit). Die Frage sollte lauten: "Wie kann festgestellt werden, welche Endianness verwendet wird?" Rechts?
So etwas wie "Combined TX/RX RS232" gibt es nicht. Was für ein Monitorkabel verwendest du? Es gibt solche, die die TX-Seite des Hosts in die RX-Seite des Hosts "bluten" lassen, und ich denke, das sehen wir hier. Es funktioniert irgendwie, wenn die Kommunikation immer halbduplex ist, aber es fügt eine zusätzliche Komplikation bei der Analyse des Protokolls hinzu. Verwenden Sie einen geeigneten RS232-Monitor mit zwei Monitorkabeln, eines für jeden TX.
Die Frage im allgemeineren Sinne ist, wie bekomme ich einen Zeitstempel, der mit dem gemeldeten Wert aus dieser Zeile "01 01 02 02 00 06 01 01 02 07 89 28 01 0d 38 01" übereinstimmt. Ich weiß nicht viel darüber, wie das Gerät kommuniziert, also wäre alles, was zu diesem Ziel beiträgt, sehr willkommen!
Was lässt Sie glauben, dass das eingebettete Gerät Datum oder Uhrzeit kennt? Und warum kümmert es dich? Wo sind die tatsächlichen Gaskonzentrationswerte? Wenn Sie wirklich glauben, dass ein aussagekräftiger Zeitstempel verschlüsselt ist, erfassen Sie zwei Austauschvorgänge, bei denen er sich unterscheidet, und sehen Sie, wie sich die Daten unterscheiden ...
Janka, am seriellen Port werden nur die Pins 1, 3 und 4 verwendet und dann durch eine Art Wechselrichterschaltung an der Ladestation geschoben, damit das Gerät ein immer hohes 2,95-V-Signal (wie vom Gerät gesehen) zum Ausschalten erhält und weiter. Ich sage dies nicht, um das Problem zu verschlimmern, sondern um zu versuchen, das mögliche Kommunikationsschema zu erklären, das das Startbit und wahrscheinlich ein Endbit benötigt, da das Gerät nur eine Kommunikationsleitung sieht.
Chris, die proprietäre Software hat eine Update-Schaltfläche, um die aktuelle Zeit auf dem Gerät anzuzeigen. Ich möchte die Zeit wissen, da dies eine Möglichkeit ist, bekannte Werte zwischen der seriellen Anzeige und dem Gerät abzugleichen. Ich habe versucht, mehrere Zeitpunkte zu vergleichen, konnte aber die 3. bis letzte Zeile nicht verstehen.
Aktualisieren Sie Ihre Frage mit Daten für zwei Zeitstempel und zeigen Sie die entsprechenden gedruckten Zeitstempel an. Sind Ihre Daten wirklich aus dem Jahr 2008 oder haben sie sich verschoben, was möglicherweise einen Hinweis auf die Codierung gibt? Erwägen Sie auch, eine gefälschte Version mit einem Arduino- oder Port-Emulator oder API-Hook/Debugger zu erstellen und ein oder zwei Bytes zu ändern, um zu sehen, was das bewirkt.
Ja, das Datum stammt aus dem Jahr 2008, das war das letzte Mal, dass diese verwendet wurden. Ich werde diese Port-Emulator-Idee ausprobieren.

Antworten (1)

Hier ist eine Hypothese des Zeitteils der Daten:

  • Aus der ursprünglichen Datenerfassung:01 0d 38 01 02

    Wir wissen, dass die Zeit als 01:13 angezeigt wurde. Das ist das 01 0dund ich glaube, das nächste Byte 38ist wahrscheinlich der Sekundenwert, aber das wird nicht angezeigt.

    Ich erwäge, dass die letzten 2 Bytes auf jedem "Paket", das vom Gerät gesendet wird, eine Prüfsumme sein können (dies ist ein üblicher Ansatz). Das erklärt, warum die letzten 2 Bytes der ersten beiden Pakete gleich sind ( 07 3b) - da die Daten in beiden Paketen gleich sind. Dann hat das nächste Paket (das erste Daten- und Zeitbeispiel) unterschiedliche Werte für die letzten 2 Bytes.

  • Aus einer der zusätzlichen Datums-/Zeiterfassungen:01 02 28 00 e7

    Nach meiner ersten Interpretation oben ist die angezeigte Zeit 01:02, das ist (nicht überraschend) die 01 02und auch 40 Sekunden (hex 28) mit einer 00 e7Prüfsumme für das gesamte "Paket".


Hier ist eine übergeordnete Hypothese der Paketdecodierung:

Am Beispiel des ursprünglichen Datums-/Uhrzeitpakets:

01 01 02 02 00 06 01 01 02 07 89 28 01 0d 38 01 02

Der ursprüngliche Befehl ist der führende, 01 01 02 02 00 06wo der eigentliche Befehl ist 01 01 02, dann ist die Anzahl der folgenden Bytes (einschließlich Prüfsumme) 02und dann gibt es eine Prüfsumme für diesen "Befehl" - 00 06.

Die Antwort beginnt mit den nächsten Bytes: 01 01 02(sagt uns vielleicht, auf welchen Befehl dies eine Antwort ist, für eine Plausibilitätsprüfung durch den Master/PC). Dann gibt es 07folgende Bytes (einschließlich Prüfsumme) - 89 28 01 0d 38 01 02.

Wie ich bereits angedeutet habe, vermute ich, dass die Werte in Hex 01 0d 38sind . hh mm ssDer Schluss 01 02ist eine Prüfsumme.

Das bedeutet, dass das tatsächliche Datum89 28 nur in den zwei verbleibenden Bytes in diesem Datenpaket codiert werden kann .


Meine Hypothese zu diesem Zeitpunkt ist, dass diese zwei Bytes 89 28ein Little-Endian-Tageszählerwert sein könnten, was bedeutet, dass es sich tatsächlich um 28 89(Hex)-, dh 10377 (Dezimal-)Tage handeln könnte. Wenn das stimmt, dann scheint der 9. April 2008 - 10377 Tage der 11. November 1979 zu sein. Keine unangemessene "Epoche".

(Das ist viel vernünftiger, als wenn ich die Bytes als Big-Endian behandle, 89 28Hex in Dezimal (35112) umwandle und so viele Tage vom 9 viel weniger sinnvoll für ein modernes Gerät.)

Wenn Sie warten können, bis sich das Datum (dh der Tag) auf der internen Uhr des Geräts ändert, können wir sehen, ob sich der Datumswert tatsächlich in diesen Antwortbytes von bis ändert, was bestätigen würde, dass es sich um einen Little-Endian- 89 28Tageszähler 8a 28handelt Wert, der vom Gerät gesendet und von der PC-Software als Anzeigedatum im normalen Format interpretiert wird.

Oder Sie könnten versuchen, der PC-Software einen modifizierten Datensatz zuzuführen und diese zwei Bytes zu ändern, von denen ich glaube, dass sie das Datum codieren, und sehen, was die PC-Software anzeigt. Das Problem ist die (was ich glaube) Prüfsumme auf jedem Paket. Das macht es schwierig (wahrscheinlich unmöglich), modifizierte Daten in die PC-Software einzuspeisen, bis Sie den Prüfsummenalgorithmus haben und die Prüfsummenbytes korrekt modifizieren können, wenn Sie die Datenbytes modifizieren.

Das Auffinden des Prüfsummenalgorithmus erwies sich als einfacher als erwartet.

  • Die letzten 2 Bytes in jedem Paket, sowohl die 6 Byte "gesendeten" Datenpakete als auch die längeren "empfangenen" Datenpakete (aber nur die wirklichen "empfangenen" Daten, die mit dem 7. Byte in dieser gemischten gesendeten + empfangenen Datenerfassung beginnen ) sind in der Tat eine Prüfsumme .

  • Es ist buchstäblich die Summe aller Bytes (aber natürlich ohne die Prüfsumme selbst) im Big-Endian-Format (dh MSB, dann LSB).

    (Alle Beispiele unten sind in Hex.)

  • An den gesendeten Datenpaketen ist dies beispielsweise gut zu erkennen:

    01 01 01 02 00 05=> 01+ 01+ 01+ 02= 0005
    01 01 02 02 00 06=> 01+ 01+ 02+ 02=0006

    Im ersten Datums- und Zeitpaket (ohne die 6 Bytes "gesendete Daten" am Anfang):

    01 01 02 07 89 28 01 0d 38 01 02=> 01+ 01+ 02+ 07+ 89+ 28+ 01+ 0d+ 38=0102

Mit diesen Informationen ist es Ihnen nun möglich, ein modifiziertes Datenpaket zu erstellen und es mit einer gültigen Prüfsumme an die PC-Software zu senden, um zu sehen, wie diese Daten angezeigt werden. Wie bereits erwähnt, sind die Bytes, auf deren Änderung Sie sich konzentrieren müssen (um Ihnen zu helfen, ihre Bedeutung zu verstehen und meine Hypothese zu bestätigen oder zu verneinen, dass es sich um einen Tageszähler handelt), diejenigen, die 89 28in den echten Datums- und Zeitpaketen enthalten sind.

In der Tat. Aber jetzt müssen wir wirklich ein anderes Datum sehen. Da die aktuellen Werte nicht sinnvoll erscheinen, aufgeschlüsselt oder als Gesamttage von einem logischen Ausgangspunkt entweder Big oder Little Endian. Idealerweise noch ein Jahr. Oder um das Programm mit falschen Werten zu füttern, wobei die vorherigen Bytes um einen Zählwert geändert wurden. Laden Sie die Daten in ein Arduino und ersetzen Sie das? Oder einfach an einen anderen PC oder Port anschließen? Wahrscheinlich muss nicht einmal die doofe Halbduplex-Seriennummer vorhanden sein, solange sie in der Software gleich aussieht.
Chris - Ich denke, Datum und Uhrzeit von einem anderen Tag zu haben, wäre fast so hilfreich wie ein weiteres Jahr zu warten, aber wir werden sehen, welche Daten wir vom OP bekommen können. Ich habe jetzt die 2-Byte-Prüfsumme bestätigt und rückentwickelt (es ist buchstäblich eine Summe). Also, wie Sie sagen, die Verwendung eines Arduino oder ähnlichem zum Senden von Ersatzdaten an den PC ist jetzt eine Option, da die korrekte Prüfsumme für die manipulierten Daten berechnet und gesendet werden kann. PS Vielen Dank, dass Sie das OP nach den zusätzlichen Beispielen für die Datums- und Uhrzeitinformationen gefragt haben. Dies hat dazu beigetragen, festzustellen, welche Bytes sich nicht geändert haben, was darauf hindeutet, dass dies die datumsbezogenen Bytes sein könnten.
Danke schön! Ja, Sie haben in jeder Hinsicht Recht. Die Zeit ist genau so, wie Sie sagen, wobei die Prüfsumme die letzten 2 Bytes sind. Auch bei den Bytes, die Datumsangaben enthielten, lagen Sie richtig. Ich habe es mit viel Fummelei herausgefunden, aber die einfache Antwort lautet: 89 (137) ist der Tag, an dem mod32 angewendet wird. Das Jahr ist in „Unterjahre“ unterteilt, also eine Steigerung von 2 für jedes 1 Jahr. Ich danke Ihnen allen für Ihre Hilfe, die ich sehr zu schätzen weiß! Ich halte Sie auf dem Laufenden, wenn es Probleme mit den anderen Daten gibt.
@Research8472 - Sehr gerne! Vielen Dank für das Update und die fortschreitende Interpretation dieser beiden "Datumsbytes". Viel Glück mit dem Projekt!