无线物联网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
EXPERTE
gefragt vor 6 Monaten14 Aufrufe
1 Antwort
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
EXPERTE
beantwortet vor 6 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen