本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
直接消息
Amazon IoT Core 现在支持直接消息。您可以通过 MQTT 客户端 ID 向连接的单个设备发送消息,而无需设备订阅主题。
以前,向特定设备发送消息需要发布到该设备订阅的主题,但没有内置的方法来确认传送。发送方调用 SendDirectMessage HTTP API,指定接收方的客户端 ID 和目标主题。何时confirmation=true, Amazon IoT Core 以 QoS 1 进行交付,等待接收方的 PUBACK 后再返回成功响应。这为您提供了端到端的交付确认。API 响应和 Ama CloudWatch zon Logs 可全面了解交付状态和失败原因。
私信不由 Amazon IoT 规则执行规则处理,不排队等候离线设备,也不支持保留的消息。
先决条件
发送方和接收方都需要采取特定的策略操作才能使用直接消息。发件人必须拥有iot:SendDirectMessage权限。目标客户端 ID 被指定为资源,iot:Topic条件键(可选)限制发件人可以直接发送消息的主题。接收者必须拥有目标主题的iot:Receive权限。接收者不需要iot:Subscribe许可 — Amazon IoT Core 无需订阅主题即可直接发送消息。有关更多详细信息和策略示例,请参阅私信策略示例。
有关 HTTP 请求使用的身份验证和端口映射,请参阅 协议、端口映射和身份验证。
SendDirectMessage API
发件人可以通过向客户特定的 URL 发出 HTTP POST 请求来发送私信:
https://IoT_data_endpoint/connections/client_id/messages?topic=topic_name&confirmation=true&timeout=10
-
IoT_data_endpoint是Amazon IoT 设备数据端点。Amazon IoT 设备数据和服务端点要查找您的终端节点,请参阅。 -
client_id是要向其发送消息的 MQTT 客户端的唯一标识符。客户端 ID 不得超过 128 个字符,并且不能以美元符号 ($) 开头。当 MQTT 客户端 ID 包含在 HTTP 请求中无效的字符(例如空格、正斜杠 (/) 和字符)时,必须进行网址编码(百分比编码)。 UTF-8 有关更多信息,请参阅Amazon IoT Core 消息代理和协议限制和配额。 -
topic_name是接收者收到消息的主题 URL-encoded。不能以 $ 开头。不得为 Amazon IoT Core 保留话题。有关主题长度和深度限制,请参阅 Amazon IoT Core 服务配额页面。有关更多信息,请参阅Amazon IoT Core 消息代理和协议限制和配额。 -
confirmation是一个布尔值。设置为时true,API 将按照 QoS 1 发送消息,并等待 MQTT 客户端发送传送确认 (PUBACK),然后再返回成功响应。如果在指定的超时时间内未收到传送确认,API 将返回 HTTP 504。 -
timeout是一个整数,表示消息传送后等待接收客户端的传送确认 (PUBACK) 的最长时间(以秒为单位)。此参数仅在设置confirmation为时使用true。如果confirmation是false,则忽略此参数。由于内部处理的原因,API 的总响应时间可能高于此值。将 HTTP 客户端超时设置为大于此参数的值。
API 响应状态码
下表列出了 SendDirectMessage API 返回的 HTTP 状态码以及每个状态码的建议操作。启用 Amazon IoT Core CloudWatch 日志以查看详细 SendDirectMessage 的事件日志,包括编程错误处理的原因字段。
| HTTP 代码 | 推荐操作 |
|---|---|
| 200 OK (200 确定) | 如果使用请求传送确认confirmation=true,则表示收件人已确认消息收据。否则,这表示消息已成功发送。 |
| 400 错误请求 | 这意味着其中一个参数无效。查看 HTTP 响应消息或 CloudWatch 日志,找出具体的故障并进行修复。确保主题名称有效 Client-id 且 URL-encoded正确。 |
| 403 禁止访问 | 这意味着发送者的策略未授予iot:SendDirectMessage目标客户和主题的权限,或者接收者的策略不授予该iot:Receive主题的权限。查看 HTTP 响应消息或 CloudWatch 日志以确定具体故障,并更新相应的策略。请参阅私信策略示例。 |
| 404 未找到 | 这意味着目标客户端 ID 未连接到 Amazon IoT Core。查看 HTTP 响应消息或 CloudWatch 日志以了解具体原因,确认接收器已连接,然后重试。如果响应消息显示 “目标客户端 ID 未连接,但其持续会话处于活动状态”,则目标客户端的持续会话未过期,但当前处于脱机状态。 |
| 413 有效载荷太大 | 有效载荷超过允许的最大大小。减小有效载荷大小并重试。请参阅 Amazon IoT Core 服务限额。 |
| 429 请求过多 | 这意味着该账户已超过 SendDirectMessage 每秒请求数限制,或者接收方连接已超过出站发布限制。查看 HTTP 响应消息或 CloudWatch 日志以了解具体原因,降低请求速率并实现指数级退避。请参阅 Amazon IoT Core 服务限额。 |
| 500 内部服务器错误 | 这表示服务器端出现意外错误。使用指数退避重试请求。如果问题仍然存在,请使用响应中的 traceID 与 Support 联系 Amazon 。 |
| 504 网关超时 | 这意味着接收方没有在指定的超时时间内发送 PUBACK。增加超时值,验证接收方的 MQTT 客户端发送 PUBACK for QoS 1 消息,或者检查接收方处理消息的速度是否缓慢。 |
示例
接收方客户端行为
直接消息无需订阅主题即可向 MQTT 客户端(接收者)发送消息。要充分受益于直接消息,接收者必须支持以下行为:
-
接收有关未明确订阅的主题的消息-接收者的直接消息可以将消息传送到接收者未明确订阅的主题。但是,某些 MQTT 客户端实现会筛选或丢弃已取消订阅的主题上的消息。如果您的客户丢弃了这些消息,则直接消息仅适用于接收者也已订阅的主题。要接收有关任何主题的直接消息,请验证无论订阅状态如何,您的客户端的消息处理程序都处理消息。
-
处理由 API 决定的 Qo S — 已发送消息的 QoS 级别由发送者 API 请求中的
confirmation参数设置,而不是由接收方的订阅设置。当消息到达 QoS 1 时confirmation=true,接收方的客户端必须发送 PUBACK 以确认传送。何时confirmation=false,消息到达 QoS 0 时无需确认。确保您的客户端的 MQTT 实现能够正确处理 QoS 0 和 QoS 1 传入消息。