1.aprus.lua配置示例

package.cpath="./?.so"
package.path="./?.lua"
cjson = require "cjson"
config = require "config"
require "myModule"

function act_control(m, json)
    for k,v in pairs(json) do
        if k ~= "Act" then
            myModule.write(moduleObj, cjson.encode({["name"] = k, ["val"] = v}))
        end
    end
end

function mqttdata_handle(m, topic, data)
    local json = cjson.decode(data)
    if json.Act == "Control" then
        act_control(m, json)
    end    
end

function mqttsys_handle(m, code)
    if code == 0 then    
        myModule.stop(moduleObj)
    elseif code == 1 then
        myModule.run(moduleObj)
    end    
end

function myModule_handle(obj, name, code, data)
    mqtt.publish(mqtt3Obj, name, "r", data)    
end

function myModule_load_collectnodes(obj, nodes)
    for k,v in pairs(nodes)
    do
        myModule.addcnode(obj,cjson.encode(v))    
    end    
end

function myModule_load_varnodes(obj, nodes)
    for k,v in pairs(nodes)
    do
        myModule.addvnode(obj,cjson.encode(v))
    end    
end

function init()
    mqtt3Obj = mqtt.new() 
    mqtt.subscribe(mqtt3Obj, "p2p")
--mqtt.config(mqtt3Obj, nil, "123.456.789.123", "1883", "user", "mix123")
user.setluaver(config.AprusX.luaver)
    user.setdevinfo(config.AprusX.devinfo)
    user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)
end

function start()
    init()
    moduleObj = myModule.new("myModule")
    myModule.config(moduleObj, cjson.encode(config.myModule.Device))
    myModule_load_collectnodes(moduleObj,config.myModule.ColNode)
    myModule_load_varnodes(moduleObj,config.myModule.VarNode)
    mqtt.run(mqtt3Obj)

    while true do
        local msg = user.waitmsg()
        if msg.from == "mqtt-sys" then
            mqttsys_handle(msg.session, msg.code)
        elseif msg.from == "mqtt-msg" then
            mqttdata_handle(msg.session, msg.topic, msg.payload)
        elseif msg.from == "myModule" then
            myModule_handle(msg.obj, msg.name, msg.code, msg.data)
        end
    end
end

start()

2.示例脚本解释

(1)代码中”–”后面的部分为注释语句,仅供解释代码意图,不对程序流程有所干预。

(2)在源码的开头部分调用需要的模块

require "myModule"

–其中myModule为用户需要模块名称,比如modbus或s7

(3)所有函数以function 开头, end结尾。代码使用TAB缩进对齐。
例:

function mqttdata_handle(m, topic, data)
    local json = cjson.decode(data)
    if json.Act == "Control" then
        act_control(m, json)
    end    
end

这是一个名叫luamqttdata_handle()的函数,它有三个参数,分别是m, topic, data

(4)最后一行表示调用start()函数,是整个程序的起始。
向上搜索function start(),可以找到start()的函数定义。

(5)下面将逐行解读start()函数的每一行语句
–函数定义:函数名start, 无参数

function start()
--先调用init()函数进行一些初始化操作。
    init()
--调用模块的功能myModule.new()创建一个新的模块实体对象moduleObj。
    moduleObj = myModule.new("myModule")
--调用myModule.config()功能,对模块实体对象moduleObj进行配置。
    myModule.config(moduleObj, cjson.encode(config.myModule.Device))
--调用myModule_load_collectnodes()函数,配置moduleObj的采集节点
    myModule_load_collectnodes(moduleObj,config.myModule.ColNode)
--调用myModule_load_varnodes()函数,配置moduleObj的上报节点
    myModule_load_varnodes(moduleObj,config.myModule.VarNode)
--调用mqtt.run()功能,运行mqtt的实体对象mqtt3Obj
    mqtt.run(mqtt3Obj)

--循环下面一段代码,反复运行
    while true do
