规则脚本
规则脚本是JieIOT平台的核心功能之一,允许用户通过JavaScript代码实现灵活的数据处理和设备控制逻辑。通过规则脚本,可以实现MQTT消息预处理、设备数据转换、条件判断等复杂业务逻辑。
脚本语言
规则脚本基于 JavaScript 语言,支持ES6+语法特性。脚本运行在服务端环境中,具有以下特点:
- 语言: JavaScript (ES6+)
- 执行环境: 服务端沙箱环境
- 触发时机: MQTT消息到达时自动执行
- 应用场景: 数据预处理、消息过滤、格式转换、条件判断等
全局变量
规则脚本执行时,系统会自动注入以下全局变量:
| 变量名 | 类型 | 描述 |
|---|---|---|
globalThis.topic | String | MQTT消息主题 |
globalThis.message | String | MQTT消息内容(原始字符串) |
globalThis.message_hex | String | MQTT消息内容(十六进制格式) |
新建规则脚本
在JieIOT平台中,找到菜单栏 规则引擎-> 规则脚本部分,点击页面的新增按钮,即可新建一个规则脚本。
编辑规则脚本
配置说明:
1.脚本事件:设备上报、平台下发、设备上线、设备离线、HTTP接入、MQTT接入
2.输出动作:消息重发、HTTP推送、MQTT推送
3.所属产品:规则脚本跟产品绑定,只会影响产品下面的设备
4.执行顺序:产品下面有多个脚本,则按照顺序执行
5.接入点:在 资源通道部分配置的对应通道类型为“MQTT服务器”和“HTTP服务器”的连接器列表中选择。
规则脚本基础示例
基础语法示例
// 获取MQTT主题和消息
let topic = globalThis.topic;
let message = globalThis.message;
let message_hex = globalThis.message_hex;
// 条件判断示例
if (message === 'www.usr.cn') {
// 处理特定消息
message = {"data":{"message":"+message+""}};
result = {"topic":topic, "message":message};
} else {
// 默认处理逻辑
result = {"topic":topic, "message_hex":message_hex};
}设备上报示例
在设备列表中找到一个 通道类型为MQTT服务器的,通讯协议为内置JSON协议的设备,
按照平台处理上报数据的系统主题和系统数据格式分别是:
//设备属性上报主题 things/up/${tenantId}/${productKey}/${deviceKey}/property/post
Topic:things/up/000000/xj_humiture_01/hum_devicek2/property/post
{
"msgId":"45lkj3551234",
"time":1626197189638,
"sys" :{
"ack": 1
},
"data":{
"current_temp":{
"value":"29",
"time": 1626197189638
},
"current_humidity":{
"value":68,
"time": 1626197189638
}
}
}实际设备上报的数据格式和主题分别是:
//设备上报主题和数据
Topic:hum_devicek2/post
{
"current_temp":29,
"current_humidity":68
}此时,我们使用脚本转换主题和数据格式,我们新建一个脚本,将设备上报的内容转换为平台标准格式:
脚本内容如下:
// 获取原始MQTT消息
let originalTopic = globalThis.topic; // hum_devicek2/post
let originalMessage = globalThis.message; // {"current_temp":29, "current_humidity":68}
try {
// 解析原始消息
const rawData = JSON.parse(originalMessage);
// 从原始主题中提取设备ID
const deviceId = originalTopic.split('/')[0]; // hum_devicek2
// 构建系统标准主题格式
// things/up/{tenantId}/{productKey}/{deviceKey}/property/post
const tenantId = "000000";
const productKey = "xj_humiture_01";
const systemTopic = `things/up/${tenantId}/${productKey}/${deviceId}/property/post`;
// 生成消息ID和时间戳
const currentTime = Date.now();
const msgId = "msg_" + Math.random().toString(36).substr(2, 9) + currentTime.toString().substr(-6);
// 构建系统标准数据格式
const systemData = {
"msgId": msgId,
"time": currentTime,
"sys": {
"ack": 1
},
"data": {}
};
// 转换数据格式:将简单键值对转换为标准属性格式
for (const [key, value] of Object.entries(rawData)) {
systemData.data[key] = {
"value": value,
"time": currentTime
};
}
// 设置转换结果
result = {
"topic": systemTopic,
"message": systemData
};
// 调试信息(可选)
console.log("原始主题:", originalTopic);
console.log("转换后主题:", systemTopic);
console.log("原始数据:", originalMessage);
console.log("转换后数据:", JSON.stringify(systemData));
} catch (error) {
// 错误处理
result = {
"topic": originalTopic + "/error",
"message": {
"error": "Data conversion failed: " + error.message,
"original_topic": originalTopic,
"original_message": originalMessage,
"timestamp": Date.now()
}
};
}我们编辑好脚本后,进行验证。连接设备标识为hum_devicek2的设备,按照如下格式发送:
可以看到脚本执行后在控制台打印的结果:
可以看到topic和数据格式已经转换为系统主题和格式
脚本配置说明
在规则脚本编辑页面中,你需要配置:
- 脚本事件: 选择"设备上报"
- 所属产品: 选择对应的产品(如:xj_humiture_01)
- 接入点: 选择设备连接的MQTT服务器
- 输出动作: 选择"消息重发",将转换后的数据重新发送到系统主题
服务下发转换示例
假设实际设备服务下发的主题和数据格式分别是:
//设备上报主题和数据
Topic:hum_devicek2/set
{
"current_temp":30,
}平台下发系统主题和数据格式是:
//平台下发主题和数据
Topic:things/down/${tenantId}/${productKey}/${deviceKey}/property/set
{
"msgId":"45lkj3551234",
"time":1626197189638,
"data":{
"current_temp":"30",
}
}新增脚本,定义如下:
我们看看脚本的定义内容:
1.将系统主题转为真实设备需要的主题
2.将系统数据格式转为真实设备需要的主题
// 平台下发数据转换脚本
// 将系统标准格式转换为设备可识别的格式
// 获取平台下发的原始消息
let systemTopic = globalThis.topic; // things/down/000000/xj_humiture_01/hum_devicek2/property/set
let systemMessage = globalThis.message; // 平台标准格式数据
try {
// 解析平台标准格式数据
const platformData = JSON.parse(systemMessage);
// 从系统主题中提取设备信息
// things/down/{tenantId}/{productKey}/{deviceKey}/property/set
const topicParts = systemTopic.split('/');
const deviceId = topicParts[4]; // hum_devicek2
// 构建设备期望的主题格式
const deviceTopic = `${deviceId}/set`;
// 转换数据格式:从平台标准格式转换为设备简单格式
const deviceData = {};
// 提取平台数据中的 data 部分,并简化格式
if (platformData.data) {
for (const [key, value] of Object.entries(platformData.data)) {
// 平台格式: "current_temp": {"value": "30", "time": 1626197189638}
// 设备格式: "current_temp": 30
if (typeof value === 'object' && value.value !== undefined) {
// 如果是标准属性格式,提取value值
deviceData[key] = value.value;
} else {
// 如果是简单值,直接使用
deviceData[key] = value;
}
}
}
// 数据类型转换(确保数值类型正确)
for (const [key, value] of Object.entries(deviceData)) {
// 尝试转换为数字(如果原始值是数字字符串)
if (typeof value === 'string' && !isNaN(value) && value.trim() !== '') {
deviceData[key] = Number(value);
}
}
// 设置转换结果
result = {
"topic": deviceTopic,
"message": deviceData
};
// 调试信息
console.log("平台下发主题:", systemTopic);
console.log("转换为设备主题:", deviceTopic);
console.log("平台下发数据:", systemMessage);
console.log("转换为设备数据:", JSON.stringify(deviceData));
} catch (error) {
// 错误处理
result = {
"topic": systemTopic + "/conversion_error",
"message": {
"error": "Platform to device conversion failed: " + error.message,
"original_topic": systemTopic,
"original_message": systemMessage,
"timestamp": Date.now()
}
};
}我们下发指令来测试一下转换情况,后端日志内容如下;
客户端订阅接收内容如下;
脚本配置要点
- 脚本事件: 选择"平台下发"
- 所属产品: 选择对应产品(xj_humiture_01)
- 输出动作: 选择"MQTT推送",将转换后的数据发送到设备
- 接入点: 选择设备连接的MQTT服务器
至此,将系统主题和数据格式转换为设备所需主题和格式验证成功。







