/rulex

轻量级边缘物联网网关开发框架

Primary LanguageGoGNU Affero General Public License v3.0AGPL-3.0

RULEX Framework

希望大家第一眼就看到这个说明 更多文档参考(国内可能需要科学上网): https://rulex.pages.dev

如果您阅读过 RULEX 的源码,你会发现里面有很多很愚蠢的设计(比如对资源的状态管理、类型硬编码设计等),因为特殊历史原因导致了其设计上有一些很糟粕的地方,如有建议请不吝赐教,一起让这个框架更加优秀!同时未来随着版本的迭代,很多低级问题会逐步被重构完善。

RULEX 是一个轻量级工业类边缘网关开发框架

架构设计

快速开始

HelloWorld

下面展示一个最简单的设备数据转发案例:

AppNAME = 'UdpServerTest'
AppVERSION = '0.0.1'

function Main(arg)
    for i = 1, 10, 1 do
        local data = { temp = 20.15 , humi = 34}
        local err = applib:DataToUdp('UdpServer', applib:T2J(data))
        applib:Sleep(100)
    end
    return 0
end

这个 DEMO 展示了如何把一个简单的数据推到 UDP 服务器端

支持的平台

架构 操作系统 测试
X86-64 X86-64-Linux\Windows 通过
ARM64 ARM-64-Linux 通过
ARM32 ARM-32-Linux 通过
Mips Arm-Mips-Linux 通过

除此之外,还可以在 Armbian、OpenWrt 等小众平台上编译成功。

规则引擎

规则定义

function Success()
    -- do some things
end

function Failed(error)
    -- do some things
end

Actions = {
    function(data)
        return true, data
    end
}

数据筛选

Actions = {
    function(data)
        print("return => ", rulexlib:JqSelect(".[] | select(.hum < 20)", data))
        return true, data
    end
}

数据中转

Actions = {
    function(data)
        -- 持久化到 MongoDb:
        rulexlib:DataToMongo("45dd0c90f56d", data)
        -- 持久化到 Mysql:
        rulexlib:DataToMysql("45dd0c90f56d", data)
        -- 推送化到 Kafka:
        rulexlib:DataToKafka("45dd0c90f56d", data)
        return true, data
    end
}

云端计算

function Main(Arg)
    -- {1,2,3,4,5,6,7,8,9,10}
    local cutterData, err = applib:ReadDevice('Dev1', 'D1', "count=10")
    if err ~= nil then
        error(err)
        return
    end
    -- 交给 ID为'AI-001'的AI模型去计算结果
    -- 输出结果是一个数组,维度取决于模型输出参数
    -- Result: {1}
    local Result, err = aibase:Infer('AI-001', cutterData)
    if err ~= nil then
        error(err)
        return
    end
    print('Result =>', Result)
    applib:save(Result)
    return 0
end

社区

贡献者

鸣谢各位给RULEX贡献代码的大佬。

RULEX

RULEX Other

Star