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 derAccess 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”:
- 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:
-
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.