物联网平台组件1: 边缘网关自定义上传报文
【技术实现】
Net6通过Jint读取JS模板文件,并调用createMqttPayload方法,传入网关数据(JSON),得到平台报文(JSON)
【应用场景】
用户可以灵活配置边缘网关的报文格式到平台
【测试范例】
脚本名称:script1.js
输入Json:
{ "GateCode": "gw1", "Devices": [{ "DeviceCode": "JY355", "Tags": [{ "TagCode": "40105", "TagValue": "5" }, { "TagCode": "40106", "TagValue": "6" }] }, { "DeviceCode": "JY356", "Tags": [{ "TagCode": "40107", "TagValue": "7" }, { "TagCode": "40108", "TagValue": "8" }] }] }
输出Json:
{ "ts": "2024-08-30 14:23:22", "d": [{ "tag": "40105", "value": "5" }, { "tag": "40106", "value": "6" }, { "tag": "40107", "value": "7" }, { "tag": "40108", "value": "8" }] }
脚本名称:script2.js
输入Json:
{ "GateCode": "gw1", "Devices": [{ "DeviceCode": "JY355", "Tags": [{ "TagCode": "40105", "TagValue": "5" }, { "TagCode": "40106", "TagValue": "6" }] }, { "DeviceCode": "JY356", "Tags": [{ "TagCode": "40107", "TagValue": "7" }, { "TagCode": "40108", "TagValue": "8" }] }] }
输出Json:
{ "clientid": "gw1", "time": "2024-08-30 14:33:10", "JY355": [{ "tag": "40105", "value": "5" }, { "tag": "40106", "value": "6" }], "JY356": [{ "tag": "40107", "value": "7" }, { "tag": "40108", "value": "8" }] }
【代码实现】
Model.cs
namespace JsTemp2Json.Util { public class Gate { public string GateCode { get; set; } public List<Device> Devices { get; set; } } public class Device { public string DeviceCode { get; set; } public List<Tag> Tags { get; set; } } public class Tag { public string TagCode { get; set; } public string TagValue { get; set; } } }
Program.cs
using Jint; using JsTemp2Json.Util; using System.Text.Json; namespace JsTemp2Json { internal class Program { public static void Main(string[] args) { var engine = new Engine(); // 读取JavaScript文件内容 string scriptPath = "script2.js";// script1.js / script2.js string scriptContent = File.ReadAllText(scriptPath); engine.Execute(scriptContent); var Gate = new Gate() { GateCode = "gw1", Devices = new List<Device>() { new Device() { DeviceCode = "JY355", Tags = new List<Tag>() { new Tag() { TagCode = "40105", TagValue = "5"}, new Tag() { TagCode = "40106", TagValue = "6"} } }, new Device() { DeviceCode = "JY356", Tags = new List<Tag>() { new Tag() { TagCode = "40107", TagValue = "7"}, new Tag() { TagCode = "40108", TagValue = "8"} } }, } }; string dataJson = JsonSerializer.Serialize(Gate); var resultJson = engine.Invoke("createMqttPayload", dataJson).AsString(); Console.WriteLine($"{scriptPath}\r\n"); Console.WriteLine($"{dataJson}\r\n"); Console.WriteLine($"{resultJson}"); Console.ReadLine(); } } }
script1.js
// ============================================================================================================================= // ** 脚本名称:script1.js // ** 输入Json:{"GateCode":"gw1","Devices":[{"DeviceCode":"JY355","Tags":[{"TagCode":"40105","TagValue":"5"},{"TagCode":"40106","TagValue":"6"}]},{"DeviceCode":"JY356","Tags":[{"TagCode":"40107","TagValue":"7"},{"TagCode":"40108","TagValue":"8"}]}]} // ** 输出Json:{"ts":"2024-08-30 11:30:30","d":[{"tag":"40105","value":"5"},{"tag":"40106","value":"6"},{"tag":"40107","value":"7"},{"tag":"40108","value":"8"}]} // ============================================================================================================================= function createMqttPayload(dataJson) { let gate = JSON.parse(dataJson); let device = gate.Devices; let result = { "ts": formatDateTime(new Date()), "d": [] }; device.forEach(function (d) { let tag = d.Tags; tag.forEach(function (t) { let data = { "tag": t.TagCode, "value": t.TagValue }; result.d.push(data); }); }); return JSON.stringify(result); } function formatDateTime(date) { const year = date.getFullYear().toString().padStart(4, '0'); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hour = date.getHours().toString().padStart(2, '0'); const minute = date.getMinutes().toString().padStart(2, '0'); const second = date.getSeconds().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hour}:${minute}:${second}`; // 2023-02-18 21:49:05 }
script2.js
// ============================================================================================================================= // ** 脚本名称:script2.js // ** 输入Json:{"GateCode":"gw1","Devices":[{"DeviceCode":"JY355","Tags":[{"TagCode":"40105","TagValue":"5"},{"TagCode":"40106","TagValue":"6"}]},{"DeviceCode":"JY356","Tags":[{"TagCode":"40107","TagValue":"7"},{"TagCode":"40108","TagValue":"8"}]}]} // ** 输出Json:{"clientid":"gw1","time":"2024-08-30 11:34:35","JY355":[{"tag":"40105","value":"5"},{"tag":"40106","value":"6"}],"JY356":[{"tag":"40107","value":"7"},{"tag":"40108","value":"8"}]} // ============================================================================================================================= function createMqttPayload(dataJson) { let gate = JSON.parse(dataJson); let clientid = gate.GateCode; let device = gate.Devices; let result = { clientid: gate.GateCode, time: formatDateTime(new Date()), }; device.forEach(function (d) { let deviceCode = d.DeviceCode; let tag = d.Tags; if (!result[deviceCode]) { result[deviceCode] = []; } tag.forEach(function (t) { result[deviceCode].push({ tag: t.TagCode, value: t.TagValue }); }); }); return JSON.stringify(result); } function formatDateTime(date) { const year = date.getFullYear().toString().padStart(4, '0'); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hour = date.getHours().toString().padStart(2, '0'); const minute = date.getMinutes().toString().padStart(2, '0'); const second = date.getSeconds().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hour}:${minute}:${second}`; // 2023-02-18 21:49:05 }
qq:505645074
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律