规则引擎
# 一、脚本语言
提示
规则脚本采用Groovy编写,是一种基于JVM(Java虚拟机)的敏捷开发语言,Groovy代码能够与Java代码很好的结合,也能用于扩展现有代码。
# Groovy与Java对比
Groovy的语法与 Java 语言的语法很相似,可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少。
Groovy | Java |
---|---|
编译为JVM字节码,兼容Java平台 | 在JDK上开发并在JVM上运行 |
用作编程和脚本语言 | 用作编程和面向对象的语言 |
默认访问修饰符 public | 默认访问修饰符包 |
为类成员自动生成 getter 和 setter | 需要为字段提供 getter 和 setter 方法,特别是如果遵循 Java Beans命名约定 |
分号是可选的 | 分号是强制性的 |
默认导入常用包 | 默认只导入Java.lang.* 包 |
一切都是对象并且仅使用对象,因此没有自动装箱或拆箱的概念 | 具有原始数据类型和包装类来隐式或显式执行装箱和拆箱 |
不需要任何 main 方法或方法的入口点来运行类或任何程序 | 需要类内部的 main 方法来运行程序 |
# 二、消息转发
设备上报和平台下发时,通过消息转发可以调整主题名称和消息内容,适配到设备的主题和内容。
# 规则编写说明
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.NumberUtil;
// 1. 获取主题和内容(必要)
String topic = msgContext.getTopic();
String payload = msgContext.getPayload();
// 2. 数据转换(自己处理)
println ("根据情况转换数据")
String NewTopic = topic;
String NewPayload = payload;
// 3. 返回新的数据(必要)
msgContext.setTopic(NewTopic);
msgContext.setPayload(NewPayload);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
提示
- 默认仅使用hutool的Json处理和数字工具类库,hutool其他类库或者系统相关类库,需要后端开放一下;
- 默认禁止使用For/While循环和IO操作等,根据情况可以后端开放;
- 通过msgContext获取和设置主题和消息内容;
- 主题和消息内容如何转换需要自己编写。
# 参考示例
主题:DEVICE555/post
转发到平台主题:/60/DEVICE555/property/post
内容:{"temperature":26.5,"humidity":65.8}
转发到平台内容:
[{
"id": "temperature",
"value": "26.45"
}, {
"id": "humidity",
"value": "65.8"
}]
1
2
3
4
5
6
7
2
3
4
5
6
7
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.NumberUtil;
// 1. 获取主题和内容(必要)
String name = msgContext.getTopic();
String payload = msgContext.getPayload();
// 2. 主题转换
String[] topics=name.split("/");
String deviceNum = topics[0];
String newTopic = "/60/" + deviceNum + "/property/post";
System.out.println(newTopic);
// 3. 内容格式转换
JSONArray newArray = new JSONArray();
JSONObject newObject =new JSONObject();
JSONObject jsonObject = JSONUtil.parseObj(payload);
jsonObject.keySet().forEach(key -> {
newObject.put("id" , key);
newObject.put("value" , jsonObject.getStr(key));
newArray.add(newObject);
});
String newPayload = newArray.toString();
// 4.打印
System.out.println("新主题:" + newTopic);
System.out.println("新内容:" + newPayload);
// 5. 返回新的数据(必要)
msgContext.setTopic(newTopic)
msgContext.setPayload(newPayload);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34