本文以温湿度采集器为例,介绍设备通过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. 根据下表逐个添加温度和湿度属性。
    功能类型 功能名称 标识符 数据类型 取值范围 步长 读写类型
    属性 温度 temperature int32 -10~50 1 只读
    属性 湿度 humidity int32 1~100 1 只读

设备端开发

设备端开发需实现设备通过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天。

更多最佳实践

点击查看更多阿里云最佳实践