文档

温湿度采集设备以HTTPS上云

更新时间:
一键部署

本文以温湿度采集器为例,介绍设备通过HTTPS协议连接物联网平台并上报数据的配置和开发方法。

前提条件

在进行本示例配置前,您需要完成以下准备工作:
  • 注册阿里云账号,并完成实名认证。
  • 开通物联网平台。关于物联网平台的介绍,参见物联网平台产品详情页
  • 本文示例需准备Node.js 6及以上开发环境。

背景信息

物联网平台华东2 (上海) 地域支持设备使用HTTPS协议接入。设备与物联网平台通过HTTPS协议进行连接通信仅适用于单纯的设备上报数据场景。请求方式仅支持POST,且设备上报的数据不超过128 KB。
图 1. 温湿度采集设备上云架构图架构图

创建产品和设备

在物联网平台创建产品和设备后,获取设备证书信息(ProductKey、DeviceName和DeviceSecret)。设备证书信息需烧录到设备固件上。当设备请求连接物联网平台时,物联网平台会根据设备证书信息进行设备身份验证。

  1. 点击登录物联网平台控制台
  2. 选择地域为华东2(上海)选择地域
  3. 创建产品。
    1. 在左侧导航栏,选择设备管理>产品
    2. 产品管理页,单击创建产品
    3. 填入产品信息,单击确定。完成产品创建。创建产品
  4. 创建设备。
    1. 在左侧导航栏,选择设备
    2. 设备管理页,单击添加设备
    3. 选择刚创建的产品,输入设备名称和备注名称,单击确定。完成设备创建。
      设备创建成功后,会弹出设备证书信息。您也可以在设备管理页,单击设备对应的查看按钮,进入设备详情页查看设备证书信息。

定义物模型

物模型指将物理空间中的实体进行数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能(包括属性、事件、服务)。完成功能定义后,系统将自动生成该产品的物模型。本示例中,温湿度采集器会上报温度和湿度,因此需为该产品定义对应的两个属性。

  1. 在物联网平台控制台的左侧导航栏,选择设备管理>产品
  2. 产品管理页,找到之前创建的产品,单击对应的查看按钮。
  3. 产品详情页,选择功能定义,再单击自定义功能对应的添加功能
  4. 根据下表逐个添加温度和湿度属性。
    功能类型功能名称标识符数据类型取值范围步长读写类型
    属性温度temperatureint32-10~501只读
    属性湿度humidityint321~1001只读

设备端开发

设备端开发需实现设备通过HTTPS协议连接物联网平台,并上报温湿度属性数据。点击查看HTTPS连接通信文档

  1. 认证设备身份。
    设备请求物联网平台建立连接时,物联网平台进行设备身份认证。认证通过后,下发设备token。设备token将在设备上报数据时使用。设备身份认证请求参数如下表。
    参数说明
    method请求方法。必须指定为POST。
    uri指定为:iot-as-http.cn-shanghai.aliyuncs.com/auth。
    productKey设备所属产品的Key。可从物联网平台的控制台设备详情页获取。
    deviceName设备名称。从物联网平台的控制台设备详情页获取。
    clientId客户端ID。长度为64字符内,可使用设备的MAC地址或SN码。本示例中,使用函数random()生成随机数。
    timestamp时间戳。本示例中使用函数now()获取当前时间戳。
    signmethod算法类型,支持hmacmd5和hmacsha1。
    Sign签名,即计算出的password。password计算方法如下:password=signHmacSha1(params, deviceConfig.deviceSecret)
    设备身份认证实例代码如下:
    var rp = require('request-promise');
    const crypto = require('crypto');
    
    const deviceConfig = {
     productKey: "替换productKey",
     deviceName: "替换deviceName",
        deviceSecret: "替换deviceSecret"
    }
    
    //1.获取身份token
    rp(getAuthOptions(deviceConfig))
     .then(function(parsedBody) {
     console.log('Auth Info :',parsedBody)
     })
     .catch(function(err) {
     console.log('Auth err :'+JSON.stringify(err))
     });
    
    
    //生成Auth认证的参数
    function getAuthOptions(deviceConfig) {
    
     const params = {
     productKey: deviceConfig.productKey,
     deviceName: deviceConfig.deviceName,
     timestamp: Date.now(),
     clientId:Math.random().toString(36).substr(2),
     }
    
     //1.生成clientId,username,password
     var password = signHmacSha1(params,deviceConfig.deviceSecret);
    
     var options = {
     method: 'POST',
     uri:'https://iot-as-http.cn-shanghai.aliyuncs.com/auth',
     body: {
     "version":"default",
     "clientId":params.clientId,
     "signmethod":"hmacsha1",
     "sign": password,
     "productKey":deviceConfig.productKey,
     "deviceName":deviceConfig.deviceName,
     "timestamp":params.timestamp
     },
     json: true
     };
    
     return options;
    }
    
    //HmacSha1 sign
    function signHmacSha1(params, deviceSecret) {
    
     let keys = Object.keys(params).sort();
     // 按字典序排序
     keys = keys.sort();
     const list = [];
     keys.map((key) => {
     list.push(`${key}${params[key]}`);
     });
     const contentStr = list.join('');
     return crypto.createHmac('sha1', deviceSecret).update(contentStr).digest('hex');
    }
    将以上代码中需要填入的信息替换为您的设备信息后,运行程序。认证成功,则获得token。替换设备信息设备认证返回的token会在一定周期后失效(目前token有效期是7天),请务必考虑token失效逻辑的处理。
  2. 上报设备数据。
    认证通过,设备获得token后,便可使用token作为上报数据的password。设备上报数据的请求参数如下表。
    参数说明
    method请求方法。必须指定为POST。
    uri
    • endpoint地址和Topic组成uri:

      iot-as-http.cn-shanghai.aliyuncs.com/topic + topic。

    • 后一个topic需指定为设备上报属性的topic:
      /sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post
    body设备上报的消息内容。
    password指定为设备认证返回的token。
    Content-Type设备上报的数据的编码格式。目前仅支持:application/octet-stream。
    设备上报数据示例代码如下:
    const topic = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post`;
    //上报数据
    pubData(topic, token, getPostData())
    
    function pubData(topic, token, data) {
    
     const options = {
     method: 'POST',
     uri: 'https://iot-as-http.cn-shanghai.aliyuncs.com/topic' + topic,
     body: data,
     headers: {
     password: token,
     'Content-Type': 'application/octet-stream'
     }
     }
    
    rp(options)
     .then(function(parsedBody) {
     console.log('publish success :' + parsedBody)
     })
     .catch(function(err) {
     console.log('publish err ' + JSON.stringify(err))
     });
    
    }
    //模拟物模型数据
    function getPostData() {
     var payloadJson = {
     id: Date.now(),
     params: {
     humidity: Math.floor((Math.random() * 20) + 60),
     temperature: Math.floor((Math.random() * 20) + 10)
     },
     method: "thing.event.property.post"
     }
    
    console.log("===postData\n topic=" + topic)
     console.log(payloadJson)
    
    return JSON.stringify(payloadJson);
    }
    运行以上代码程序后,可在本地日志中查看运行结果。在本地日志中查看运行结果
    在物联网平台控制台上,该设备的设备详情运行状态页签下,可查看设备上报的温湿度属性数据。查看设备温湿度属性数据

名词解释

  • 设备身份认证

    设备请求连接物联网平台时,物联网平台会根据设备上报的参数:ProductKey、DeviceName、clientId等进行身份校验。

  • token

    设备通过HTTPS协议请求建立连接时,物联网平台根据设备上报的参数进行身份认证。认证通过后,返回设备认证token。该token将在设备上报数据请求中作为password使用。目前,token有效期是7天。

  • 本页导读
文档反馈