1.平台介绍
阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端api,服务端可通过调用云端api将指令下发至设备端,实现远程控制。
物联网平台与设备、服务端、客户端的消息通信流程如下。
数据通信说明:
上行通信:设备通过mqtt协议与物联网平台建立连接,上报数据到平台;平台通过amqp将数据流转到客户的服务器。
下行通信:通过业务应用下发指令,使业务服务器调用基于https协议的api接口pub,给topic发送指令,将数据发送到物联网平台;平台通过mqtt协议,推送数据到设备端。
2.基本概念介绍
实例、产品和设备类型、认证方式、物模型相关概念详见阿里云官方文档。
阿里云物联网平台的基本概念_物联网平台(iot)-阿里云帮助中心
阿里云物联网平台常见的认证方式分为一机一密与一型一密,具体可参考下图。
图1 一机一密
图2 一型一密
3.对接阿里云物联网流程
本章主要介绍物联网平台的基础能力,包括设备上云、设备上报消息、云端订阅设备消息、云端下发指令到设备等。主要分为以下几个步骤:
- 创建产品与设备
- 为产品定义物模型
- 接入云平台
-
创建产品与设备
创建产品和设备的前提是创建实例,目前个人账户可以免费创建一个公共实例,创建后界面如下。
点击进入公共实例,左侧的设备管理中可以看到产品和设备两个条目,在左侧导航栏选择设备管理 > 产品,单击创建产品。
产品具体的参数选择和范围设置详情可参见阿里云官方文档
如何在物联网平台创建产品_物联网平台(iot)-阿里云帮助中心
创建产品后在左侧导航栏,选择设备管理 > 产品,在产品列表中,单击产品对应的查看,进入产品详情页。单击相应页签,查看产品信息、topic类列表,设置自定义topic、功能定义(物模型)、数据解析脚本、服务端订阅等。
产品是设备的集合,通常指一组具有相同功能的设备。创建产品完成后,需在产品下添加设备,获取设备证书。创建产品同样在左侧导航栏,选择设备管理 > 设备。在设备页面,单击添加设备。在添加设备对话框中,输入设备信息,单击确认。
-
为产品定义物模型
物模型是阿里云物联网平台为产品定义的数据模型,用于描述产品的功能。主要分为属性(property,一般用于描述设备运行时的状态)、服务(service,设备可被外部调用的能力或方法)、事件(event,设备运行时的事件)三种类型。物模型是产品的概念,定义后该产品下所有设备共享物模型的定义内容,在产品详情页—功能定义—编辑草稿,可以自定义物模型属性也可选择现有模型,配置完成后选择发布生效。
接入云平台
接入云平台的方式可以用模组现有的功能模块连接,也可以通过集成阿里云官方提供的sdk来对接云平台,两种方式均支持mqtt与http协议连接。
-
利用模组现有功能接入云平台
-
mqtt接入
-
首先介绍如何利用现有模组的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接入
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地址来上报数据
-
集成sdk接入云平台
详见阿里云官方文档中mqtt与http接入示例
https://help.aliyun.com/document_detail/256389.html
发表评论