Giter VIP home page Giter VIP logo

hootrhino / rulex Goto Github PK

View Code? Open in Web Editor NEW
234.0 6.0 62.0 80.67 MB

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

Home Page: http://www.hootrhino.com

License: GNU Affero General Public License v3.0

Dockerfile 0.11% Makefile 0.19% Go 92.01% Shell 1.53% HTML 0.67% Lua 4.52% Ruby 0.03% Batchfile 0.12% Awk 0.12% Python 0.69%
iot middleware rules-engine lcdp lua golang iiot iiot-gateway gateway-services framework

rulex's People

Contributors

beattime avatar dropliu avatar gmnoah avatar goldeagle avatar ijuvenile avatar lion-brave avatar mingyuewanchonglou avatar qubbei avatar sanshengshui avatar suixinio avatar tianyingkeji avatar wan9bo7 avatar wwhai avatar yuanliang-ma avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

rulex's Issues

功能建议:对 ubuntu 路由交换功能的支持

主要功能:
1、支持登录界面,支持多账户管理。
2、支持远程操控,有助于远程问题诊断。
3、支持NAT转发配置功能。
4、支持防火墙配置功能。
5、支持RS485参数配置功能。
6、支持DDOS防控功能。
7、支持VLAN划分,1WAN,多LAN。
8、支持网络参数配置,如:ip、子网掩码、网关、DNS等。
9、支持界面多语言显示。
10、支持设备使用资源显示,温度显示。

功能建议: 数据筛选器函数

采集到的数据:

Data = {
  "name1" :"a1",
  "name2" :"a2",
  "name3" :"a3",
  "name4" :"a4"
}

过滤器:

Filter = {
  "标签2": "name2",
  "标签4": "name5",
}

函数

Result = rulex:Reduce(Data, Filter)

输出结果:

Result = {
  "标签2": "a2",
  "标签4": "a4",
}

【长期任务】文档优化

资源文档

  • 配置示例
  • 上行数据示例 Up
  • 下行数据示例 Down
  • 错误码表

LUA标准库文档

  • 函数返回值、参数表
  • 示例代码

Mqtt 插件管理强制下线接口

后端接口已经实现:

Image

接口

和请求客户端列表的接口完全一样,参数不同

Image

{
    "uuid": "RULEX-MqttServer",
    "name": "kickout",
    "args": [
        "mqttx_3067bd9f"
    ]
}

其中 args 表示要踢下线的设备的ID。

关于写插件的一点建议

关于写插件的一点建议

下面是对各个层职责分层的一点建议:

  1. 驱动永远关注“读”和“写”,而不要关注读出来的是不是对的
  2. 设备只管问驱动要数据,然后将其加工成应用格式,设备不关注读写细节
  3. 资源只管数据流向而不用管怎么来的,只管输送或者接收

综上所述,设备、资源本质上是两类东西,设备是真实物理器材,资源是逻辑存在的软件源或者目标

功能建议:modbus tcp

modbus tcp应该是多路复用,而不是和modbus 485进行轮询,这个地方应该是分组,多并发采集,一般的特别是modbus tcp,会有多组多个采集点,所以这个地方要支持批量上传点位,modbus 485也要支持批量上传,批量导入

发现BUG:CPU使用总是为0

大致描述
在linux下,刷新时,CPU使用经常出现0,在对比finalshell时,发现finalshell不会显示为0。

建议解决办法
这个地方多次验证后,发现finalshell公式如下:
CPU占用率=100%-CPU空闲率
image

id值为CPU空闲率,此公式可以作为参考

发现BUG:关于串口重启逻辑

大致描述
一条总线上,其中有一个设备没有回复,哪怕其他设备正常,一样会重启设备

复现条件
有设备未回复

建议修复方式
当一条总线上,如果所有设备不回复,那么说明串口有问题,则重启
当一条总线上,有设备正常,有设备未回复,那么上报正常数据,上报异常的设备ID,异常建议做特殊标识,便于上位机知晓错误设备

功能建议:遥测统计

概述

为了作用户画像,需要做一个远程遥测功能,来合法的采集用户端的OS、硬件架构。

设计

每次启动的时候连续向远程服务器发送5个UDP包,包含用户端的OS、硬件架构,数据结构,同时数据库需要记录公网IP,分析出来大概的地理位置。

{
    "os":"linux",
    "arch":"arm64"
}

合法性

以RULEX插件的形式提供,有个开关可供用户关闭,默认开启。

名词

  • 远程统计:remote statistics

功能建议: 测试接口

用户在开发阶段可以测试数据,主要是一个模拟输出的数据格式和一个脚本编辑器。
image

功能建议:关于数据格式

关于数据格式

对于设备而言,所有 read 接口读出来全部按照以下结构:

{
   // 标准规范
   "tag": "tag",
   "value":"value",
   // 其他扩展字段
   “key”:"value"
}

字段解释

  • tag: 用来标记本地设备的特殊标识符
  • value:读到的data,一般是个二进制流串,你可以把他解析成自己想要的格式。

几个名词的关系

  • MDevice: 表示是静态数据,保存在数据库里面的,相当于配置
  • Device: MDevice加载到的内存映射,也是静态的
  • XDevice:实际上这个静态模型的实现,这才是真实工作者。

功能建议: 证书管理

需求

增加一个软件授权功能。

思路

当软件第一次启动的时候要求其远程联网授权,必须提供设备的 MAC地址、操作系统、硬件架构信息,授权完了以后下发证书保存本地,下一次启动的时候本地验证证书。

设计

  1. 一个后端接口,要记录设备的 MAC地址、操作系统、硬件架构信息
  2. 一个请求客户端

功能建议: 动态链接库插件支持

目前的插件实际上是写死的,需要扩展一个可热插拔的机制。现阶段准备用这个库做一个版本:(https://github.com/ebitengine/purego)

下面是个简单的接口设计:

/*
*
* 插件接口
*
 */
type DynamicPlugin interface {
	Init(map[string]interface{}) error
	Start(context.Context, context.CancelFunc)
	Stop() error
}

/*
*
* 插件结构体
*
 */
type CC1Plugin struct {
	Type   string
	ctx    context.Context
	cancel context.CancelFunc
}

功能建议:支持一个最基础的 ANN 模型

同济大学《高等数学》下册第九章第十节127页有一个关于最小二乘法的案例,我认为这个案例很有意义,他手动推导了一遍解方程的过程,同时通过刀具寿命这个简单的案例来展示应用价值。因此我把这个简单案例扩展了一下,做了一个demo:刀具健康状态预测,通过训练一组模型,来对刀具的实时数据进行判定预测,从而实现刀具寿命预测维护。

将该算法实现后集成到RULEX内,展示一个如何用AI为RULEX赋能的案例。
image

发现BUG:规则不触发

大致描述
建立了一个modbus点位,然后创建规则,再新建,modbus点位,规则就会不起作用,当再次将程序重启后,恢复正常

功能建议:【User-Defined types】

定义一个通用结构体来快速实现类型转换

type Person struct {
    Name string
}

const luaPersonTypeName = "person"

// Registers my person type to given L.
func registerPersonType(L *lua.LState) {
    mt := L.NewTypeMetatable(luaPersonTypeName)
    L.SetGlobal("person", mt)
    // static attributes
    L.SetField(mt, "new", L.NewFunction(newPerson))
    // methods
    L.SetField(mt, "__index", L.SetFuncs(L.NewTable(), personMethods))
}

// Constructor
func newPerson(L *lua.LState) int {
    person := &Person{L.CheckString(1)}
    ud := L.NewUserData()
    ud.Value = person
    L.SetMetatable(ud, L.GetTypeMetatable(luaPersonTypeName))
    L.Push(ud)
    return 1
}

// Checks whether the first lua argument is a *LUserData with *Person and returns this *Person.
func checkPerson(L *lua.LState) *Person {
    ud := L.CheckUserData(1)
    if v, ok := ud.Value.(*Person); ok {
        return v
    }
    L.ArgError(1, "person expected")
    return nil
}

var personMethods = map[string]lua.LGFunction{
    "name": personGetSetName,
}

// Getter and setter for the Person#Name
func personGetSetName(L *lua.LState) int {
    p := checkPerson(L)
    if L.GetTop() == 2 {
        p.Name = L.CheckString(2)
        return 0
    }
    L.Push(lua.LString(p.Name))
    return 1
}

func main() {
    L := lua.NewState()
    defer L.Close()
    registerPersonType(L)
    if err := L.DoString(`
        p = person.new("Steeve")
        print(p:name()) -- "Steeve"
        p:name("Alice")
        print(p:name()) -- "Alice"
    `); err != nil {
        panic(err)
    }
}

类型管理器有点low

类型管理器代码设计的有点low,当时全部写死了,需要择时优化。特殊历史产物,谁都不知道后来居然支持了这么多设备。准备用个MAP来装类型。
image

文件重复关闭问题

if err := typex.GLOBAL_LOGGER.Close(); err != nil {
	return
}
if err := typex.LUA_LOGGER.Close(); err != nil {
	return
}

功能建议: 规范化所有资源的数据格式

结构设计

单个数据

{
   "name": "test",
   "tag": "test-t",
   "value": {}
}

多个数据

{
   "name": "test",
   "tag": "test-t",
   "value":  []
}

配置

{
        "commonConfig": {
            "transport": "rs485rawserial",
            "waitTime": 10
        },
        "uartConfig": {
            "timeout": 10,
            "baudRate": 9600,
            "dataBits": 8,
            "parity": "N",
            "stopBits": 1,
            "uart": "COM3"
        }
        "otherconfig":{}
}

抽象设备

抽象设备

1.0 以后的大功能:支持抽象设备,抽象设备就是外挂的设备,Rulex本来是个规则引擎,但是1.0之前的版本没有对硬件设备进行抽象支持。因此,1.0以后增加对硬件的抽象,Target、 Source 描述了数据的流向,抽象设备描述了数据的载体。

举例

外挂一个设备,这个设备具备双工控制功能,例如电磁开关等,此时它强调的是设备的物理功能,而数据则不是主体。因此需要抽象出来一个层专门来描述这些设备

功能建议

对驱动的读写增加类似于 ioctrl 的参数来区分读写功能:

目前

driver.Read(args)

改良

driver.Read(int code, args)

0.3.4 规划

0.3.4 规划

  • 加载用户lua脚本
  • 区分用户资源和内建资源
  • websocket日志输出器

未来任务

剩下几个月的时间核心任务:

  1. 定制一个Linux最小系统, Rulex-linux, 专门用来运行rulex应用。
  2. 目标选定,使用全志CPU来制作第一代网关
  3. 文档的继续优化

功能建议: 支持基础AI模型加载、预测、识别接口

motivation

准备支持一个基础的AI框架,用户可以上传自己的模型来加载运行,然后对数据进行处理。准备首先支持以下模型:

  • ANN
  • RNN

因为ANN、RNN相对比较简单而且适用于一维简单数据处理,很适合在物联网场景下使用。未来可能会计划加入 CNN,用于图像、视频处理等。

design

首先设计一个模型加载接口:

interface AIFrameWork{
      Init() // 初始化环境
      Train(Type, Simple, Output) // 训练
      Load()// 加载模型
      Run([]Data) // 用数据去执行
      Unload() // 卸载模型
}

接口说明

  • Init:初始化环境,常用来生成一些表之类的操作
  • Train:训练模型,参数为类型,当前只有“ANN”、“RNN”两个选项, Simple 是样本,Output是输出标签
  • Load:加载模型
  • Run:执行AI操作,参数就是Simple同纬度的数据
  • Unload:释放资源

2023年6.1日 0.5规划

2023年6.1日 0.5规划

常见的上行、下行库的完善

  • modbus
  • tcp、udp
  • mqtt
  • iothub
  • opcua

轻量本地应用

  • appstack

科学计算库函数

  • 基础科学计算函数支持

基础AI算法:ANN、RNN

  • 模型训练
  • 识别、分类

功能建议:串口参数

image

数据位范围:
05d8d2a01d16caacdafe939245676e2
不能手动输入,只能选择
停止位范围:
50b9bb156d386aaa704d93ed142186b
不能手动输入,只能选择

功能建议:十六进制字节提取器

十六进制字节提取器

输入十六进制字符串:FF FF FF 01 4C B2 AA 55

输入一个提取表达式: "A:[1,2];B:[4,5]"

最后筛选出来的结果是:

R = {
       A: FF,FF
       B: 4B,B2
}

例如:

MatchHex("A:[1,2];B:[4,5]", "FFFFFF014CB2AA55")
 -> {
       A: FF,FF
       B: 4B,B2
    }

接口

type HexSegment struct{
    Name string
    Value []byte
}

HexSegment.ToInt64() int64
HexSegment.ToFloat64() float64
HexSegment.ToBool() bool
HexSegment.ToString() string

MatchHex(string,string)HexSegment

【v0.4.0】前端模板项目规划

准备搞个模板项目,方便一键生成网关项目,下面是功能列表:

系统管理

  • 首页数据:CPU、内存、版本、OS架构、硬件架构信息

用户管理

用户管理极其简单,就一个前端入口而已。

  • 新增用户【表单】
  • 更新密码【表单】
  • 删除用户【弹框】

设备管理

  • 新建设备【表单】
  • 更新设备【表单】
  • 删除设备【弹框】
  • 查询设备【表单】
  • 重启设备【按钮】

驱动管理

  • 驱动列表

插件管理

  • 插件列表【列表】
  • 重启插件【按钮】

规则管理

  • 新建规则【表单】
  • 更新规则【表单】
  • 删除规则【弹框】
  • 测试规则【表单】

目标管理

  • 新建目标【表单】
  • 更新目标【表单】
  • 删除目标【弹框】
  • 查找目标【表单】

轻量应用

  • 新建应用【表单】
  • 更新应用【表单】
  • 删除应用【弹框】
  • 查找应用【表单】

日志管理

  • 日志列表【列表】
  • 删除日志【按钮】
  • 上传日志【按钮】

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.