使用 Vorto 中的自定義 JavaScript 轉(zhuǎn)換解析非固定格式的二進制有效負載
我們現(xiàn)在主要使用 Vorto 作為標(biāo)準(zhǔn)化格式,并開始研究使用映射引擎將不同的有效負載格式映射到 Vorto 模型。我或多或少了解如何使用 xpath 和轉(zhuǎn)換函數(shù)從 JSON 或二進制有效負載映射功能塊屬性。但是,我不清楚如何支持使用此方法解析非固定格式二進制有效負載。例如,我們有一個現(xiàn)成的 LoRaWAN 傳感器,它以以下格式傳輸: <length><frame type>[<sensor-id><sensor-value>]其中長度是總幀長度,傳感器 ID(例如溫度、濕度、電池……)描述了如何解析傳感器值(即長度、數(shù)據(jù)類型)。在一幀中,這些讀數(shù)的多個可以以隨機順序出現(xiàn)。解析這個可以很容易地在 loraserver.io 中使用一個小的 javascript 函數(shù)來完成,該函數(shù)迭代所有字節(jié)并返回解析的屬性。同樣的方式也適用于 Ditto 有效負載映射引擎 afaik。但是,目前我不知道如何在 Vorto 映射中執(zhí)行類似的操作。當(dāng)然,這只是一個特定的傳感器示例,但市場上存在更多使用類似動態(tài)有效負載格式的示例。我知道已經(jīng)有一個待解決的問題 (#1535) 來改進文檔,但如果知道使用映射 DSL 是否可以實現(xiàn)這種靈活的解析,將會很有幫助。我嘗試將原始有效負載作為字節(jié)數(shù)組傳遞給 javascript 函數(shù)。為了測試這一點,我復(fù)制org.eclipse.vorto.mapping.engine.converter.binary.BinaryMappingTest#testMappingBinaryContaining2DataPoints并調(diào)整模型以使用像這樣的自定義 JavaScript 函數(shù) evaluator.addScriptFunction(new ScriptClassFunction("extractTemperature","function extractTemperature(value) { " + " print(\"parameter of type \" + typeof value + \", value = \" + value);" + " print(value[1]);" + "}"));該函數(shù)的輸出是parameter of type number, value = 1undefined其中值 1 是使用的字節(jié)數(shù)組的第一個元素。另外,我注意到JavaScript 代碼中不允許使用像for和這樣的循環(huán)關(guān)鍵字。while因此,即使我可以訪問 javascript 函數(shù)中的 bytearray 參數(shù),我現(xiàn)在也看不到如何迭代它。在 gitter 上,我收到了以下回復(fù)(以及將討論移至 SO 的建議)你是對的。我們將 Javascript 函數(shù)的使用限制為非?;镜恼Z言關(guān)鍵字集,不包括 for 循環(huán),因為可以在那里實現(xiàn)令人討厭的東西。相反,您可以做的是將您自己的命名空間中的 java 函數(shù)注冊到映射引擎。該函數(shù)可以保存一個字節(jié)數(shù)組。稍后這個函數(shù)可以作為標(biāo)準(zhǔn)函數(shù)貢獻給地圖引擎,以提取出一定的值供其他開發(fā)人員重用。但我不認為這能解決問題。如上所述,這只是現(xiàn)成傳感器有效負載格式的一個示例,我不知道如何將其概括為足夠大以將其作為通用函數(shù)包含在映射引擎中。而且我認為不需要在 Java 中實現(xiàn)特定于傳感器的轉(zhuǎn)換,因為(作為想要部署新傳感器類型的物聯(lián)網(wǎng)平臺的最終用戶)這比一點 javascript 的開發(fā)和部署更復(fù)雜可以在運行時在映射規(guī)范中更改的函數(shù)。我看到能夠在 javascript 中進行簡單映射有很多價值,就像在loraserver.io和Eclipse Ditto中可以完成的那樣。我認為能夠?qū)⒆止?jié)數(shù)組傳遞給 JavaScript 是第一步。我還想知道在 javascript 中允許循環(huán)的風(fēng)險到底在哪里?例如,Ditto 在 javascript 沙箱中也有一些限制(請參閱此處),但這允許循環(huán),并且只能防止無限循環(huán)和遞歸。他們聲明如下:使用 Rhino 代替 Nashorn(Java 附帶的較新 JavaScript 引擎)的好處是可以更好地應(yīng)用沙箱。需要對不同的有效負載腳本進行沙箱處理,因為 Ditto 旨在作為云服務(wù)運行,同時為不同的租戶管理到不同端點的多個連接。這就需要隔離每個單獨的腳本,以避免與其他腳本的干擾,并保護執(zhí)行腳本的 JVM 免受有害代碼的執(zhí)行。在 Vorto 中使用 Rhino 是否也可以控制您看到的風(fēng)險并允許在 Vorto 映射中構(gòu)建循環(huán)?
查看完整描述