

# 创建规则以处理 LoRaWAN 设备消息
<a name="lorawan-destination-rules"></a>

AWS IoT 规则会将设备消息发送到其他服务。AWS IoT 规则还可以处理从 LoRaWAN 设备接收的二进制消息，以便将消息转换为其他格式，从而更加便于其他服务使用。

[适用于 LoRaWAN 的 AWS IoT Core 目标](lorawan-create-destinations.md)将无线设备与规则相关联，该规则将处理要发送到其他服务的设备消息数据。该规则会在 适用于 LoRaWAN 的 AWS IoT Core 收到数据时立即开始处理设备数据。[适用于 LoRaWAN 的 AWS IoT Core 目标](lorawan-create-destinations.md)可由消息具有相同数据格式并将数据发送到同一服务的所有设备共享。

## AWS IoT 规则如何处理设备消息
<a name="how-rules-process-message"></a>

AWS IoT 规则处理设备消息数据的方式取决于将接收数据的服务、设备消息数据的格式以及该服务所需的数据格式。通常，该规则会调用 AWS Lambda 函数将设备的消息数据转换为服务所需的格式，然后将结果发送到服务。

以下示意图显示了在消息数据在从无线设备移动到AWS服务的过程中是如何确保安全以及如何处理的。

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


1. LoRaWAN 无线设备在传输二进制消息之前会使用 AES128 CTR 模式对其进行加密。

1.  适用于 LoRaWAN 的 AWS IoT Core 会对二进制消息进行解密，并将解密的二进制消息负载编码为 base64 字符串。

1. 生成的 base64 编码消息将作为二进制消息负载（未格式化为 JSON 文档的消息负载）发送到分配给设备的目标中所描述的 AWS IoT 规则。

1. AWS IoT 规则将消息数据定向到规则配置中描述的服务。

从无线设备接收的加密二进制负载不会被 适用于 LoRaWAN 的 AWS IoT Core 修改或解释。解密的二进制消息负载仅编码为 base64 字符串。要使服务访问二进制消息负载中的数据元素，必须通过规则调用的函数从负载中解析数据元素。base64 编码的消息负载是一个 ASCII 字符串，因此可以将其存储以便稍后进行解析。

## 为 LoRaWAN 设备创建规则
<a name="create-lorawan-rules"></a>

适用于 LoRaWAN 的 AWS IoT Core 使用 AWS IoT 规则来安全地将设备消息直接发送到其他 AWS 服务，而无需使用消息代理。通过从摄取路径中删除消息代理，可以降低成本并优化数据流。

适用于 LoRaWAN 的 AWS IoT Core 规则如要将设备消息发送到其他 AWS 服务，则需要 适用于 LoRaWAN 的 AWS IoT Core 目标，并要将 AWS IoT 规则分配给该目标。AWS IoT 规则必须包含 SQL 查询语句和至少一个规则操作。

通常，AWS IoT 规则查询语句由以下内容组成：
+ 一个 SQL SELECT 子句，用于从消息负载中选择数据并设置其格式
+ 标识要使用的消息的主题筛选条件（规则查询语句中的 FROM 对象）
+ 可选条件语句（SQL WHERE 子句），用于指定执行操作的条件

以下是规则查询语句示例：

```
SELECT temperature FROM iot/topic' WHERE temperature > 50
```

构建 AWS IoT 规则来处理来自 LoRaWAN 设备的负载时，则不必将 FROM 子句指定为规则查询对象的一部分。规则查询语句必须具有 SQL SELECT 子句，并且可以包含或不包含 WHERE 子句。如果查询语句使用 FROM 子句，该子句会被忽略。

以下是一个可以处理来自 LoRaWAN 设备的负载的规则查询语句示例：

```
SELECT WirelessDeviceId, WirelessMetadata.LoRaWAN.FPort as FPort,
       WirelessMetadata.LoRaWAN.DevEui as DevEui, 
       PayloadData
```

在此示例中，`PayloadData` 是由您的 LoRaWAN 设备发送的 base64 编码二进制负载。

下面是一个示例规则查询语句，它可以对传入的有效负载执行二进制解码，并将其转换为不同的格式，如 JSON：

```
SELECT WirelessDeviceId, WirelessMetadata.LoRaWAN.FPort as FPort,
       WirelessMetadata.LoRaWAN.DevEui as DevEui, 
       aws_lambda("arn:aws:lambda:<region>:<account>:function:<name>",                                       
                  {                                      
                   "PayloadData":PayloadData,                                       
                   "Fport": WirelessMetadata.LoRaWAN.FPort   
                  }) as decodingoutput
```

有关使用 SELECT AND WHERE 子句的更多信息，请参阅 [https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-reference.html](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-reference.html)。

有关 AWS IoT 规则以及如何创建和使用该规则的信息，请参阅 [https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html) 和 [https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules-tutorial.html](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules-tutorial.html)。

有关创建和使用 适用于 LoRaWAN 的 AWS IoT Core 目标的信息，请参阅 [将目标添加到 适用于 LoRaWAN 的 AWS IoT Core](lorawan-create-destinations.md)。

有关在规则中使用二进制消息负载的信息，请参阅 [https://docs.aws.amazon.com/iot/latest/developerguide/binary-payloads.html](https://docs.aws.amazon.com/iot/latest/developerguide/binary-payloads.html)。

有关用于在传输过程中保护消息负载的数据安全和加密技术的详细信息，请参阅 [AWS IoT Wireless 中的数据保护](data-protection.md)。

有关显示 IoT 规则二进制解码和实现示例的参考体系架构，请参阅 [GitHub 上的 适用于 LoRaWAN 的 AWS IoT Core 解决方案示例](https://github.com/aws-samples/aws-iot-core-lorawan/tree/main/transform_binary_payload)。