在服务开发工作台,开发三个服务应用,分别用于:获取设备上报的温度数据,每整点统计前一小时的最高温度数据,和筛选指定时间段内每小时的最高温度数据。

操作步骤

  1. 在项目页,选择服务开发 > 新建服务
  2. 新建一个设备触发服务。
    该服务以温度监测器设备作为触发节点,接收温度监测器设备上报的温度数据,并存储到云数据库RDS版MySQL数据表中。
    1. 输入服务基本信息,新建一个服务。
    2. 从服务编辑器左侧节点页签下,拖拽一个设备触发节点到画布上,并配置输入数据为温度监测器上报的属性。
      配置设备触发节点
    3. 配置一个云数据库RDS节点,用于将温度监测器上报的温度数据存入数据表sensor_data。
      配置RDS节点

      本示例中,输入的参数为:

      {
          "table": "sensor_data",
          "rows": [
              {
             "id":{{payload.deviceContext.gmtCreate}},
             "deviceName" : "{{payload.deviceContext.deviceName}}",
             "dateTime" : "{{payload.props.temperature.time}}",
             "temperature" : {{payload.props.temperature.value}}
      
               }
          ]
      }
    4. 单击部署,部署服务。
    5. 单击启动,启动服务。
    6. 单击调试,前往产品的在线调试页签,开启虚拟设备,推送模拟温度数据。
  3. 新建一个定时触发服务。

    该服务用于每整点统计前一小时的最高温度数据,并存储到云数据库RDS版MySQL数据表中。

    1. 在服务开发页右上角,单击服务列表右侧的添加图标+,新增一个服务。
    2. 配置一个定时触发节点,用于每整点触发一次服务。
      定时触发节点
    3. 配置一个云数据库RDS节点,用于从存储设备上报的温度数据的数据表sensor_data中,查询数据。
      rds节点

      本示例中,查询数据的输入参数为:

      {
          "table": "sensor_data",
          "condition": {
              "where": {"deviceName": "bZxNh9qi6PyqYvFcDvqK"},
              "columns": [
                  "id",
                  "deviceName",
                  "temperature",
                  "dateTime"
                  ],
              "orders": ["temperature"]
          }
      }
    4. 配置一个Node.js节点,用于提取每小时内,设备上报的最高温度。
      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;
      }
    5. 再配置一个云数据库RDS节点,用于将Node.js处理后的数据存入数据表Maxtemperature。
      rds数据表节点

      本示例中,输入的参数为:

      {
          "table": "Maxtemperature",
          "rows": [{
                  "id": {{payload.id}},
                  "deviceName": "{{payload.deviceName}}",
                  "dateTime": "{{payload.dateTime}}",
                  "maxTemperature": {{payload.maxTemperature}}
          }]
      }
    6. 单击部署,部署服务。
    7. 单击启动,启动服务。
    8. 单击调试,输入模拟时间,调试服务。
  4. 创建一个HTTP接口,用于实现筛选指定时间段的数据。
    1. 在服务开发页右上角,单击服务列表右侧的添加图标+,新增一个服务。
    2. 配置一个HTTP请求节点,设置筛选温度数据API的Action名称和请求参数。
      HTTP请求

      本示例中,配置了以下三个请求参数。

      参数 类型 是否必需 说明
      DeviceName String 调用接口时,传入设备名称,查询指定设备上报的温度数据;不传入设备名称,则返回全部设备的温度数据。
      startTime Int 调用接口时,需传入要查询数据的起始时间。
      endTime Int 调用接口时,需传入要查询数据的结束时间
    3. 配置一个云数据库RDS节点,用于从数据表Maxtemperature中获取每小时的最高温度数据。
      RDS节点

      本示例中,输入的参数为:

      {
          "table": "maxtemperature",
          "condition": {
              "where": {
                  "deviceName": "{{payload.DeviceName}}"
              },
              "columns": [
                  "maxTemperature",
                  "dateTime"
              ],
              "orders": [
                  "dateTime"
              ]
          }
      }
    4. 配置一个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;
      }
    5. 配置一个HTTP返回节点,输出Node.js节点处理后的数据。
      HTTP返回
    6. 单击部署,部署服务。
    7. 单击调试,输入请求参数,调试服务。
  5. 三个服务均调试成功后,单击页面右上角的发布按钮,发布服务。