Module Lua addon
Le module addon
permet de se connecter dynamiquement à un service gRPC, d'appeler des méthodes via réflexion et d'établir des flux de messages. Il prend en charge des services l'addon-can.
Importation
Pour l’importer dans Lua :
Configuration
Exemple de configuration dans le fichier YAML de l’agent :
iot:
modules:
addon:
- name: addon1
address: "localhost:50051"
timeout: 5
useTLS: false
addonType: "canbus"
Détails des options
- name : Nom du module, utilisé dans le
require
. Doit être unique. - address : Adresse du serveur gRPC.
- timeout : Délai en secondes pour les connexions ou appels.
- useTLS : Si
true
, tente une connexion sécurisée TLS. - addonType : Type de service gRPC. Exemple :
canbus
.
Fonctions Lua
addon.connect()
Établit une connexion gRPC au service distant.
-
Retour :
-
true
,nil
si la connexion est établie. nil
,"message"
si une erreur survient.
addon.disconnect()
Ferme la connexion gRPC précédemment ouverte.
-
Retour :
-
true
,nil
en cas de succès. nil
,"message"
en cas d’erreur.
addon.call(method, request_table)
Effectue un appel RPC sur le service configuré (ex: canbus.CANService
).
-
Paramètres :
-
method
(string) : Nom de la méthode RPC (ex:"GetCurrentSignalValues"
). -
request_table
(table) : Données du message d'entrée (optionnel). -
Retour :
-
Une table Lua représentant la réponse.
nil
,"message"
en cas d’erreur.
local resp, err = addon.call("GetCurrentSignalValues", {})
if resp then
print(resp)
else
print("Erreur appel RPC : " .. err)
end
addon.stream(method, request_table)
Crée un flux gRPC bidirectionnel (ou serveur) et retourne un itérateur Lua.
-
Paramètres :
-
method
(string) : Nom de la méthode de streaming (ex:"SubscribeFrames"
). -
request_table
(table) : Données d’entrée (souvent{}
). -
Retour :
-
Un itérateur Lua. Chaque appel retourne
message, nil
, ounil, err
.
local stream = addon.stream("SubscribeFrames", {})
if not stream then
print("Erreur ouverture flux")
return
end
for msg, err in stream do
if msg then
print("Reçu :", msg)
elseif err then
print("Erreur flux :", err)
end
end
Champs Lua associés
addon.name
: Retourne le nom du module.addon.type
: Retourne le type"addon"
.
Cas d’usage avec l'addon CAN
Lire les valeurs courantes
local addon = require("addon1")
addon.connect()
local resp = addon.call("GetCurrentSignalValues", {})
for _, frame in ipairs(resp.frames) do
print("Frame ID:", frame.id)
for _, sig in ipairs(frame.signals) do
print(" ", sig.name, "=", sig.value)
end
end
Écouter les trames en temps réel
local addon = require("addon1")
addon.connect()
local stream = addon.stream("SubscribeFrames", {})
for msg, err in stream do
if msg then
print("Frame:", msg.name, "ID:", msg.id)
elseif err then
print("Erreur stream :", err)
end
end
Exemple : Envoi d’une trame CAN via Reset
Le service gRPC Reset
de reinitialise les valeurs des signaux CAN.
Voici comment l’utiliser en Lua via le module addon
.
Exemple Lua
local addon = require("addon1")
-- Connexion au service gRPC
local ok, err = addon.connect()
if not ok then
print("Connexion échouée :", err)
return
end
-- Reinitialisation des valeurs des signaux CAN
local resp, err = addon.call("Reset")
if resp then
print(resp.message)
else
print("Erreur d'envoi :", err)
end
Exemple : Envoi d’une trame CAN via SendFrame
Le service gRPC SendFrame
permet d’envoyer une trame CAN construite à partir des définitions DBC chargées côté serveur.
Voici comment l’utiliser en Lua via le module addon
.
Exemple Lua
local addon = require("addon1")
-- Connexion au service gRPC
local ok, err = addon.connect()
if not ok then
print("Connexion échouée :", err)
return
end
-- Envoi d'une trame CAN avec deux signaux définis dans le DBC
local frame = {
name = "ExampleMessage", -- Nom du message DBC (optionnel si id est fourni)
id = 0x123, -- Identifiant CAN (optionnel si name est fourni)
dlc = 8, -- Data Length Code
signals = {
{ name = "Speed", value = 42.0 },
{ name = "RPM", value = 1500.0 },
}
}
local resp, err = addon.call("SendFrame", frame)
if resp then
print("Trame envoyée avec succès :", resp.message)
else
print("Erreur d'envoi :", err)
end
Détails
- Le champ
name
ouid
est requis (au moins l’un des deux). dlc
doit correspondre à la définition DBC, typiquement8
.signals
contient une liste de{ name, value }
pour chaque champ à encoder.- Le serveur encode automatiquement les valeurs dans le format binaire CAN en utilisant les métadonnées du fichier
.dbc
.