

# 管理 LoRaWAN 设备与 AWS IoT 之间的通信
管理 LoRaWAN 设备通信

将 LoRaWAN 设备连接到 适用于 LoRaWAN 的 AWS IoT Core 之后，您的设备可以开始向云发送消息。上行链路消息是从您设备发送并由 适用于 LoRaWAN 的 AWS IoT Core 接收的消息。LoRaWAN 设备可以随时发送上行链路消息，随后会转发至其他 AWS 服务 和云托管应用程序。从 适用于 LoRaWAN 的 AWS IoT Core 以及其他 AWS 服务 和应用程序发送到设备的消息称为下行链路消息。

下面演示了如何查看和管理在设备与云之间发送的上行链路和下行链路消息。您可以维护下行链路消息队列，然后按照这些消息的队列添加顺序将消息发送到设备。

**Topics**
+ [

# 查看从 LoRaWAN 设备发送的上行链路消息的格式
](lorawan-uplink-metadata-format.md)
+ [

# 管理要发送到 LoRaWAN 设备的下行链路消息队列
](lorawan-downlink-queue.md)

# 查看从 LoRaWAN 设备发送的上行链路消息的格式
查看 LoRaWAN 上行链路消息格式

将 LoRaWAN 设备连接到 适用于 LoRaWAN 的 AWS IoT Core 后，您可以观察将从无线设备接收的上行链路消息的格式。

## 在您观察上行链路消息之前


您必须已登记无线设备并将设备连接到 AWS IoT，以便它能够传输和接收数据。有关将您的设备登记到 适用于 LoRaWAN 的 AWS IoT Core 的更多消息，请参阅 [将您的设备登记到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-onboard-end-devices.md)。

## 上行链路消息包含什么内容？


LoRaWAN 设备使用 LoRaWAN 网关连接到 适用于 LoRaWAN 的 AWS IoT Core。您从设备接收的上行链路消息将包含以下信息。
+ 对应从无线设备发送的加密负载消息的负载数据。
+ 无线元数据，包括：
  + 设备信息，例如 DevEui、数据速率和设备运行所在的频率通道。
  + 连接到设备的网关的可选附加参数和网关信息。网关参数包括网关的 EUI、SNR 和 RSSi。

  通过使用无线元数据，您可以获取有关无线设备的有用信息以及在设备和 AWS IoT 之间传输的数据。例如，您可以使用 `AckedMessageId` 参数来检查设备是否已收到上次确认的下行链路消息。或者，如果您选择包含网关信息，则可以确定是否要切换到更靠近设备的更强网关通道。

## 如何观察上行链路消息？


