与 EnOS 云端建立连接


本文介绍如何通过 MQTT 协议建立从设备到 EnOS 云端的连接。


支持的 MQTT 版本:

  • 如果你使用基于证书的双向认证,在端口 18883 上使用 MQTT v3.1.1。
  • 如果你使用基于密钥的单向认证,在端口 11883 上使用 MQTT v3.1.1。

直接使用 MQTT 协议

您可以直接使用 MQTT 协议将设备连接到 EnOS 云端。设备的 CONNECT 数据包中包含以下值:

mqttClientId: {clientId}|securemode={secureMode},signmethod=sha256,timestamp={timeStamp}|
mqttUsername: {deviceKey}&{productKey}
mqttPassword: toUpperCase(sha256({content}{deviceSecret}))用于静态激活  toUpperCase(sha256({content}{productSecret}))用于动态激活
  • mqttClientId 部分: 由下列字段按照前述方式拼接而成:

    • clientId: 变量,必填项。可指定使用 MAC 地址或设备序列号。不可超过 64 字符。

    • securemode: 必填项。表示所使用的安全模式。

      • 使用静态激活认证方式的设备,securemode=2
      • 使用动态激活认证方式的设备,securemode=3
    • signmethod: 必填项,当前支持 sha256。表示使用 SHA256 签名算法。

    • timestamp: 变量,必填项。表示当前的时间的 UNIX 时间戳,单位为毫秒。

      例如,mqttClientId所需的各字段如下所示:

      • clientId=001A3FF14CC6
      • securemode=2,即采用静态激活模式
      • signmethod=sha256
      • timestamp=1575286479512

      mqttClientId= 001A3FF14CC6|securemode=2,signmethod=sha256,timestamp=1575286479512|

  • mqttUsername 部分: 由 deviceKey、 “&”、 productKey 三个要素拼接而成:

    • deviceKey :变量,设备的 device key,可以在 EnOS 管理控制台上获取。
    • productKey:变量,设备的 product key,可以在 EnOS 管理控制台上获取。

    例如,某设备的 deviceKeyxIhSzeP6lhproductKeyYj9MEH5F。则此处的 mqttUsernamexIhSzeP6lh&Yj9MEH5F

  • mqttPassword 部分: 静态激活的设备,由 contentdeviceSecret 拼接而成;动态激活的设备,由 contentproductSecret 拼接而成。然后将拼接得来的字符串用 SHA256 算法计算出新的字符串,再将新的字符串的字母全部转换成大写字母。

    • content:按照 clientIddeviceKeyproductKeytimestamp 的顺序,将字段名称和值串联组合。

      例如:设备的参数值如下所示

      • clientId=001A3FF14CC6
      • deviceKey=xIhSzeP6lh
      • productKey=Yj9MEH5F
      • timestamp=1575286479512

      content= clientId001A3FF14CC6deviceKeyxIhSzeP6lhproductKeyYj9MEH5Ftimestamp1575286479512

    • deviceSecret:设备的 device secret。当设备完成创建后,可在 EnOS 管理控制台上查看该值。如何获取设备的 device secret,参见 获取设备三元组信息

    • productSecret:设备的 product secret。当设备完成创建后,可在 EnOS 管理控制台上查看该值。如何获取设备的 product secret,参见 查看产品信息

静态激活

静态激活认证过程中,productKeydeviceKey、和 deviceSecret 都已经在设备尝试认证并登录 EnOS 之前,配置在了设备端。在 设备管理 > 设备资产 中创建设备之后,你就可以获取 productKeydeviceKey、和 deviceSecret

对于静态激活认证方式:

mqttPassword: toUpperCase(sha256({content}{deviceSecret}))

注解

timestamp 的值必须和 mqttClientId 部分的 timestamp 保持一致。

举例说明,当参数如下设定:

  • clientId=001A3FF14CC6
  • deviceKey=xIhSzeP6lh
  • productKey=Yj9MEH5F
  • timestamp=1575286479512
  • deviceSecret=gIsxsrAJvk3AnkxHnDnI

此时,mqttClientId 为:

001A3FF14CC6|securemode=2,signmethod=sha256,timestamp=1575286479512|

mqttUsername 为:

xIhSzeP6lh&Yj9MEH5F

mqttPassword 为:

mqttPassword = toUpperCase(sha256(clientId001A3FF14CC6deviceKeyxIhSzeP6lhproductKeyYj9MEH5Ftimestamp1575286479512gIsxsrAJvk3AnkxHnDnI))

由上述参数及其值拼接而成的字符串将通过 SHA256 算法计算出新的字符串,新字符串的字母将全部转换成大写字母,再用于静态激活认证。

动态激活

要使用动态激活认证方式,你需要在 设备管理 > 产品管理 > 产品详情 中, 打开 动态激活 开关。

对于动态激活认证方式:

mqttPassword: toUpperCase(sha256({content}{productSecret}))

注解

timestamp 的值必须和 mqttClientId 部分的 timestamp 保持一致。

举例说明,当参数如下设定:

  • clientId=001A3FF14CC6
  • deviceKey=xIhSzeP6lh
  • productKey=Yj9MEH5F
  • timestamp=1575286479512
  • productSecret=cWiY0NtjT64

此时,mqttPassword 为:

mqttPassword = toUpperCase(sha256(clientId001A3FF14CC6deviceKeyxIhSzeP6lhproductKeyYj9MEH5Ftimestamp1575286479512cWiY0NtjT64))

在动态激活认证过程中,productKeyproductSecret、和 deviceKey 已经预先配置在了设备当中。当设备尝试认证并登录 EnOS 时,设备会发送带有 productKeyproductSecretdeviceKey 的请求以获取 deviceSecret。如果设备通过认证,设备需要订阅以下 topic 来获得 deviceSecret

/ext/session/{productKey}/{deviceKey}/thing/activate/info

EnOS 会在发送给设备的响应中,包含 deviceSecret,举例如下:

{
    "id": "1",
    "version": "1.0",
    "method": "thing.activate.info",
    "params":{
        "assetId": "12344",
        "productKey": "1234556554",
        "deviceKey": "deviceKey1234",
        "deviceSecret": "xxxxxx"
    }
}

设备在后续的接入 EnOS 的过程中,使用 productKeydeviceKey、及 deviceSecret 以认证。认证过程与静态激活认证相同。