全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
阿里云物联网套件

温湿度计上报数据到钉钉群机器人实践

更新时间:2018-01-12 16:44:13

0. 背景介绍

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

思路:温湿度计通过MQTT协议连接到IoT套件,规则引擎针对数据上报Topic配置转发到函数计算(FunctionComputer)中编写好的函数pushData2DingTalk,函数Nodejs脚本处理数据,post到钉钉群机器人的Webhook,配置了温湿度机器人的钉钉群组即可收到消息。关系图.png

1. 钉钉群机器人配置

钉钉PC端

①、登录钉钉电脑版;

②、群聊天窗口右上角找到机器人图标,点击图标。

③、选择自定义Webhook机器人,按指引添加名字和图标,并确认完成。

添加完成后,对应的机器人设置页面如下,其中红框中的webhook地址已经包含了访问用的accessToken

钉钉群机器人配置.png

2. 函数计算脚本编写

2.1 开通阿里云函数计算服务

函数计算,是一个事件驱动的全托管计算服务,目前支持的语言Java、NodeJS、Python等语言,详见

2.2 编写函数脚本

这里我们选择Nodejs执行环境,从上游IoT套件处获取到设备位置,设备编号,实时温度,相对湿度和上报时间,依据钉钉消息格式组装,并用https模块post数据到钉钉群机器人的webhook接口。

2.2.1 创建函数

我们选择华东2区,创建服务IoT_Service,新建空白Nodejs函数pushData2DingTalk。

函数计算.png

2.2.2 函数pushData2DingTalk完整脚本如下:

  1. const https = require('https');
  2. const accessToken = '此处填写钉钉机器人webhook的accessToken';
  3. module.exports.handler = function(event, context, callback) {
  4. var eventJson = JSON.parse(event.toString());
  5. //钉钉消息格式
  6. const postData = JSON.stringify({
  7. "msgtype": "markdown",
  8. "markdown": {
  9. "title": "温湿度传感器",
  10. "text": "#### 温湿度传感器上报\n" +
  11. "> 设备位置:" + eventJson.tag + "\n\n" +
  12. "> 设备编号:" + eventJson.isn+ "\n\n" +
  13. "> 实时温度:" + eventJson.temperature + "℃\n\n" +
  14. "> 相对湿度:" + eventJson.humidity + "%\n\n" +
  15. "> ###### " + eventJson.time + " 发布 by [物联网套件](https://www.aliyun.com/product/iot) \n"
  16. },
  17. "at": {
  18. "isAtAll": false
  19. }
  20. });
  21. const options = {
  22. hostname: 'oapi.dingtalk.com',
  23. port: 443,
  24. path: '/robot/send?access_token=' + accessToken,
  25. method: 'POST',
  26. headers: {
  27. 'Content-Type': 'application/json',
  28. 'Content-Length': Buffer.byteLength(postData)
  29. }
  30. };
  31. const req = https.request(options, (res) => {
  32. res.setEncoding('utf8');
  33. res.on('data', (chunk) => {});
  34. res.on('end', () => {
  35. callback(null, 'success');
  36. });
  37. });
  38. // 异常返回
  39. req.on('error', (e) => {
  40. callback(e);
  41. });
  42. // 写入数据
  43. req.write(postData);
  44. req.end();
  45. };

3. IoT套件配置

3.1 创建产品和设备

①、我们现在物联网套件控制台创建温湿度计产品,系统会生成productKey

②、在温湿度计产品创建一个具体设备,获得deviceName和deviceSecret用于身份验证,

③、给设备添加两个设备属性

属性 属性值 描述
tag 云栖小镇 2号楼3层007S 设备所在位置
deviceISN T20180102XnbKjmoAnUb 设备序列号

设备信息.png

3.2 创建并订阅Topic

这里我们选择温湿度计产品,在左侧消息通信下创建一个Topic为/productKey/${deviceName}/data,设备操作权限设置:发布。

topic设置.png

3.3 创建并启用规则引擎

一条完整的规则包括基本信息,处理数据,转发数据三部分,其中转发数据支持配置多个转发动作。

3.3.1 配置数据处理脚本

规则引擎SQL脚本支持特定SQL和函数查询

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

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

规则引擎SQL.png

具体SQL如下:

  1. SELECT
  2. deviceName() as deviceName,
  3. attribute('tag') as tag,
  4. attribute('deviceISN') as isn,
  5. temperature,
  6. humidity,
  7. timestamp('yyyy-MM-dd HH:mm:ss') as time
  8. FROM
  9. "/此处为产品productKey/+/data"

3.3.2 配置转发动作到函数计算

FC转发配置.png

3.3.3 完整规则如下

我们定义好的规则toFC完整信息如下:一条规则引擎.png

3.3.4 启用规则引擎

这里找到我们定义好的规则toFC,并启用。规则引擎启用.png

4. 温湿度计设备

为了方便联调我们先用Nodejs程序模拟温湿度计,上报采集到的数据。这里依赖了aliyun-iot-mqtt库demo.js完整代码如下:

  1. const mqtt = require('aliyun-iot-mqtt');
  2. const client = mqtt.getAliyunIotMqttClient({
  3. productKey: "产品productKey",
  4. deviceName: "设备deviceName",
  5. deviceSecret: "设备的secret"
  6. });
  7. const topic = '添加了转发函数计算规则的Topic';
  8. const data = {
  9. temperature: 18,
  10. humidity: 63,
  11. };
  12. client.publish(topic, JSON.stringify(data));

5. 完整演示

5.1 程序模拟发送数据:

  1. $ npm install
  2. $ node demo.js

执行.png

5.2 钉钉群消息效果:

钉钉群效果.png

本文导读目录