

# 为 Sidewalk 终端设备添加目标
<a name="iot-sidewalk-qsg-destination"></a>

使用 AWS IoT 规则处理数据和设备消息，并将其路由到其他服务。您还可以定义规则来处理从设备接收的二进制消息，并将消息转换为其他格式，使其他服务易于使用这些消息。目标将 Sidewalk 终端设备与处理要发送到其他 AWS 服务的设备数据的规则相关联。

## 如何创建和使用目标
<a name="iot-sidewalk-destination-how"></a>

1. 为目标创建 AWS IoT 规则和 IAM 角色。AWS IoT 规则指定了将处理设备的数据并路由数据以供其他 AWS 服务和您的应用程序使用的规则。IAM 角色授予访问此规则的权限。

1. 使用 `CreateDestination` API 操作为 Sidewalk 设备创建目标。指定目标名称、规则名称、角色名称和任何可选参数。API 将返回目标的唯一标识符，您可以在将终端设备添加到适用于 Amazon Sidewalk 的 AWS IoT Core 时指定该标识符。

以下内容显示了如何创建目标，以及为该目标创建 AWS IoT 规则和 IAM 角色。

**Topics**
+ [如何创建和使用目标](#iot-sidewalk-destination-how)
+ [为 Sidewalk 设备创建目标](iot-sidewalk-destination-create.md)
+ [为您的目标创建 IAM 角色和 IoT 规则](sidewalk-destination-rule-role.md)

# 为 Sidewalk 设备创建目标
<a name="iot-sidewalk-destination-create"></a>

您可以使用[目标中心](https://console.aws.amazon.com/iot/home#/wireless/destinations)或使用 `CreateDestination` 针对适用于 Amazon Sidewalk 的 AWS IoT Core 将目标添加到您的账户。创建目标时，请指定：
+ 要用于 Sidewalk 终端设备的目标的唯一名称。
**注意**  
如果您已经使用目标名称添加设备，则在创建目标时必须使用该名称。有关更多信息，请参阅[步骤 2：添加 Sidewalk 设备](iot-sidewalk-add-device.md#iot-sidewalk-device-create)。
+ 将用于处理设备数据的 AWS IoT 规则的名称以及要向其发布消息的主题。
+ IAM 角色，向设备的数据授予访问规则的权限。

以下各节介绍如何为目标创建 AWS IoT 规则和 IAM 角色。

## 创建目标（控制台）
<a name="iot-sidewalk-destination-create-console"></a>

要使用 AWS IoT 控制台创建目标，请转到[目标中心](https://console.aws.amazon.com/iot/home#/wireless/destinations)并选择**添加目标**。

![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/iot-wireless/latest/developerguide/images/iot-sidewalk-add-destination.PNG)


要处理设备的数据，请在创建目标时指定以下字段，然后选择**添加目标**。
+ 

**目标详细信息**  
输入 **Destination name**（目标名称）以及您的目标描述（可选）。
+ 

**Rule name（规则名称）**  
被配置为评估设备发送的消息并处理设备数据的 AWS IoT 规则。规则名称将映射到您的目标。目标要求规则来处理收到的消息。您可以通过调用 AWS IoT 规则或通过发布到 AWS IoT 消息代理。
  + 如果选择 **Enter a rule name**（输入规则名称），请输入名称，然后选择 **Copy**（复制）以复制创建 AWS IoT 规则时要输入的规则名称。您可以选择 **Create rule**（创建规则）以立即创建规则，或导航到 AWS IoT 控制台的 [Rule](https://console.aws.amazon.com/iot/home#/create/rule)（规则）中心并使用该名称创建规则。

    您也可以输入规则并使用**高级**设置以指定主题名称。主题名称是在规则调用期间提供的，可通过使用 `topic` 规则中的表达式访问。有关 AWS IoT 规则的更多信息，请参阅 [AWS IoT 规则](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html)。
  + 如果选择 **Publish to AWS IoT message broker**（发布到消息代理），输入主题名称。然后，您可以复制 MQTT 主题名称，多个订阅者可以订阅此主题以接收发布到该主题的消息。有关更多信息，请参阅 [MQTT 主题](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html)。

  有关目标的 AWS IoT 规则的更多信息，请参阅[创建规则以处理 LoRaWAN 设备消息](https://docs.aws.amazon.com/iot/latest/developerguide/connect-iot-lorawan-destination-rules.html)。
+ 

**角色名称**  
IAM 角色，该角色授予设备数据权限以访问在 **Rule name**（规则名称）中命名的规则。在控制台中，您可以创建新的服务角色或选择现有的服务角色。如果要创建新的服务角色，可以输入角色名称（例如，**SidewalkDestinationRole**)，或将其留白 适用于 LoRaWAN 的 AWS IoT Core 以生成新的角色名称。然后 适用于 LoRaWAN 的 AWS IoT Core 将代表您自动创建具有适当权限的 IAM 角色。

## 创建目标（CLI）
<a name="iot-sidewalk-destination-create-cli"></a>

要创建目标，请使用 [https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateDestination.html](https://docs.aws.amazon.com/iot-wireless/2020-11-22/apireference/API_CreateDestination.html) API 操作或 [https://docs.aws.amazon.com/cli/latest/reference/create-destination.html](https://docs.aws.amazon.com/cli/latest/reference/create-destination.html) CLI 命令。例如，以下命令为您的 Sidewalk 终端设备创建目标：

```
aws iotwireless create-destination --name SidewalkDestination \
    --expression-type RuleName --expression SidewalkRule \
    --role-arn arn:aws:iam::123456789012:role/SidewalkRole
```

运行此命令会返回目标详细信息，其中包括 Amazon 资源名称（ARN）和目标名称。

```
{
    "Arn": "arn:aws:iotwireless:us-east-1:123456789012:Destination/SidewalkDestination",
    "Name": "SidewalkDestination"
}
```

有关创建目标的更多信息，请参阅[创建规则以处理 LoRaWAN 设备消息](https://docs.aws.amazon.com/iot/latest/developerguide/connect-iot-lorawan-destination-rules.html)。

# 为您的目标创建 IAM 角色和 IoT 规则
<a name="sidewalk-destination-rule-role"></a>

AWS IoT 规则将设备消息发送到其他服务。AWS IoT 规则还可以处理从 Sidewalk 终端设备接收的二进制消息，以供其他服务使用。适用于 Amazon Sidewalk 的 AWS IoT Core 目标将无线设备与处理设备的消息数据以发送到其他服务的规则相关联。在适用于 Amazon Sidewalk 的 AWS IoT Core 收到设备的数据后，该规则会立即对其进行处理。对于将数据发送到同一服务的所有设备，您可以创建一个可供所有设备共享的目标。您还必须创建一个 IAM 角色来授予向规则发送数据的权限。

## 为目标创建 IAM 角色
<a name="iot-sidewalk-destination-role"></a>

创建一个 IAM 角色来授予适用于 Amazon Sidewalk 的 AWS IoT Core 向 AWS IoT 规则发送数据的权限。要创建角色，请使用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) API 操作或 [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role) CLI 命令。您可以将角色命名为 *`SidewalkRole`*。

```
aws iam create-role --role-name SidewalkRole \ 
    --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
```

您还可以使用 JSON 文件为角色定义信任策略。

```
aws iam create-role --role-name SidewalkRole \ 
    --assume-role-policy-document file://trust-policy.json
```

下面显示的是 JSON 文件的内容。

**trust-policy.json 的内容**

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

## 为目标创建规则
<a name="iot-sidewalk-destination-rule"></a>

使用 AWS IoT Core API 操作 [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html) 或 AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html](https://docs.aws.amazon.com/cli/latest/reference/iot/create-topic-rule.html) 来创建规则。您的目标将使用主题规则将从 Sidewalk 终端设备接收到的数据路由到其他 AWS 服务。例如，您可以创建向 Lambda 函数发送消息的规则操作。您可以定义 Lambda 函数，使其从您的设备接收应用程序数据，并使用 base64 对有效负载数据进行解码，以便其他应用程序可以使用这些数据。

以下步骤显示了如何创建 Lambda 函数，以及如何创建向该函数发送消息的主题规则。

1. 

**创建执行角色和策略**

   创建一个 IAM 角色，向您的函数授予访问 AWS 资源的权限。您还可以使用 JSON 文件为角色定义信任策略。

   ```
   aws iam create-role --role-name lambda-ex \ 
       --assume-role-policy-document file://lambda-trust-policy.json
   ```

   下面显示的是 JSON 文件的内容。

   **lambda-trust-policy.json 的内容**

   ```
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. 

**创建并测试 Lambda 函数**

   执行以下步骤以创建 base64 对有效负载数据进行解码的 AWS Lambda 函数。

   1. 编写用于解码有效负载数据的代码。例如，您可以使用以下示例 Python 代码。为脚本指定一个名称，例如 *`base64_decode.py`*。

      **base64\$1decode.py 的内容**

      ```
      // -----------------------------------------------------------
      // ----- Python script to decode incoming binary payload -----
      // -----------------------------------------------------------
      import json
      import base64
      
      def lambda_handler(event, context):
      
          message = json.dumps(event)
          print (message)
      
          payload_data = base64.b64decode(event["PayloadData"])
          print(payload_data)
          print(int(payload_data,16))
      ```

   1. 将部署包创建为包含 Python 文件的 zip 文件，并将其命名为 `base64_decode.zip`。使用 `CreateFunction` API 或 `create-function` CLI 命令为示例代码创建 Lambda 函数 *`base64_decode.py`*。

   1. 

      ```
      aws lambda create-function --function-name my-function \
      --zip-file fileb://base64_decode.zip --handler index.handler \ 
      --runtime python3.9 --role arn:aws:iam::123456789012:role/lambda-ex
      ```

      您应当看到如下输出。创建主题规则时，您将使用输出中的 Amazon 资源名称（ARN）值 `FunctionArn`。

      ```
      {
          "FunctionName": "my-function",
          "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
          "Runtime": "python3.9",
          "Role": "arn:aws:iam::123456789012:role/lambda-ex",
          "Handler": "index.handler",
          "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=",
          "Version": "$LATEST",
          "TracingConfig": {
              "Mode": "PassThrough"
          },
          "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff",
          ...
      }
      ```

   1. 要从命令行获取调用的日志，请将 `--log-type` 选项与 `invoke` 命令一起使用。响应包含一个 LogResult 字段，该字段包含来自调用的多达 4KB 的 base64 编码日志。

      ```
      aws lambda invoke --function-name my-function out --log-type Tail
      ```

      您应该会收到 `StatusCode` 为 200 的响应。有关从 AWS CLI 创建和使用 Lambda 函数的更多信息，请参阅[将 Lambda 与 AWS CLI 结合使用](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)。

1. 创建主题规则

   使用 `CreateTopicRule` API 或 `create-topic-rule` CLI 命令创建向此 Lambda 函数发送消息的主题规则。您还可以添加第二个规则操作，以重新发布到 AWS IoT 主题。将此主题规则命名为 `Sidewalkrule`。

   ```
   aws iot create-topic-rule --rule-name Sidewalkrule \ 
       --topic-rule-payload file://myrule.json
   ```

   您可以使用 `myrule.json` 文件来指定有关规则的更多详细信息。例如，以下 JSON 文件显示了如何重新发布到 AWS IoT 主题以及如何向 Lambda 函数发送消息。

   ```
   {
       "sql": "SELECT * ",
       "actions": [
          {
               // You obtained this functionArn when creating the Lambda function using the 
               // create-function command.
               "lambda": {
                   "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function"
                }
           },
           {
               // This topic can be used to observe messages exchanged between the device and 
               // AWS IoT Core for Amazon Sidewalk after the device is connected.
                "republish": {
                    "roleArn": "arn:aws:iam::123456789012:role/service-role/SidewalkRepublishRole",
                    "topic": "project/sensor/observed"
                }
           }
       ],
   }
   ```