脚本
更新时间:2018-10-15 14:40:18
脚本作为应用组建操作的重要补充,为用户提供更加灵活的方式来实现项目的业务逻辑。当前平台支持的脚本语言为node.js。编程语法及支持的内容都和标准node.js相同。
新建脚本
通过点击项目工作台左侧的“脚本”按钮,进入脚本管理页面。
点击列表右上侧的“新建脚本”按钮会弹出新建脚本弹窗。
用户需要为脚本命名,现阶段仅支持Node.js脚本。点击确认后,进入脚本编辑流程。
新建出的脚本文件,平台会为用户自动生成必须的初始化代码。如下所示:
const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {
const client = new IIoTClient({
appKey: process.env['appKey'],
appSecret: process.env['appSecret']
});
// 插入您的代码
callback(null, 'hello');
}
用户可以快速地在已有的代码中开始自己的业务逻辑的编写。其中IIoTClient是系统为用户实例化的一个对平台数据源、设备等内容进行操作的对象实例。
由于脚本的语法本身完全与Node.js相同,所以在此不对脚本的基础使用作介绍,下面会重点介绍如何通过脚本对项目中的数据源和设备进行操作。
数据源操作
数据写入
说明:将脚本内计算的数据写入指定的数据源节点内。
/**
* @param params 数据源写入参数
* {
* "id" : 582, //int, 数据源Id
* "name" : "SourceTable", //String, 数据标识。标识、ID至少填一个
* "nodes" : ["field1","field2"], //数据表字段名数组
* "data" : [["f1","f2"],["f3","f4"]] //数据内容数组
* }
@returns {}
*/
pushDataToDataSource(params);
数据拉取
说明:通过一定规则条件从指定数据源节点获取数据。
/**
* @param params 数据源拉取参数
* {
"id":123 //数据源ID
"name":"SourceForTest", //数据源标识。标识、ID至少填一个
"expr":{
"condition":[{
"col":"city",
"op":"EQUAL",
"value":"北京"
}],
"op":"AND"
},
"nodes":[ //需要查询的列名
{"name":"field1"},
{"name":"field2"}
],
"page":{"to":1, "size":15}, //分页信息
"orderby":[{"col":"id", "type":"asc"}] //排序信息
*
}
* @returns {*}
*/
pullDataFromDataSource(params);
操作示例
const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {
const client = new IIoTClient({
appKey: process.env['appKey'],
appSecret: process.env['appSecret']
});
const params = {'data':[['北京',10.1,'2018-04-26 00:00:00'],['北京',19.8,'2018-04-26 02:00:00']],'id':15132,'name':'数据源名称','nodes':['city','temp','time']};
client.pushDataToDataSource(params).then(value => {
console.log('ok, data : ' + JSON.stringify(value));
callback(null, value);
}, error => {
console.error('failed, data :' + JSON.stringify(error));
callback(error);
});
}
设备操作
获取设备属性
获取指定设备对应属性的快照数据。
* @param params
* {
"productKey":"" //产品标识符
"deviceName":"", //设备名称
"propertyIdentifier":"" //属性标识符
* }
* @returns {*}
*/
getDeviceProperty(params);
设置设备属性
说明:设置指定设备属性。
* @param params
* {
"productKey":"" //产品标识符
"deviceName":"", //设备名称
"properties":{ //属性标识符
"property1":"xxx",
"property2":"xxx"
}
* }
* @returns {*}
*/
setDeviceProperty(params);
调用设备方法
调用设备提供的方法,需要指定方法名与方法参数。
* @param params 数据源拉取参数
* {
"productKey":"" //产品标识符
"deviceName":"", //设备名称
"method":"" //服务方法名
"inputParams":{ //服务方法
"param1":"xxx",
"param2":"xxx"
}
* }
* @returns {*}
*/
invokeDeviceService(params);
调用示例
获取设备的“temperature”属性:
const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {
const client = new IIoTClient({
appKey: process.env['appKey'],
appSecret: process.env['appSecret']
});
const params = {"productKey":"xxxxxxxxxx","deviceName":"dfadfa",
"propertyIdentifier":"temperature"};
client.getDeviceProperty(params).then(value => {
console.log('ok, data : ' + JSON.stringify(value));
callback(null, value);
}, error => {
console.error('failed, data :' + JSON.stringify(error));
callback(error);
});
}
设置设备的“temperature”属性:
const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {
const client = new IIoTClient({
appKey: process.env['appKey'],
appSecret: process.env['appSecret']
});
const params = {"productKey":"xxxxxxxxxx",
"deviceName":"dfadfa",
"properties":{"temperature":26.5"};
client.setDeviceProperty(params).then(value => {
console.log('ok, data : ' + JSON.stringify(value));
callback(null, value);
}, error => {
console.error('failed, data :' + JSON.stringify(error));
callback(error);
});
}
调用设备的设置温度服务
const IIoTClient = require('./iiot-sdk/iiot-sdk.js');
module.exports.handler = function(event, context, callback) {
const client = new IIoTClient({
appKey: process.env['appKey'],
appSecret: process.env['appSecret']
});
const params = {
"productKey":"abcdefghijk", //productKey根据设备实际情况填写
"deviceName":"abcdefghijklmnopqrst", //deviceName根据设备实际情况填写
"method":"setTemperatureService" , //服务方法名根据产品中实际情况填写
"inputParams":{
"temperature":26.5 //入参根据产品中实际情况填写
}};
client.invokeDeviceService(params).then(value => {
console.log('ok, data : ' + JSON.stringify(value));
callback(null, value);
}, error => {
console.error('failed, data :' + JSON.stringify(error));
callback(error);
});
}
脚本执行
在完成编码后,用户需要先对脚本进行保存,保存按钮位于编辑器的右上部分。在完成保存后,通过编辑器的左上侧的执行按钮来完成一次脚本的执行。同时,可以在编辑器的调试输出窗口中看到脚本的执行返回情况。通过反复执行和观察输出,完成脚本的调试。
组态触发
通过在组态中绑定脚本与输入框,将数据的内容作为输入参数调用脚本。传入的参数对应脚本入口函数handler的event参数,格式为JSON字符串。在脚本中可以通过event做JSON转换后获取配置的参数值。
例如图中示例,“确定”按钮关联了输入框与脚本“006”,并制定输入框内容对应参数名为“arg1”。当输入框填写“test”并点击“确认”按钮后,会向后台脚本发起调用请求,并携带参数'{"arg1":"test"}'。后台脚本通过var eventJson = JSON.parse(event) 获取event JSON对象,然后通过eventJson.arg1在脚本内获取输入框填写内容。
event是有脚本调用方封装数据格式传入脚本中,一般是JSON格式,脚本内通过解析event的格式来获取脚本调用的入参数据。在组态触发中event封装的为输入框组合的数据。
规则触发
规则触发关联脚本执行时,会在后台封装event数据格式,携带设备标识参数。触发器服务会对设备上报属性、上报事件发送不同的even数据格式。
<设备属性触发>
{
"source":"DEVICE_STATUS", //消息来源
"timestamp":1523844349000, //消息时间戳(毫秒级)
"context":{ //消息的上下文数据,比如设备id,设备分组,场景id等
"deviceName":"test001",
"productKey":"a1OvAcS1uxy",
"sceneId":"1q2w3e"
},
"bodyData":{ //消息的主要数据,比如设备上报的属性数据
"LightSwitch":{
"time":1524216467962,
"value":0
}
}
}
<设备事件触发>
{
"source":"DEVICE_EVENT", //消息来源
"timestamp":1523844349000, //消息时间戳(毫秒级)
"context":{ //消息的上下文数据,比如设备id,设备分组,场景id等
"deviceName":"test001",
"productKey":"a1OvAcS1uxy",
"eventCode":"Shortage",
"sceneId":"1q2w3e"
},
"bodyData":{ //消息的主要数据,比如设备上报的属性数据
"x":0,
"y":1,
"inventory":10
}
}