规则引擎说明
推荐先去官网学习一下基础的规则引擎。
https://thingsboard.io/docs/user-guide/rule-engine-2-0/re-getting-started/
了解怎么过滤信息,怎么做数据转换就行。
思路说明
- 定义一个key值用于传递json对象,比如说attributesJsonData。
- 规则引擎中判断遥测数据中是否存在一个约定好的key。
- 然后将这个key下的所有属性转换成要存储的属性。
整体解决思路是这样的,需要解决一下这几个问题
- 如果有多个json对象怎么区分。
- 如果json对象不支持直接存储怎么转换。
区分不同的json对象
再次约定一个值,比如说是attributesJsonType。
然后取到这个值之后遍历attributesJsonData里面的json对象,把key值全部改为(type+原有key)
多个json转换
在ThingsBoard中的json解析器中判断了传入的值是否是key:value格式。
如果不是则数据无法存储,所以需要进行转换。
转换格式见上个博客Js将Json对象解析成key:value格式
规则链
总览图
规则链js
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
var data, type;
var keyName = "@Name"
if (msg.timeseriesJsonData) {
var result = {};
if (isJson(msg.timeseriesJsonData)) {
convertKV(msg.timeseriesJsonData, "", keyName,
result);
} else {
convertKV(JSON.parse(msg.timeseriesJsonData), "",
keyName,
result);
}
data = result;
}
if (msg.timeseriesJsonType) {
type = msg.timeseriesJsonType;
for (var k in data) {
data[type + '_' + k] = data[k];
delete data[k];
}
}
if (msg.ErrorCode) {
data.ErrorCode = msg.ErrorCode;
}
if (msg.ErrorMessage) {
data.ErrorMessage = msg.ErrorMessage;
}
return {
msg: data,
metadata: metadata,
msgType: msgType
};
function convertKV(jsonObj, parentKey, keyName, result) {
if (isJson(jsonObj) == 0) {
// 字符串,取消分隔符
result[parentKey.substring(0, parentKey.length - 1)] = jsonObj;
return;
}
for (var key in jsonObj) {
var itemkey = key;
var val = jsonObj[itemkey];
// 对象
if (isJson(val) == 1) {
convertKV(val, parentKey + itemkey + "_",
keyName, result);
}
// 数组对象
else if (isJson(val) == 2) {
for (var i = 0; i < val.length; i++) {
var valElement = val[i];
var item = i;
if (valElement[keyName]) {
item = valElement[keyName];
}
convertKV(valElement, parentKey + itemkey +
"_" + item + "_", keyName, result);
}
}
// 值
else {
result[parentKey + itemkey] = val;
}
}
}
function isJson(obj) {
// json对象
if (Object.prototype.toString.call(obj).toLowerCase() ==
"[object object]" && !obj.length) {
return 1;
} else
// json数组
if (typeof(obj) == "object" && obj.length) {
return 2;
}
// 值
else {
return 0;
}
}
导出的Root Rule Chain,点击查看