Aller au contenu

Module addon

Le module addon permet à l'agent Alemca d'appeler un service distant exposé via gRPC. Le module effectue des appels dynamiques.

Import

Pour importer le module dans Lua :

local addon = require("addon")

Configuration YAML

Exemple à placer dans la section iot.modules du fichier de configuration :

iot:
  modules:
    addon:
      - name: can
        addonType: can
        address: 127.0.0.1:50051
        timeout: 5
        useTLS: false

Champs disponibles : - name (string) : identifiant de l'instance de module (doit être unique) - addonType (string) : type d'addon — utilisé pour déterminer le nom du service. Exemples : can, canbus, etc. - address (string) : adresse du service gRPC sous la forme host:port - timeout (int) : timeout en secondes (champ présent dans la structure, utilisé par la configuration) - useTLS (bool) : si true, la connexion gRPC utilise TLS

Assomptions raisonnables : si addonType vaut can ou canbus, le loader mappe le nom de service vers canbus.CANService (voir code).

API Lua

Le module Lua retourne une table avec les champs et fonctions suivants :

  • name : nom de l'instance (lecture seule)
  • type : type du module (lecture seule)
  • connect() : tente d'ouvrir la connexion gRPC. Retourne (true, nil) en cas de succès, (nil, errMsg) en cas d'erreur.
  • disconnect() : ferme la connexion. Même contrat de retour que connect().
  • call(methodName, reqTable) : effectue un appel unary vers methodName (string). reqTable est optionnel et doit être une table Lua représentant le message d'entrée. Retourne (responseTable, nil) ou (nil, errMsg).
  • stream(methodName, reqTable) : ouvre un stream serveur (server-side streaming). Retourne un itérateur Lua utilisable comme for msg, err in iterator do ... end où msg est une table Lua pour chaque message reçu et err contient l'erreur s'il y en a.

Comportements importants : - Si le module n'est pas connecté, call et stream renvoient une erreur indiquant qu'il faut appeler connect() d'abord.

Exemples d'utilisation Lua

Connexion, appel unary et déconnexion :

local addon = require("addon") -- le nom dépend de l'enregistrement fait par le module

local ok, err = addon.connect()
if not ok then
  print("connect error:", err)
  return
end

local resp, err = addon.call("GetDBCVersion", {})
if not resp then
  print("call error:", err)
else
  -- traiter resp (table Lua)
  print("response:", resp)
end

addon.disconnect()

Itération sur un stream serveur :

local it, err = addon.stream("SubscribeFrames", {})
if not it then
  print("stream error:", err)
  return
end

for msg, err in it do
  if err then
    print("stream recv error:", err)
    break
  end
  -- msg est une table Lua contenant le message protobuf converti
  print(msg)
end

Champs Lua associés

  • addon.name : nom de l'instance (lecture seule)
  • addon.type : type du module (lecture seule)