在服务开发工作台,开发三个服务应用,分别用于:获取设备上报的温度数据,每整点统计前一小时的最高温度数据,和筛选指定时间段内每小时的最高温度数据。
操作步骤
- 在项目页,选择服务开发 > 新建服务。
- 新建一个设备触发服务。该服务以温度监测器设备作为触发节点,接收温度监测器设备上报的温度数据,并存储到云数据库RDS版MySQL数据表中。
- 输入服务基本信息,新建一个服务。
- 从服务编辑器左侧节点页签下,拖拽一个设备触发节点到画布上,并配置输入数据为温度监测器上报的属性。
- 配置一个云数据库RDS节点,用于将温度监测器上报的温度数据存入数据表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数据表中。
- 在服务开发页右上角,单击服务列表右侧的添加图标+,新增一个服务。
- 配置一个定时触发节点,用于每整点触发一次服务。
- 配置一个云数据库RDS节点,用于从存储设备上报的温度数据的数据表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; }
- 再配置一个云数据库RDS节点,用于将Node.js处理后的数据存入数据表Maxtemperature。
本示例中,输入的参数为:
{ "table": "Maxtemperature", "rows": [{ "id": {{payload.id}}, "deviceName": "{{payload.deviceName}}", "dateTime": "{{payload.dateTime}}", "maxTemperature": {{payload.maxTemperature}} }] }
- 单击部署,部署服务。
- 单击启动,启动服务。
- 单击调试,输入模拟时间,调试服务。
- 创建一个HTTP接口,用于实现筛选指定时间段的数据。
- 在服务开发页右上角,单击服务列表右侧的添加图标+,新增一个服务。
- 配置一个HTTP请求节点,设置筛选温度数据API的Action名称和请求参数。
本示例中,配置了以下三个请求参数。
参数 类型 是否必需 说明 DeviceName String 否 调用接口时,传入设备名称,查询指定设备上报的温度数据;不传入设备名称,则返回全部设备的温度数据。 startTime Int 是 调用接口时,需传入要查询数据的起始时间。 endTime Int 是 调用接口时,需传入要查询数据的结束时间 - 配置一个云数据库RDS节点,用于从数据表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 && parseInt(payload[i].dateTime) <= query.endTime) { 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 && parseInt(payload[j].dateTime) <= query.endTime) { result[valid][0] = payload[j].dateTime; result[valid][1] = payload[j].maxTemperature; valid = valid + 1; } } return result; }
- 配置一个HTTP返回节点,输出Node.js节点处理后的数据。
- 单击部署,部署服务。
- 单击调试,输入请求参数,调试服务。
- 三个服务均调试成功后,单击页面右上角的发布按钮,发布服务。