TapHome

Funkce Packet parser

Funkce Packet parser ve skriptu TapHome — HTTPREQUEST, SENDHTTPREQUEST, SENDDATA, MQTTPUBLISH, FTPDOWNLOAD, FTPUPLOAD, COMPLETESERVICEATTRIBUTE a COMPLETESERVICEACTION — pro HTTP, TCP, UDP, MQTT a FTP.

Funkce Packet parser komunikují se zařízeními přes HTTP, TCP, UDP, MQTT a FTP. Fungují jen ve skriptech modulu nebo zařízení Packet parser, jehož protokol odpovídá funkci; jinde se skript zastaví chybou PacketParserFunction - PacketParserContext is null. Všechny vyžadují Core 2022.2 nebo novější. Nastavení modulu Packet parser popisuje stránka Packet parser; příchozí zprávy se zpracovávají v listener skriptech a zařízení Modbus mají vlastní funkce Modbus.

Protokoly a skripty

Každý protokol má vlastní funkce a typické rozdělení práce mezi skripty.

ProtokolFunkceTypické skripty
HTTPHTTPREQUEST, SENDHTTPREQUESTSkript pro čtení modulu pošle jeden požadavek a uloží odpověď do proměnné modulu; skripty pro čtení zařízení ji parsují.
TCP, UDPSENDDATASkripty pro čtení nebo zápis pošlou požadavek; odpověď dorazí do listener skriptu.
MQTTMQTTPUBLISHListener skript zpracovává příchozí zprávy; skript pro zápis publikuje příkazy.
FTPFTPDOWNLOAD, FTPUPLOADSkripty pro čtení a zápis přenášejí soubory.

Příklad — jeden požadavek HTTP pro všechna zařízení modulu

VAR response := SENDHTTPREQUEST("/status", "GET");
StatusJson := response.Content;
PARSEJSON(StatusJson, "temperature");

První skript je skript pro čtení modulu, druhý skript pro čtení zařízení; StatusJson je proměnná modulu.

HTTPREQUEST

HTTPREQUEST sestaví hodnotu httprequest, jejíž cestu, metodu, tělo a hlavičky lze změnit před odesláním přes SENDHTTPREQUEST.

1
HTTPREQUEST(path [, method [, body]])

Poznámky — Výchozí metoda je GET. Vlastnosti PATH, METHOD, BODY a HEADERS lze číst i zapisovat; HEADERS je kolekce řetězců "Name: value". Funkce jen vytváří hodnotu, takže funguje v každém skriptu.

Příklad

VAR request := HTTPREQUEST("/api/v1/state", "POST", "{\"on\":true}");
request.HEADERS := {"Content-Type: application/json", "Authorization: Bearer " + token};
VAR response := SENDHTTPREQUEST(request);

SENDHTTPREQUEST

SENDHTTPREQUEST odešle požadavek HTTP, počká na odpověď a vrátí ji jako hodnotu httpresponse s vlastnostmi Content, StatusCode, ReasonPhrase, IsSuccess a Headers.

1
2
SENDHTTPREQUEST(path [, method [, body [, header1, header2, …]]])
SENDHTTPREQUEST(request)
NázevTypPopis
pathřetězecCesta na zařízení nastaveném v modulu, například "/status".
methodřetězec, volitelnýGET (výchozí), POST, PUT, …
bodyřetězec, volitelnýTělo požadavku.
header1 …řetězec, volitelnýAž 27 hlaviček ve tvaru "Name: value".
requesthttprequestPožadavek sestavený přes HTTPREQUEST.

Vrací — httpresponse:

VlastnostVýznam
ContentTělo odpovědi jako text.
StatusCodeStavový kód HTTP, například 200.
ReasonPhraseText stavu, například OK.
IsSuccessTRUE pro stavové kódy 200 – 299.
HeadersHlavičky odpovědi jako text JSON — pole {"Key": …, "Value": [ … ]} — čitelné přes PARSEJSON.

Poznámky — Jen pro modul s protokolem HTTP. Odpověď smí mít nejvýše 128 kB.

Příklad

VAR response := SENDHTTPREQUEST("/status", "GET");
IF response.IsSuccess
    StatusJson := response.Content;
ELSE
    ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
END
SENDHTTPREQUEST("/doSomething", "POST", "someData", "header1: value1", "header2: value2");

Chyby — Response is too long (Nbytes). Maximum supported length is 128KB; PacketParserFunction - unable to use ‘SENDHTTPREQUEST’ with … (modul používá jiný protokol).

SENDDATA

SENDDATA odešle řetězec nebo kolekci bajtů přes TCP nebo UDP a vrátí TRUE; odpověď dorazí do listener skriptu.

1
SENDDATA(data)

Poznámky — Řetězec se odešle jako bajty v iso-8859-1. Kolekce musí být collection<uint8>. Příchozí data se do listener skriptu doručují po částech nejvýše 4096 bajtů.

Příklad

SENDDATA(BYTECOLLECTION("0a dd ef a2"));
SENDDATA("STATUS?\r\n");

MQTTPUBLISH

MQTTPUBLISH publikuje zprávu se zadaným tématem do brokeru MQTT modulu a vrátí Null.

1
MQTTPUBLISH(topic, data)

Poznámky — data je řetězec nebo collection<uint8>. Chyba hlášená brokerem zastaví skript s jejím textem. Broker se nastavuje podle stránky MQTT Broker.

Příklad

MQTTPUBLISH("shellies/" + plugTopic + "/relay/0/command", IF(St > 0, "on", "off"));

FTPDOWNLOAD

FTPDOWNLOAD stáhne soubor ze serveru FTP modulu a vrátí jeho obsah jako kolekci bajtů (collection<uint8>).

1
FTPDOWNLOAD(path)

Příklad

VAR data := FTPDOWNLOAD("/export/values.csv");
VAR csv := TOSTRING(data, "utf-8");

FTPUPLOAD

FTPUPLOAD zapíše data do souboru na serveru FTP modulu — s "write" (výchozí) soubor nahradí, s "append" data připojí na jeho konec.

1
FTPUPLOAD(path, data [, mode])

Poznámky — data je řetězec nebo collection<uint8>. mode musí být malými písmeny.

Příklad

FTPUPLOAD("/path/to/file", "some data", "write");
FTPUPLOAD("/path/to/file", BYTECOLLECTION("a7 ff e2"), "append");

Chyby — FTPUPLOAD - invalid argument, upload mode must be ‘append’ or ‘write’.

COMPLETESERVICEATTRIBUTE

COMPLETESERVICEATTRIBUTE předá hodnotu servisního atributu do aplikace z listener skriptu TCP nebo UDP poté, co skript atributu odeslal požadavek přes SENDDATA.

1
COMPLETESERVICEATTRIBUTE(name, value [, error])

Poznámky — name je název servisního atributu. S error atribut místo hodnoty zobrazí text chyby. Vrací Null.

Příklad

COMPLETESERVICEATTRIBUTE("Uptime", "2d:21h:43m");
COMPLETESERVICEATTRIBUTE("Status", "", "Device is offline");

COMPLETESERVICEACTION

COMPLETESERVICEACTION ohlásí výsledek servisní akce do aplikace z listener skriptu TCP nebo UDP poté, co skript akce odeslal požadavek přes SENDDATA.

1
COMPLETESERVICEACTION(name, result)

Příklad

COMPLETESERVICEACTION("Reboot", "Rebooted successfully");

Chyby — No service action with name X.

Viz také — Listener skripty, Funkce pro parsování, Převody datových typů.