2.1 MQTT连接说明

本节将介绍如何使用MQTT协议连接到阿里云IoT平台,包括MQTT服务器的域名/IP地址和端口号、MQTT连接需要的参数: ClientID、Username和Password的定义。上下行的Topic和Payload的定义将在下面两节会介绍。

(1)MQTT介绍

MQTT(MessageQueuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP协议上,由IBM在1999年发布。MQTT V3.1标准规范文档请参考:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html。

(2)MQTT的域名和端口

阿里云IoT MQTT的Broker的域名与设备证书中的productKey有关:

  1. LinkPlatform MQTT代理器域名:{productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com
  2. LinkDevelop MQTT服务器为:1883

(3)ClientID、Username和Password的参数说明

标准MQTT连接过程依赖三个重要参数:ClientID、Username和Password。

  • ClientID中包括了一个用户自定ID(SubID),其他部分由前后两个“|”包裹,被包裹的内容包括:

    a)securemode安全模式,securemode=2表示TLS连接,securemode=3表示MQTT直连(非加密模式)

    b)signmethod签名算法,签名算法包括HMAC-SHA1和HMAC-MD5

    c)timestamp时间戳,该时间戳应与HAMC-SHA1的某部分输入内容相同

  • Username 由DeviceName和ProductKey拼接而成,拼接符为”&”。
  • Password 根据HMAC算法计算获得,输入内容由用户自定义ID,deviceName,productKey和时间戳拼接获得,HMAC的secret为设备DeviceSecret。
说明 :MQTT连接参数的计算过程如下图所示:


【示例】

HMAC输入的明文格式为:

clientId{SubId}deviceName{deviceName}productKey{productKey}timestamp{timestamp}。

假设,SubID设置为{productKey}.{deviceName},productKey=a1c6PF6oWWI、deviceName=112233445566,则SubID取值为:a1c6PF6oWWI.112233445566。

假设,时间戳(timeStamp)取值为:1534149235。则,字符串拼接结果(即HMAC输入的明文)为:

clientIda1c6PF6oWWI.112233445566deviceName112233445566productKeya1c6PF6oWWItimestamp123456789

deviceSecret为82zHwhg4bN4DKTFcYQ1bcpOGYreFWSk1,经过HMAC-SHA1计算后ClientID、Username、Password结果如下所示:



说明 :若连接设备的产品创建时节点类型为“网关”,ClientID的格式如下:a1c6PF6oWWI.112233445566|securemode=3,timestamp=1534149235,signmethod=hmacsha1,gw=1|若不指定gw=1,该网关在平台上添加子设备会出现问题。

阿里云IoTMQTT连接参数生成工具:http://www.iotwuxi.org/iot-tools/index.html

2.2 Topic/URL说明

MQTT协议使用Topic概念,CoAP和HTTP协议使用URL的概念。

说明 :平台上对于Alink和透传/自定义格式的接入采用的是不一样的Topic/URL。
  1. Alink协议使用的Topic/URL
    功能 类型 方向 topic
    属性上报 请求 设备->平台 /sys/{productKey}/{deviceName}/thing/event/property/post
    响应 平台->设备 /sys/{productKey}/{deviceName}/thing/event/property/post_reply
    属性设置 请求 平台->设备 /sys/{productKey}/{deviceName}/thing/service/property/set
    响应 设备->平台 /sys/{productKey}/{deviceName}/thing/service/property/set_reply由于这是平台异步的调用,平台并不会处理设备的响应。因此需要在属性修改之后设备对修改的属性进行上报。
    属性获取 请求 平台->设备 /sys/{productKey}/{deviceName}/thing/service/property/get为了提高请求的响应速度,获取设备属性时读取的是云端设备影子的数据,该请求目前不会发给设备。所以设备的属性如果需要上层应用查询的,建议由设备及时上报更新云端设备影子的数据。
    响应 设备->平台 /sys/{productKey}/{deviceName}/thing/event/property/post云端不会对get_reply数据做处理,目前获取到的属性值要求设备通过post方式上报
    事件上报 请求 设备->平台 /sys/{productKey}/{deviceName}/thing/event/{event.identifer}/post
    响应 平台->设备 /sys/{productKey}/{deviceName}/thing/event/{event.identifer}/post_reply
    服务调用 请求 平台->设备 /sys/{productKey}/{deviceName}/thing/service/{service.identifer}
    响应 设备->平台 /sys/{productKey}/{deviceName}/thing/service/{tsl.service.identifer}_reply由于这是平台异步的调用,平台并不会处理设备的响应。因此如果调用需要返回参数则采用同步调用方式,或者其他方式返回调用结果。

    上述,平台到设备的请求均是异步调用(平台不会等待处理结果)。如果对下行操作的可靠性有要求,那需要采用同步调用方式,相关的Topic/URL如下所示:

    功能 类型 方向 topic
    同步服务调用 请求 平台->设备 /sys/{productKey}/{deviceName}/rrpc/request/{messageId}由于messageId是平台生成的,设备端并不知晓,因此设备端订阅该topic需要使用通配符:/sys/{productKey}/{deviceName}/rrpc/request/+
    响应 设备->平台 /sys/{productKey}/{deviceName}/rrpc/response/{messageId}

    如果服务为同步调用,云端会等待设备回复,否则会调用超时。

  2. 自定义协议使用的Topic/URL
    功能 类型 方向 topic
    设备上报 请求 设备->平台 /sys/{productKey}/{deviceName}/thing/model/up_raw
    响应 平台->设备 /sys/{productKey}/{deviceName}/thing/model/up_raw_reply
    平台下发 请求 平台->设备 /sys/{productKey}/{deviceName}/thing/model/down_raw
    响应 设备->平台 /sys/{productKey}/{deviceName}/thing/model/down_raw_reply

    由于这是平台异步的调用,平台并不会处理设备的响应。

2.3 Alink协议说明

  1. 请求Payload


    • method的定义

      不同的请求对应的method和params含义会有不同。

      功能 method params
      属性上报 thing.event.property.post params存放属性的对象,例如:{ "Text" : "hello", "status" : 2}
      属性获取 thing.service.property.get params存放期望获取的属性标识符,例如:{ "power" , "temp"}
      属性设置 thing.service.property.set params存放属性的对象,例如:{ "Text" : "hello", "status" : 2}
      事件上报 thing.event.{event.identifier}.post params存放事件参数的对象,例如:{ "arg1" : "hello", "arg2" : 2}
      服务调用 thing.service.{service.identifer} params存放服务的入参的对象,例如:{ "arg1" : "hello", "arg2" : 2}
  2. 响应Payload


    • 通用code以及错误码解析

      云端返回结果code和message描述如下: