[英]Handling nested JSON messages with AWS IoT Core rules and AWS Lambda
[英]AWS IoT Core for Lambda event missing data
我有一个 TEKTELIC 智能房间传感器连接到 Lambda 的 AWS IoT Core。目的地发布到一个主题。 在 MQTT 测试客户端中,我收到一条格式正确的消息:
{
"WirelessDeviceId": "24e8d6e2-88c8-4057-a60f-66c5f3ef354e",
"PayloadData": "A2cA4ARoaAD/ASw=",
"WirelessMetadata": {
"LoRaWAN": {
"ADR": true,
"Bandwidth": 125,
"ClassB": false,
"CodeRate": "4/5",
"DataRate": "3",
"DevAddr": "019e3fcb",
"DevEui": "647fda00000089e2",
"FCnt": 4676,
"FOptLen": 0,
"FPort": 10,
"Frequency": "904700000",
"Gateways": [
{
"GatewayEui": "647fdafffe014abc",
"Rssi": -92,
"Snr": 5.800000190734863
},
{
"GatewayEui": "0080000000024245",
"Rssi": -93,
"Snr": 7.25
},
{
"GatewayEui": "24e124fffef464da",
"Rssi": -86,
"Snr": 4.25
}
],
"MIC": "eb050f05",
"MType": "UnconfirmedDataUp",
"Major": "LoRaWANR1",
"Modulation": "LORA",
"PolarizationInversion": false,
"SpreadingFactor": 7,
"Timestamp": "2022-12-07T21:46:13Z"
}
}
}
当我使用 lambda 订阅主题时:
Rule query statement: SELECT *, topic() AS topic FROM 'lora/#'
我缺少大部分数据:
{
"Gateways": {
"Timestamp": "2022-12-07T21:46:13Z",
"SpreadingFactor": 7,
"PolarizationInversion": false,
"Modulation": "LORA",
"Major": "LoRaWANR1",
"MType": "UnconfirmedDataUp",
"MIC": "eb050f05",
"Snr": 4.25,
"Rssi": -86,
"GatewayEui": "24e124fffef464da"
},
"Snr": 7.25,
"Rssi": -93,
"GatewayEui": "0080000000024245",
"topic": "lora/tektelic/smart_room"
}
相关代码是:
def handler(event, context):
print(json.dumps(event))
该事件看起来像大约一半的数据,格式错误且顺序相反。 原始事件中有一个Gateways [ ]
,它现在是一个 object,其中包含原始数组中的一些数据,以及数组外的其他数据。
发送消息的设备信息以及我要处理的有效负载丢失。
我遵循此解决方案构造模式,唯一的修改是 lambda 代码和 select 语句。
我尝试将 memory 从默认的 128M 增加到 1024M,没有任何变化。
我还将原始消息存储在 AWS S-3 中,遵循此构造模式,它与 MQTT 数据匹配。 我在其中对 select 语句进行了类似的更改。
关于在哪里寻找问题的想法?
最近的见解是 select 声明:
iot_topic_rule_props=iot.CfnTopicRuleProps(
topic_rule_payload=iot.CfnTopicRule.TopicRulePayloadProperty(rule_disabled=False, description="Processing of DTC messages from Lora Sensors.", sql="SELECT topic() AS topic, * FROM 'lora/#'", actions=[])),
将 sql 替换为:
sql="SELECT * FROM 'lora/#'",
生成一个格式良好的事件。
将其替换为:
sql="SELECT topic() AS topic, * FROM 'lora/#'",
生成相同格式错误的事件,除了topic
是第一个标签而不是最后一个。 我打算让这个问题保持开放,以回答发生了什么,因为它感觉像是一个错误。 如果它只是对 sql 不满意,这应该会产生一个错误。
使其工作的关键是包含 aws_iot_sql_version:
sql="SELECT *, topic() AS topic FROM 'lora/#'",
aws_iot_sql_version="2016-03-23",
根据文档,默认值为“2015-10-08”,但控制台使用“2016-03-23”。 我没有进行研究以查看详细信息。
我不认为你想用 lambda 订阅主题? lambda 是一段短暂的代码......你看过 Iot Rules 了吗
您可以使用 sql 语句进行订阅,然后触发 lambda 对其进行处理。
https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.