阿里云物联网接入指南

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 阿里云物联网接入指南

    发表评论