Aller au contenu
JelinaJelina DocumentationDocumentation technique
Retour au site officiel

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.

  1. Personnalisez le format de publication MQTT et configurez une tâche CRON pour transférer les données.
  2. Personnalisez l’analyse des messages reçus ; le backend Edge-EMS Builder écrit les résultats dans les points spécifiés.
  3. 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 ou nil.

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
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 = {}
-- Heure
map.time = OffsetDateTime.now():unixMilli()
-- Valeur de données ordinaire
map.name = "${数据8}"
-- Tableau de chaînes
map.strList = { "${数据3}", "${数据4}" }
-- Tableau de nombres
local d3 = ${数据3}
local d4 = ${数据4}
map.numberList = { d3, d4 }
return map

Exemple 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)
{
"strList": [
"3.6",
"0.6"
],
"name": "2",
"time": 1742180870064,
"numberList": [
3.6,
0.6
]
}
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
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.

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"])
-- 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 resultList

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

Topic d’abonnement : /rpc/yanhua001/ems/strategy/request

Remarque : iot_code est une donnée agrégée.

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

Exigences du résultat :

  1. dataType doit être Collection (données brutes), Customization (données par plage horaire) ou Aggregation (données agrégées).
  2. dataKey doit exister.
  3. Si un dataKey Customization possède plusieurs valeurs, leurs périodes de validité ne doivent pas se chevaucher.
  4. 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.

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}

Topic de réponse cible : /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}

Topic de réponse cible : /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
}
]
}
}

Remarque : le JSON réel est compacté.

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