开发获取温度数据的服务
在业务逻辑工作台,开发三个业务服务,分别用于获取设备上报的温度数据,每整点统计前一小时的最高温度数据,和筛选指定时间段内每小时的最高温度数据。
前提条件
已完成以下操作:
开发设备有不同的方法,用户可根据实际场景需要,选择相应的设备开发方法。本案例以开发虚拟设备为例。
操作步骤
在开发工具模块,单击业务逻辑。
在业务逻辑开发页面,单击空白模板区域。
创建一个设备触发服务。
该服务以温度监测器设备作为触发节点,接收温度监测器设备上报的温度数据,并存储到云数据库RDS版MySQL数据表中。
输入业务逻辑服务的基本信息并单击确认。
参数
说明
服务名称
服务的唯一标识符,在项目下具有唯一性。例如:存储温度数据
仅支持中文汉字、英文字母、数字、下划线(_)、连接号(-)和英文圆括号(()),且必须以中文汉字、英文字母或数字开头,长度不超过30个字符(一个中文汉字算一个字符)。
所属项目
服务所属的项目。本案例选择已创建的项目:茶园监控方案。
备注
描述服务的用途等信息。长度不超过100个字符(一个中文汉字算一个字符)。
从服务编辑器左侧节点页签下,拖拽一个设备触发节点到画布上,并配置输入数据为温度监测器上报的属性。
配置一个云数据库MySQL节点,用于将温度监测器上报的温度数据存入数据表sensor_data。节点配置具体操作,请参见节点配置。
本示例中,输入的参数如下所示。
{ "table": "sensor_data", "rows": [ { "id":"{{payload.deviceContext.gmtCreate}}", "deviceName" : "{{payload.deviceContext.deviceName}}", "dateTime" : "{{payload.props.temperature.time}}", "temperature" : "{{payload.props.temperature.value}}" } ] }
单击部署调试按钮,部署并启动服务。
说明本案例是以开启虚拟设备上报数据,无需再次部署调试。具体操作,请参见开发虚拟设备。
创建一个定时触发服务。
该服务用于每整点统计前一小时的最高温度数据,并存储到云数据库RDS版MySQL数据表中。
切换到服务列表页面,单击服务列表右侧的添加图标。
在业务逻辑开发页面,创建并设置定时触发服务。
配置一个定时触发节点,用于每整点触发一次服务。
配置一个云数据库MySQL节点,用于从存储设备上报的温度数据的数据表sensor_data中,查询数据。
本示例中,查询数据的输入参数如下所示。
{ "table": "sensor_data", "condition": { "where": {"deviceName": "bZxNh9qi6PyqYvFcDvqK"}, "columns": [ "id", "deviceName", "temperature", "dateTime" ], "orders": ["temperature"] } }
配置一个Node.js节点,用于提取每小时内,设备上报的最高温度。
本示例中,输入的脚本如下所示。
/** * @param {Object} payload 上一节点的输出 * @param {Object} node 指定某个节点的输出 * @param {Object} query 服务流第一个节点的输出 * @param {Object} context { appKey, appSecret } */ module.exports = async function(payload, node, query, context) { console.log("payload: ", payload); let result = {}; result.index = payload.length - 1; result.maxTemperature = payload[result.index].temperature; result.id = payload[result.index].id; result.deviceName = payload[result.index].deviceName; result.dateTime = payload[result.index].dateTime; return result; }
再配置一个云数据库MySQL节点,用于将Node.js处理后的数据存入数据表Maxtemperature。
本示例中,输入的参数如下所示。
{ "table": "Maxtemperature", "rows": [{ "id": "{{payload.id}}", "deviceName": "{{payload.deviceName}}", "dateTime": "{{payload.dateTime}}", "maxTemperature": "{{payload.maxTemperature}}" }] }
单击部署调试按钮,部署并启动服务。
单击部署调试按钮,输入模拟时间,调试服务。
创建一个HTTP接口,用于实现筛选指定时间段的数据。
参照步骤5中的子步骤1和子步骤2,新增一个服务(例如获取温度数据)。
配置一个HTTP请求节点,设置筛选温度数据API的Action名称和请求参数。
本示例中,配置了以下三个请求参数。
参数
类型
是否必需
说明
DeviceName
String
否
调用接口时,传入设备名称,查询指定设备上报的温度数据;不传入设备名称,则返回全部设备的温度数据。
startTime
Int
是
调用接口时,需传入要查询数据的起始时间。
endTime
Int
是
调用接口时,需传入要查询数据的结束时间。
配置一个云数据库MySQL节点,用于从数据表Maxtemperature中获取每小时的最高温度数据。
本示例中,输入的参数如下所示。
{ "table": "maxtemperature", "condition": { "where": { "deviceName": "{{payload.DeviceName}}" }, "columns": [ "maxTemperature", "dateTime" ], "orders": [ "dateTime" ] } }
配置一个Node.js节点,用于筛选指定时间段内的温度数据。
本示例中,输入的脚本如下所示。
/** * @param {Object} payload 上一节点的输出 * @param {Object} node 指定某个节点的输出 * @param {Object} query 服务流第一个节点的输出 * @param {Object} context { appKey, appSecret } */ module.exports = async function(payload, node, query, context) { console.log("payload: ", payload); let length = 0; for (let i = 0; i < payload.length; i++) { if(parseInt(payload[i].dateTime) >= query.startTime*1000 && parseInt(payload[i].dateTime) <= query.endTime*1000) { length = length + 1; } } console.log("length", length); var result = new Array(length); for(let i = 0; i < length ; i++){ result[i] = new Array(2); result[i][0] = ""; result[i][1] = 0; } let valid = 0; for(let j = 0 ;j < payload.length ; j++ ){ if(parseInt(payload[j].dateTime) >= query.startTime*1000 && parseInt(payload[j].dateTime) <= query.endTime*1000) { result[valid][0] = payload[j].dateTime; result[valid][1] = payload[j].maxTemperature; valid = valid + 1; } } return result; }
配置一个HTTP返回节点,输出Node.js节点处理后的数据。
单击部署调试按钮,部署并启动服务。
单击部署调试按钮,输入请求参数,调试服务。
三个服务均调试成功后,单击页面右上角的发布按钮,发布服务。