Zum Inhalt springen
JelinaJelina DocumentationTechnische Dokumentation
Zur Website

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.

  1. Das Format veröffentlichter MQTT-Daten kann angepasst werden. Für den Daten-Upload lassen sich CRON-Aufgaben konfigurieren.
  2. Die Auswertung abonnierter Nachrichten kann angepasst werden. Das Backend von Edge-EMS Builder schreibt anhand des Ergebnisses in die angegebenen Datenpunkte.
  3. 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 noch nil an.

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
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.

local map = {}
-- Zeitpunkt
map.time = OffsetDateTime.now():unixMilli()
-- Regulärer Datenwert
map.name = "${数据8}"
-- String-Array
map.strList = { "${数据3}", "${数据4}" }
-- Zahlen-Array
local d3 = ${数据3}
local d4 = ${数据4}
map.numberList = { d3, d4 }
return map
local json = '{"strList":["${数据3}","${数据4}"],"name":"${数据8}","time":' .. OffsetDateTime.now():unixMilli() .. ',"numberList":[' .. ${数据3} .. ',' .. ${数据4} .. ']}'
return jsonToMap(json)
{
"strList": [
"3.6",
"0.6"
],
"name": "2",
"time": 1742180870064,
"numberList": [
3.6,
0.6
]
}
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
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.

local messageMap = jsonToMap(${subscribe_message})
local params = messageMap.params
local strategyList = jsonToListMap(toJsonString(params.strategy))
local date = params.date
local 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 resultList

/rpc/${iot_code}/${method}/request

Abonniertes Topic: /rpc/yanhua001/ems/strategy/request

Hinweis: iot_code ist ein Aggregationsdatenpunkt.

{
"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
}
]
}
}

Anforderungen an das Auswertungsergebnis:

  1. dataType darf nur Collection (Rohdaten), Customization (Zeitplandaten) oder Aggregation (Aggregationsdaten) sein.
  2. dataKey muss vorhanden sein.
  3. Enthält ein Customization-dataKey mehrere value-Einträge, dürfen sich deren Gültigkeitszeiträume nicht überschneiden.
  4. 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": {
}
}

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.

local messageMap = jsonToMap(${subscribe_message})
local id = messageMap.id
local method = messageMap.method
return "/rpc/" .. "${iot_code}" .. "/" .. method .. "/response/" .. id

/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

{
"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
}
]
}
}
/rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9
local messageMap = jsonToMap(${subscribe_message})
local id = messageMap.id
local jsonrpc = messageMap.jsonrpc
local result = "${subscribe_result}"
local resultMap = {}
resultMap.jsonrpc = jsonrpc
resultMap.result = result
resultMap.id = id
return resultMap

/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

{
"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
}
]
}
}

Hinweis: Tatsächlich wird kompaktes JSON verwendet.

{
"result": "true",
"id": "d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9",
"jsonrpc": "2.0"
}