--接收消息,并把消息保存在本地变量msg中
        local msg = user.waitmsg()
--判断消息msg的来源,如果是mqtt系统消息“mqtt-sys”
        if msg.from == "mqtt-sys" then
--调用mqttsys_handle()函数处理消息的内容
            mqttsys_handle(msg.session, msg.code)
--判断消息msg的来源,如果是mqtt数据消息“mqtt-msg”
        elseif msg.from == "mqtt-msg" then
--调用mqttdata_handle()函数处理消息的内容
            mqttdata_handle(msg.session, msg.topic, msg.payload)
--判断消息msg的来源,如果是来自模块myModule的消息“myModule”
        elseif msg.from == "myModule" then
--调用myModule_handle()函数处理消息的内容
            myModule_handle(msg.obj, msg.name, msg.code, msg.data)
--判断结束
        end
--循环结束
    end
--start()函数结束
end

(6)初始化函数init()解析

--函数定义:函数名init, 无参数
function init()
--调用mqtt模块的功能mqtt.new()创建一个新的模块实体对象mqtt3Objmqtt3Obj = mqtt.new() 
--调用mqtt模块的功能mqtt.subscribe()配置mqtt3Obj的订阅模式为”p2pmqtt.subscribe(mqtt3Obj, "p2p")
--如果需要,使用mqtt.config()配置mqtt3Obj连接到用户自已的服务器。(现在此行以“--”开头,表示注释掉了,不起作用)
    --mqtt.config(mqtt3Obj, nil, "123.456.789.123", "1883", "user", "mix123")
--设置lua版本(版本信息来自于配置文件config.lua的AprusX字段的luaver)
    user.setluaver(config.AprusX.luaver)
--设置设备信息(设备信息来自于配置文件config.lua的AprusX字段的devinfo)
    user.setdevinfo(config.AprusX.devinfo)
--设置AprusIP地址(信息来自于配置文件config.lua的AprusX字段)
    user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)
--init()函数结束
end

(7)user 全局通用/配置类函数
①本机网络配置方法
user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)
②消息捕获方法
msg = user.waitmsg()
通过 msg.from 可判断消息来源

  • mqtt-sys:来自mqtt系统消息
  • mqtt-msg:来自mqtt数据消息
  • modubs:来自modbus管理器消息

③以下为 msg.frommodbusopcuamitsufxmitsumcdlt645s7等协议时通用

  • msg.session: 消息会话对象
  • msg.code: 消息号
  • msg.style_L: 变量名称
  • msg.val_L: 变量值
  • msg.style_E: 事件变量名称
  • msg.val_E: 事件变量值
  • msg.z: 条件改变标志位
    ④以下为 msg.frommqtt时使用
  • msg.topic: mqtt话题
  • msg.payload: mqtt消息数据
    ⑤以下为 msg.frommqtt-sys时使用
  • msg.code: mqtt事件
    • 0: mqtt断开
    • 1: mqtt 连接
      ⑥设置Lua版本信息
      user.setLuaver(Luaver)
      ⑦设置设备信息
      user.setdevinfo(devinfo)

(8)mqtt对象操作方法函数
①创建mqtt对象实例
mqttobj = mqtt.new()
②配置mqtt连接信息 (选填)
mqtt.config(mqttobj, "mqtt_1", "192.168.1.159", "1883")

  • param 1: mqtt对象实例
  • param 2: 实例id
  • param 3: mqtt服务器ip
  • param 4: mqtt 服务器端口
    注:此配置选填,如果不填,则通过gards 服务器自动指定
    ③话题订阅
    mqtt.subscribe(mqttobj, "p2p")
    ④发布消息
    mqtt.publish(mqttobj, nil, topic, payload)
  • reserve: 预留参数,必须有,可填nil
    ⑤mqtt运行
    mqtt.run(mqttobj)
    备注:支持多实例,最大可创建3个mqtt对象
文档更新时间: 2024-11-05 17:40   作者:CGL