问题描述
我正在尝试让我的IoT设备启动Lambda功能。尝试了几个小时无济于事。
我的lambda函数很简单:
exports.handler = async (event) => {
// Todo implement
const response = {
statusCode: 200,body: JSON.stringify(event.message),};
return response;
};
我已经设置了IoT规则以通过SELECT * FROM 'iot/trigger-lambda'
触发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"
}
]
}
当我将lambda函数添加到规则中时,AWS表示它将创建更正权限。我还尝试过更新lambda函数的权限。
有关如何解决此问题的任何建议?任何帮助/信息都非常感谢。
编辑:4小时后或扯掉头发
原来是我从IoT设备作为有效负载发送的数据格式。让我解释一下,如果有人可以告诉我这是为什么,我很想知道。
我将Mac用作设备,并从AWS IoT Python SDK实现了this code。我的讯息如下:
message = {"message": "test message"}
似乎很简单的json。
发布消息的代码如下:
mqtt_connection.publish(
topic=args.topic,payload=args.message,qos=mqtt.QoS.AT_LEAST_ONCE)
AWS IoT Core上收到的有效负载如下:
{'message': 'test message'} [1]
并伴随着这样的错误消息:我们无法将消息显示为JSON,而是将其显示为UTF-8字符串。
我想我有点没连接点,但是事实证明我必须对我的代码执行以下操作:
mqtt_connection.publish(
topic=args.topic,payload=json.dumps(args.message).replace("\"",'').replace("[1]",'').replace("'",'"'),qos=mqtt.QoS.AT_LEAST_ONCE)
希望这种解释对将来的人有所帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)