使用Vorto中的自定义javascript转换解析非固定格式的二进制有效载荷

问题描述 投票:1回答:1

我们现在主要将Vorto用作规范化格式,并开始考虑使用映射引擎将不同的有效负载格式映射到Vorto模型。我或多或少了解如何使用xpath和转换函数从JSON或二进制有效负载映射功能块属性。但是,我不清楚如何使用此方法支持解析非固定格式的二进制有效负载。例如,我们有现成的LoRaWAN传感器,它以以下格式传输:<length><frame type>[<sensor-id><sensor-value>]其中length是帧的总长度和传感器ID(例如,温度,湿度,电池等)描述了如何解析传感器值(即长度,数据类型)。一帧中,这些读数可能会以随机顺序出现多个。

例如,可以使用一个小的javascript函数在loraserver.io中轻松进行此解析,该JavaScript函数会迭代所有字节,从而返回已解析的属性。同样的方法将在Ditto有效负载映射引擎afaik中起作用。但是,目前我看不到如何在Vorto映射中执行类似的操作。当然,这只是一个特定的传感器示例,但是市场上使用类似的动态有效载荷格式的示例更多。我知道已经有一个开放的问题(#1535)可以改进文档,但是了解使用映射DSL是否可以进行这种灵活的解析已经很有帮助。

我尝试将原始有效负载作为字节数组传递给javascript函数。为了测试这一点,我复制了org.eclipse.vorto.mapping.engine.converter.binary.BinaryMappingTest#testMappingBinaryContaining2DataPoints并修改了模型以使用这样的自定义javascript函数

    evaluator.addScriptFunction(new ScriptClassFunction("extractTemperature",
"function extractTemperature(value) { " +
        " print(\"parameter of type \" + typeof value + \", value = \" + value);" +
        " print(value[1]);" +
        "}"));

此功能的输出为

parameter of type number, value = 1
undefined

其中值1是所使用的字节数组的第一个元素。

因此该函数似乎未将参数作为bytarray接收。该模型配置了.withXPathStereotype("custom:extractTemperature(data)", "demo"),因此有效负载以BinaryData测试(testMappingBinaryContaining2DataPoints)的相同方式传递(作为.withXPathStereotype("custom:convert(vorto_conversion1:byteArrayToInt(data,0,0,0,2))", "demo"))。我现在看到的唯一区别是,在testMappingBinaryContaining2DataPoints测试中,byetarray参数传递给了Java函数而不是javascript函数。还是我错过了什么?

[此外,我注意到JavaScript代码中不允许使用forwhile之类的循环关键字。因此,即使我可以在javascript函数中访问bytearray参数,也暂时看不到如何对其进行迭代。

关于gitter,我收到了以下答复(连同将讨论移至SO的建议)

你是对的。我们将Javascript函数的用法限制为非常基本的语言关键字集(不包括for循环),因为可以在此处实现讨厌的内容。您可以做的是在自己的名称空间中向映射引擎注册一个Java函数。该函数可以保存一个字节数组。稍后,可以将此功能作为标准功能添加到映射引擎,以提取特定值以供其他开发人员重用。

但是,我认为这不是解决问题的方法。如上所述,这只是现成的传感器有效载荷格式的一个示例,我看不出如何将其概括为足以将其作为通用函数包含在映射引擎中。而且我认为不需要用Java来实现传感器特定的转换,因为(作为需要部署新传感器类型的IoT平台的最终用户),这比一点点javascript开发和部署更为复杂。可以在运行时在映射规范中更改的函数。我可以在javascript中进行简单的映射看到很多价值,就像可以在loraserver.ioEclipse Ditto中完成的一样。

我认为能够将字节数组传递给javascript是第一步。我也想知道允许javascript循环的确切风险是什么?例如,Ditto在javascript沙箱(see here)中也有一些限制,但是这允许循环,并且只能防止无限循环和递归。他们声明如下:

使用Rhino代替Java附带的更新JavaScript引擎Nashorn,具有可以更好地应用沙箱的好处。由于Ditto旨在作为云服务运行,因此需要对不同的有效负载脚本进行沙盒处理,在该服务中,将同时为不同的租户管理与不同端点的多个连接。这要求隔离每个脚本,以避免与其他脚本发生干扰,并保护执行该脚本的JVM免受有害代码执行的影响。

[在Vorto中使用Rhino是否也可以控制您看到的风险并允许在Vorto映射中进行循环构造?

PS:具有足够的声望值的人可以添加标签eclipse-vorto吗?

java rhino nashorn eclipse-vorto
1个回答
1
投票

我为您请求在Javascript转换器中支持此问题创建了一个问题:https://github.com/eclipse/vorto/issues/2029

如问题中所述,作为当前的解决方法,您可以使用Java注册自己的自定义转换器函数,并在整个映射中重用此函数。在这些Java转换器函数中,您具有Java语言的全部功能,可以转换以从任意列表中提取正确的属性。为了找出如何使用Java实现自己的自定义转换器函数,请在此处查看:https://github.com/eclipse/vorto/tree/master/mapping-engine#Advanced-Usage

© www.soinside.com 2019 - 2024. All rights reserved.