赞
踩
阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。
物联网平台与设备、服务端、客户端的消息通信流程如下。
数据通信说明:
上行通信:设备通过MQTT协议与物联网平台建立连接,上报数据到平台;平台通过AMQP将数据流转到客户的服务器。
下行通信:通过业务应用下发指令,使业务服务器调用基于HTTPS协议的API接口Pub,给Topic发送指令,将数据发送到物联网平台;平台通过MQTT协议,推送数据到设备端。
实例、产品和设备类型、认证方式、物模型相关概念详见阿里云官方文档。
阿里云物联网平台的基本概念_物联网平台(IoT)-阿里云帮助中心
阿里云物联网平台常见的认证方式分为一机一密与一型一密,具体可参考下图。
图1 一机一密
图2 一型一密
本章主要介绍物联网平台的基础能力,包括设备上云、设备上报消息、云端订阅设备消息、云端下发指令到设备等。主要分为以下几个步骤:
创建产品和设备的前提是创建实例,目前个人账户可以免费创建一个公共实例,创建后界面如下。
点击进入公共实例,左侧的设备管理中可以看到产品和设备两个条目,在左侧导航栏选择设备管理 > 产品,单击创建产品。
产品具体的参数选择和范围设置详情可参见阿里云官方文档
如何在物联网平台创建产品_物联网平台(IoT)-阿里云帮助中心
创建产品后在左侧导航栏,选择设备管理 > 产品,在产品列表中,单击产品对应的查看,进入产品详情页。单击相应页签,查看产品信息、Topic类列表,设置自定义Topic、功能定义(物模型)、数据解析脚本、服务端订阅等。
产品是设备的集合,通常指一组具有相同功能的设备。创建产品完成后,需在产品下添加设备,获取设备证书。创建产品同样在左侧导航栏,选择设备管理 > 设备。在设备页面,单击添加设备。在添加设备对话框中,输入设备信息,单击确认。
物模型是阿里云物联网平台为产品定义的数据模型,用于描述产品的功能。主要分为属性(Property,一般用于描述设备运行时的状态)、服务(Service,设备可被外部调用的能力或方法)、事件(Event,设备运行时的事件)三种类型。物模型是产品的概念,定义后该产品下所有设备共享物模型的定义内容,在产品详情页—功能定义—编辑草稿,可以自定义物模型属性也可选择现有模型,配置完成后选择发布生效。
接入云平台的方式可以用模组现有的功能模块连接,也可以通过集成阿里云官方提供的SDK来对接云平台,两种方式均支持MQTT与HTTP协议连接。
首先介绍如何利用现有模组的MQTT功能连接阿里云平台,连接MQTT服务器至少需要五个参数,分别是客户端ID、用户名、密码、服务器地址与端口号。如果使用一机一密的方式连接,则上述五个参数可以直接在对应设备详情页查看;若使用一型一密的方式连接(前提是在产品详情页开启动态注册功能),服务器地址与端口号不变,前三个参数需要构造,具体构造方法如下图。
图3 动态注册获取MQTT连接参数
由图可知,连接流程主要分为两个步骤,第一步建立动态注册连接获取到deviceSecret相关参数,第二步是通过获取到的deviceSecret相关参数构造MQTT连接参数接入云平台。
获取deviceSecret
第一步的连接参数构造如下:
mqttClientId: clientId+"|securemode=-2,authType=xxxx,random=xxxx,signmethod=xxxx,instanceId=xxxx|"
mqttUserName: deviceName+"&"+productKey
mqttPassword: sign_hmac(productSecret,content)
对于mqttClientId,其中clientId为自定义字符串,控制在64个字符以内;securemode为一型一密的安全模式,预注册取值为2,免预注册取-2;authType为一型一密认证方式,register:一型一密预注册认证方式,返回DeviceSecret,regnwl:一型一密免预注册认证方式,返回DeviceToken、ClientID;random为自定义随机数;signMethod签名算法,目前支持hmacmd5、hmacsha1、hmacsha256;instanceId实例ID,请登录物联网平台控制台,在实例概览页面查看。
示例:
mqttClientId:ailink|securemode=2,authType=register,random=789,signmethod=hmacsha1,instanceId=
iot-06z00ez08936hvm|
对于mqttUserName,deviceName和productKey均可从设备详情页获取。
示例:mqttUserName: hello&ggrycEBOq8u
对于mqttPassword,productSecret可在产品详情页获取,而content的值是提交给服务器的必需参数和值(deviceName、productKey、random)按照字母顺序排序、拼接(无拼接符号)的字符串,其中random与mqttClient中配置保持一致。然后,将content的值通过mqttClientId中的signMethod指定的算法,进行签名计算,可利用在线校验计算出mqttPassword。在线计算工具链接https://1024tools.com/hmac
示例:hmac_sha1(Rhkkj6K6BhlhyUW7, deviceNamedevice1productKeyxxxrandom789)
根据上述可计算出mqttPassword,并配置CA证书,下载路径见
使用TLS加密设备和物联网平台的MQTT通信_物联网平台(IoT)-阿里云帮助中心,配置完成后利用模组现有的AT^AIMQTTCFG命令分别配置clientid、username和password,再利用AT^AIMQTTOPEN连接云平台,连接成功后云平台会向Topic为/ext/register主动推送如下格式的数据
{
"productKey" : "xxx",
"deviceName" : "xxx",
"deviceSecret" : "xxxxxx"
}
获取MQTT连接云平台的必要参数
记录第一步获取到的deviceSecret,来进行第二步的MQTT连接参数的构造,格式如下:
mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: sign_hmac(deviceSecret,content)
对于mqttClientId,其中clientId为自定义字符串,控制在64个字符以内;securemode表示目前安全模式,可选值有2(TLS直连模式)和3(TCP直连模式),目前阿里云已不支持非加密,所以此项只能取2;signMethod签名算法,目前支持hmacmd5、hmacsha1、hmacsha256;timestamp为时间戳,可以省略。
示例:mqttClientId:ailink|securemode=2,signmethod=hmacsha1|
对于mqttUserName,同第一步。
示例:mqttUserName: device1&ggryrtlgSWt
对于mqttPassword,deviceSecret即第一步连接获取值,而content的值是提交给服务器的必需参数和值(clientId,deviceName、productKey)按照字母顺序排序、拼接(无拼接符号)的字符串,其中clientId与mattClientId中配置保持一致。然后,将content的值通过mqttClientId中的signMethod指定的算法,进行签名计算,可利用在线校验计算出mqttPassword。
示例:hmac_sha1("deviceSecret", clientIdailinkdeviceNamedevice1productKeyxxx)
利用上述操作可获取到mqttPassword,至此,我们已经获取到MQTT连接云平台需要的所有必须参数,利用现有的AT命令即可完成配置、连接、订阅、发布等操作。
HTTP接入与MQTT类似也分为两步,第一步获取token,第二步利用获取到的token连接云平台通信。获取token的前提是获取到设备的deviceSecret。同理若通过一机一密方式则在设备详情页可以直接查看,若通过一型一密方式则需先获取设备deviceSecret。
HTTP获取deviceSecret,构造请求格式如下:
POST /auth/register/device HTTP/1.1
Host: iot-auth.cn-shanghai.aliyuncs.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 123
productKey=xxx&deviceName=xxx&random=xxx&sign=xxx&signMethod=Hmacmd5
其中productKey和deviceName可通过设备详情页获取;random为自定义随机数;signMethod为签名方法,目前支持hmacmd5、hmacsha1、hmacsha256;sign类似上文中mqttPassword的构造,通过signmethod中指定的方法利用productSecret和content(包括productKey、devicename、random,构造格式同MQTT配置)计算。请求成功收到如下格式数据:
{
"code": 200,
"data": {
"productKey": "xxx",
"deviceName": "xxx",
"deviceSecret": "xxxxxx"
},
"message": "success"
}
获取token
记录下上文获取到的deviceSecret为获取token,构造POST请求数据格式如下:
POST /auth HTTP/1.1
Host: ${YourEndpoint}
Content-Type: application/json
Content-Length: 192
body: {"version":"default","clientId":"xxx","signmethod":"hmacsha1","sign":"xxxxxxx","productKey":"ZG1EvTE****","deviceName":"device1","timestamp":"1501668289957"}
Host可在实例详情页面右上角查看开发配置获取,body构造,clientId同MQTT配置,signmethod算法类型,支持hmacmd5和hmacsha1,若不传入默认为hmacmd5;sign类似上文中mqttPassword的构造,通过signmethod中指定的方法利用deviceSecret和content(包括productKey、deviceName、clientId,构造格式同MQTT)计算;productKey和deviceName在设备详情页获取;timestamp为时间戳,可不传入。若认证成功可获取到如下格式返回数据
{
"code": 0,
"message": "success",
"info": {
"token": "6944e5bfb92e4d4ea3918d1eda39****"
}
}
上报数据
上报数据格式如下:
POST /topic/${topic} HTTP/1.1
Host: ${YourEndpoint}
password:${token}
Content-Type: application/octet-stream
Content-Length: 53
body: ${mqtmqttt物联网your_data}
Topic为/${YourProductKey}/${YourDeviceName}/pub,假设当前设备名称为device1,产品的ProductKey为xxx,那么您可以调用
https://iot-as-http.cn-shanghai.aliyuncs.com/topic/xxx/device1/pub地址来上报数据
详见阿里云官方文档中MQTT与HTTP接入示例
https://help.aliyun.com/document_detail/256389.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。