登记设备后，您可以使用 AWS IoT 控制台中 **Test**（测试）页面的 [MQTT 测试客户端](https://console.aws.amazon.com/iot/home#/test)订阅创建目标时指定的主题。连接设备并开始发送负载数据后，您将开始看到消息。

此图表标识了连接到 适用于 LoRaWAN 的 AWS IoT Core 的 LoRaWAN 系统中的密钥元素，其中显示了主数据面板以及数据在系统中流动的方式。

![\[图片显示了 适用于 LoRaWAN 的 AWS IoT Core 数据如何从无线设备传递到 AWS IoT 和其他服务。\]](http://docs.aws.amazon.com/zh_cn/iot-wireless/latest/developerguide/images/iot-lorawan-data-flow.png)


当无线设备开始发送上行链路数据时，适用于 LoRaWAN 的 AWS IoT Core 将无线元数据信息与负载打包，然后将其发送到 AWS 应用程序。

## 上行链路消息示例


以下示例显示了从您的设备接收的上行链路消息的格式。

```
{
    "WirelessDeviceId": "5b58245e-146c-4c30-9703-0ca942e3ff35", 
    "PayloadData": "Cc48AAAAAAAAAAA=",    
    "WirelessMetadata":
    {
        "LoRaWAN":
        {
            "ADR": false,
            "Bandwidth": 125,
            "ClassB": false,
            "CodeRate": "4/5",
            "DataRate": "0",
            "DevAddr": "00b96cd4",
            "DevEui": "58a0cb000202c99",            
            "FOptLen": 2,
            "FCnt": 1,
            "Fport": 136,   
            "Frequency": "868100000",     
            "Gateways": [
             {
                    "GatewayEui": "80029cfffe5cf1cc",      
                    "Snr": -29,
                    "Rssi": 9.75
             }
             ],  
            "MIC": "7255cb07",  
            "MType": "UnconfirmedDataUp",
            "Major": "LoRaWANR1",
            "Modulation": "LORA", 
            "PolarizationInversion": false,    
            "SpreadingFactor": 12,                         
            "Timestamp": "2021-05-03T03:24:29Z"
            
        }
    }
}
```

### 从上行链路元数据中排除网关元数据


如果要从上行链路元数据中排除网关元数据信息，请在您创建服务配置文件时禁用 **AddGwMetadata** 参数。有关禁用此参数的信息，请参阅 [添加服务配置文件](lorawan-define-profiles.md#lorawan-service-profiles)。

在这种情况下，您将不会在上行链路元数据中看到 `Gateways` 部分，如以下示例所示。

```
{  
    "WirelessDeviceId": "0d9a439b-e77a-4573-a791-49d5c0f4db95",
    "PayloadData": "AAAAAAAA//8=",
    "WirelessMetadata": {
        "LoRaWAN": {
            "ClassB": false,
            "CodeRate": "4/5",
            "DataRate": "1",
            "DevAddr": "01920f27",
            "DevEui": "ffffff10000163b0",
            "FCnt": 1,
            "FPort": 5,
            "Timestamp": "2021-04-29T05:19:43.646Z"
    }
  }
}
```

# 管理要发送到 LoRaWAN 设备的下行链路消息队列
将 LoRaWAN 下行链路消息列入队列

云托管应用程序和其他 AWS 服务 可以向无线设备发送下行链路消息。下行链路消息是从 适用于 LoRaWAN 的 AWS IoT Core 发送到无线设备的消息。您可以为已登记到 适用于 LoRaWAN 的 AWS IoT Core 的每台设备调度和发送下行链路消息。

如果要向多台设备发送下行链路消息，可以使用多播组。多播组中的设备共享同一个多播地址，将该地址分发到整组接收设备。有关更多信息，请参阅[创建多播组向多台设备发送下行链路有效负载](lorawan-multicast-groups.md)。

## 下行链路消息队列的工作原理


LoRaWAN 设备的设备类别决定了队列中的消息如何发送到设备。A 类设备将上行链路消息发送到 适用于 LoRaWAN 的 AWS IoT Core，表明设备可以接收下行链路消息。B 类设备可在常规的下行链路槽接收消息。C 类设备可以随时接收下行链路消息。有关设备类别的更多信息，请参阅 [设备类](lorawan-manage-end-devices.md#lorawan-device-classes)。

下面演示了如何形成消息队列以及如何将消息发送到 A 类设备。

1. 适用于 LoRaWAN 的 AWS IoT Core 借助您通过 AWS IoT 控制台或 AWS IoT Wireless API 指定的帧端口、有效负载数据和确认模式参数，对添加到队列中的下行链路消息进行缓冲。

1. LoRaWAN 设备会发送上行链路消息，表明其处于线上状态且可以开始接收下行链路消息。

1. 如果已将多条下行链路消息添加到队列中，适用于 LoRaWAN 的 AWS IoT Core 会将队列中的第一条下行链路消息发送到已设置确认 (ACK) 标志的设备。

1. 设备可立即向 适用于 LoRaWAN 的 AWS IoT Core 发送上行链路消息，也可休眠直至出现下一条上行链路消息且消息中包含 ACK 标志。

1. 适用于 LoRaWAN 的 AWS IoT Core 收到带有 ACK 标志的上行链路消息后，会清除队列中的下行链路消息，表示设备已成功收到下行链路消息。如果三次检查后，上行链路消息中仍缺少 ACK 标志，则会丢弃该消息。

## 使用控制台执行下行链路队列操作


您可以使用 AWS 管理控制台 管理下行链路消息队列，以及根据需要清除单条消息或整个队列。如果为 A 类设备，收到从设备发送的表明设备处于线上状态的上行链路消息后，将队列消息发送到该设备。发送消息后，系统会自动从队列中清除该消息。

**管理下行链路消息队列**  
创建下行链路消息队列

1. 转到 [AWS IoT 控制台的设备中心](https://console.aws.amazon.com/iot/home#/wireless/devices)，然后选择要管理下行链路消息队列的设备。

1. 在设备详细信息页面的 **Downlink messages**（下行链路消息）部分，选择 **Queue downlink messages**（管理下行链路消息队列）。

1. 要配置下行链路消息，请指定以下参数：
   + **FPort**：选择设备与 适用于 LoRaWAN 的 AWS IoT Core 通信的帧端口。
   + **Payload**（有效负载）：指定要发送到设备的有效负载消息。最大有效负载大小为 242 字节。如果已启用自适应数据速率 (ADR)，适用于 LoRaWAN 的 AWS IoT Core 会用其选择有效负载大小的租价数据速率。您可以根据需要进一步优化数据速率。
   + **Acknowledge mode**（确认模式）：确认设备是否收到下行链路消息。如果消息需要此模式，数据流会显示一条带有 ACK 标志的上行链路消息，并且该消息将从队列中清除。

1. 要将下行链路消息添加到队列中，请选择 **Submit**（提交）。

下行链路消息现已添加到队列中。如果没有显示消息或收到错误，您可以如 [排查下行链路消息队列错误](#lorawan-downlink-queue-troubleshoot) 中所述排查该错误。

**注意**  
将下行链路消息添加到队列后，便无法继续编辑 **FPort** 参数、**Payload**（有效负载）和 **Acknowledge mode**（确认模式）。要为这些参数发送具有不同值的下行链路消息，您可以删除此消息，再对具有更新参数值的新下行链路消息进行队列管理。

队列会列出已添加的下行链路消息。若要查看设备与 适用于 LoRaWAN 的 AWS IoT Core 之间交换的上行链路和下行链路消息的有效负载，您可以使用网络分析器。有关更多信息，请参阅[使用网络分析器实时监控无线资源机群](network-analyzer-overview.md)。

**列出下行链路消息队列**  
已将创建的下行链路消息添加到队列中。后续每条下行链路消息均会在此消息之后添加到队列中。您可以在设备详细信息页面的 **Downlink messages**（下行链路消息）部分查看下行链路消息列表。收到上行链路消息后，消息就会发送到设备。设备收到下行链路消息后，该消息会从队列中删除。然后，下一条消息会在队列中向前移动，等待发送到设备。

**删除单条下行链路消息或清除整个队列**  
发送到设备后，每条下行链路消息都会自动从队列中清除。您还可以删除单条消息或清除整个下行链路队列。这些操作无法撤消。
+ 如果发现队列中有不想发送的消息，请选中相应消息并选择 **Delete**（删除）。
+ 如果不想将任何消息从队列发送到设备，请选择 **Clear downlink queue**（清除下行链路队列）来清除整个队列。

## 使用 API 执行下行链路队列操作


您可以使用 AWS IoT Wireless API 管理下行链路消息队列，以及根据需要清除单条消息或整个队列。

**管理下行链路消息队列**  
若要创建下行链路消息队列，请使用 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_SendDataToWirelessDevice.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_SendDataToWirelessDevice.html) API 操作或 [cli/latest/reference/iotwireless/send-data-to-wireless-device.html](cli/latest/reference/iotwireless/send-data-to-wireless-device.html) 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`，数据包也可能丢失。有关如何解决错误的更多信息，请参阅 [排查下行链路消息队列错误](#lorawan-downlink-queue-troubleshoot)。

```
{
    MessageId: "6011dd36-0043d6eb-0072-0008"
}
```

**列出队列中的下行链路消息**  
若要列出队列中的所有下行链路消息，请使用 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_ListQueuedMessages.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_ListQueuedMessages.html) API 操作或 [https://docs.aws.amazon.com/cli/latest/reference/iotwireless/list-queued-messages.html](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/list-queued-messages.html) CLI 命令。

```
aws iotwireless list-queued-messages
```

默认情况下，运行此命令时最多会显示 10 条下行链路消息。

**删除单条下行链路消息或清除整个队列**  
若要从队列中删除单条消息或清除整个队列，请使用 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_DeleteQueuedMessages.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_DeleteQueuedMessages.html) API 操作或 [https://docs.aws.amazon.com/cli/latest/reference/iotwireless/delete-queued-messages.html](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/delete-queued-messages.html) CLI 命令。
+ 若要删除单条消息，请针对无线设备（由 `wirelessDeviceId` 指定）提供待删除消息的 `messageID`。
+ 若要清除整个下行链路消息队列，请针对无线设备（由 `wirelessDeviceId` 指定）将 `messageID` 指定为 `*`。

## 排查下行链路消息队列错误


如果没有看到期望的结果，可检查以下事项：
+ 

**AWS IoT 控制台中未显示下行链路消息**  
如果如 [使用控制台执行下行链路队列操作](#lorawan-downlink-queue-console) 中所述添加下行链路消息后，但队列中并未显示下行链路消息，可能是因为设备尚未完成名为 *activation*（激活）或 *join*（联接）过程。当设备登记到 适用于 LoRaWAN 的 AWS IoT Core，此过程才算完成。有关更多信息，请参阅[使用控制台将您的无线设备规范添加到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-end-devices-add.md#lorawan-end-device-spec-console)。

  将设备登记到 适用于 LoRaWAN 的 AWS IoT Core 后，您可以使用网络分析器或 Amazon CloudWatch 监控设备来检查联接和重新联接是否成功。有关更多信息，请参阅[监控工具](monitoring-cloudwatch.md#monitoring-tools)。
+ 

**使用 API 时缺少下行链路消息包**  
使用 `SendDataToWirelessDevice` API 操作时，API 会返回唯一的 `MessageId`。不过，其无法确认 LoRaWAN 设备是否收到下行链路消息。在设备尚未完成联接过程等情况下，下行链路数据包可能遭到丢弃。有关如何解决此错误的更多信息，请参阅上一节的内容。
+ 

**发送下行链路消息时缺少 ARN 错误**  
从队列向设备发送下行链路消息时，可能会出现缺少 Amazon Resource Name (ARN) 错误。出现此错误可能是因为尚未为接收下行链路消息的设备准确指定目标。若要解决此错误，请检查设备的目标详细信息。