hug*_*ugo 5 amazon-web-services aws-lambda aws-iot
我正在尝试让我的 IoT 设备启动 Lambda 函数。尝试了几个小时没有成功。
我的 lambda 函数很简单:
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify(event.message),
};
return response;
};
Run Code Online (Sandbox Code Playgroud)
我已经设置了 IoT 规则来触发 lambda 函数SELECT * FROM 'iot/trigger-lambda'。当我从 AWS IoT 的测试功能向主题发布消息时iot/trigger-lambda,lambda 函数会成功触发。但是,当我从设备发布消息时,出现以下错误:
{
"ruleName": "ruleTriggerLambda",
"topic": "iot/trigger-lambda",
"cloudwatchTraceId": "xxx-yyy-zzz",
"clientId": "ABC123",
"base64OriginalPayload": "eydvcGVyYGTpb24nOiAncHV0T2JqZWN0JywgJ2J1Y2tldCc6ICdyZWR3YXZlLWFwcC1kZXYnLCAna2V5JzogJ3JlYWNoYmFjay56aXAnLQWncmVwbHlUbyc6ICdpb3QvdGhyGHT0aWQtMDAwMS9wcmUtc2lnbmVkLBNzLXVybC1yBBNwb25zZXMnfSBbMV0=",
"failures": [
{
"failedAction": "LambdaAction",
"failedResource": "arn:aws:lambda:us-east-1:xxx:function:lambdaTriggerLambda",
"errorMessage": "Failed to invoke lambda function. Received Server error from Lambda. The error code is 400"
}
]
}
Run Code Online (Sandbox Code Playgroud)
当我将 lambda 函数添加到规则中时,AWS 表示它将创建更正权限。我还尝试更新 lambda 函数的权限。
对于如何解决这个问题,有任何的建议吗?非常感谢任何帮助/信息。
编辑:4小时后或扯掉我的头发
事实证明,这是我从物联网设备作为有效负载发送的数据的格式。让我解释一下,如果有人能告诉我这是为什么,我很想知道。
我使用 Mac 作为我的设备,并从 AWS IoT Python SDK实现了此代码。我的消息看起来像这样:
message = {"message": "test message"}
Run Code Online (Sandbox Code Playgroud)
看起来很简单的 json。
发布消息的代码如下所示:
mqtt_connection.publish(
topic=args.topic,
payload=args.message,
qos=mqtt.QoS.AT_LEAST_ONCE)
Run Code Online (Sandbox Code Playgroud)
AWS IoT Core 收到的有效负载如下所示:
{'message': 'test message'} [1]
Run Code Online (Sandbox Code Playgroud)
并且伴随着如下错误消息:我们无法将消息显示为 JSON,而是将其显示为 UTF-8 字符串。
我想我有点笨,因为没有连接这些点,但事实证明我必须对我的代码执行以下操作:
mqtt_connection.publish(
topic=args.topic,
payload=json.dumps(args.message).replace("\"", '').replace("[1]", '').replace("'", '"'),
qos=mqtt.QoS.AT_LEAST_ONCE)
Run Code Online (Sandbox Code Playgroud)
希望这个解释对将来的人有所帮助。
| 归档时间: |
|
| 查看次数: |
1053 次 |
| 最近记录: |