Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    LoRaWAN GPS MAP Viewer AEQ-WEB

    TTS HTTP Webhook mit PHP & JSON

    Alex @ AEQ-WEB

    LoRaWAN Netzwerke wie The Things Network oder dessen Nachfolger The Things Stack speichern grundsätzlich keine Sensordaten bzw. nur für einen sehr kurzen Zeitraum. Hauptaufgabe vom Application Server ist die Decodierung und Weiterleitung der empfangenen Datensätze zu einem Cloud-Dienst. Um die endgültige und dauerhafte Speicherung der Datensätze muss sich also der Anwender selbst kümmern. Es gibt mittlerweile viele Dienste wie Thingspeak oder Microsoft Azure, die bereits eine Schnittstelle für TTS integriert haben und somit extrem einfach an den Application Server angebunden werden können. Dennoch besteht oft der Wunsch nach einer eigenen Schnittstelle zu einem Webserver, der dann die Daten beispielsweise in eine MySQL Datenbank speichert. The Things Stack bietet dafür eine Schnittstelle (Webhooks), welche die empfangen Daten an den eigenen Webserver bzw. an die eigene Homepage weiterleitet. Dieser Artikel ist Teil vom LoRaWAN GPS Tracker Projekt und beschreibt die Verarbeitung von JSON-Webhooks mit PHP.

    Was ist JSON

    Die Wurzeln von JSON (JavaScript Object Notation) stammen von JavaScript, werden jedoch mittlerweile von allen gängigen Programmiersprachen unterstützt. Viele API-Schnittstellen basieren auf JSON, da sie von der Programmiersprache unabhängig sind. Ein weiterer großer Vorteil von JSON ist, dass die Daten im Klartext übertragen werden und daher auch von einem Menschen leicht gelesen werden können.

    Was ist PHP

    PHP (PHP Hypertext Preprocessor) ist eine gängige Programmiersprache in der Webentwicklung, so wie sie auch auf diesem Blog zum Einsatz kommt. PHP übernimmt meistens Logikaufgaben und baut Verbindungen zu Datenbankservern auf. PHP eignet sich gut, um z. B. eine Login-Funktion zu bauen, Daten und Formulare abzuspeichern oder auch zur Generierung von HTML Code (Template Engine). Neben PHP gibt es auch andere Programmiersprachen wie ASP oder PHYTON, die solche Aufgaben übernehmen können. Vorteil von PHP: Der Code muss nicht kompiliert werden.

    Die Struktur von JSON

    Bei JSON gibt es grundsätzlich zwei große Typen, wie Daten dargestellt werden können. Die einfachste Möglichkeit ist die Darstellung von Parametername und Wert. Beim LoRaWAN GPS-Tracker wären dies zum Beispiel Positionsdaten. Die folgende Grafik zeigt den Aufbau von einem einfachen JSON-Paket mit 3 Parametern und den zugehörigen Werten:

    Werbung:

    Die zweite häufig verwendete Möglichkeit ist ein JSON-Array. Man kann sich ein Array vorstellen wie eine Tabelle. Es gibt eine Überschrift (Parametername) und beliebig viele Werte (Einträge in der Tabelle). Die folgende Grafik zeigt ein JSON-Array:

    Sehr oft findet man in einem JSON-Paket eine Kombination aus den oberen zwei Typen. Ein typisches JSON-Paket könnte so aussehen:

    Abfrage mit PHP

    PHP hat bereits eine Funktion zum Encodieren und Decodieren von JSON integriert. Einzelne Parameter und Arrays können daher recht einfach verarbeitet werden. Für die folgenden zwei Beispiele wird eine Variable mit einem JSON-Paket angelegt. Anstatt dieser Variable könnten die JSON-Daten aber auch aus einem POST/GET-Request kommen oder von einer Datei eingelesen werden. Das folgende Beispiel zeigt, wie einzelne Variablen aus einem JSON-Paket entnommen werden:

    Werbung:

    
    $json_input = '{
                    "decoded_payload":{
                        "altitude":32,
                        "latitude":52.520831,
                        "longitude":13.409527
                    }
                }';
    
    $data = json_decode($json_input);
    $gps_lat = $data->decoded_payload->latitude;
    $gps_lon = $data->decoded_payload->longitude;
    $gps_hgt = $data->decoded_payload->altitude;
    
    echo "LAT: " . $gps_lat . ", LON: " . $gps_lon;
    ?>
    

    Ausgabe:

    LAT: 52.520831, LON: 13.409527

    Das zweite Beispiel handelt wieder von einem Array. Das Array kann entweder mit einer Schleife verarbeitet werden oder es kann direkt auf die gewünschte Position zugegriffen werden. Das folgende Beispiel holt sich den zweiten Parameter (Position 1) aus einem Array:

    
    $json_input = '{
                    "array":[
                        "element1",
                        "element2",
                        "element3"
                    ]
                }';
    
    $data = json_decode($json_input);
    $array_1 = $data->array[1];
    
    echo "Element: " . $array_1;
    ?>
    

    Ausgabe:

    Element: element2

    Das dritte Beispiel ist wieder eine Kombination aus Variablen und einem Array:

    
    $json_input = '{
                    "decoded_payload":{
                        "altitude":32,
                        "latitude":52.520831,
                        "longitude":13.409527
                    },
                    "array":[
                        "element1",
                        "element2",
                        "element3"
                    ]
                    }';
    
    $data = json_decode($json_input);
    $gps_lat = $data->decoded_payload->latitude;
    $gps_lon = $data->decoded_payload->longitude;
    $gps_hgt = $data->decoded_payload->altitude;
    $array_1 = $data->array[1];
    
    
    echo "LAT: " . $gps_lat . ", Element: " . $array_1;
    ?>
    

    Ausgabe:

    LAT: 52.520831, Element: element2

    JSON Beispiel von TTS

    The Things Stack übergibt im JSON-Webhook sehr viele Parameter. Man kann dies wie eine hierarchische Struktur sehen, wo es mehre Unterpunkte mit Variablen oder Arrays gibt. Ein vollständiges JSON-Paket wie es von TTS über einen Webhook zum Webserver gesendet wird, könnte wie folgt aussehen:

    Werbung:

    {
       "end_device_ids":{
          "device_id":"esp32testdev",
          "application_ids":{
             "application_id":"lorawangpstestyt"
          },
          "dev_eui":"73DE2482E2DE1221",
          "join_eui":"3D27ED36D3D2AE23",
          "dev_addr":"260B95C1"
       },
       "received_at":"2021-04-02T06:28:01.603843077Z",
       "uplink_message":{
          "session_key_id":"AXiRPLjdI91aAVB0XzuZKw==",
          "f_port":1,
          "f_cnt":7,
          "frm_payload":"CH6x/wuHMfcAIAU=",
          "decoded_payload":{
             "altitude":32,
             "latitude":52.520831,
             "longitude":13.409527,
             "sat":5
          },
          "rx_metadata":[
             {
                "gateway_ids":{
                   "gateway_id":"aeqwebyoutubegate",
                   "eui":"3133303759003098"
                },
                "time":"2021-04-02T06:28:01.329797Z",
                "timestamp":1306928027,
                "rssi":-32,
                "channel_rssi":-32,
                "snr":6.25,
                "uplink_token":"Ch4KHAoQSWkxd2VixW90dWJlZ2F0ZRIIMTMwN1kAMJgQm8eY7wQaDAjx8pqDBhCnkKO5ASD4quzXhCY=",
                "channel_index":5
             }
          ],
          "settings":{
             "data_rate":{
                "lora":{
                   "bandwidth":125000,
                   "spreading_factor":7
                }
             },
             "data_rate_index":5,
             "coding_rate":"4/5",
             "frequency":"867500000",
             "timestamp":1306928027,
             "time":"2021-04-02T06:28:01.329797Z"
          },
          "received_at":"2021-04-02T06:28:01.390032024Z",
          "consumed_airtime":"0.061696s"
       }
    }
    

    Folgender Ausschnitt zeigt nun, wie mit PHP auf einzelne Parameter zugegriffen wird:

    $data = json_decode($json_input);
    $dev_id = $data->end_device_ids->device_id;
    $gps_lat = $data->uplink_message->decoded_payload->latitude;
    $gps_lon = $data->uplink_message->decoded_payload->longitude;
    $sp_factor = $data->uplink_message->settings->data_rate->lora->spreading_factor;
    

    Die Ausgabe im Browser könnte wie folgt aussehen:

    $dev_id = esp32gpstrack
    $gps_lat = 52.520831
    $gps_lon = 13.409527
    $sp_factor = 7


    122X122

    Über den Autor

    Alex, der Gründer von AEQ-WEB. Seit über 10 Jahren beschäftigt er sich mit Computern und elektronischen Bauteilen aller Art. Neben den Hardware-Projekten entwickelt er auch Webseiten, Apps und Software für Computer.

    Top Artikel in dieser Kategorie:

    Arduino PT100 Temperature Sensor Converter

    PT100 Arduino Sketch

    • Video
    • DE/EN

    Beispielcode für den PT100 Temperatursensor an einem Arduino

    Weiterlesen
    STM32 Nucleo 64 Arduino IDE Installation

    STM Boards im Arduino IDE

    • Video

    STM Boards programmieren mit dem Arduino IDE - Alle Infos zur Einrichtung und Installation der Boards, Treiber und Bibliotheken

    Weiterlesen

    Social Media

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden