- Présentation de Jelina
- EMS Builder
- Manuel de référence
Manuel des scripts de publication et d’abonnement MQTT
Les scripts utilisent Lua. Consultez Coordination cloud-edge MQTT pour les rôles des configurations de connexion, publication et abonnement. Cette page détaille les paramètres d’écriture, les scripts complets et les formats de requête/réponse.
Présentation
Section intitulée « Présentation »- Personnalisez le format de publication MQTT et configurez une tâche CRON pour transférer les données.
- Personnalisez l’analyse des messages reçus ; le backend Edge-EMS Builder écrit les résultats dans les points spécifiés.
- Définissez si une réponse est requise après traitement d’un message reçu, ainsi que son topic et son contenu.
Remarque : des bases de programmation et une connaissance de la publication/abonnement MQTT sont nécessaires. Consultez la référence complète Lua pour la syntaxe.
Si un point référencé n’a pas de valeur disponible, la chaîne sentinelle
__Null__est injectée. Testez explicitement${dataKey} == "__Null__", sans supposer une chaîne vide ounil.
Connexion MQTT
Section intitulée « Connexion MQTT »| Paramètre | Valeur | Obligatoire | Type | Description |
|---|---|---|---|---|
| mqttConnectionConfigName | Nom de configuration de connexion | Oui | String | Nom de la configuration de connexion MQTT |
| status | Valid | Oui | String | État, indiquant si la connexion est activée |
| protocol | mqtts | Oui | String | Protocole MQTT : mqtt/mqtts |
| protocolVersion | 3.1.1 | Oui | String | Version MQTT : 3.1/3.1.1/5.0 |
| serverHost | 127.0.0.1 | Oui | String | Adresse de connexion MQTT |
| serverPort | 8883 | Oui | String | Port de connexion MQTT |
| clientId | return "demo-edge" |
Oui | String | Expression Lua renvoyant l’ID client |
| username | username | Oui | String | Nom d’utilisateur |
| password | password | Oui | String | Mot de passe |
| cleanSession | true | Oui | Boolean | Nettoyage de session |
| sessionExpiryInterval | 0 | Oui | Number | Intervalle d’expiration de session, propre à MQTT5.0 |
| keepAliveInterval | 60 | Oui | String | Intervalle de heartbeat |
| connectTimeout | 30 | Oui | String | Délai de connexion |
| sslEnable | true | Oui | Boolean | Utilisation de SSL |
Publication des données MQTT
Section intitulée « Publication des données MQTT »| Paramètre | Valeur | Obligatoire | Type | Description |
|---|---|---|---|---|
| mqttConnectionConfigId | 100101 | Oui | Number | ID de configuration de connexion MQTT |
| mqttPublishConfigName | Nom de configuration de publication | Oui | String | Nom de la configuration de publication MQTT |
| topic | return "demo/telemetry" |
Oui | String | Expression Lua renvoyant le topic |
| qos | “1” | Oui | String | Énumération QoS sous forme de chaîne |
| publishStrategy | 0/10 * * * * ? | Oui | String | Stratégie de publication, expression CRON |
| publishContent | {“name”: “dataKey”} | Oui | String | Contenu publié, script Lua |
| note | note | Oui | String | Remarque |
La publication sérialise le résultat du script en JSON. Pour publier un objet, renvoyez directement une table Lua ; un appel préalable à toJsonString produit une chaîne JSON entourée de guillemets.
Exemple publishContent 1 : construction d’une table
Section intitulée « Exemple publishContent 1 : construction d’une table »local map = {}-- Heuremap.time = OffsetDateTime.now():unixMilli()-- Valeur de données ordinairemap.name = "${数据8}"-- Tableau de chaînesmap.strList = { "${数据3}", "${数据4}" }-- Tableau de nombreslocal d3 = ${数据3}local d4 = ${数据4}map.numberList = { d3, d4 }
return mapExemple publishContent 2 : concaténation de chaînes
Section intitulée « Exemple publishContent 2 : concaténation de chaînes »local json = '{"strList":["${数据3}","${数据4}"],"name":"${数据8}","time":' .. OffsetDateTime.now():unixMilli() .. ',"numberList":[' .. ${数据3} .. ',' .. ${数据4} .. ']}'return jsonToMap(json)Résultat de l’analyse
Section intitulée « Résultat de l’analyse »{ "strList": [ "3.6", "0.6" ], "name": "2", "time": 1742180870064, "numberList": [ 3.6, 0.6 ]}Abonnement aux messages MQTT
Section intitulée « Abonnement aux messages MQTT »| Paramètre | Valeur | Obligatoire | Type | Description |
|---|---|---|---|---|
| mqttConnectionConfigId | 2 | Oui | Number | ID de configuration de connexion MQTT |
| mqttSubscribeConfigName | Nom de configuration d’abonnement | Oui | String | Nom de la configuration d’abonnement MQTT |
| status | Valid | Oui | String | État |
| topic | return "demo/commands" |
Oui | String | Expression Lua renvoyant le topic |
| qos | “1” | Oui | String | Énumération QoS sous forme de chaîne |
| actionContent | {} | Oui | String | Contenu de l’action, script Lua |
| needResponse | true | Oui | Boolean | Réponse requise ou non |
| responseTopic | return "demo/replies" |
Si la réponse est activée | String | Expression Lua renvoyant le topic de réponse |
| response | return {ok=true} |
Si la réponse est activée | String | Script de réponse : chaîne envoyée telle quelle, table sérialisée en JSON |
| note | note | Oui | String | Remarque |
actionContent : analyser le message reçu
Section intitulée « actionContent : analyser le message reçu »Paramètres d’écriture
Section intitulée « Paramètres d’écriture »| Paramètre | Valeur | Obligatoire | Type | Description |
|---|---|---|---|---|
| dataType | Customization | Oui | String | Type de données à manipuler : Customization/Collection/Aggregation |
| dataKey | 功率 | Oui | String | dataKey unique des données |
| dataValue | topic | Oui | String | Valeur des données |
| availableDate | 2023-01-15T07:00:00+08:00 | Non | String | Date de début de validité (Customization) |
| expiredDate | 2023-01-15T10:00:00+08:00 | Non | String | Date de fin de validité (Customization) |
Paramètres fixes :
${subscribe_message} : message reçu depuis le topic.
Dans Edge-EMS Builder, ne créez pas de dataKey identique aux dataKey réservés ci-dessus.
Analyse actionContent
Section intitulée « Analyse actionContent »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"])
-- Type à écrire : Collection (données brutes)/Customization (données par plage horaire)/Aggregation (données agrégées) 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 resultListExemple de requête
Section intitulée « Exemple de requête »/rpc/${iot_code}/${method}/request
Topic d’abonnement : /rpc/yanhua001/ems/strategy/request
Remarque : iot_code est une donnée agrégée.
Message envoyé
Section intitulée « Message envoyé »{ "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 } ] } }Résultat de l’analyse action
Section intitulée « Résultat de l’analyse action »Exigences du résultat :
- dataType doit être Collection (données brutes), Customization (données par plage horaire) ou Aggregation (données agrégées).
- dataKey doit exister.
- Si un dataKey Customization possède plusieurs valeurs, leurs périodes de validité ne doivent pas se chevaucher.
- Une mise à jour Customization supprime entièrement les valeurs existantes et les remplace par celles envoyées.
{ "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 : analyser l’abonnement de réponse
Section intitulée « responseTopic : analyser l’abonnement de réponse »Paramètres fixes :
${subscribe_message} : message reçu depuis le topic.
${subscribe_result} : réussite ou échec de l’exécution d’actionContent.
${subscribe_result_message} : résultat d’exécution d’actionContent, par exemple le résultat de l’analyse action.
Dans Edge-EMS Builder, ne créez pas de dataKey identique aux dataKey réservés ci-dessus.
Analyse responseTopic
Section intitulée « Analyse responseTopic »local messageMap = jsonToMap(${subscribe_message})local id = messageMap.idlocal method = messageMap.methodreturn "/rpc/" .. "${iot_code}" .. "/" .. method .. "/response/" .. idExemple de requête
Section intitulée « Exemple de requête »/rpc/${iot_code}/${method}/response/${id}
Topic de réponse cible : /rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9
Message envoyé
Section intitulée « Message envoyé »{ "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 } ] } }Résultat de l’analyse du topic
Section intitulée « Résultat de l’analyse du topic »/rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9response : construire la réponse retournée
Section intitulée « response : construire la réponse retournée »Analyse response
Section intitulée « Analyse response »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 resultMapExemple de requête
Section intitulée « Exemple de requête »/rpc/${iot_code}/${method}/response/${id}
Topic de réponse cible : /rpc/yanhua001/ems/strategy/response/d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9
Message envoyé
Section intitulée « Message envoyé »{ "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 } ] } }Résultat de l’analyse du topic
Section intitulée « Résultat de l’analyse du topic »Remarque : le JSON réel est compacté.
{ "result": "true", "id": "d1acc980-0e4e-11e8-98f0-ab5030b47df4:d1db7aa0-0e4e-11e8-b1d9-5f0ab230c0d9", "jsonrpc": "2.0"}Étapes suivantes
Section intitulée « Étapes suivantes »- Concepts de coordination cloud-edge (connexion, publication, abonnement et reprise après déconnexion) : Coordination cloud-edge MQTT.
- Référence complète des fonctions intégrées et modules Lua : Référence complète Lua.