物联网平台组件1: 边缘网关自定义上传报文

2024-08-31 07:36

本文主要是介绍物联网平台组件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.jsstring 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  
}

这篇关于物联网平台组件1: 边缘网关自定义上传报文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123286

相关文章

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到