物联网平台设备数据上云

更新时间: 2023-12-11 14:13:20

技术解决方案部署

130

https://www.aliyun.com/solution/tech-solution/iot_cloud

方案概览

本文以温湿度传感器设备为例,介绍了如何将该设备接入物联网平台,将设备所上报的数据转发至函数计算FC,并最终推送数据到钉钉群中。

方案架构

方案提供的默认设置完成部署后在阿里云上搭建的网站运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。

物联网设备上云.jpg

本方案的技术架构包括以下基础设施和云服务:

  • 1个物联网企业版实例:基于物联网平台,连接用户的设备和业务服务器。

  • 1台云服务器ECS实例:模拟实际的温湿度传感器设备,向物联网平台上报数据。

  • 1个专有网络VPC:为云服务器ECS提供云上私有网络。

  • 1个交换机vSwitch:云服务器资源必须部署在专有网络的交换机中。

  • 1个函数计算的服务:服务是函数计算资源管理的单位。一个服务可以由多个函数组成。

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值。本方案的云资源支持按量付费,且默认设置均采用按量付费引导操作。如果确定任何一个云资源采用按量付费方式部署,账户余额都必须大于等于100元。

    • 完成本方案的部署及体验,预计产生费用不超过900元(假设资源运行时间不超过1小时)。如果您调整了资源规格、使用时长,或执行了本方案以外的操作,可能会导致费用发生变化,请以控制台显示的实际价格和最终账单为准。以下为本方案中需付费资源在上海地域的价格,仅供参考。

      产品

      计费项

      单价

      云服务器ECS

      实例规格、系统盘和公网流量

      • 实例0.334元/小时

      • 系统盘0.042元/小时

      • 公网流量0.8元/GB

      物联网平台企业版实例

      企业版实例(包年包月)

      最低规格866元

      函数计算服务和函数

      invoke请求数、公网出流量、活跃vCPU使用量和内存使用量

      • invoke请求数0.01元/万次

      • 公网出流量0.5元/GB

      • 活跃vCPU使用量0.000127元/vCPU*秒

      • 内存使用量0.0000127元/GB*秒

  3. 创建用于方案部署的RAM用户并授予权限。

    1. 创建1个RAM用户IoT-Test。具体操作,请参见创建RAM用户

    2. 为RAM用户添加云资源的相应权限。

      1. 在资源管理中创建1个资源组IoT-Resource-Group。具体操作,请参见创建资源组

      2. 创建自定义权限策略。本文用到的函数计算不支持资源组或资源标签,所以需要创建自定义权限策略。自定义权限策略的名称为IoT-FC,权限策略内容如下。具体策略说明,请参见权限策略及示例

        {
          "Version": "1",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "fc:ListServices",
                "fc:ListFunctions",
                "fc:GetService",
                "fc:GetFunction",
                "fc:CreateFunction",
                "fc:CreateService",
                "fc:DeleteFunction",
                "fc:DeleteService",
                "fc:GetFunctionCode",
                "fc:InvokeFunction"
              ],
              "Resource": "*"
            }
          ]
        }
      3. 本方案中,物联网平台将设备数据转发到函数计算,需要通过扮演服务关联角色的方式。需要为RAM用户授予创建服务关联角色AliyunIOTAccessingFCRole的权限。授权的具体操作,请参见为RAM用户授权

        {
            "Version": "1",
            "Statement": [
                {
                    "Action": [
                        "ram:AttachPolicyToRole",
                        "ram:CreateRole"
                    ],
                    "Resource": [
                        "acs:ram:*:system:policy/AliyunIOTAccessingFCRolePolicy",
                        "acs:ram:*:*:role/AliyunIOTAccessingFCRole"
                    ],
                    "Effect": "Allow"
                }
            ]
        }
      4. 为资源组添加RAM身份并授权。

        1. 登录资源管理控制台

        2. 在左侧导航栏,选择资源组 > 资源组

        3. 在资源组名称后的操作列,单击权限管理

        4. 单击新增授权,为RAM用户添加相应权限。

          说明
          • 被添加到目标资源组,并被授予阿里云服务的管理权限的RAM用户,只能管理目标资源组中的阿里云资源。

          • 单次授权最多支持添加5条权限策略,您可以分2次添加本方案所需权限。

          授权范围

          授权主体

          权限策略

          整个云账号

          IoT-Test

          AliyunBSSOrderAccess

          在费用中心(BSS)查看订单、支付订单及取消订单的权限。

          IoT-Test

          AliyunVPCReadOnlyAccess

          只读访问专有网络(VPC)的权限。

          IoT-Test

          IoT-FC

          管理函数计算服务和函数的权限。

          目标资源组

          IoT-Test

          AliyunECSFullAccess

          管理云服务器ECS的权限。

          IoT-Test

          AliyunVPCFullAccess

          管理专有网络VPC的权限。

          IoT-Test

          AliyunIOTFullAccess

          管理物联网平台的权限。

