温湿度计上报数据到物联网平台,物联网平台通过数据流转规则,将温湿度数据转发到钉钉群机器人,钉钉群里即可收到温湿度数据。
背景信息
- 场景:
办公室中布点的温湿度计设备上报数据到钉钉群机器人。
- 思路:
温湿度计通过MQTT协议连接到物联网平台,并上报数据。配置数据流转规则,将数据转发到函数计算(Function Compute)中编写好的函数pushData2DingTalk,函数Nodejs脚本处理数据,再推送到钉钉群机器人的Webhook。配置了温湿度机器人的钉钉群组即可收到消息。
图 1. 温湿度传感流程图
操作步骤
- 钉钉群机器人配置。
- 函数计算脚本编写。
- 开通阿里云函数计算服务。
函数计算,是一个事件驱动的全托管计算服务,目前支持的语言Java、NodeJS、Python等语言,具体请参见如何使用函数计算。
- 编写函数脚本,此处选择Nodejs执行环境,从上游物联网平台处获取到设备位置,设备编号,实时温度,相对湿度和上报时间,依据钉钉消息格式组装,并用https模块post数据到钉钉群机器人的webhook接口。
- 登录函数计算控制台,创建服务。本示例中创建的额服务名为IoT_Service。
- 创建函数。选择空白函数模板和不创建触发器,函数的基础信息,如下图所示:
图 2. 基础配置
函数pushData2DingTalk完整脚本如下:
const https = require('https'); const accessToken = '填写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(); };
- 开通阿里云函数计算服务。
- 在物联网平台控制台,创建产品和设备,添加设备标签,和配置数据流转规则。
- 在物联网平台的控制台对应实例的左侧导航栏,选择设备管理 > 产品,创建一个温湿度计产品。系统会生成productKey。
- 在产品的产品详情页,选择Topic类列表 > 自定义Topic > 定义Topic类,创建一个具有发布权限的Topic类。本示例中,创建的Topic类为
/productKey/${deviceName}/user/data
。 - 在左侧导航栏,选择设备,在温湿度计产品下,创建一个具体的温湿度计设备。获得deviceName和deviceSecret,用于设备连接物联网平台时身份验证。
- 在设备详情页的标签信息栏,单击编辑,给设备添加标签。
本示例中添加了如下两个标签:
Key Value 描述 tag 云栖小镇X号楼F层00XS 设备所在位置 deviceISN T20180102XnbKjmo**** 设备序列号 - 创建和配置数据转发规则,将温湿度计上报的温度和湿度等数据转发至函数计算的函数中。
- 选择规则引擎 > 云产品流转 > 创建规则,创建一个数据转发规则。
- 配置处理数据的SQL。
规则引擎SQL脚本支持SQL表达式。
本示例中,定义筛选的消息字段包含:
具体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/+/user/data"
- 设备本身信息中抽取设备名(deviceName),自定义属性中获取标签(tag)和序列号(deviceISN)。
- 从温湿度采集设备上报数据消息的payload中获取温度值(temperature)和湿度值(humidity)。
- 配置数据转发操作,将数据转发到函数计算(FC)。
- 在数据流转规则列表中,单击规则对应的启动,启用规则。
- 温湿度计设备连接物联网平台,并上报数据。
为了方便联调,先用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));
- 模拟演示。