无线物联网Lambda解码器确定解码器类型的最佳方法是什么?

0

【以下的问题经过翻译处理】 嗨,我正在尝试找到一个最佳的设计模式,用于运行一个Lambda函数处理解码多个二进制负载类型,以确定在传入LoRa负载时使用哪个编码器。

基本的输入事件如下所示:

{
    "WirelessDeviceId": "<<REDACTED>>",
    "PayloadData": "BA==",
    "WirelessMetadata": {
      "LoRaWAN": {
        "ADR": true,
        "Bandwidth": 125,
        "ClassB": false,
        "CodeRate": "4/5",
        "DataRate": "3",
        "DevAddr": "01b9c3bb",
        "DevEui": "<<REDACTED>>",
        "FCnt": 312,
        "FOptLen": 0,
        "FPort": 4,
        "Frequency": "904500000",
        "Gateways": [
          {
            "GatewayEui": "<<REDACTED>>",
            "Rssi": -96,
            "Snr": 2.5
          }
        ],
        "MIC": "0110ac72",
        "MType": "UnconfirmedDataUp",
        "Major": "LoRaWANR1",
        "Modulation": "LORA",
        "PolarizationInversion": false,
        "SpreadingFactor": 7,
        "Timestamp": "2021-12-23T19:58:35Z"
      }
    }
  }

但是在这种情况下,对于我的Lambda解码器来说,它本身并不包含任何有用的信息,无法确定应使用哪个解码器。

在Lambda内部,我有一个Node.js脚本,其中包含一堆自定义解码器作为单独的模块,每个模块专门为特定的设备类型构建(按制造商和型号分类)。处理程序使用简单的if语句导入适当的模块,并通过该解码器运行有效负载。类似于以下方式:

const decodera = require('./lib/decodera');
const decoderb = require('./lib/decoderb');

exports.handler = async (event) => {

    // Call the correct transformer function
    if (event.DecoderType === 'a') {
        return decodera(event);

    } else if (event.DecoderType === 'b') {
        return decoderb(event);

    } else {
        console.log(`A transformer for ${event.DecoderType} was not found.`);
    }
    
};

最初,我为每个解码器都设置了一个单独的 Lambda,但这样会变得很复杂,因为您需要为每种新设备类型管理一大堆函数、规则和主题。所以我更倾向于只用一个,一旦事件发生,就让函数来决定正确的解码器。

至少我是这么想的。不过,这种方法似乎需要上述示例事件的一个丰富版本,其中包含使用哪个解码器的信息。因此,我正在尝试找出最佳处理方法。

1,我是否要将该信息存储在 Dynamo 中,然后先用 get_dynamodb()使用一个单独的规则(包含类似 "decoder_type "的内容),并将其添加到事件中,然后重新发布,aws_lambda() 规则会将其发送到解码器函数,在那里我将第二次重新发布到最终主题?

2、我是否至少可以将 get_dynamodb() 和 aws_lambda() 功能合并为一条规则?这里的问题是,我似乎仍然需要 Dynamo 存储某种键来告诉 Lambda 使用哪个解码器?

3、有没有更简单的方法?

profile picture
专家
已提问 5 个月前10 查看次数
1 回答
0

【以下的回答经过翻译处理】 嗨,

使用DynamoDB存储每个无线设备ID的解码器,并在Lambda中使用此DynamoDB表可能是可行的方法。特别是如果您需要在DynamoDB中存储任何其他每个设备的信息(例如某些元数据),那么这种方法是有意义的。您还可以在一个规则中使用get dynamod()和aws_lambda()。

但是,也有一种替代方法,可以消除需要DynamoDB表来存储每个WirelessDeviceId的解码器的需要:

  1. 为每种设备(即每个解码器)创建一个单独的Wireless Destination。例如,如果您有解码器A和B,则创建Wireless Destinations Dest_A和Dest_B。现在,如果您有类型为A的设备D1、D2和类型为B的设备D3、D4,您需要确保每个设备都分配了适当的无线目的地(即D1、D2的Dest_A和D3、D4的Dest_B)。
  2. 所有无线目的地都应指向相同的IoT规则。但是,在无线目的地的主题字段中(单击控制台中的“高级”下拉菜单),您需要指定解码器的名称(例如,对于解码器A,您指向IoT规则“ProcescLoRaWANUplink”并使用主题名称“A”)。
  3. 现在,在IoT规则中,您可以使用以下表达式:
select topic() as DecoderName, .... 

  1. 现在您的Lambda函数可以访问DecoderName。

这种方法将一部分复杂性移到管理单个LoRaWAN设备与正确的Wireless Destination之间的关系上。如果解码器名称是您希望每个设备额外存储的唯一信息,符合您用例的要求,那么这是有意义的。

如果对您有所帮助或

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则