规划网络和资源

20

网络规划

请参考表格中的说明和方案默认示例值,为每个规划项做详细规划,并在实际部署时将默认示例值修改为您的实际规划。

规划项

数量

说明

地域

1

您的云服务部署的地域。选择地域的基本原则请参见地域和可用区

专有网络VPC

1

在部署过程中新建一个VPC作为本方案的专有网络。

交换机

1

本方案需要1台交换机。

安全组

1

用于限制专有网络VPC下云服务器ECS的网络流入和流出规则。

规划云资源

请参考表格中的说明和方案默认示例值,为每个规划项做详细规划,并在实际部署时将默认示例值修改为您的实际规划。

规划项

数量

说明

ECS实例

1

本方案需要1台ECS实例,用于接收设备上传的数据。

函数计算

1

本方案需要函数计算的1个服务。

物联网平台企业版实例

1

本方案需要1个物联网企业版实例。

部署资源

30

规划好资源后,请按照以下步骤部署方案中的所有资源。

1. 创建物联网平台实例

  1. 登录物联网平台控制台

  2. 实例概览页签的购买企业版实例卡片中,单击购买实例

  3. 在实例购买页面,根据您的业务需求选择实例规格,选择资源组为IoT-Resource-Group,完成购买。

  4. 实例概览页签,单击该实例。

  5. 实例详情页面,单击实例基本信息区域的编辑,输入IoT测试环境,单击保存

    保存备注名称后,在实例概览页签,以备注名称显示该实例,便于您后续快速找到实例。

2. 创建函数计算服务

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数

  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击创建服务

  3. 设置服务名称为IoT_Service,单击确定

3. 创建专有网络VPC和交换机

云服务器ECS实例必须部署在专有网络VPC的交换机,因此,您需要创建1个专有网络VPC和1个交换机vSwitch。

  1. 登录专有网络管理控制台

  2. 在顶部菜单栏,选择华东2(上海)地域。

  3. 在左侧导航栏,单击专有网络

  4. 专有网络页面,单击创建专有网络

  5. 创建专有网络页面,配置1个专有网络和1台交换机。

    说明

    配置交换机时,请确保交换机所属的可用区的ECS是可用状态。

    项目

    说明

    示例值

    VPC名称

    建议您在部署过程中新建一个VPC作为本方案的专有网络。部署过程中填写VPC名称即可创建对应名称的VPC。

    长度为2~128个字符,以英文大小写字母或中文开头,可包含数字、下划线(_)和短划线(-)。

    VPC_IOT

    IPv4网段

    在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见专有网络组成部分

    在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段投入使用后,调整过程复杂,因此规划十分重要。

    192.168.0.0/16

    资源组

    被添加到资源组,并被授予AliyunVPCFullAccess的RAM用户,只能管理资源组中的VPC资源。

    IoT-Resource-Group

    vSwitch名称

    建议您在部署过程中在新建的VPC内创建虚拟交换机。部署过程中填写交换机名称即可创建对应名称的虚拟交换机。

    长度为2~128个字符,以英文大小写字母或中文开头,可包含数字、下划线(_)和短划线(-)。

    vsw_001

    可用区

    在规划的地域内选择1个可用区。

    建议选择排序靠后的,一般此类可用区较新。新可用区资源更充沛,新规格也会在新的可用区优先上线。

    可用区J

    IPv4网段

    每台虚拟交换机需要一个IPv4网段。

    192.168.1.0/24

4. 创建安全组

您已经在1个专有网络VPC下创建1台交换机。接下来您需要创建1个安全组,用于限制该专有网络VPC下交换机中的网络流入和流出。

  1. 登录ECS管理控制台

  2. 在顶部菜单栏,选择华东2(上海)地域。

  3. 在左侧导航栏,选择网络与安全>安全组

  4. 安全组页面,单击创建安全组

  5. 创建安全组页面,创建1个安全组。

    项目

    说明

    示例值

    名称

    设置安全组的名称。

    SecurityGroup_1

    网络

    选择之前规划的专有网络VPC。

    VPC_IOT

    安全组类型

    本方案选择普通安全组。实际部署时,建议您选择安全性更高的企业级安全组。

    普通安全组

    资源组

    被添加到资源组,并被授予AliyunECSFullAccess的RAM用户,只能管理资源组中的安全组。

    IoT-Resource-Group

5. 创建云服务器ECS

您已经创建1个专有网络VPC及一个交换机vSwitch。接下来您需要在这个交换机下创建1台ECS实例,作为业务服务器,接收设备上传的数据。

  1. 登录ECS管理控制台

  2. 在顶部菜单栏,选择华东2(上海)地域。

  3. 在左侧导航栏,选择实例与镜像>实例

  4. 实例页面,单击创建实例

  5. 在云服务器ECS购买页面,创建1台云服务器ECS。

    项目

    说明

    示例值

    实例名称

    长度为2~128个字符,以英文大小字母或中文开头,可包含大小写字母、中文、数字、半角句号(.)、下划线(_)、半角冒号(:)或短划线(-)。

    APP001

    可用区

    本方案要求一台云服务器ECS实例与一个虚拟交换机位于同一可用区,另一台云服务器ECS实例与另一虚拟交换机位同一可用区。

    可用区J

    支付方式

    ECS实例的计费方式。

    ECS计费的详细信息请参见ECS计费方式概述

    按量付费

    实例规格

    ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见选型最佳实践

    ecs.s6-c1m1.small

    镜像

    ECS的“装机盘”,为ECS实例提供操作系统、预装软件等。

    Alibaba Cloud Linux

    镜像版本

    镜像的版本。

    Alibaba Cloud Linux 3.2104 LTS 64位

    系统盘类型

    硬盘类型。

    ESSD云盘

    系统盘容量

    硬盘容量。

    20 GiB

    安全组

    之前创建的安全组。

    SecurityGroup_1

    资源组

    高级选项中配置。被添加到资源组,并被授予AliyunECSFullAccess的RAM用户,只能管理资源组中的云服务器ECS实例。

    IoT-Resource-Group

推送设备数据上报到钉钉群

60

1. 创建产品和设备

  1. 登录物联网平台控制台

  2. 实例概览页签的全部环境下,找到对应的实例,单击实例卡片。

  3. 在左侧导航栏,选择设备管理 > 产品

  4. 单击创建产品。配置产品名称为温湿度传感器,所属品类为自定义品类,节点类型为直连设备,其他参数使用默认值。

  5. 单击前往功能定义,在功能定义页签,单击编辑草稿

  6. 默认模块,单击添加自定义功能,为产品添加温度和湿度两个属性。

    image.png

  7. 在左侧导航栏,选择设备管理 > 设备

  8. 单击添加设备,在对话框中配置产品为温湿度传感器,DeviceName为TH_sensor

  9. 创建设备完成后,在弹出的添加完成对话框,单击前往查看,跳转到设备详情页面。

  10. 复制并保存设备证书(ProductKeyDeviceNameDeviceSecret)。设备证书是设备后续与物联网平台交流的重要凭证。

  11. 标签信息区域,单击编辑,为设备添加以下标签。

    Key

    Value

    描述

    tag

    YY小镇X号楼F层00XS

    设备所在位置。

    deviceISN

    T20180102X

    设备序列号。

2. 设备接入和上报温湿度数据

使用设备证书(ProductKeyDeviceNameDeviceSecret),通过MQTT协议将设备接⼊物联网平台,并模拟上报温湿度数据。

  1. 在ECS实例中下载并安装Node.js

    1. 添加Node.js源。

      curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
    2. 安装Node.js和npm。

      sudo yum install nodejs
    3. 验证Node.js和npm是否成功安装。

      node -v
      npm -v
  2. 创建一个JavaScript文件(名称为iot_device.js),用来存放以下Node.js示例代码。这段代码模拟设备上报和接收物联网平台的消息。

    1. 设置了设备的身份信息,包括productKey、deviceName、deviceSecret和MQTT服务器地址。建立了与阿里云物联网平台的MQTT连接。

    2. 订阅了自定义Topic:user/get,并设置了消息接收函数,接收阿里云物联网平台发送的指令和消息。

    3. 通过MQTT客户端,每隔5秒上报一次温湿度数据。上报的数据内容在函数getPostData()中定义。

      const mqtt = require("aliyun-iot-mqtt");
      // 1. 设备身份信息
      var options = {
        productKey: "g18l***",
        deviceName: "TH_sensor",
        deviceSecret: "b2e6e4f102458d84***",
        host: "iot-cn-***.mqtt.iothub.aliyuncs.com",
      };
      
      // 2. 建立MQTT连接
      const client = mqtt.getAliyunIotMqttClient(options);
      //订阅云端指令Topic
      client.subscribe(`/${options.productKey}/${options.deviceName}/c`);
      client.on("message", function (topic, message) {
        console.log("topic " + topic);
        console.log("message " + message);
      });
      
      setInterval(function () {
        // 3.定时上报温湿度数据
        client.publish(
          `/sys/${options.productKey}/${options.deviceName}/thing/event/property/post`,
          getPostData(),
          { qos: 0 }
        );
      }, 5 * 1000);
      
      function getPostData() {
        const payloadJson = {
          id: Date.now(),
          version: "1.0",
          params: {
            temperature: Math.floor(Math.random() * 20 + 10),
            humidity: Math.floor(Math.random() * 20 + 10),
          },
          method: "thing.event.property.post",
        };
        console.log("payloadJson " + JSON.stringify(payloadJson));
        return JSON.stringify(payloadJson);
      }

      参数

      示例

      说明

      productKey

      g18l***

      添加设备后,保存的设备证书信息。

      您可在控制台中设备TH_sensor设备详情页面查看。

      deviceName

      TH_sensor

      deviceSecret

      b2e6e4f102458d84***

      host

      iot-******-vpc.mqtt.iothub.aliyuncs.com

      MQTT设备接入域名(VPC内地址)。

      获取接入域名的方法, 请参见查看和配置实例终端节点信息(Endpoint)

  3. 使用cd命令找到iot_device.js文件所在路径,在该路径下执行以下命令,下载阿里云IoT的MQTT库。

    npm install aliyun-iot-mqtt -S
  4. MQTT库下载完成后,输入node iot_device.js,启动设备。

  5. 出现如下信息,表示设备接入成功,并上报数据。

    payloadJson {"id":161848***,"version":"1.0","params":{"temperature":22,"humidity":15},"method":"thing.event.property.post"}

3. 配置函数计算服务

