TapHome

Funkcie Packet parsera

Funkcie Packet parsera v skripte TapHome — HTTPREQUEST, SENDHTTPREQUEST, SENDDATA, MQTTPUBLISH, FTPDOWNLOAD, FTPUPLOAD, COMPLETESERVICEATTRIBUTE a COMPLETESERVICEACTION — pre HTTP, TCP, UDP, MQTT a FTP.

Funkcie Packet parsera komunikujú so zariadeniami cez HTTP, TCP, UDP, MQTT a FTP. Fungujú iba v skriptoch modulu alebo zariadenia Packet parsera, ktorého protokol zodpovedá funkcii; inde sa skript zastaví chybou PacketParserFunction - PacketParserContext is null. Všetky potrebujú Core 2022.2 alebo novší. Nastavenie modulu Packet parsera opisuje stránka Packet parser; prichádzajúce správy spracúvajú listener skripty a Modbus zariadenia majú vlastné funkcie Modbus.

Protokoly a skripty

Každý protokol má vlastné funkcie a typické rozdelenie práce medzi skriptmi.

ProtokolFunkcieTypické skripty
HTTPHTTPREQUEST, SENDHTTPREQUESTSkript na čítanie modulu pošle jednu požiadavku a odpoveď uloží do premennej modulu; skripty na čítanie zariadení ju parsujú.
TCP, UDPSENDDATASkripty na čítanie alebo na zápis pošlú požiadavku; odpoveď príde do listener skriptu.
MQTTMQTTPUBLISHListener skript spracúva prichádzajúce správy; skript na zápis publikuje príkazy.
FTPFTPDOWNLOAD, FTPUPLOADSkripty na čítanie a na zápis prenášajú súbory.

Príklad — jedna HTTP požiadavka pre všetky zariadenia modulu

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

Prvý skript je skript na čítanie modulu, druhý skript na čítanie zariadenia; StatusJson je premenná modulu.

HTTPREQUEST

HTTPREQUEST zostaví hodnotu httprequest, ktorej cestu, metódu, telo a hlavičky možno pred odoslaním funkciou SENDHTTPREQUEST zmeniť.

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

Poznámky — Predvolená metóda je GET. Vlastnosti PATH, METHOD, BODY a HEADERS sa dajú čítať aj zapisovať; HEADERS je kolekcia reťazcov v tvare "Name: value". Funkcia iba vytvára hodnotu, takže funguje v každom skripte.

Prí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 pošle HTTP požiadavku, počká na odpoveď a vráti ju ako hodnotu httpresponse s vlastnosťami Content, StatusCode, ReasonPhrase, IsSuccess a Headers.

1
2
SENDHTTPREQUEST(path [, method [, body [, header1, header2, …]]])
SENDHTTPREQUEST(request)
NázovTypPopis
pathreťazecCesta na zariadení nastavenom v module, napríklad "/status".
methodreťazec, voliteľnýGET (predvolené), POST, PUT, …
bodyreťazec, voliteľnýTelo požiadavky.
header1 …reťazec, voliteľnýAž 27 hlavičiek v tvare "Name: value".
requesthttprequestPožiadavka zostavená funkciou HTTPREQUEST.

Návratová hodnota — httpresponse:

VlastnosťVýznam
ContentTelo odpovede ako text.
StatusCodeStavový kód HTTP, napríklad 200.
ReasonPhraseText stavu, napríklad OK.
IsSuccessTRUE pre stavové kódy 200 – 299.
HeadersHlavičky odpovede ako text JSON — pole {"Key": …, "Value": [ … ]} — ktorý sa dá čítať funkciou PARSEJSON.

Poznámky — Iba pre modul s protokolom HTTP. Odpoveď môže mať najviac 128 kB.

Prí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žíva iný protokol).

SENDDATA

SENDDATA pošle reťazec alebo bajtovú kolekciu cez TCP alebo UDP a vráti TRUE; odpoveď príde do listener skriptu.

1
SENDDATA(data)

Poznámky — Reťazec sa pošle ako bajty iso-8859-1. Kolekcia musí byť collection<uint8>. Prichádzajúce dáta sa doručujú listener skriptu po častiach s veľkosťou najviac 4096 bajtov.

Príklad

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

MQTTPUBLISH

MQTTPUBLISH publikuje správu so zadaným topicom na MQTT broker modulu a vráti Null.

1
MQTTPUBLISH(topic, data)

Poznámky — data je reťazec alebo collection<uint8>. Chyba, ktorú hlási broker, zastaví skript s jej textom. Broker sa nastavuje podľa stránky MQTT broker.

Príklad

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

FTPDOWNLOAD

FTPDOWNLOAD stiahne súbor z FTP servera modulu a vráti jeho obsah ako bajtovú kolekciu (collection<uint8>).

1
FTPDOWNLOAD(path)

Príklad

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

FTPUPLOAD

FTPUPLOAD zapíše dáta do súboru na FTP serveri modulu — s "write" (predvolené) súbor nahradí, s "append" pridá dáta na jeho koniec.

1
FTPUPLOAD(path, data [, mode])

Poznámky — data je reťazec alebo collection<uint8>. mode musí byť napísaný malými písmenami.

Prí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 doručí hodnotu servisného atribútu do aplikácie z TCP alebo UDP listener skriptu potom, čo skript atribútu poslal požiadavku funkciou SENDDATA.

1
COMPLETESERVICEATTRIBUTE(name, value [, error])

Poznámky — name je názov servisného atribútu. S argumentom error atribút namiesto hodnoty zobrazí text chyby. Vracia Null.

Príklad

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

COMPLETESERVICEACTION

COMPLETESERVICEACTION ohlási výsledok servisnej akcie do aplikácie z TCP alebo UDP listener skriptu potom, čo skript akcie poslal požiadavku funkciou SENDDATA.

1
COMPLETESERVICEACTION(name, result)

Príklad

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

Chyby — No service action with name X.

Pozrite aj — Listener skripty, Parsovacie funkcie, Konverzie dátových typov.