- Jelina-Überblick
- EMS Builder
- Referenzhandbuch
MQTT-Publish-/Subscribe-Skripthandbuch
Die Skriptsprache ist Lua. Lesen Sie zunächst MQTT-Cloud-Edge-Koordination zu den Grundkonzepten und zur Rolle der Verbindungs-, Publish- und Subscribe-Konfigurationen. Diese Seite beschreibt Schreibparameter, vollständige Skriptbeispiele und Formate für Anfrage-/Antwortnachrichten im Detail.
Überblick
Abschnitt betitelt „Überblick“- Das Format veröffentlichter MQTT-Daten kann angepasst werden. Für den Daten-Upload lassen sich CRON-Aufgaben konfigurieren.
- Die Auswertung abonnierter Nachrichten kann angepasst werden. Das Backend von Edge-EMS Builder schreibt anhand des Ergebnisses in die angegebenen Datenpunkte.
- Nach der Verarbeitung einer abonnierten Nachricht können Sie festlegen, ob eine response erforderlich ist und welches Topic und welchen Inhalt sie verwendet.
Hinweis: Erforderlich sind Programmiergrundkenntnisse und Vertrautheit mit dem MQTT-Publish-/Subscribe-Ablauf. Die Skriptsyntax beschreibt die vollständige Lua-Skriptreferenz.
Ist für einen im Skript referenzierten Datenpunkt kein Wert verfügbar, wird der Sentinel-String
__Null__eingesetzt. Prüfen Sie ausdrücklich${dataKey} == "__Null__". Nehmen Sie weder einen leeren String nochnilan.
MQTT-Verbindung
Abschnitt betitelt „MQTT-Verbindung“| Parametername | Parameterwert | Pflichtfeld | Parametertyp | Beschreibung |
|---|---|---|---|---|
| mqttConnectionConfigName | Name der Verbindungskonfiguration | Ja | String | Name der MQTT-Verbindungskonfiguration |
| status | Valid | Ja | String | Status: Verbindung aktiviert oder deaktiviert |
| protocol | mqtts | Ja | String | MQTT-Protokoll; unterstützt mqtt/mqtts |
| protocolVersion | 3.1.1 | Ja | String | MQTT-Protokollversion; unterstützt 3.1/3.1.1/5.0 |
| serverHost | 127.0.0.1 | Ja | String | MQTT-Verbindungsadresse |
| serverPort | 8883 | Ja | String | MQTT-Verbindungsport |
| clientId | return "demo-edge" |
Ja | String | Lua-Ausdruck, der die Client-ID zurückgibt |
| username | username | Ja | String | Benutzername |
| password | password | Ja | String | Passwort |
| cleanSession | true | Ja | Boolean | Sitzung bereinigen |
| sessionExpiryInterval | 0 | Ja | Number | Ablaufintervall der Sitzung; nur MQTT 5.0 |
| keepAliveInterval | 60 | Ja | String | Keep-Alive-Intervall |
| connectTimeout | 30 | Ja | String | Verbindungszeitlimit |
| sslEnable | true | Ja | Boolean | SSL verwenden |
MQTT-Daten veröffentlichen
Abschnitt betitelt „MQTT-Daten veröffentlichen“| Parametername | Parameterwert | Pflichtfeld | Parametertyp | Beschreibung |
|---|---|---|---|---|
| mqttConnectionConfigId | 100101 | Ja | Number | ID der MQTT-Verbindungskonfiguration |
| mqttPublishConfigName | Name der Publish-Konfiguration | Ja | String | Name der MQTT-Publish-Konfiguration |
| topic | return "demo/telemetry" |
Ja | String | Lua-Ausdruck, der das Topic zurückgibt |
| qos | “1” | Ja | String | QoS-Enum als String |
| publishStrategy | 0/10 * * * * ? | Ja | String | Publish-Strategie als CRON-Ausdruck |
| publishContent | {“name”: “dataKey”} | Ja | String | Publish-Inhalt als Lua-Skript |
| note | note | Ja | String | Anmerkung |
Der Publish-Ablauf serialisiert das Skriptergebnis in JSON. Geben Sie beim Veröffentlichen eines Objekts direkt eine Lua-Tabelle zurück. Ein vorzeitiger Aufruf von toJsonString erzeugt einen JSON-String mit Anführungszeichen.
publishContent – Beispiel 1: Tabelle erstellen
Abschnitt betitelt „publishContent – Beispiel 1: Tabelle erstellen“local map = {}-- Zeitpunktmap.time = OffsetDateTime.now():unixMilli()-- Regulärer Datenwertmap.name = "${数据8}"-- String-Arraymap.strList = { "${数据3}", "${数据4}" }-- Zahlen-Arraylocal d3 = ${数据3}local d4 = ${数据4}map.numberList = { d3, d4 }
return mappublishContent – Beispiel 2: Strings verketten
Abschnitt betitelt „publishContent – Beispiel 2: Strings verketten“local json = '{"strList":["${数据3}","${数据4}"],"name":"${数据8}","time":' .. OffsetDateTime.now():unixMilli() .. ',"numberList":[' .. ${数据3} .. ',' .. ${数据4} .. ']}'return jsonToMap(json)Auswertungsergebnis
Abschnitt betitelt „Auswertungsergebnis“{ "strList": [ "3.6", "0.6" ], "name": "2", "time": 1742180870064, "numberList": [ 3.6, 0.6 ]}MQTT-Nachrichten abonnieren
Abschnitt betitelt „MQTT-Nachrichten abonnieren“| Parametername | Parameterwert | Pflichtfeld | Parametertyp | Beschreibung |
|---|---|---|---|---|
| mqttConnectionConfigId | 2 | Ja | Number | ID der MQTT-Verbindungskonfiguration |
| mqttSubscribeConfigName | Name der Subscribe-Konfiguration | Ja | String | Name der MQTT-Subscribe-Konfiguration |
| status | Valid | Ja | String | Status |
| topic | return "demo/commands" |
Ja | String | Lua-Ausdruck, der das Topic zurückgibt |
| qos | “1” | Ja | String | QoS-Enum als String |
| actionContent | {} | Ja | String | Aktionsinhalt als Lua-Skript |
| needResponse | true | Ja | Boolean | Gibt an, ob eine response erforderlich ist |
| responseTopic | return "demo/replies" |
Bei aktivierter Antwort | String | Lua-Ausdruck, der das Antwort-Topic zurückgibt |
| response | return {ok=true} |
Bei aktivierter Antwort | String | Antwortskript: Strings werden unverändert gesendet, Tabellen in JSON serialisiert |
| note | note | Ja | String | Anmerkung |
actionContent: Abonnierte message auswerten
Abschnitt betitelt „actionContent: Abonnierte message auswerten“Schreibparameter
Abschnitt betitelt „Schreibparameter“| Parametername | Parameterwert | Pflichtfeld | Parametertyp | Beschreibung |
|---|---|---|---|---|
| dataType | Customization | Ja | String | Zu bearbeitender Datentyp: Customization/Collection/Aggregation |
| dataKey | 功率 | Ja | String | Eindeutiger dataKey des Datenpunkts |
| dataValue | topic | Ja | String | Datenwert |
| availableDate | 2023-01-15T07:00:00+08:00 | Nein | String | Beginn der Gültigkeit (Customization) |
| expiredDate | 2023-01-15T10:00:00+08:00 | Nein | String | Ende der Gültigkeit (Customization) |
Feste Parameter:
${subscribe_message}: Die über das abonnierte Topic empfangene message.
Konfigurieren Sie in Edge-EMS Builder keine dataKey-Werte, die mit den oben genannten festen dataKey-Werten kollidieren.
actionContent auswerten
Abschnitt betitelt „actionContent auswerten“local messageMap = jsonToMap(${subscribe_message})local params = messageMap.paramslocal strategyList = jsonToListMap(toJsonString(params.strategy))local date = params.datelocal resultList = {}
for i, keyMap in ipairs(strategyList) do local availableDate = completeDateTime(date .. "T" .. keyMap.start) local expiredDate = completeDateTime(date .. "T" .. keyMap["end"])
-- Zu schreibender Datentyp: Collection (Rohdaten), Customization (Zeitplandaten) oder Aggregation (Aggregationsdaten) local modeMap = buildCommonWriteMap("Customization", "mode", tostring(keyMap.mode), availableDate, expiredDate, false) local chargeMap = buildCommonWriteMap("Customization", "charge", tostring(keyMap.charge), availableDate, expiredDate, false) local valueMap = buildCommonWriteMap("Customization", "value", tostring(keyMap.value), availableDate, expiredDate, false)
table.insert(resultList, modeMap) table.insert(resultList, chargeMap) table.insert(resultList, valueMap)end
table.insert(resultList, buildSlaveWriteMap("DeviceB", "Share", "数据4", 777, nil, nil, false))
return resultListAnfragebeispiel
Abschnitt betitelt „Anfragebeispiel“/rpc/${iot_code}/${method}/request
Abonniertes Topic: /rpc/yanhua001/ems/strategy/request
Hinweis: iot_code ist ein Aggregationsdatenpunkt.
Nachricht senden
Abschnitt betitelt „Nachricht senden“{ "jsonrpc":"2.0", "id":"d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9", "method":"ems/strategy", "params":{ "date":"2023-1-15", "strategy":[ { "strategyDate":"2023-1-15", "start":"00:00:00", "end":"05:00:00", "mode":1, "charge":true, "value":100 }, { "start":"05:00:00", "end":"07:00:00", "mode":2, "charge":false, "value":100 } ] } }action-Auswertungsergebnis
Abschnitt betitelt „action-Auswertungsergebnis“Anforderungen an das Auswertungsergebnis:
- dataType darf nur Collection (Rohdaten), Customization (Zeitplandaten) oder Aggregation (Aggregationsdaten) sein.
- dataKey muss vorhanden sein.
- Enthält ein Customization-dataKey mehrere value-Einträge, dürfen sich deren Gültigkeitszeiträume nicht überschneiden.
- Beim Aktualisieren von Customization-Daten werden die vorhandenen Daten vollständig gelöscht und durch die neu übermittelten Daten ersetzt.
{ "actionType": "SUBSCRIBE", "actionResult": true, "mqttActionContent": { "Customization": { "mode": [ { "dataType": "Customization", "dataKey": "mode", "dataValue": "1", "availableDate": "2023-01-15T00:00:00+08:00", "expiredDate": "2023-01-15T05:00:00+08:00" }, { "dataType": "Customization", "dataKey": "mode", "dataValue": "2", "availableDate": "2023-01-15T05:00:00+08:00", "expiredDate": "2023-01-15T07:00:00+08:00" } ], "charge": [ { "dataType": "Customization", "dataKey": "charge", "dataValue": "true", "availableDate": "2023-01-15T00:00:00+08:00", "expiredDate": "2023-01-15T05:00:00+08:00" }, { "dataType": "Customization", "dataKey": "charge", "dataValue": "false", "availableDate": "2023-01-15T05:00:00+08:00", "expiredDate": "2023-01-15T07:00:00+08:00" } ], "value": [ { "dataType": "Customization", "dataKey": "value", "dataValue": "100", "availableDate": "2023-01-15T00:00:00+08:00", "expiredDate": "2023-01-15T05:00:00+08:00" }, { "dataType": "Customization", "dataKey": "value", "dataValue": "100", "availableDate": "2023-01-15T05:00:00+08:00", "expiredDate": "2023-01-15T07:00:00+08:00" } ] } }, "mqttActionResult": {
}}responseTopic: Antwort-Topic ermitteln
Abschnitt betitelt „responseTopic: Antwort-Topic ermitteln“Feste Parameter:
${subscribe_message}: Die über das abonnierte Topic empfangene message.
${subscribe_result}: Gibt an, ob actionContent erfolgreich ausgeführt wurde.
${subscribe_result_message}: Ergebnis der Ausführung von actionContent, siehe action-Auswertungsergebnis.
Konfigurieren Sie in Edge-EMS Builder keine dataKey-Werte, die mit den oben genannten festen dataKey-Werten kollidieren.
responseTopic auswerten
Abschnitt betitelt „responseTopic auswerten“local messageMap = jsonToMap(${subscribe_message})local id = messageMap.idlocal method = messageMap.methodreturn "/rpc/" .. "${iot_code}" .. "/" .. method .. "/response/" .. idAnfragebeispiel
Abschnitt betitelt „Anfragebeispiel“/rpc/${iot_code}/${method}/response/${id}
Ziel-Topic der Antwort: /rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9
Nachricht senden
Abschnitt betitelt „Nachricht senden“{ "jsonrpc":"2.0", "id":"d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9", "method":"ems/strategy", "params":{ "date":"2023-1-15", "strategy":[ { "strategyDate":"2023-1-15", "start":"00:00:00", "end":"05:00:00", "mode":1, "charge":true, "value":100 }, { "start":"05:00:00", "end":"07:00:00", "mode":2, "charge":false, "value":100 } ] } }topic-Auswertungsergebnis
Abschnitt betitelt „topic-Auswertungsergebnis“/rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9response: Antwort zusammenstellen
Abschnitt betitelt „response: Antwort zusammenstellen“response auswerten
Abschnitt betitelt „response auswerten“local messageMap = jsonToMap(${subscribe_message})local id = messageMap.idlocal jsonrpc = messageMap.jsonrpclocal result = "${subscribe_result}"
local resultMap = {}resultMap.jsonrpc = jsonrpcresultMap.result = resultresultMap.id = id
return resultMapAnfragebeispiel
Abschnitt betitelt „Anfragebeispiel“/rpc/${iot_code}/${method}/response/${id}
Ziel-Topic der Antwort: /rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9
Nachricht senden
Abschnitt betitelt „Nachricht senden“{ "jsonrpc":"2.0", "id":"d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9", "method":"ems/strategy", "params":{ "date":"2023-1-15", "strategy":[ { "strategyDate":"2023-1-15", "start":"00:00:00", "end":"05:00:00", "mode":1, "charge":true, "value":100 }, { "start":"05:00:00", "end":"07:00:00", "mode":2, "charge":false, "value":100 } ] } }topic-Auswertungsergebnis
Abschnitt betitelt „topic-Auswertungsergebnis“Hinweis: Tatsächlich wird kompaktes JSON verwendet.
{ "result": "true", "id": "d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9", "jsonrpc": "2.0"}Nächste Schritte
Abschnitt betitelt „Nächste Schritte“- Grundkonzepte der MQTT-Cloud-Edge-Koordination (Verbindungs-/Publish-/Subscribe-Konfigurationen und Wiederaufnahme nach Verbindungsunterbrechungen): MQTT-Cloud-Edge-Koordination
- Vollständige Referenz integrierter Lua-Funktionen und -Module: Vollständige Lua-Skriptreferenz