函数计算是事件驱动的全托管计算服务。函数计算为您准备好计算资源,弹性地、可靠地运行任务,并提供日志查询、性能监控和报警等功能。更多信息,请参见什么是函数计算

  1. 配置钉钉机器人,获取Webhook地址。具体步骤,请参见企业内部应用机器人的创建和安装

  2. 编写函数计算脚本。

    本文以Node.js运行环境为例编写函数脚本,从物联网平台获取设备位置、设备编号、实时温度、相对湿度和上报时间数据,按照钉钉消息格式组装,使用HTTPS协议将POST数据推送到钉钉机器人的Webhook接口。

    • 将脚本文件命名为index.js,并压缩为index.zip文件进行保存。

    • 完整代码脚本如下,您需将代码中accessToken替换为Webhook地址中access_token的值。

    const https = require("https");
    const accessToken = "填写accessToken,即钉钉机器人Webhook的access_token值";
    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. 登录函数计算控制台,在左侧导航栏选择服务及函数

    2. 服务列表单击IoT_Service,单击创建函数

    3. 创建函数页面,选择使用内置运行时创建

    4. 配置函数的基本信息,如下所示,其他参数使用默认设置,然后单击创建

      • 基本设置

        配置函数名称为pushData2DingTalk,选择处理事件请求

      • 函数代码

        选择运行环境为Node.js 14,上传已保存的index.zip文件。

4. 配置数据流转到函数计算中

将设备TH_sensor上报的温度和湿度等数据转发至函数计算的函数pushData2DingTalk中。

  1. 返回物联网平台控制台

  2. 单击目标企业版实例的卡片,

  3. 在左侧导航栏,选择消息转发 > 云产品流转

  4. 配置数据源。

    1. 单击数据源页签,单击创建数据源

    2. 在对话框中输入数据源名称钉钉消息,然后单击确定

    3. 在对应数据源后的操作列单击查看,单击添加topic。topic的配置如下:

      image.png

  5. 配置数据目的。

    1. 单击数据目的页签,单击创建数据目的

    2. 在对话框中,配置如下参数:

      • 选择操作发送到函数计算(FC)中

      • 地域华东2(上海)

      • 服务IoT_Service

      • 函数pushData2DingTalk

      • 授权AliyunIOTAccessingFCRole

    3. 单击确定

  6. 配置解析器。单击解析器页签,单击创建解析器。输入解析器名称后按照配置向导进行配置。

    1. 关联已创建的数据源和数据目的。

    2. 输入解析器脚本。脚本语法,请参见脚本语法函数列表数据转发到函数计算(FC)

      //通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
      var data = payload("json"); 
      
      //筛选出上报的温湿度值。
      var temperature = data.items.temperature.value;
      var humidity = data.items.humidity.value;
      
      //获取设备标签值。
      var tag = getDeviceTag('tag');
      var isn = getDeviceTag('deviceISN');
      
      //数据目的ID是1000
      writeFc(1000, {"deviceName":deviceName(), "temperature":temperature, "humidity":humidity, "time":timestamp() , "tag": tag, "isn":isn} );
      
    3. 单击发布

  7. 启动解析器。在控制台左侧导航栏,选择消息转发 > 云产品流转,单击目标解析器后操作列的启动

完成及清理

10

方案验证

钉钉群收到消息如下。

image.png

清理资源

在本方案中,您创建了:

  • 1个物联网企业版实例。

  • 1台云服务器ECS实例。

  • 1个专有网络VPC。

  • 1个交换机vSwitch。

  • 1个函数计算的服务。

  • 1个函数计算的函数。

测试完方案后,您可以参考以下规则处理对应的云产品资源、资源组和RAM用户,避免继续产生费用或发生安全问题:

  1. 释放1台云服务器ECS实例:

    登录ECS控制台,在实例页面,找到目标实例,然后在操作列选择216更多-竖向..png>释放设置,根据界面提示释放实例。

  2. 释放1台交换机:

    登录专有网络控制台,在交换机页面,找到目标交换机,然后在操作列单击删除,按照界面提示释放实例。

  3. 释放1个专有网络VPC:

    登录专有网络控制台,在专有网络页面,找到目标VPC,然后在操作列单击删除,按照界面提示释放实例。

  4. 删除1个函数计算服务:

    登录函数计算控制台,在服务列表页面,找到目标服务,然后在操作列选择更多>删除

  5. 释放1个物联网平台实例:

    物联网平台实例不支持手动释放。实例到期后,会停止服务;到期15天后,实例将被释放,其下产品、设备等数据都被删除,不可恢复。

  6. 您可以根据需要为RAM用户移除权限删除资源组删除RAM用户