使用 MQTT 协议与 DPS 通信

DPS 可让设备使用以下协议来与 DPS 设备终结点通信:

DPS 不是功能完备的 MQTT 中转站,并未支持 MQTT v3.1.1 标准中指定的所有行为。 本文介绍设备如何使用受支持的 MQTT 行为通过 DPS 进行通信。

所有通过 DPS 进行的设备通信都必须使用 TLS/SSL 来保护。 因此,DPS 不支持通过端口 1883 进行的不安全的连接。

注意

DPS 目前不支持通过 MQTT 协议使用 TPM 证明机制的设备。

连接到 DPS

设备可以通过以下任意选项使用 MQTT 协议连接到 DPS 实例。

直接使用 MQTT 协议(作为设备)

如果设备无法使用设备 SDK,仍可使用端口 8883 上的 MQTT 协议连接到公共设备终结点。 在 CONNECT 数据包中,设备应使用以下值:

  • 对于 ClientId 字段,使用 registrationId

  • 对于“用户名”字段,使用 {idScope}/registrations/{registration_id}/api-version=2019-03-31,其中 {idScope} 是 DPS 的 ID 范围{registration_id} 是设备的注册 ID

    注意

    如果使用 X.509 证书认证,则注册 ID 由你的设备叶证书的主题公共名称提供。 “用户名”字段中的 {registration_id} 必须与公用名匹配。

  • 密码”字段使用 SAS 令牌。 对于 HTTPS 和 AMQP 协议,SAS 令牌的格式是相同的:

    SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration resourceURI 应采用 {idScope}/registrations/{registration_id} 格式。 策略名称 (skn) 应设置为 registration

    注意

    如果使用 X.509 证书身份验证,则不需要使用 SAS 令牌密码。

    有关如何生成 SAS 令牌的详细信息,请参阅控制对 DPS 的访问的安全令牌部分。

下面列出了 DPS 特定于实现的行为:

  • DPS 不支持持久性会话。 它将每个会话视为非持久性会话,而不考虑 CleanSession 标志的值。 建议将 CleanSession 设置为 true。

  • 当设备应用使用 QoS 2 订阅主题时,DPS 会在 SUBACK 包中授予最高 QoS 级别 1。 之后,DPS 会使用 QoS 1 将消息传送到设备。

TLS/SSL 配置

若要直接使用 MQTT 协议,客户端必须通过 TLS 1.2 进行连接。 尝试跳过此步骤失败并显示连接错误。

注册设备

若要通过 DPS 注册某个设备,该设备应使用 $dps/registrations/res/# 作为主题筛选器进行订阅。 主题筛选器中的多级通配符 # 仅用于允许设备接收主题名称中的其他属性。 DPS 不允许使用 #? 通配符筛选子主题。 由于 DPS 不是一般用途的发布-订阅消息传送中转站,因此它仅支持存档的主题名称和主题筛选器。

设备应使用 $dps/registrations/PUT/iotdps-register/?$rid={request_id} 作为主题名称向 DPS 发布 register 消息。 有效负载应包含 JSON 格式的设备注册对象。 如果成功,设备将在 $dps/registrations/res/202/?$rid={request_id}&retry-after=x 主题名称中收到响应,其中,x 是以秒为单位的 retry-after 值。 响应的有效负载将包含 JSON 格式的 RegistrationOperationStatus 对象。

轮询注册操作状态

设备必须定期轮询服务,以接收设备注册操作的结果。 假设设备已如前所述订阅 $dps/registrations/res/# 主题,则它可以将 get operationstatus 消息发布到 $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId} 主题名称。 此消息中的操作 ID 应是在上一步骤中的 RegistrationOperationStatus 响应消息中收到的值。 如果成功,服务将在 $dps/registrations/res/200/?$rid={request_id} 主题中做出响应。 响应的有效负载将包含 RegistrationOperationStatus 对象。 如果在经过与 retry-after 期限相等的延迟时间后响应代码为 202,则设备应不断地轮询服务。 如果服务返回 200 状态代码,则表示设备注册操作成功。

通过 Websocket 进行连接

通过 Websocket 进行连接时,请将子协议指定为 mqtt。 遵循 RFC 6455

后续步骤

若要了解有关 MQTT 协议的详细信息,请参阅 MQTT 文档

若要进一步探索 DPS 的功能,请参阅: