温湿度采集设备以HTTPS上云
更新时间:
本文以温湿度采集器为例,介绍设备通过HTTPS协议连接物联网平台并上报数据的配置和开发方法。
前提条件
在进行本示例配置前,您需要完成以下准备工作:- 注册阿里云账号,并完成实名认证。
- 开通物联网平台。关于物联网平台的介绍,参见物联网平台产品详情页。
- 本文示例需准备Node.js 6及以上开发环境。
背景信息
物联网平台华东2 (上海) 地域支持设备使用HTTPS协议接入。设备与物联网平台通过HTTPS协议进行连接通信仅适用于单纯的设备上报数据场景。请求方式仅支持POST,且设备上报的数据不超过128 KB。创建产品和设备
在物联网平台创建产品和设备后,获取设备证书信息(ProductKey、DeviceName和DeviceSecret)。设备证书信息需烧录到设备固件上。当设备请求连接物联网平台时,物联网平台会根据设备证书信息进行设备身份验证。
- 点击登录物联网平台控制台。
- 选择地域为华东2(上海)。
- 创建产品。
- 在左侧导航栏,选择设备管理>产品。
- 在产品管理页,单击创建产品。
- 填入产品信息,单击确定。完成产品创建。
- 创建设备。
- 在左侧导航栏,选择设备。
- 在设备管理页,单击添加设备。
- 选择刚创建的产品,输入设备名称和备注名称,单击确定。完成设备创建。设备创建成功后,会弹出设备证书信息。您也可以在设备管理页,单击设备对应的查看按钮,进入设备详情页查看设备证书信息。
定义物模型
物模型指将物理空间中的实体进行数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能(包括属性、事件、服务)。完成功能定义后,系统将自动生成该产品的物模型。本示例中,温湿度采集器会上报温度和湿度,因此需为该产品定义对应的两个属性。
- 在物联网平台控制台的左侧导航栏,选择设备管理>产品。
- 在产品管理页,找到之前创建的产品,单击对应的查看按钮。
- 在产品详情页,选择功能定义,再单击自定义功能对应的添加功能。
- 根据下表逐个添加温度和湿度属性。
功能类型 功能名称 标识符 数据类型 取值范围 步长 读写类型 属性 温度 temperature int32 -10~50 1 只读 属性 湿度 humidity int32 1~100 1 只读
设备端开发
设备端开发需实现设备通过HTTPS协议连接物联网平台,并上报温湿度属性数据。点击查看HTTPS连接通信文档。
- 认证设备身份。设备请求物联网平台建立连接时,物联网平台进行设备身份认证。认证通过后,下发设备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)
将以上代码中需要填入的信息替换为您的设备信息后,运行程序。认证成功,则获得token。设备认证返回的token会在一定周期后失效(目前token有效期是7天),请务必考虑token失效逻辑的处理。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作为上报数据的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); }
在物联网平台控制台上,该设备的设备详情页运行状态页签下,可查看设备上报的温湿度属性数据。 - endpoint地址和Topic组成uri:
名词解释
- 设备身份认证
设备请求连接物联网平台时,物联网平台会根据设备上报的参数:ProductKey、DeviceName、clientId等进行身份校验。
- token
设备通过HTTPS协议请求建立连接时,物联网平台根据设备上报的参数进行身份认证。认证通过后,返回设备认证token。该token将在设备上报数据请求中作为password使用。目前,token有效期是7天。
反馈
- 本页导读
文档反馈