为您的目标创建 IAM 角色和 IoT 规则
AWS IoT 规则将设备消息发送到其他服务。AWS IoT 规则还可以处理从 Sidewalk 终端设备接收的二进制消息,以供其他服务使用。适用于 Amazon Sidewalk 的 AWS IoT Core 目标将无线设备与处理设备的消息数据以发送到其他服务的规则相关联。在适用于 Amazon Sidewalk 的 AWS IoT Core 收到设备的数据后,该规则会立即对其进行处理。对于将数据发送到同一服务的所有设备,您可以创建一个可供所有设备共享的目标。您还必须创建一个 IAM 角色来授予向规则发送数据的权限。
为目标创建 IAM 角色
创建一个 IAM 角色来授予适用于 Amazon Sidewalk 的 AWS IoT Core 向 AWS IoT 规则发送数据的权限。要创建角色,请使用 CreateRole
API 操作或 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-documentfile://trust-policy.json
下面显示的是 JSON 文件的内容。
trust-policy.json 的内容
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
为目标创建规则
使用 AWS IoT Core API 操作 CreateTopicRule
或 AWS CLI 命令 create-topic-rule
来创建规则。您的目标将使用主题规则将从 Sidewalk 终端设备接收到的数据路由到其他 AWS 服务。例如,您可以创建向 Lambda 函数发送消息的规则操作。您可以定义 Lambda 函数,使其从您的设备接收应用程序数据,并使用 base64 对有效负载数据进行解码,以便其他应用程序可以使用这些数据。
以下步骤显示了如何创建 Lambda 函数,以及如何创建向该函数发送消息的主题规则。
-
创建执行角色和策略
创建一个 IAM 角色,向您的函数授予访问 AWS 资源的权限。您还可以使用 JSON 文件为角色定义信任策略。
aws iam create-role --role-name
lambda-ex
\ --assume-role-policy-documentfile://lambda-trust-policy.json
下面显示的是 JSON 文件的内容。
lambda-trust-policy.json 的内容
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
创建并测试 Lambda 函数
执行以下步骤以创建 base64 对有效负载数据进行解码的 AWS Lambda 函数。
-
编写用于解码有效负载数据的代码。例如,您可以使用以下示例 Python 代码。为脚本指定一个名称,例如
。base64_decode.py
base64_decode.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))
-
将部署包创建为包含 Python 文件的 zip 文件,并将其命名为
。使用base64_decode.zip
CreateFunction
API 或create-function
CLI 命令为示例代码创建 Lambda 函数
。base64_decode.py
-
aws lambda create-function --function-name
my-function
\ --zip-filefileb://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", ... } -
要从命令行获取调用的日志,请将
--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 结合使用。
-
-
创建主题规则
使用
CreateTopicRule
API 或create-topic-rule
CLI 命令创建向此 Lambda 函数发送消息的主题规则。您还可以添加第二个规则操作,以重新发布到 AWS IoT 主题。将此主题规则命名为
。Sidewalkrule
aws iot create-topic-rule --rule-name
Sidewalkrule
\ --topic-rule-payloadfile://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"
} } ], }