Aller au contenu

Module addon

Le module addon permet de communiquer avec un logiciel externe. Il est conçu pour être utilisé avec des protocoles de communication moins courants ou des systèmes spécifiques. L'addon est un module Lua qui permet d'interagir avec le logiciel externe via des appels de fonction. La communication avec l'addon se fait via gRPC, ce qui permet une communication sécurisée et efficace entre l'agent Alemca et le logiciel externe.

Configuration Addon

L'agent Alemca est configuré via un fichier de configuration. Pour déclarer un addon il faut ajouter la section suivante dans le fichier de configuration de l'agent Alemca :

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

Details de la configuration

  • name : Nom de l'addon. Il doit être unique et ne pas contenir d'espaces ou de caractères spéciaux.
  • addonType : Type de l'addon. Il doit correspondre au type de l'addon que vous utilisez (par exemple, can pour l'addon CAN).
  • address : Adresse de l'addon. Il doit être au format IP:PORT
  • timeout : Délai d'attente pour la connexion à l'addon, en secondes. Si la connexion prend plus de temps que ce délai, elle échouera.
  • useTLS : Indique si la connexion doit utiliser TLS (true) ou non (false). Si vous utilisez TLS, assurez-vous que l'addon est configuré pour accepter les connexions TLS.

Exemple de configuration

Depuis le lua vous pouvez accéder aux l'addon de la manière suivante :

Chaque call est spécifique en fonction du type de l'addon. Par exemple, pour l'addon can, vous pouvez utiliser les appels suivants :

local can = require("can")

-- Fonction pour afficher les tables
function printRecusiveTable(t, indent)
    indent = indent or 0
    if t == nil then
        print(string.rep(" ", indent) .. "nil")
        return
    end
    for k, v in pairs(t) do
        local prefix = string.rep(" ", indent)
        if type(v) == "table" then
            print(prefix .. k .. ":")
            printRecusiveTable(v, indent + 2)
        else
            print(prefix .. k .. ": " .. tostring(v))
        end
    end
end

-- Connexion à l'addon can
local status, err = can.connect()
if not status then
    printError("Error connecting to CAN addon: " .. err)
    return
end

-- Retourne la version du DBC.
local resp, err = can.call("GetDBCVersion")

-- Retourne les données DBC analysées (liste de messages et signaux).
local resp, err = can.call("GetDBCData")
-- [{
--     "id" = 1,
--     "name" = 2,
--     "dlc" = 3,
--     "signals" = [
--         {
--             "name": 1,
--             "startBit": 2,
--             "length": 3,
--             "factor": 4,
--             "offset": 5,
--             "isSigned": 6,
--             "isIntel": 7,
--         }
--     ]
-- }]

-- Retourne un flux de messages CAN avec les valeurs de signaux décodées.
local resp = can.stream("SubscribeFrames")
-- {
--   "id": 1,
--   "name": 2,
--   "dlc": 3,
--   "signals": [
--     {
--         "name": 1,
--         "value": 2,
--     }
--   ]
-- }

for msg, err in resp do
  if err then
    print("Stream error:", err)
    break
  end
  printRecusiveTable(msg)
end

-- Retourne les valeurs de signaux décodées à partir du dernier message CAN reçu.
local resp, err = can.call("GetCurrentSignalValues")
-- [{
--   "id": 1,
--   "name": 2,
--   "dlc": 3,
--   "signals": [
--     {
--         "name": 1,
--         "value": 2,
--     }
--   ]
-- }]

-- Déconnexion de l'addon can
local status, err = can.disconnect()
if not status then
    printError("Error disconnecting from CAN addon: " .. err)
    return
end

Champs Lua associés

  • addon.name : Retourne le nom de l'instance addon.
  • addon.type : Retourne le type du module (ici, can).