管理要发送到 LoRaWAN 设备的下行链路消息队列
云托管应用程序和其他 AWS 服务 可以向无线设备发送下行链路消息。下行链路消息是从 适用于 LoRaWAN 的 AWS IoT Core 发送到无线设备的消息。您可以为已登记到 适用于 LoRaWAN 的 AWS IoT Core 的每台设备调度和发送下行链路消息。
如果要向多台设备发送下行链路消息,可以使用多播组。多播组中的设备共享同一个多播地址,将该地址分发到整组接收设备。有关更多信息,请参阅创建多播组向多台设备发送下行链路有效负载。
下行链路消息队列的工作原理
LoRaWAN 设备的设备类别决定了队列中的消息如何发送到设备。A 类设备将上行链路消息发送到 适用于 LoRaWAN 的 AWS IoT Core,表明设备可以接收下行链路消息。B 类设备可在常规的下行链路槽接收消息。C 类设备可以随时接收下行链路消息。有关设备类别的更多信息,请参阅 设备类。
下面演示了如何形成消息队列以及如何将消息发送到 A 类设备。
-
适用于 LoRaWAN 的 AWS IoT Core 借助您通过 AWS IoT 控制台或 AWS IoT Wireless API 指定的帧端口、有效负载数据和确认模式参数,对添加到队列中的下行链路消息进行缓冲。
-
LoRaWAN 设备会发送上行链路消息,表明其处于线上状态且可以开始接收下行链路消息。
-
如果已将多条下行链路消息添加到队列中,适用于 LoRaWAN 的 AWS IoT Core 会将队列中的第一条下行链路消息发送到已设置确认 (ACK) 标志的设备。
-
设备可立即向 适用于 LoRaWAN 的 AWS IoT Core 发送上行链路消息,也可休眠直至出现下一条上行链路消息且消息中包含 ACK 标志。
-
适用于 LoRaWAN 的 AWS IoT Core 收到带有 ACK 标志的上行链路消息后,会清除队列中的下行链路消息,表示设备已成功收到下行链路消息。如果三次检查后,上行链路消息中仍缺少 ACK 标志,则会丢弃该消息。
使用控制台执行下行链路队列操作
您可以使用 AWS Management Console 管理下行链路消息队列,以及根据需要清除单条消息或整个队列。如果为 A 类设备,收到从设备发送的表明设备处于线上状态的上行链路消息后,将队列消息发送到该设备。发送消息后,系统会自动从队列中清除该消息。
管理下行链路消息队列
创建下行链路消息队列
-
转到 AWS IoT 控制台的设备中心
,然后选择要管理下行链路消息队列的设备。 -
在设备详细信息页面的 Downlink messages(下行链路消息)部分,选择 Queue downlink messages(管理下行链路消息队列)。
-
要配置下行链路消息,请指定以下参数:
-
FPort:选择设备与 适用于 LoRaWAN 的 AWS IoT Core 通信的帧端口。
-
Payload(有效负载):指定要发送到设备的有效负载消息。最大有效负载大小为 242 字节。如果已启用自适应数据速率 (ADR),适用于 LoRaWAN 的 AWS IoT Core 会用其选择有效负载大小的租价数据速率。您可以根据需要进一步优化数据速率。
-
Acknowledge mode(确认模式):确认设备是否收到下行链路消息。如果消息需要此模式,数据流会显示一条带有 ACK 标志的上行链路消息,并且该消息将从队列中清除。
-
-
要将下行链路消息添加到队列中,请选择 Submit(提交)。
下行链路消息现已添加到队列中。如果没有显示消息或收到错误,您可以如 排查下行链路消息队列错误 中所述排查该错误。
注意
将下行链路消息添加到队列后,便无法继续编辑 FPort 参数、Payload(有效负载)和 Acknowledge mode(确认模式)。要为这些参数发送具有不同值的下行链路消息,您可以删除此消息,再对具有更新参数值的新下行链路消息进行队列管理。
队列会列出已添加的下行链路消息。若要查看设备与 适用于 LoRaWAN 的 AWS IoT Core 之间交换的上行链路和下行链路消息的有效负载,您可以使用网络分析器。有关更多信息,请参阅使用网络分析器实时监控无线资源机群。
列出下行链路消息队列
已将创建的下行链路消息添加到队列中。后续每条下行链路消息均会在此消息之后添加到队列中。您可以在设备详细信息页面的 Downlink messages(下行链路消息)部分查看下行链路消息列表。收到上行链路消息后,消息就会发送到设备。设备收到下行链路消息后,该消息会从队列中删除。然后,下一条消息会在队列中向前移动,等待发送到设备。
删除单条下行链路消息或清除整个队列
发送到设备后,每条下行链路消息都会自动从队列中清除。您还可以删除单条消息或清除整个下行链路队列。这些操作无法撤消。
-
如果发现队列中有不想发送的消息,请选中相应消息并选择 Delete(删除)。
-
如果不想将任何消息从队列发送到设备,请选择 Clear downlink queue(清除下行链路队列)来清除整个队列。
使用 API 执行下行链路队列操作
您可以使用 AWS IoT Wireless API 管理下行链路消息队列,以及根据需要清除单条消息或整个队列。
管理下行链路消息队列
若要创建下行链路消息队列,请使用 SendDataToWirelessDevice
API 操作或 send-data-to-wireless-device
CLI 命令。
aws iotwireless send-data-to-wireless-device \ --id "11aa5eae-2f56-4b8e-a023-b28d98494e49" \ --transmit-mode "1" \ --payload-data "SGVsbG8gVG8gRGV2c2lt" \ --wireless-metadata LoRaWAN={FPort=1}
运行此命令的输出会生成下行链路消息的 MessageId
。在某些情况下,即使收到 MessageId
,数据包也可能丢失。有关如何解决错误的更多信息,请参阅 排查下行链路消息队列错误。
{ MessageId: "6011dd36-0043d6eb-0072-0008" }
列出队列中的下行链路消息
若要列出队列中的所有下行链路消息,请使用 ListQueuedMessages
API 操作或 list-queued-messages
CLI 命令。
aws iotwireless list-queued-messages
默认情况下,运行此命令时最多会显示 10 条下行链路消息。
删除单条下行链路消息或清除整个队列
若要从队列中删除单条消息或清除整个队列,请使用 DeleteQueuedMessages
API 操作或 delete-queued-messages
CLI 命令。
-
若要删除单条消息,请针对无线设备(由
wirelessDeviceId
指定)提供待删除消息的messageID
。 -
若要清除整个下行链路消息队列,请针对无线设备(由
wirelessDeviceId
指定)将messageID
指定为*
。
排查下行链路消息队列错误
如果没有看到期望的结果,可检查以下事项:
-
AWS IoT 控制台中未显示下行链路消息
如果如 使用控制台执行下行链路队列操作 中所述添加下行链路消息后,但队列中并未显示下行链路消息,可能是因为设备尚未完成名为 activation(激活)或 join(联接)过程。当设备登记到 适用于 LoRaWAN 的 AWS IoT Core,此过程才算完成。有关更多信息,请参阅使用控制台将您的无线设备规范添加到 适用于 LoRaWAN 的 AWS IoT Core。
将设备登记到 适用于 LoRaWAN 的 AWS IoT Core 后,您可以使用网络分析器或 Amazon CloudWatch 监控设备来检查联接和重新联接是否成功。有关更多信息,请参阅监控工具。
-
使用 API 时缺少下行链路消息包
使用
SendDataToWirelessDevice
API 操作时,API 会返回唯一的MessageId
。不过,其无法确认 LoRaWAN 设备是否收到下行链路消息。在设备尚未完成联接过程等情况下,下行链路数据包可能遭到丢弃。有关如何解决此错误的更多信息,请参阅上一节的内容。 -
发送下行链路消息时缺少 ARN 错误
从队列向设备发送下行链路消息时,可能会出现缺少 Amazon Resource Name (ARN) 错误。出现此错误可能是因为尚未为接收下行链路消息的设备准确指定目标。若要解决此错误,请检查设备的目标详细信息。