物联网平台组件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

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (