hootrhino / rulex Goto Github PK
View Code? Open in Web Editor NEW轻量级边缘物联网网关开发框架
Home Page: http://www.hootrhino.com
License: GNU Affero General Public License v3.0
轻量级边缘物联网网关开发框架
Home Page: http://www.hootrhino.com
License: GNU Affero General Public License v3.0
主要功能:
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",
}
下面是对各个层职责分层的一点建议:
综上所述,设备、资源本质上是两类东西,设备是真实物理器材,资源是逻辑存在的软件源或者目标。
专门针对Modbus写个lualib, 实现常见的读写操作
modbus tcp应该是多路复用,而不是和modbus 485进行轮询,这个地方应该是分组,多并发采集,一般的特别是modbus tcp,会有多组多个采集点,所以这个地方要支持批量上传点位,modbus 485也要支持批量上传,批量导入
前端目前是用VUE做的,1.0以后用React重构
大致描述
Modbus插件拔线恢复后重启失败
大致描述
一条总线上,其中有一个设备没有回复,哪怕其他设备正常,一样会重启设备
复现条件
有设备未回复
建议修复方式
当一条总线上,如果所有设备不回复,那么说明串口有问题,则重启
当一条总线上,有设备正常,有设备未回复,那么上报正常数据,上报异常的设备ID,异常建议做特殊标识,便于上位机知晓错误设备
为了作用户画像,需要做一个远程遥测功能,来合法的采集用户端的OS、硬件架构。
每次启动的时候连续向远程服务器发送5个UDP包,包含用户端的OS、硬件架构,数据结构,同时数据库需要记录公网IP,分析出来大概的地理位置。
{
"os":"linux",
"arch":"arm64"
}
以RULEX插件的形式提供,有个开关可供用户关闭,默认开启。
对于设备而言,所有 read 接口读出来全部按照以下结构:
{
// 标准规范
"tag": "tag",
"value":"value",
// 其他扩展字段
“key”:"value"
}
假设设备和source相互交互的时候 , 内部代码就很混乱,探索一种更好的交互形式
增加一个软件授权功能。
当软件第一次启动的时候要求其远程联网授权,必须提供设备的 MAC地址、操作系统、硬件架构信息,授权完了以后下发证书保存本地,下一次启动的时候本地验证证书。
目前的插件实际上是写死的,需要扩展一个可热插拔的机制。现阶段准备用这个库做一个版本:(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
}
兼容W3C和腾讯云的Iothub数据格式
把Map改成结构体
新增一个插件,监听一个UDP端口,外部设备扫描的时候可以返回信息
大致描述
建立了一个modbus点位,然后创建规则,再新建,modbus点位,规则就会不起作用,当再次将程序重启后,恢复正常
定义一个通用结构体来快速实现类型转换
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)
}
}
让LUA当APP,可以独立运行。用来实现本地化应用
支持基础的KNX设备接入:https://github.com/vapourismo/knx-go
if err := typex.GLOBAL_LOGGER.Close(); err != nil {
return
}
if err := typex.LUA_LOGGER.Close(); err != nil {
return
}
把这个表达式计算器集成到RULEX:
https://expr.medv.io/docs/Getting-Started
和RULEX的RULE 一样,单独新建一个子模块叫:EXPR-ENGINE,实现和LUA对等的地位,除了lua之外的另一个规则选择器,该选择器目的性很强,就是专门针对数据处理。
{
"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":{}
}
driver write bytes as json format
1.0 以后的大功能:支持抽象设备,抽象设备就是外挂的设备,Rulex本来是个规则引擎,但是1.0之前的版本没有对硬件设备进行抽象支持。因此,1.0以后增加对硬件的抽象,Target、 Source 描述了数据的流向,抽象设备描述了数据的载体。
外挂一个设备,这个设备具备双工控制功能,例如电磁开关等,此时它强调的是设备的物理功能,而数据则不是主体。因此需要抽象出来一个层专门来描述这些设备
对驱动的读写增加类似于 ioctrl 的参数来区分读写功能:
driver.Read(args)
driver.Read(int code, args)
剩下几个月的时间核心任务:
准备支持一个基础的AI框架,用户可以上传自己的模型来加载运行,然后对数据进行处理。准备首先支持以下模型:
因为ANN、RNN相对比较简单而且适用于一维简单数据处理,很适合在物联网场景下使用。未来可能会计划加入 CNN,用于图像、视频处理等。
首先设计一个模型加载接口:
interface AIFrameWork{
Init() // 初始化环境
Train(Type, Simple, Output) // 训练
Load()// 加载模型
Run([]Data) // 用数据去执行
Unload() // 卸载模型
}
接口说明
常见的上行、下行库的完善
轻量本地应用
科学计算库函数
基础AI算法:ANN、RNN
输入十六进制字符串: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
准备搞个模板项目,方便一键生成网关项目,下面是功能列表:
用户管理极其简单,就一个前端入口而已。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.