开发获取温度数据的服务

更新时间:

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

前提条件

已完成以下操作:

  1. 创建项目和产品

  2. 开发虚拟设备

  3. 使用云数据库创建数据表

说明

开发设备有不同的方法,用户可根据实际场景需要,选择相应的设备开发方法。本案例以开发虚拟设备为例。

操作步骤

  1. 在开发工具模块,单击业务逻辑

    业务逻辑

  2. 业务逻辑开发页面,单击空白模板区域。

    新建业务逻辑

  3. 创建一个设备触发服务。

    该服务以温度监测器设备作为触发节点,接收温度监测器设备上报的温度数据,并存储到云数据库RDS版MySQL数据表中。

    1. 输入业务逻辑服务的基本信息并单击确认

      参数

      说明

      服务名称

      服务的唯一标识符,在项目下具有唯一性。例如:存储温度数据

      仅支持中文汉字、英文字母、数字、下划线(_)、连接号(-)和英文圆括号(()),且必须以中文汉字、英文字母或数字开头,长度不超过30个字符(一个中文汉字算一个字符)。

      所属项目

      服务所属的项目。本案例选择已创建的项目:茶园监控方案

      备注

      描述服务的用途等信息。长度不超过100个字符(一个中文汉字算一个字符)。

    2. 从服务编辑器左侧节点页签下,拖拽一个设备触发节点到画布上,并配置输入数据为温度监测器上报的属性。

      配置设备触发节点

    3. 配置一个云数据库MySQL节点,用于将温度监测器上报的温度数据存入数据表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. 单击部署调试按钮部署,部署并启动服务。

      说明

      本案例是以开启虚拟设备上报数据,无需再次部署调试。具体操作,请参见开发虚拟设备

  4. 创建一个定时触发服务。

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

    1. 切换到服务列表页面,单击服务列表右侧的添加图标添加按钮

      新增服务

    2. 业务逻辑开发页面,创建并设置定时触发服务。

      1. 打开新建业务服务对话框。具体操作,请参见步骤3

      2. 设置定时触发服务的基本信息设置(例如服务名称为存储最高温度数据)。具体操作,请参见步骤4的第一个子步骤。

    3. 配置一个定时触发节点,用于每整点触发一次服务。

      定时触发节点

    4. 配置一个云数据库MySQL节点,用于从存储设备上报的温度数据的数据表sensor_data中,查询数据。

      rds节点

      本示例中,查询数据的输入参数如下所示。

      {
          "table": "sensor_data",
          "condition": {
              "where": {"deviceName": "bZxNh9qi6PyqYvFcDvqK"},
              "columns": [
                  "id",
                  "deviceName",
                  "temperature",
                  "dateTime"
                  ],
              "orders": ["temperature"]
          }
      }
    5. 配置一个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;
      }
    6. 再配置一个云数据库MySQL节点,用于将Node.js处理后的数据存入数据表Maxtemperature。

      rds数据表节点

      本示例中,输入的参数如下所示。

      {
          "table": "Maxtemperature",
          "rows": [{
                  "id": "{{payload.id}}",
                  "deviceName": "{{payload.deviceName}}",
                  "dateTime": "{{payload.dateTime}}",
                  "maxTemperature": "{{payload.maxTemperature}}"
          }]
      }
    7. 单击部署调试按钮部署,部署并启动服务。

    8. 单击部署调试按钮部署,输入模拟时间,调试服务。

  5. 创建一个HTTP接口,用于实现筛选指定时间段的数据。

    1. 参照步骤5中的子步骤1和子步骤2,新增一个服务(例如获取温度数据)。

    2. 配置一个HTTP请求节点,设置筛选温度数据API的Action名称和请求参数。

      HTTP请求

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

      参数

      类型

      是否必需

      说明

      DeviceName

      String

      调用接口时,传入设备名称,查询指定设备上报的温度数据;不传入设备名称,则返回全部设备的温度数据。

      startTime

      Int

      调用接口时,需传入要查询数据的起始时间。

      endTime

      Int

      调用接口时,需传入要查询数据的结束时间。

    3. 配置一个云数据库MySQL节点,用于从数据表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*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;
      }
    5. 配置一个HTTP返回节点,输出Node.js节点处理后的数据。

      HTTP返回

    6. 单击部署调试按钮部署,部署并启动服务。

    7. 单击部署调试按钮部署,输入请求参数,调试服务。

  6. 三个服务均调试成功后,单击页面右上角的发布按钮发布,发布服务。

后续步骤

开发可视化茶园监控大屏