1. Posts/

MQTT & Payload Formatierung

  • Um eine Langzeitmessung vorzunehmen ist es nötig die vom TTN-Netzwerk empfangenen Daten in irgendeiner Form persistent zu speichern. Bisher war es uns nur möglich, die vom Gateway empfangen Daten in der TTN Konsole einzusehen, diese wurden aber nicht gespeichert.
  • Daher greifen wir mittels MQTT die empfangenen Daten ab. Dazu verwenden wir zunächst den MQTT Client Mosquitto:
mosquitto_sub -h "<host>" -p "<port>" -u "<user>" -P "<access-key>" -t "<topic>" -d
  • Host (MQTT Broker): eu1.cloud.thethings.network
  • Port ist in userem Fall ohne TLS 1883
  • Der User und der Access Key können im TTN unter Integrations->MQTT eingesehen werden
  • Das topic spezifiziert den Kanal auf dem nach eingehenden Nachrichten gehört werden soll. Für den Anfang kann hier ‘#’ gewählt werden, dies abonniert alle Topics, es werden also alle Nachrichten für unsere TTN App angezeigt.

Das Kommando sollte also in etwa so aussehen:

mosquitto_sub -h "eu1.cloud.thethings.network" -p "1883" -u "ps-w2022@ttn" -P "NNSXS..." -t "#" -d
  • Übertragen werden die Temperaturdaten des HTU21 Sensors. (Porgramm: LoraTemperature.ino)
  • Da die Temperaturdaten (ursprünglich float) vor dem Senden als Byte Array konvertiert werden, ist es nötig nach dem Empfangen die Daten wieder zurück in float zu konvertieren.
  • Dies kann mithilfe der Payload-Formatter in der TTN-Console umgesetzt werden. Die Payload-Formatter können unter “End devices” -> <gewünschtes Gerät> -> “payload formatters” gefunden werden.
  • Um einen eigenen Formatter zu schreiben wählen wir die Option “Custom Javascript Formatter”:
    Payload Formatter
  • Mit folgendem Code wird das Byte array wieder in einen float umgewandelt und als “temperature” der Uplink JSON hinzugefügt:
function decodeUplink(input) {
  // convert byte array to float
  temp = new Float32Array(new Uint8Array(input.bytes).buffer)[0];
  // round to 2 decimal places
  temp = temp.toFixed(2);
  return {
    data: {
      temperature: temp,
    },
    warnings: [],
    errors: [],
  };
}
  • Anschließend erscheinen auch in der TTN-Console die empfangen Daten formatiert:

    Formatierte Daten

  • Eine über MQTT empfangene JSON mit formatierten Temperaturdaten:

{
  "end_device_ids": {
    "device_id": "eui-70b3d57ed00575c7",
    "application_ids": {
      "application_id": "ps-w2022"
    },
    "dev_eui": "70B3D57ED00575C7",
    "join_eui": "0000000000000000",
    "dev_addr": "260B6C7C"
  },
  "correlation_ids": [
    "as🆙01GT22DBV6KHTAPBADYW6XFNJS",
    "gs:conn:01GS7YWE5R4EJNCN3VE2DN1XQQ",
    "gs🆙host:01GS7YWE6EMGCD1X90Q9BYFT7A",
    "gs:uplink:01GT22DBMMHNHWKAKTN1VA4N7G",
    "ns:uplink:01GT22DBMNQ4WVT11CEQM500BB",
    "rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01GT22DBMN9MB72BM1XPPTH3T4",
    "rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01GT22DBV6RZ04K9PMQHQASKDX"
  ],
  "received_at": "2023-02-24T15:59:33.222246617Z",
  "uplink_message": {
    "session_key_id": "AYaD237C86pyBBYdzLC30A==",
    "f_port": 1,
    "f_cnt": 161,
    "frm_payload": "mw28QQ==",
    "decoded_payload": {
      //--------formatierte Temperatur-------
      "temperature": "23.51"
      //-------------------------------------
    },
    "rx_metadata": [
      {
        "gateway_ids": {
          "gateway_id": "htw-dresden-ttn-gw1",
          "eui": "AC1F09FFFE05222E"
        },
        "time": "2023-02-24T15:59:33.023525953Z",
        "timestamp": 4236365460,
        "rssi": -117,
        "channel_rssi": -117,
        "snr": -9,
        "location": {
          "latitude": 51.03562,
          "longitude": 13.73465,
          "altitude": 183,
          "source": "SOURCE_REGISTRY"
        },
        "uplink_token": "CiEKHwoTaHR3LWRyZXNkZW4tdHRuLWd3MRIIrB8J//4FIi4QlJ2H5A8aCwjlveOfBhDH9O4FIKDku9ilmscB",
        "received_at": "2023-02-24T15:59:32.993511569Z"
      }
    ],
    "settings": {
      "data_rate": {
        "lora": {
          "bandwidth": 125000,
          "spreading_factor": 10,
          "coding_rate": "4/5"
        }
      },
      "frequency": "867100000",
      "timestamp": 4236365460,
      "time": "2023-02-24T15:59:33.023525953Z"
    },
    "received_at": "2023-02-24T15:59:33.013238353Z",
    "consumed_airtime": "0.329728s",
    "version_ids": {
      "brand_id": "heltec",
      "model_id": "cubecell-dev-board-class-c-otaa",
      "hardware_version": "_unknown_hw_version_",
      "firmware_version": "1.0",
      "band_id": "EU_863_870"
    },
    "network_ids": {
      "net_id": "000013",
      "tenant_id": "ttn",
      "cluster_id": "eu1",
      "cluster_address": "eu1.cloud.thethings.network"
    }
  }
}

Die vollständigen Logs von Mosquitto sind in der mqtt.txt Datei zu finden.