Skip to content

规则脚本

规则脚本是JieIOT平台的核心功能之一,允许用户通过JavaScript代码实现灵活的数据处理和设备控制逻辑。通过规则脚本,可以实现MQTT消息预处理、设备数据转换、条件判断等复杂业务逻辑。

脚本语言

规则脚本基于 JavaScript 语言,支持ES6+语法特性。脚本运行在服务端环境中,具有以下特点:

  • 语言: JavaScript (ES6+)
  • 执行环境: 服务端沙箱环境
  • 触发时机: MQTT消息到达时自动执行
  • 应用场景: 数据预处理、消息过滤、格式转换、条件判断等

全局变量

规则脚本执行时,系统会自动注入以下全局变量:

变量名类型描述
globalThis.topicStringMQTT消息主题
globalThis.messageStringMQTT消息内容(原始字符串)
globalThis.message_hexStringMQTT消息内容(十六进制格式)

新建规则脚本

在JieIOT平台中,找到菜单栏 规则引擎-> 规则脚本部分,点击页面的新增按钮,即可新建一个规则脚本。

编辑规则脚本

配置说明:

1.脚本事件:设备上报、平台下发、设备上线、设备离线、HTTP接入、MQTT接入

2.输出动作:消息重发、HTTP推送、MQTT推送

3.所属产品:规则脚本跟产品绑定,只会影响产品下面的设备

4.执行顺序:产品下面有多个脚本,则按照顺序执行

5.接入点:在 资源通道部分配置的对应通道类型为“MQTT服务器”和“HTTP服务器”的连接器列表中选择。

规则脚本基础示例

基础语法示例

javascript
// 获取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协议的设备,

按照平台处理上报数据的系统主题和系统数据格式分别是:

javascript
//设备属性上报主题 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
        }
	}
}

实际设备上报的数据格式和主题分别是:

javascript
//设备上报主题和数据
Topic:hum_devicek2/post
{
    	"current_temp":29, 
        "current_humidity":68
}

此时,我们使用脚本转换主题和数据格式,我们新建一个脚本,将设备上报的内容转换为平台标准格式:

脚本内容如下:

javascript
// 获取原始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和数据格式已经转换为系统主题和格式

脚本配置说明

在规则脚本编辑页面中,你需要配置:

  1. 脚本事件: 选择"设备上报"
  2. 所属产品: 选择对应的产品(如:xj_humiture_01)
  3. 接入点: 选择设备连接的MQTT服务器
  4. 输出动作: 选择"消息重发",将转换后的数据重新发送到系统主题

服务下发转换示例

假设实际设备服务下发的主题和数据格式分别是:

javascript
//设备上报主题和数据
Topic:hum_devicek2/set
{
    	"current_temp":30, 
}

平台下发系统主题和数据格式是:

javascript
//平台下发主题和数据
Topic:things/down/${tenantId}/${productKey}/${deviceKey}/property/set
{
	"msgId":"45lkj3551234",
  	"time":1626197189638,
	"data":{
    	"current_temp":"30", 
	}
}

新增脚本,定义如下:

我们看看脚本的定义内容:

1.将系统主题转为真实设备需要的主题

2.将系统数据格式转为真实设备需要的主题

javascript
// 平台下发数据转换脚本
// 将系统标准格式转换为设备可识别的格式

// 获取平台下发的原始消息
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()
        }
    };
}

我们下发指令来测试一下转换情况,后端日志内容如下;

客户端订阅接收内容如下;

脚本配置要点

  1. 脚本事件: 选择"平台下发"
  2. 所属产品: 选择对应产品(xj_humiture_01)
  3. 输出动作: 选择"MQTT推送",将转换后的数据发送到设备
  4. 接入点: 选择设备连接的MQTT服务器

至此,将系统主题和数据格式转换为设备所需主题和格式验证成功。