背景信息

  • 场景:

    办公室中已经布点的温湿度计设备上报数据到钉钉群机器人。

  • 思路:

    温湿度计通过MQTT协议连接到物联网平台,规则引擎针对数据上报Topic配置转发到函数计算(Function Compute)中编写好的函数pushData2DingTalk,函数Nodejs脚本处理数据,post到钉钉群机器人的Webhook,配置了温湿度机器人的钉钉群组即可收到消息。

    流程说明如图 1所示。

    图 1. 温湿度传感流程图

操作步骤

  1. 钉钉群机器人配置。
    1. 登录钉钉电脑版。
    2. 选择钉钉群聊天窗口的,选择群机器人
    3. 单击添加机器人,选择自定义,单击添加
    4. 设置机器人名字,单击下一步,使用默认设置,单击完成
  2. 函数计算脚本编写。
    1. 开通阿里云函数计算服务。

      函数计算,是一个事件驱动的全托管计算服务,目前支持的语言Java、NodeJS、Python等语言,具体请参见如何使用函数计算

    2. 编写函数脚本,此处选择Nodejs执行环境,从上游物联网平台处获取到设备位置,设备编号,实时温度,相对湿度和上报时间,依据钉钉消息格式组装,并用https模块post数据到钉钉群机器人的webhook接口。
    3. 登录函数计算控制台,新增IoT_Service服务。
    4. 单击新建函数,选择空白函数模板。
    5. 不创建触发器,配置基础信息,如图 2所示。
      图 2. 基础配置


      函数pushData2DingTalk完整脚本如下:
      
      const https = require('https');
      const accessToken = '此处填写钉钉机器人webhook的accessToken';
      module.exports.handler = function(event, context, callback) {
      var eventJson = JSON.parse(event.toString());
      //钉钉消息格式
      const postData = JSON.stringify({
      "msgtype": "markdown",
      "markdown": {
      "title": "温湿度传感器",
      "text": "#### 温湿度传感器上报\n" +
      "> 设备位置:" + eventJson.tag + "\n\n" +
      "> 设备编号:" + eventJson.isn+ "\n\n" +
      "> 实时温度:" + eventJson.temperature + "℃\n\n" +
      "> 相对湿度:" + eventJson.humidity + "%\n\n" +
      "> ###### " + eventJson.time + " 发布 by [物联网平台](https://www.aliyun.com/product/iot) \n"
      },
      "at": {
      "isAtAll": false
      }
      });
      const options = {
      hostname: 'oapi.dingtalk.com',
      port: 443,
      path: '/robot/send?access_token=' + accessToken,
      method: 'POST',
      headers: {
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(postData)
      }
      };
      const req = https.request(options, (res) => {
      res.setEncoding('utf8');
      res.on('data', (chunk) => {});
      res.on('end', () => {
      callback(null, 'success');
      });
      });
      // 异常返回
      req.on('error', (e) => {
      callback(e);
      });
      // 写入数据
      req.write(postData);
      req.end();
      };
  3. 物联网平台配置。
    1. 在物联网平台的控制台,选择产品管理,创建温湿度计产品,系统会生成productKey。
    2. 选择设备管理,在温湿度计产品创建一个具体设备,获得deviceName和deviceSecret用于身份验证。
    3. 单击设备后的查看,在设备标签页签下,单击立即添加,给设备添加两个设备属性。
      表 1. 设备属性
      属性 属性值 描述
      tag 云栖小镇 2号楼3层007S 设备所在位置
      deviceISN T20180102XnbKjmoAnUb 设备序列号
    4. 选择产品管理,单击产品后的查看,在左侧消息通信下,创建一个Topic为/productKey/${deviceName}/data,设备操作权限设置为发布。
    5. 选择规则引擎,创建并启用规则引擎,一条完整的规则包括基本信息,处理数据和转发数据三部分,其中转发数据支持配置多个转发动作。
      1. 配置数据处理脚本。

        规则引擎SQL脚本支持SQL表达式

        设备本身信息中抽取设备名(deviceName),自定义属性中获取标签(tag)和序列号(deviceISN)。

        从温湿度采集设备上报数据消息的payload中获取温度值(temperature)和湿度值(humidity)。



        具体SQL语句如下:
        
        SELECT
        deviceName() as deviceName,
        attribute('tag') as tag,
        attribute('deviceISN') as isn,
        temperature,
        humidity,
        timestamp('yyyy-MM-dd HH:mm:ss') as time
        FROM
        "/此处为产品productKey/+/data"
      2. 配置转发动作到函数计算。


        定义好的规则toFC完整信息如下:



    6. 单击启用,启用规则。
  4. 温湿度计设备。
    为了方便联调,先用Nodejs程序模拟温湿度计,上报采集到的数据。这里依赖了 aliyun-iot-mqtt库demo.js完整代码如下:
    
    const mqtt = require('aliyun-iot-mqtt');
    const client = mqtt.getAliyunIotMqttClient({
    productKey: "产品productKey",
    deviceName: "设备deviceName",
    deviceSecret: "设备的secret"
    });
    const topic = '添加了转发函数计算规则的Topic';
    const data = {
    temperature: 18,
    humidity: 63,
    };
    client.publish(topic, JSON.stringify(data));
  5. 完整演示。
    1. 程序模拟发送数据。
      
      $ npm install
      $ node demo.js


    2. 钉钉群消息效果,如图 3所示。
      图 3. 钉钉群消息效果