繁体   English   中英

Lambda 事件缺失数据的 AWS IoT Core

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM