Packet-Parser-Funktionen
Packet-Parser-Funktionen der TapHome-Skripte — HTTPREQUEST, SENDHTTPREQUEST, SENDDATA, MQTTPUBLISH, FTPDOWNLOAD, FTPUPLOAD, COMPLETESERVICEATTRIBUTE und COMPLETESERVICEACTION — für HTTP, TCP, UDP, MQTT und FTP.
Packet-Parser-Funktionen kommunizieren mit Geräten über HTTP, TCP, UDP, MQTT und FTP. Sie funktionieren nur in den Skripten eines Packet-Parser-Moduls oder -Geräts, dessen Protokoll zur Funktion passt; anderswo hält das Skript mit PacketParserFunction - PacketParserContext is null an. Alle erfordern Core 2022.2 oder neuer. Die Einrichtung eines Packet-Parser-Moduls ist unter Packet Parser beschrieben; eingehende Nachrichten werden in Listener-Skripten verarbeitet, und Modbus-Geräte haben eigene Modbus-Funktionen.
Protokolle und Skripte
Jedes Protokoll hat eigene Funktionen und eine typische Aufgabenteilung zwischen den Skripten.
| Protokoll | Funktionen | Typische Skripte |
|---|---|---|
| HTTP | HTTPREQUEST, SENDHTTPREQUEST | Das Leseskript des Moduls sendet eine Anfrage und speichert die Antwort in einer Modulvariablen; die Leseskripte der Geräte parsen sie. |
| TCP, UDP | SENDDATA | Lese- oder Schreibskripte senden eine Anfrage; die Antwort kommt im Listener-Skript an. |
| MQTT | MQTTPUBLISH | Das Listener-Skript verarbeitet eingehende Nachrichten; das Schreibskript veröffentlicht Befehle. |
| FTP | FTPDOWNLOAD, FTPUPLOAD | Lese- und Schreibskripte übertragen Dateien. |
Beispiel — eine HTTP-Anfrage für alle Geräte eines Moduls
VAR response := SENDHTTPREQUEST("/status", "GET");
StatusJson := response.Content;PARSEJSON(StatusJson, "temperature");Das erste Skript ist das Leseskript des Moduls, das zweite ein Leseskript eines Geräts; StatusJson ist eine Modulvariable.
HTTPREQUEST
HTTPREQUEST erstellt einen httprequest-Wert, dessen Pfad, Methode, Body und Header geändert werden können, bevor er mit SENDHTTPREQUEST gesendet wird.
| |
Hinweise — Die Standardmethode ist GET. Die Eigenschaften PATH, METHOD, BODY und HEADERS können gelesen und geschrieben werden; HEADERS ist eine Sammlung von Strings der Form "Name: value". Die Funktion erstellt nur einen Wert und funktioniert daher in jedem Skript.
Beispiel
VAR request := HTTPREQUEST("/api/v1/state", "POST", "{\"on\":true}");
request.HEADERS := {"Content-Type: application/json", "Authorization: Bearer " + token};
VAR response := SENDHTTPREQUEST(request);SENDHTTPREQUEST
SENDHTTPREQUEST sendet eine HTTP-Anfrage, wartet auf die Antwort und gibt sie als httpresponse-Wert mit den Eigenschaften Content, StatusCode, ReasonPhrase, IsSuccess und Headers zurück.
| |
| Name | Typ | Beschreibung |
|---|---|---|
path | String | Pfad auf dem im Modul eingestellten Gerät, zum Beispiel "/status". |
method | String, optional | GET (Standard), POST, PUT, … |
body | String, optional | Body der Anfrage. |
header1 … | String, optional | Bis zu 27 Header als "Name: value". |
request | httprequest | Eine mit HTTPREQUEST erstellte Anfrage. |
Rückgabewert — httpresponse:
| Eigenschaft | Bedeutung |
|---|---|
Content | Der Body der Antwort als Text. |
StatusCode | HTTP-Statuscode, zum Beispiel 200. |
ReasonPhrase | Statustext, zum Beispiel OK. |
IsSuccess | TRUE für die Statuscodes 200 – 299. |
Headers | Header der Antwort als JSON-Text — ein Array aus {"Key": …, "Value": [ … ]} —, lesbar mit PARSEJSON. |
Hinweise — Nur für ein Modul mit dem Protokoll HTTP. Die Antwort darf höchstens 128 kB groß sein.
Beispiel
VAR response := SENDHTTPREQUEST("/status", "GET");
IF response.IsSuccess
StatusJson := response.Content;
ELSE
ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
ENDSENDHTTPREQUEST("/doSomething", "POST", "someData", "header1: value1", "header2: value2");Fehler — Response is too long (Nbytes). Maximum supported length is 128KB; PacketParserFunction - unable to use ‘SENDHTTPREQUEST’ with … (das Modul verwendet ein anderes Protokoll).
SENDDATA
SENDDATA sendet einen String oder eine Bytesammlung über TCP oder UDP und gibt TRUE zurück; die Antwort kommt im Listener-Skript an.
| |
Hinweise — Ein String wird als iso-8859-1-Bytes gesendet. Eine Sammlung muss eine collection<uint8> sein. Eingehende Daten werden dem Listener-Skript in Blöcken von höchstens 4096 Bytes übergeben.
Beispiel
SENDDATA(BYTECOLLECTION("0a dd ef a2"));
SENDDATA("STATUS?\r\n");MQTTPUBLISH
MQTTPUBLISH veröffentlicht eine Nachricht mit dem angegebenen Topic beim MQTT-Broker des Moduls und gibt Null zurück.
| |
Hinweise — data ist ein String oder eine collection<uint8>. Ein vom Broker gemeldeter Fehler hält das Skript mit dessen Text an. Der Broker wird unter MQTT Broker eingerichtet.
Beispiel
MQTTPUBLISH("shellies/" + plugTopic + "/relay/0/command", IF(St > 0, "on", "off"));FTPDOWNLOAD
FTPDOWNLOAD lädt eine Datei vom FTP-Server des Moduls herunter und gibt ihren Inhalt als Bytesammlung (collection<uint8>) zurück.
| |
Beispiel
VAR data := FTPDOWNLOAD("/export/values.csv");
VAR csv := TOSTRING(data, "utf-8");FTPUPLOAD
FTPUPLOAD schreibt Daten in eine Datei auf dem FTP-Server des Moduls — mit "write" (Standard) wird die Datei ersetzt, mit "append" an ihr Ende angehängt.
| |
Hinweise — data ist ein String oder eine collection<uint8>. mode muss kleingeschrieben sein.
Beispiel
FTPUPLOAD("/path/to/file", "some data", "write");
FTPUPLOAD("/path/to/file", BYTECOLLECTION("a7 ff e2"), "append");Fehler — FTPUPLOAD - invalid argument, upload mode must be ‘append’ or ‘write’.
COMPLETESERVICEATTRIBUTE
COMPLETESERVICEATTRIBUTE liefert den Wert eines Service-Attributs aus einem TCP- oder UDP-Listener-Skript an die App, nachdem das Skript des Attributs die Anfrage mit SENDDATA gesendet hat.
| |
Hinweise — name ist der Name des Service-Attributs. Mit error zeigt das Attribut den Fehlertext statt eines Wertes an. Gibt Null zurück.
Beispiel
COMPLETESERVICEATTRIBUTE("Uptime", "2d:21h:43m");
COMPLETESERVICEATTRIBUTE("Status", "", "Device is offline");COMPLETESERVICEACTION
COMPLETESERVICEACTION meldet das Ergebnis einer Service-Aktion aus einem TCP- oder UDP-Listener-Skript an die App, nachdem das Skript der Aktion die Anfrage mit SENDDATA gesendet hat.
| |
Beispiel
COMPLETESERVICEACTION("Reboot", "Rebooted successfully");Fehler — No service action with name X.
Siehe auch — Listener-Skripte, Parsing-Funktionen, Konvertierung von Datentypen.