

# 使用 适用于 LoRaWAN 的 AWS IoT Core 管理设备
<a name="lorawan-manage-end-devices"></a>

以下是将您的设备与 适用于 LoRaWAN 的 AWS IoT Core 搭配使用时需要注意的重要事项。有关如何将设备添加到 适用于 LoRaWAN 的 AWS IoT Core 的信息，请参阅 [将您的设备登记到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-onboard-end-devices.md)。

## 设备注意事项
<a name="lorawan-devices-criteria"></a>

选择要用于与 适用于 LoRaWAN 的 AWS IoT Core 通信的设备时，请考虑以下事项：
+ 可用传感器
+ 电池容量
+ 能源消耗
+ 费用
+ 天线类型和传输范围

## 使用具有可与 适用于 LoRaWAN 的 AWS IoT Core 搭配使用的网关的设备
<a name="lorawan-devices-qualified-gateways"></a>

您使用的设备可以与能够同 适用于 LoRaWAN 的 AWS IoT Core 搭配使用的无限网关配对。这些网关和开发人员工具包可在 [AWS 合作伙伴设备目录](https://devices.amazonaws.com/search?page=1&sv=iotclorawan)中找到。我们还建议您考虑将这些设备靠近您的网关。有关更多信息，请参阅[使用来自AWS Partner Device Catalog 的合格网关](lorawan-manage-gateways.md#lorawan-qualified-gateways)。

## LoRaWAN 版本
<a name="lorawan-lorawan-version"></a>

适用于 LoRaWAN 的 AWS IoT Core 支持所有符合 LoRa Alliance 标准化的 1.0.x 或 1.1 LoRAWAN 规范的设备。

## 激活模式
<a name="lorawan-activation-modes"></a>

在 LoRaWAN 设备能够发送上行链路数据之前，您必须完成一个名为*激活*或者*联接*流程的操作。要激活您的设备，您可以使用 OTAA（空中激活）或 ABP（通过个性化激活）。我们建议您使用 OTAA 激活您的设备，因为每次激活都会生成新的会话密钥，这样更加安全。

您的无线设备规范基于 LoRaWAN 版本和激活模式，该模式决定了为每次激活生成的根密钥和会话密钥。有关更多信息，请参阅[使用控制台将您的无线设备规范添加到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-end-devices-add.md#lorawan-end-device-spec-console)。

## 设备类
<a name="lorawan-device-classes"></a>

LoRaWAN 设备可以随时发送上行链路消息。侦听下行链路消息会消耗电池容量并缩短电池持续时间。LoRaWAN 协议指定了三类 LoRaWAN 设备。
+ A 类设备大部分时间都处于睡眠状态，并且仅在短时间内侦听下行链路消息。这些设备主要是电池供电的传感器，电池寿命长达 10 年。
+ B 类设备可以在计划的下行链路插槽中接收消息。这些设备主要是电池供电的执行器。
+ C 类设备永远不会睡眠，并会持续侦听传入的消息，因此接收消息时没有太多延迟。这些器件主要是电源驱动器。

有关这些无线设备注意事项的更多信息，请参阅 [了解有关 LoRaWAN 的更多信息](what-is-lorawan.md#lorawan-learn-more) 中提及的资源。

**Topics**
+ [设备注意事项](#lorawan-devices-criteria)
+ [使用具有可与 适用于 LoRaWAN 的 AWS IoT Core 搭配使用的网关的设备](#lorawan-devices-qualified-gateways)
+ [LoRaWAN 版本](#lorawan-lorawan-version)
+ [激活模式](#lorawan-activation-modes)
+ [设备类](#lorawan-device-classes)
+ [使用 适用于 LoRaWAN 的 AWS IoT Core 执行自适应数据速率 (ADR)](iot-lorawan-adr.md)
+ [管理 LoRaWAN 设备与 AWS IoT 之间的通信](lorawan-device-cloud-communication.md)
+ [管理来自公共 LoRaWAN 设备网络（Everynet）的 LoRaWAN 流量](iot-lorawan-roaming.md)

# 使用 适用于 LoRaWAN 的 AWS IoT Core 执行自适应数据速率 (ADR)
<a name="iot-lorawan-adr"></a>

适用于 LoRaWAN 的 AWS IoT Core 使用自适应数据速率来降低设备传输功耗，同时确保由网关接收来自终端设备的消息。自适应数据速率指示终端设备优化数据速率、传输功率和重传次数，同时尝试降低网关收到的数据包的错误率。例如，如果您的终端设备靠近网关，则自适应数据速率会降低传输功率并提高数据传输速率。

**Topics**
+ [自适应数据速率（ADR）的工作原理](#iot-lorawan-adr-algorithm)
+ [配置数据速率限制（CLI）](#iot-lorawan-adr-use)

## 自适应数据速率（ADR）的工作原理
<a name="iot-lorawan-adr-algorithm"></a>

要启用 ADR，您的设备必须在帧头中设置 ADR 位。设置 ADR 位后，适用于 LoRaWAN 的 AWS IoT Core 会发送 `LinkADRReq` MAC 命令，您的设备将使用包含 ADR 命令的 ACK 状态的 `LinkADRAns` 命令进行响应。设备确认 ADR 命令后，它将按照来自 适用于 LoRaWAN 的 AWS IoT Core 的 ADR 说明调整传输参数值以获得最佳数据速率。

适用于 LoRaWAN 的 AWS IoT Core ADR 算法使用上行链路元数据历史记录中的 SINR 信息来确定设备使用的最佳传输功率和数据速率。该算法使用在帧头中设置 ADR 位后开始的 20 个最近的上行链路消息。为了确定重传次数，它使用数据包错误率（PER），即丢失的数据包总数的百分比。使用此算法时，您只能控制数据速率的范围，即数据速率的最小和最大限制。

## 配置数据速率限制（CLI）
<a name="iot-lorawan-adr-use"></a>

默认情况下，当您在 LoRaWAN 设备的帧头中设置 ADR 位时，适用于 LoRaWAN 的 AWS IoT Core 将执行 ADR。使用 AWS IoT Wireless API 操作 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateServiceProfile.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateServiceProfile.html) 或 AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/create-service-profile.html](https://docs.aws.amazon.com/cli/latest/reference/create-service-profile.html) 为 LoRaWAN 设备创建服务配置文件时，您可以控制数据速率的最小和最大限制。

**注意**  
从 AWS 管理控制台 创建服务配置文件时，无法指定最大和最小数据速率限制。只能使用 AWS IoT Wireless API 或 AWS CLI 指定该值。

要指定数据速率的最小和最大限制，请在 `CreateServiceProfile` API 操作中使用 `DrMin` 和 `DrMax` 参数。默认的最小和最大数据速率限制为 0 和 15。例如，以下 CLI 命令将最低数据速率限制设置为 3，将最大限制设置为 12。

```
aws iotwireless create-service-profile \ 
    --lorawan DrMin=3,DrMax=12
```

运行此命令会生成服务配置文件的 ID 和 Amazon 资源名称（ARN）。

```
{
    "Arn": "arn:aws:iotwireless:us-east-1:123456789012:ServiceProfile/12345678-a1b2-3c45-67d8-e90fa1b2c34d",
    "Id": "12345678-a1b2-3c45-67d8-e90fa1b2c34d"
}
```

您可以使用 AWS IoT Wireless API 操作 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_GetServiceProfile.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_GetServiceProfile.html) 或 AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/get-service-profile.html](https://docs.aws.amazon.com/cli/latest/reference/get-service-profile.html) 获取指定参数的值。

```
aws iotwireless get-service-profile --id "12345678-a1b2-3c45-67d8-e90fa1b2c34d"
```

运行此命令会生成服务配置文件参数的值。

```
{
    "Arn": "arn:aws:iotwireless:us-east-1:651419225604:ServiceProfile/12345678-a1b2-3c45-67d8-e90fa1b2c34d",
    "Id": "12345678-a1b2-3c45-67d8-e90fa1b2c34d",
    "LoRaWAN": {
        "UlRate": 60,
        "UlBucketSize": 4096,
        "DlRate": 60,
        "DlBucketSize": 4096,
        "AddGwMetadata": false,
        "DevStatusReqFreq": 24,
        "ReportDevStatusBattery": false,
        "ReportDevStatusMargin": false,
        "DrMin": 3,
        "DrMax": 12,
        "PrAllowed": false,
        "HrAllowed": false,
        "RaAllowed": false,
        "NwkGeoLoc": false,
        "TargetPer": 5,
        "MinGwDiversity": 1
    }
}
```

如果您创建了多个配置文件，则可以使用 API 操作 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_ListServiceProfiles.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_ListServiceProfiles.html) 或 AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/list-service-profiles.html](https://docs.aws.amazon.com/cli/latest/reference/list-service-profiles.html) 列出 AWS 账户中的服务配置文件，然后使用 `GetServiceProfile` API 或 `get-service-profile` CLI 命令检索您为其自定义数据速率限制的服务配置文件。

# 管理 LoRaWAN 设备与 AWS IoT 之间的通信
<a name="lorawan-device-cloud-communication"></a>

将 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 设备发送的上行链路消息的格式
<a name="lorawan-uplink-metadata-format"></a>

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

## 在您观察上行链路消息之前
<a name="lorawan-uplink-metadata-prerequisites"></a>

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

## 上行链路消息包含什么内容？
<a name="lorawan-uplink-metadata-contains"></a>

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

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

## 如何观察上行链路消息？
<a name="lorawan-uplink-metadata-observe"></a>

登记设备后，您可以使用 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 应用程序。

## 上行链路消息示例
<a name="lorawan-uplink-metadata-example"></a>

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

```
{
    "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"
            
        }
    }
}
```

### 从上行链路元数据中排除网关元数据
<a name="lorawan-uplink-metadata-example2"></a>

如果要从上行链路元数据中排除网关元数据信息，请在您创建服务配置文件时禁用 **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 设备的下行链路消息队列
<a name="lorawan-downlink-queue"></a>

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

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

## 下行链路消息队列的工作原理
<a name="lorawan-how-downlink-works"></a>

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 标志，则会丢弃该消息。

## 使用控制台执行下行链路队列操作
<a name="lorawan-downlink-queue-console"></a>

您可以使用 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 执行下行链路队列操作
<a name="lorawan-downlink-queue-api"></a>

您可以使用 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` 指定为 `*`。

## 排查下行链路消息队列错误
<a name="lorawan-downlink-queue-troubleshoot"></a>

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

**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) 错误。出现此错误可能是因为尚未为接收下行链路消息的设备准确指定目标。若要解决此错误，请检查设备的目标详细信息。

# 管理来自公共 LoRaWAN 设备网络（Everynet）的 LoRaWAN 流量
<a name="iot-lorawan-roaming"></a>

您可以使用公开可用的 LoRaWAN 网络，在几分钟内将您的 LoRaWAN 设备连接到云端。适用于 LoRaWAN 的 AWS IoT Core 现在支持 Everynet 在美国和英国的网络覆盖。使用公共网络时，您每月需要为每台设备支付公共网络连接费。该定价适用于所有提供公共网络连接的 AWS 区域。有关此特征的定价的信息，请参阅 [AWS IoT Core 定价页面](https://aws.amazon.com/iot-core/pricing/)。

**重要**  
公共网络由 Everynet 直接作为一项服务运营和提供。在使用此特征之前，请参阅适用的 [AWS 服务条款](https://aws.amazon.com/service-terms/)。此外，如果您通过 适用于 LoRaWAN 的 AWS IoT Core 使用公共网络，则某些 LoRaWAN 设备信息（例如 `DevEUI` 和 `JoinEUI`）将在 适用于 LoRaWAN 的 AWS IoT Core 可用的区域之间复制。

适用于 LoRaWAN 的 AWS IoT Core 根据 LoRa Alliance 漫游规范支持公共 LoRaWAN 网络，如 [LoRaWAN 后端接口 1.0 规范](https://lora-alliance.org/wp-content/uploads/2020/11/lorawantm-backend-interfaces-v1.0.pdf)中所述。公共网络功能可用于连接家庭网络之外的终端设备。为了支持此功能，适用于 LoRaWAN 的 AWS IoT Core 与 Everynet 合作，提供更广泛的无线电覆盖范围。

## 使用公共 LoRaWAN 网络的优势
<a name="lorawan-roaming-benefits"></a>

您的 LoRaWAN 设备可以使用公共网络连接到云端，这可以缩短部署时间，并减少维护私有 LoRaWAN 网络所需的时间和成本。

通过使用公共 LoRaWAN 网络，您将获得诸如覆盖范围扩展、在没有无线电网络的情况下运行核心以及覆盖密集化等优势。此特征可用于：
+ 为设备移出家庭网络时提供覆盖范围，例如[公共 LoRaWAN 网络支持架构](lorawan-roaming-works.md#lorawan-roaming-architecture)部分所示的图中的*设备 A*。
+ 将覆盖范围扩大到没有 LoRa 网关可供连接的设备，例如[公共 LoRaWAN 网络支持架构](lorawan-roaming-works.md#lorawan-roaming-architecture)部分所示的图中的*设备 B*。然后，设备可以使用由合作伙伴提供的网关连接到家庭网络。

您的 LoRaWAN 设备可以通过公共网络使用漫游功能连接到云端，这可以缩短部署时间，并减少维护私有 LoRaWAN 网络所需的时间和成本。

以下各节描述了公共网络支持架构、公共 LoRaWAN 网络支持的工作原理以及如何使用此特征。

**Topics**
+ [使用公共 LoRaWAN 网络的优势](#lorawan-roaming-benefits)
+ [LoRaWAN 公共网络支持的工作原理](lorawan-roaming-works.md)
+ [如何使用公共网络支持](lorawan-roaming-use.md)

# LoRaWAN 公共网络支持的工作原理
<a name="lorawan-roaming-works"></a>

适用于 LoRaWAN 的 AWS IoT Core 根据 LoRa Alliance 规范支持被动漫游特征。使用被动漫游时，漫游过程对终端设备完全透明。在家庭网络之外漫游的终端设备可以连接到公共网络中的网关，并使用应用程序服务器交换上行链路和下行链路数据。在整个漫游过程中，设备保持与家庭网络的连接。

**注意**  
适用于 LoRaWAN 的 AWS IoT Core 仅支持被动漫游的无状态特征。不支持移交漫游。在移交漫游中，当您的设备移动到家庭网络之外时，它会切换到其他运营商。

**Topics**
+ [公共 LoRaWAN 网络概念](#lorawan-roaming-concepts)
+ [公共 LoRaWAN 网络支持架构](#lorawan-roaming-architecture)

## 公共 LoRaWAN 网络概念
<a name="lorawan-roaming-concepts"></a>

适用于 LoRaWAN 的 AWS IoT Core 支持的公共网络功能使用以下概念。

**LoRaWAN 网络服务器（LNS）**  
LNS 是一种独立的私有服务器，可以在本地运行，也可以是基于云的服务。适用于 LoRaWAN 的 AWS IoT Core 是在云端提供服务的 LNS。

**家庭网络服务器（hNS）**  
家庭网络是设备所属的网络。家庭网络服务器（hNS）是一个 LNS，其中 适用于 LoRaWAN 的 AWS IoT Core 用于存储设备的预置数据，例如 `DevEUI`、`AppEUI` 和会话密钥。

**访问的网络服务器（vNS）**  
访问的网络是设备离开家庭网络时从中获得覆盖的网络。访问的网络服务器（vNS）是与 hNS 签订业务和技术协议的 LNS，可以为终端设备提供服务。AWS 合作伙伴 Everynet 充当访问的网络以提供覆盖范围。

**提供服务的网络服务器（sNS）**  
提供服务的网络服务器（sNS）是处理设备的 MAC 命令的 LNS。一个 LoRa 会话只能有一个 sNS。

**转发网络服务器（fNS）**  
转发网络服务器（fNS）是管理无线电网关的 LNS。一个 LoRa 会话中可以涉及零个或多个 fNS。该网络服务器管理将从设备收到的数据包转发到家庭网络的过程。

## 公共 LoRaWAN 网络支持架构
<a name="lorawan-roaming-architecture"></a>

下面的架构图显示了 适用于 LoRaWAN 的 AWS IoT Core 如何与 Everynet 合作以提供公共网络连接。在这种情况下，*设备 A* 通过 LoRa 网关连接到由 适用于 LoRaWAN 的 AWS IoT Core 提供的 hNS（家庭网络服务器）。当设备 A 移出家庭网络时，它会进入访问的网络，并被 Everynet 提供的访问的网络服务器（vNS）覆盖。vNS 还将覆盖范围扩展到没有 LoRa 网关可供连接的*设备 B*。

您可以在 AWS IoT 控制台中查看公共网络覆盖信息，如下一节所述。

![\[图片显示 适用于 LoRaWAN 的 AWS IoT Core 如何通过支持漫游功能来支持家庭网络之外的设备，以及如何将覆盖范围扩展到没有网关连接的设备。\]](http://docs.aws.amazon.com/zh_cn/iot-wireless/latest/developerguide/images/iot-lorawan-roaming-architecture.png)


 适用于 LoRaWAN 的 AWS IoT Core 根据 [LoRa Alliance LoRaWAN 漫游中心技术建议](https://lora-alliance.org/wp-content/uploads/2022/01/TR010-1.0.0-LoRaWAN-Roaming-Hub.pdf)使用漫游中心功能。漫游中心为 Everynet 提供一个端点，用于路由从终端设备接收到的流量。在这种情况下，Everynet 充当转发网络服务器（fNS），以转发从设备收到的流量。它使用由 LoRa Alliance 规范定义的 HTTP RESTful API。

**注意**  
如果您的设备从其家庭网络移出，并进入您的家庭网络和 Everynet 都可以提供覆盖的位置，它会使用先到先得的策略来确定是连接到 LoRa 网关，还是连接到 Everynet 的网关。

访问公共网络时，hNS 和提供服务的网络服务器（sNS）是分开的。然后，在 sNS 与 hNS 之间交换上行链路和下行链路数据包。

# 如何使用公共网络支持
<a name="lorawan-roaming-use"></a>

要启用 Everynet 的公共网络支持，请在创建服务配置文件时启用某些漫游参数。在此测试版中，这些参数在您使用 AWS IoT Wireless API 或 AWS CLI 时可用。以下各节显示了必须启用的参数以及如何使用 AWS CLI 启用公共网络。

**注意**  
只有在创建新的服务配置文件时，才能启用公共网络支持。您无法使用这些参数更新现有配置文件以启用公共网络。

**Topics**
+ [漫游参数](#lorawan-roaming-parameters)
+ [为设备启用公共网络支持](#lorawan-roaming-enable)

## 漫游参数
<a name="lorawan-roaming-parameters"></a>

在为设备创建服务配置文件时，请指定以下参数。在从 AWS IoT 控制台的[配置文件](https://console.aws.amazon.com/iot/home#/wireless/profiles)中心添加服务配置文件时，请指定这些参数，也可以使用 AWS IoT Wireless API 操作 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateServiceProfile.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateServiceProfile.html) 或 AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/create-service-profile.html](https://docs.aws.amazon.com/cli/latest/reference/create-service-profile.html)。

**注意**  
适用于 LoRaWAN 的 AWS IoT Core 不支持移交漫游。创建服务配置文件时，您无法启用指定是否使用移交漫游的 `HrAllowed` 参数。
+ 允许漫游激活（`RaAllowed`）：此参数指定是否启用漫游激活。漫游激活使终端设备能够在 vNS 的覆盖范围内激活。使用漫游特征时，`RaAllowed` 必须设置为 `true`。
+ 允许被动漫游（`PrAllowed`）：此参数指定是否启用被动漫游。使用漫游特征时，`PrAllowed` 必须设置为 `true`。

## 为设备启用公共网络支持
<a name="lorawan-roaming-enable"></a>

要在设备上启用公共 LoRaWAN 网络支持，请运行以下过程。

**注意**  
只能为 OTAA 设备启用公共网络功能。使用 ABP 作为激活方法的设备不支持此特征。

1. 

**使用漫游参数创建服务配置文件**

   通过启用漫游参数创建服务配置文件。
**注意**  
在为要与该服务配置文件关联的设备创建设备配置文件时，我们建议您为 `RxDelay1` 参数指定一个较大的值，至少大于 2 秒。
   + 

**使用 AWS IoT控制台**  
转到 AWS IoT 控制台的[配置文件](https://console.aws.amazon.com/iot/home#/wireless/profiles)中心，然后选择**添加服务配置文件**。创建配置文件时，选择**启用公共网络**。
   + 

**使用 AWS IoT Wireless API**  
要在创建服务配置文件时启用漫游功能，请使用 [CreateServiceProfile](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateServiceProfile.html) API 操作或 [https://docs.aws.amazon.com/cli/latest/reference/create-service-profile.html](https://docs.aws.amazon.com/cli/latest/reference/create-service-profile.html) CLI 命令，如下例所示。

     ```
     aws iotwireless create-service-profile \ 
         --region us-east-1 \
         --name roamingprofile1 \ 
         --lorawan '{"AddGwMetadata":true,"PrAllowed":true,"RaAllowed":true}'
     ```

     运行此命令将返回服务配置文件的 ARN 和 ID 作为输出。

     ```
     {
         "Arn": "arn:aws:iotwireless:us-east-1:123456789012:ServiceProfile/12345678-a1b2-3c45-67d8-e90fa1b2c34d",
         "Id": "12345678-a1b2-3c45-67d8-e90fa1b2c34d"
     }
     ```

1. 

**检查服务配置文件中的漫游参数**

   要检查您指定的漫游参数，可以在控制台中或使用 `get-service-profile` CLI 命令查看服务配置文件，如下例所示。
   + 

**使用 AWS IoT控制台**  
转到 AWS IoT 控制台的[配置文件](https://console.aws.amazon.com/iot/home#/wireless/profiles)中心，然后选择您创建的配置文件。在详细信息页面的**配置文件配置**选项卡中，您将看到 **RaAllowed** 和 **PrAllowed** 设置为 `true`。
   + 

**使用 AWS IoT Wireless API**  
要查看您启用的漫游参数，请使用 [GetServiceProfile](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_GetServiceProfile.html) API 操作或 [https://docs.aws.amazon.com/cli/latest/reference/get-service-profile.html](https://docs.aws.amazon.com/cli/latest/reference/get-service-profile.html) CLI 命令，如下例所示。

     ```
     aws iotwireless get-service-profile \ 
         --region us-east-1 \ 
         --id 12345678-a1b2-3c45-67d8-e90fa1b2c34d
     ```

     运行此命令会将服务配置文件详细信息作为输出返回，包括漫游参数 `RaAllowed` 和 `PrAllowed` 的值。

     ```
     {
         "Arn": "arn:aws:iotwireless:us-east-1:123456789012:ServiceProfile/12345678-a1b2-3c45-67d8-e90fa1b2c34d",
         "Id": "12345678-a1b2-3c45-67d8-e90fa1b2c34d",
         "Name": "roamingprofile1"
         "LoRaWAN": {
             "UlRate": 60,
             "UlBucketSize": 4096,
             "DlRate": 60,
             "DlBucketSize": 4096,
             "AddGwMetadata": true,
             "DevStatusReqFreq": 24,
             "ReportDevStatusBattery": false,
             "ReportDevStatusMargin": false,
             "DrMin": 0,
             "DrMax": 15,
             "PrAllowed": true,
             "RaAllowed": true,
             "NwkGeoLoc": false,
             "TargetPer": 5,
             "MinGwDiversity": 1
         }
     }
     ```

1. 

**将服务配置文件附加到设备**

   将您使用漫游参数创建的服务配置文件附加到终端设备。您也可以创建设备配置文件并为无线设备添加目标。您将使用此目标路由从您的设备发送的上行链路消息。有关创建设备配置文件和目标的更多信息，请参阅[添加设备配置文件](lorawan-define-profiles.md#lorawan-device-profiles)和[将目标添加到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-create-destinations.md)。
   + 

**登记新设备**  
如果您尚未登记设备，则可以指定此服务配置文件，以便在将设备添加 适用于 LoRaWAN 的 AWS IoT Core 时使用。以下命令显示如何使用 `create-wireless-device` CLI 命令，通过您创建的服务配置文件的 ID 添加设备。有关使用控制台添加服务配置文件的信息，请参阅[使用控制台将您的无线设备规范添加到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-end-devices-add.md#lorawan-end-device-spec-console)。

     ```
     aws iotwireless create-wireless-device --cli-input-json file://createdevice.json
     ```

     下面显示的是 *`createdevice.json`* 文件的内容。

     **createdevice.json 的内容**

     ```
     {
         "Name": "DeviceA",  
         "Type": LoRaWAN,
         "DestinationName": "RoamingDestination1",
         "LoRaWAN": {
             "DeviceProfileId": "ab0c23d3-b001-45ef-6a01-2bc3de4f5333",
             "ServiceProfileId": "12345678-a1b2-3c45-67d8-e90fa1b2c34d",
             "OtaaV1_1": {
                 "AppKey": "3f4ca100e2fc675ea123f4eb12c4a012",
                 "JoinEui": "b4c231a359bc2e3d",
                 "NwkKey": "01c3f004a2d6efffe32c4eda14bcd2b4"
             },
             "DevEui": "ac12efc654d23fc2"
         },
     }
     ```

     运行此命令的输出将生成无线设备的 ARN 和 ID 作为输出。

     ```
     {
         "Arn": "arn:aws:iotwireless:us-east-1:123456789012:WirelessDevice/1ffd32c8-8130-4194-96df-622f072a315f",
         "Id": "1ffd32c8-8130-4194-96df-622f072a315f"
     }
     ```
   + 

**更新现有设备**  
如果您已经登记了设备，则可以更新现有的无线设备以使用此服务配置文件。以下命令显示如何使用 `update-wireless-device` CLI 命令，通过您创建的服务配置文件的 ID 更新设备。

     ```
     aws iotwireless update-wireless-device \
         --id "1ffd32c8-8130-4194-96df-622f072a315f" \
         --service-profile-id "12345678-a1b2-3c45-67d8-e90fa1b2c34d" \ 
         --description "Using roaming service profile A"
     ```

     此命令不会生成任何输出。您可以使用 `GetWirelessDevice` API 或 `get-wireless-device` CLI 命令来获取更新的信息。

1. 

**使用 Everynet 将设备连接到云端**

   由于已启用漫游，您的设备现在必须执行联接才能获得新的 `DevAddr`。当您使用 OTAA 时，LoRaWAN 设备会发送联接请求，网络服务器将允许该请求。然后，它可以使用 Everynet 提供的网络覆盖范围连接到 AWS 云。有关如何为设备执行激活过程或联接的说明，请参阅设备文档。
**注意**  
只能针对使用 OTAA 作为激活方式的设备，启用漫游功能并连接到公共网络。不支持 ABP 设备。有关如何为设备执行激活过程或联接的说明，请参阅设备文档。请参阅 [激活模式](lorawan-manage-end-devices.md#lorawan-activation-modes)。
要禁用设备的漫游功能，您可以取消设备与该服务配置文件的关联，然后将其与漫游参数设置为 `false` 的另一个服务配置文件进行关联。切换到此服务配置文件后，您的设备必须再次加入，这样它们就不会继续在公共网络上运行。

1. 

**交换上行链路和下行链路消息**

   在将设备联接到 适用于 LoRaWAN 的 AWS IoT Core 后，即可开始在设备和云端之间交换消息。
   + 

**查看上行链路消息**  
当您从设备发送上行链路消息时，适用于 LoRaWAN 的 AWS IoT Core 使用您之前配置的目标将这些消息传送到您的 AWS 账户。这些消息将通过 Everynet 的网络从您的设备发送到云端。

     您可以使用 AWS IoT 规则名称查看消息，也可以使用 MQTT 客户端订阅在创建目标时指定的 MQTT 主题。有关规则名称和您指定的其他目标详细信息的更多信息，请参阅[使用控制台添加一个目标](lorawan-create-destinations.md#lorawan-create-destination-console)。

     有关查看上行链路消息和格式的更多信息，请参阅[查看从 LoRaWAN 设备发送的上行链路消息的格式](lorawan-uplink-metadata-format.md)。
   + 

**发送下行链路消息**  
您可以从控制台对下行链路消息排队并向设备发送这些消息，也可以使用 AWS IoT Wireless API 命令 `SendDataToWirelessDevice` 或 AWS CLI 命令 `send-data-to-wireless-device` 执行这一过程。有关对下行链路消息排队和发送这些消息的信息，请参阅[管理要发送到 LoRaWAN 设备的下行链路消息队列](lorawan-downlink-queue.md)。

     以下代码显示了如何使用 `send-data-to-wireless-device` CLI 命令发送下行链路消息的示例。您可以指定接收数据的无线设备的 ID、有效负载、是否使用确认模式以及无线元数据。

     ```
     aws iotwireless send-data-to-wireless-device \
         --id "1ffd32c8-8130-4194-96df-622f072a315f" \
         --transmit-mode "1" \
         --payload-data "SGVsbG8gVG8gRGV2c2lt" \
         --wireless-metadata LoRaWAN={FPort=1}
     ```

     运行此命令的输出会生成下行链路消息的 `MessageId`。
**注意**  
在某些情况下，即使收到 `MessageId`，数据包也可能丢失。有关对此类场景进行问题排查和解决问题的信息，请参阅[排查下行链路消息队列错误](lorawan-downlink-queue.md#lorawan-downlink-queue-troubleshoot)。

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

**查看覆盖范围信息**  
启用公共网络后，可以在 AWS IoT 控制台中查看网络覆盖范围信息。转至 AWS IoT 控制台的[https://console.aws.amazon.com/iot/home#/wireless/network-coverage](https://console.aws.amazon.com/iot/home#/wireless/network-coverage)中心，然后搜索位置以在地图上查看设备的覆盖范围信息。
**注意**  
此特征使用 Amazon Location Service 在 Amazon Location 地图上显示您设备的覆盖范围信息。使用 Amazon Location 地图之前，请查看 Amazon Location Service 的条款和条件。请注意，AWS 可能会将您的 API 查询传输给您选择的第三方数据提供商，这些提供商可能不在您当前使用的 AWS 区域范围内。有关更多信息，请参阅 [AWS 服务条款](https://aws.amazon.com/service-terms)。