(WS19-01)Wetterballon CSV

Aus Verteilte Systeme - Wiki
Version vom 3. Dezember 2019, 00:58 Uhr von Mfell001 (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „=CSV-Format:= ==Zweck== CSV steht für Comma Separated Value. Das Format legt eine Darstellung von Daten in Zeilen und Spalten durch Nutzung von Trennzeichen…“)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

CSV-Format:

Zweck

CSV steht für Comma Separated Value. Das Format legt eine Darstellung von Daten in Zeilen und Spalten durch Nutzung von Trennzeichen in Textform fest. Formal ist das CSV-Format im Standard RFC 4180 spezifiziert.

Sensordaten

Das Speichern der Sensordaten soll im CSV-Format erfolgen. Zusätzlich ist Folgendes definiert:

  • Das Trennzeichen zwischen Werten ist immer ein ;.
  • Der erste Wert einer Zeile ist ein Zeitstempel.
  • Nach dem Zeitstempel folgt der Datensatz einer Sensorabfrage.
  • Die Werte eines Datensatzes werden mit Trennzeichen semantisch sinnvoll voneinander getrennt.Werte sind dabei nie als Zeichenwerte zu interpretieren (Bsp.: das Byte 0x3B darf nicht als ASCII-Zeichen ; interpretiert werden, sondern muss als 3B gespeichert werden, da anderenfalls das Format nicht mehr eindeutig ist)! Bytes werden immer ohne das Präfix 0x dargestellt, um eine etwas kompaktere Speicherung zu ermöglichen.
  • Nach dem Datensatz wird eine neue Zeile begonnen.

Formal dargestellt bedeutet dies:

; Augmented Backus-Naur Form
CSV-SEP     = ";"
CSV-NEWLINE = "\n"

DIGIT       = %x30-39
DIGIT-HEX   = DIGIT / %x41-46 / %x61-66
BYTE        = 2DIGIT-HEX

TIME-SEC    = 1*DIGIT
TIME-NSEC   = 1*DIGIT
TIME        = TIME-SEC "." TIME-NSEC

RAW-DATA    = 1*BYTE

LINE        = TIME 1*(CSV-SEP RAW-DATA) CSV-NEWLINE
FILE        = *LINE



; Regular Expression:
;   [0-9]+\.[0-9]+(;([0-9A-Fa-f]{2})+)+



; Backus-Naur Form
;   <CSV_SEP>     ::= ";"
;   <CSV_NEWLINE> ::= "\n"
;
;   <DIGIT>       ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
;   <DIGIT_HEX>   ::= <DIGIT> | "A" | "B" | "C" | "D" | "E" | "F"
;   <BYTE>        ::= <DIGIT_HEX> <DIGIT_HEX>
;
;   <TIME_SEC>    ::= <DIGIT> {<DIGIT>}
;   <TIME_NSEC>   ::= <DIGIT> {<DIGIT>}
;   <TIME>        ::= <TIME_SEC> "." <TIME_NSEC>
;
;   <RAW_DATA>    ::= <BYTE> {<BYTE>}
;
;   <LINE>        ::= <TIME> <CSV_SEP> <RAW_DATA> {<CSV_SEP> <RAW_DATA>} <CSV_NEWLINE>
;   <FILE>        ::= {<LINE>}

Beispiel

Ein Beispiel ist in der Datei MCP9808.csv zu finden. Es enthält einen möglichen Ausschnitt der Daten für den Temperatursensor MCP9808.

Erklärung

Zeitstempel

Der Zeitspempel ist als relativer Wert zu einem festgelegten Zeitpunkt aufzufassen. Dieser Zeitpunkt ist implementierungsabhängig. Im gegebenen Beispiel wurde der Systemstart als dieser Zeitpunkt gewählt. Der erste Messwert ist also 935 Sekunden und 490393000 Nanosekunden nach dem Systemstart aufgezeichnet worden.

Messwerte

Die Messwerte sind eine Liste der ausgelesenen Bytes. Meist sind diese jeweils ein oder zwei Bytes lang. Ihre Bedeutung ist stark sensorabhängig. Im gegebenen Beispiel gibt es nur einen Temperaturwert. Dieser ist laut den Seiten 24f im Datenblatt wie folgt zu interpretieren:

// C
// 22.1875 °C.
uint8_t bytes[] = {0xC1, 0x63};

// Ignore status bytes and adjust bits to their actual positions.
float temp = (bytes[0] & 0x1F) * 16 + bytes[1] / 16;
// Evaluate with sign bit.
if (bytes[0] & 0x10)
    temp = 256 - temp;
// Java
// 22.1875 °C.
int[] bytes = {0xC1, 0x63};

// Ignore status bytes and adjust bits to their actual positions.
float temp = (bytes[0] & 0x1F) * 16 + bytes[1] / (float) 16;
// Evaluate with sign bit.
if (1 == (bytes[0] & 0x10))
    temp = 256 - temp;
# Python
# 22.1875 °C.
bs = [0xC1, 0x63]

# Ignore status bytes and adjust bits to their actual positions.
temp = (bs[0] & 0x1F) * 16 + bs[1] / 16
# Evaluate with sign bit.
if (bs[0] & 0x10):
    temp = 256 - temp