首页 > 其他分享 >硬件管理平台-硬件网关-插件模块-集成(下)

硬件管理平台-硬件网关-插件模块-集成(下)

时间:2023-09-02 18:23:31浏览次数:48  
标签:hardwareInfo 插件 调用 String 网关 硬件 实例

硬件管理平台-硬件网关-插件模块-集成(下)

简介

通过以上的几篇文章说明了xml的相关配置信息和配置项,我们可以对插件模块的剩余部分进行说明了。当网关服务加载了本地的硬件插件后就产生了硬件类型的实例,通过该实例就可以去调用下位机了。而去调用哪个下位机,我们就需要通过xml的配置信息去指定,例如我们要调用IP为192.168.1.52的门禁,测试它的登录功能,HardwareInfo.xml中就需要有该门禁的相关信息,包含了ip地址,用户名,密码以及端口号,还有相关的对外暴露的功能。当初始化了门禁类的实例后,再加上xml中特定的信息就可以对特定门禁的特定功能进行调用,这样的好处是可以动态的进行插拔更新,也可以很好的将硬件与网关解耦。

正文

完成RefreshHardware方法后,开始为读取HardwareInfo.xml做准备:

  1. HardwareServices中申明HardwareOptXml 类并进行实例化:

    private HardwareOptXml xmlClient = new HardwareOptXml();
    

    在RefresHardware下放增加一个OnStartByXml方法,该方法的功能是将HardwareInfo.xml文件的硬件信息进行读取并存放到HardwareXmlEntity列表中,然后通过获取TimeingFuninitializationFun的变了来分别完成各自的业务需求,其中InitializationFun为将该设备初始化,而TimeingFun功能涉及到了任务调度部分,因此本章不涉及,会在后续进行详细说明。

    public void OnStartByXml()
    {
    	// 重新打开一次HardwareInfo文件-意味着刷新硬件实例列表
        xmlClient.RefreshXml();
        // 获取硬件实例
        List<HardwareXmlEntity> hardwareDics = xmlClient.GetHardwareInfos();
        // 调用插件类的开始方法,将硬件实例放置到该方法中进行相关的开始工作
        Task.Factory.StartNew(async () =>
                              {
                                  await pluginManager.OnStartAsync(hardwareDics);
                              });
    }
    

    插件模块的OnStart方法部分主要描述的是硬件实例的初始化和调用部分

    public async Task OnStartAsync(List<HardwareXmlEntity> hardwareDics)
    {
        if (hardwareDics.Count > 0)
        {
            // 将反射的硬件类型实例与硬件实例合并,转换为以key为型号,value为设备实例的字典,便于后面使用
            Dictionary<String, List<HardwareXmlEntity>> dic = new Dictionary<string, List<HardwareXmlEntity>>();
            hardwareDics.ForEach(item => {
                String sbxh = item.Param["设备型号"];
                if (hardwareDic.ContainsKey(sbxh))
                {
                    // 判断是否存在该类型,如果不存在就创建一个
                    if (!dic.ContainsKey(sbxh))
                    {
                        dic.Add(sbxh, new List<HardwareXmlEntity>());
                    }
                    dic[sbxh].Add(item);
                }
            });
            foreach (var key in dic)
            {
                // 进行初始化方法操作,后期会将回调一个调度实例,然后继续调度任务的操作
                await Initialization(key.Value, hardwareDic[key.Key], key.Key);
                // 该处将增加调用任务的相关代码
            }
        }
    }
    

    Initialization方法为调用硬件类型的初始化实例

    public async Task<bool> Initialization(List<HardwareXmlEntity> item, HardwareAbstract @abstract, String sbxh)
    {
        // 设置一个初始化实例
        InitHardwareEntity iInitClass = new InitHardwareEntity(item, @abstract, sbxh);
        bool v = await Task<bool>.Factory.StartNew(init =>
        {
            // 获得到,之前怕传入的方法多,该实例会变
            InitHardwareEntity initClass = (InitHardwareEntity)init;
            initClass.item.ForEach(t =>
            {
                try
                {
                    // 如果存在InitializationFun功能模块
                    if (null != t.InitializationFun)
                    {
                        t.InitializationFun.ForEach(fun =>
                        {
                            try
                            {
                                // 调用InitializationFun中存储的功能模块
                                AjaxResult result = initClass.@abstract.Execute(fun, t.ParamJson, "");
                            }
                            catch (Exception ex)
                            {
    
                            }
                        });
                    }
                }
                catch (Exception ex)
                {
                    _logerror.Error("hardwareDics.ForEach错误", ex);
                }
            });
            return true;
        }, iInitClass);
        return v;
    }
    
  2. 创建GetFunction方法,该方法的主要作用是调用硬件的OperationFun部分的功能码,为硬件网关主动调用下位机的操作。

    之前的设计为全是异步操作,硬件网关获取数据后通过上位机暴露的方法再进行传输,这样可完成上位机到硬件网关的异步操作。

    在HardwareService中增加存储硬件实例的声明

    readonly Dictionary<string, HardwareXmlEntity> hardwareXmlEntities = new Dictionary<string, HardwareXmlEntity>();
    

    增加OperationFun调用的方法

    public AjaxResult GetFunction(String function, String hardwareInfo, String param)
    {
        String deviceId = "";
        // 如果硬件实例为空,则刷新获得
        if (hardwareXmlEntities.Count == 0)
        {
            RefreshHardwareDics();
        }
        // 没有未找到该主键,则尝试获取
        if (!String.IsNullOrEmpty(hardwareInfo) && hardwareXmlEntities.ContainsKey(hardwareInfo))
        {
            deviceId = hardwareInfo;
            hardwareInfo = JSONUtils.SerializeObject(hardwareXmlEntities[hardwareInfo].Param);
        }
        //根据描述获得
        Function fun = AssemblyUtil.GetEnumByDescription<Function>(function);
        if (fun == 0)
        {
            fun = AssemblyControl.GetEnumByName<Function>(function);
        }           
        try
        {
            // 调用方法
            return pluginManager.Function(fun, hardwareInfo, param);
        }
        catch (Exception ex)
        {
            String msg = $"GetFunction function:{function} hardwareInfo:{hardwareInfo} param:{param}";
            _logerror.Error(msg, ex);
            return AjaxResult.error("报错", ex.Message);
        }
    }
    

结尾

本文章主要介绍了上次集成时遗留下来的尾巴,主要涵盖了如何将反射的硬件类实例与xml中存储的硬件实例进行处理,并进行初始化以及等待上位机调用所开放的接口,接下来我们将开始系统调度的说明。

标签:hardwareInfo,插件,调用,String,网关,硬件,实例
From: https://www.cnblogs.com/wanghun315/p/17674006.html

相关文章

  • 其他主机硬件对象的状态告警:H3C R4900 G3
    故障告警:其他主机硬件对象的状态。监控,硬件运行状况,警示和警告显示两条:ConnectivitySwitch36LAN_4_Link0和ConnectivitySwitch36LAN_3_Link0,但是登陆H3CR4900G3,进去HDM,却无任何告警。这是因为板载的网卡,3和4号口没接网线导致。(其实接满网线也可行,但不是最终解决办法......
  • 微服务网关-Spring Cloud Gateway
    为什么需要服务网关:1、什么是服务网关:微服务架构中将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。那有了网关之后,能够起到怎样的改善呢?网关作为系统的唯一流量入口,封装内......
  • Flink 1.17教程:WebUI提交作业及打jar包maven插件配置
    打jar包maven插件配置<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version>......
  • 24 路由器,交换机,IP,DNS,子网掩码,网关
    昨天有同志遇到了电脑连接问题,他是在一个大型局域网中,他们的网络交换机没打开自动分配IP的功能,所以IP地址都是手动配置,期间遇到了子网掩码,IP地址,网关,DNS服务器等概念,逐一记录,希望能让所有人看懂。一、交换机主要功能为端口拓展,让你有更多网络端口,扩大局域网接入点。。工作在TCPI......
  • PyCharm — Gitee 插件
    本文:在本地电脑安装Git,在线注册Gitee,给PyCharm配置Gitee的使用。Git客户端安装(Windows)⽹址:https://git-scm.com/downloads下载完.exe,双击安装。一路”next“,默认选项。不建议修改安装⽬录位置。查看是否安装成功。cmd打开终端。输⼊  git--version  看到版本......
  • 金蝶云星空-插件调试 (本地开发,集成环境)
    金蝶云星空-插件调试(本地开发,集成环境)  调试在本地的情况下,可以先重新生成解决方案——> 调试附加到进程---->w3wp.exe(多个都选中,保险)--------->进行调试。如果还是有问题可以重启iis 重新来过。 本地环境,也就是集成环境,路径一般是默认在C盘下,非协同环境的工作空间。......
  • KubeSphere 社区双周报 | KubeKey 新增网络插件 Hybridnet | 2023.08.18-08.31
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.08.18-2023.08.31。贡献者名单新晋KubeSphereCon......
  • idea插件easycode
    作为Java开发者,我们经常需要编写大量的重复性代码,例如实体类的属性、Getter和Setter方法、数据库操作代码等。这些繁琐的工作占用了我们宝贵的时间和精力,影响了开发效率。幸运的是,有一款强大的IDEA插件,名为EasyCode,可以帮助我们自动生成这些重复代码,极大地提升开发效率。在......
  • 5G工业网关常见应用场景介绍
    5G工业网关是指基于5G网络技术的工业物联网网关设备,用于连接和管理工业设备和各个物联网子系统。它可以实现数据采集、远程监控、远程控制和数据传输等功能,广泛应用于工业自动化、智能制造、智能交通等领域。以下是一些5G工业网关的应用场景:  1、工业自动化:5G工业网关可以与......
  • 视频云存储/安防监控/AI视频智能分析网关V3:工服检测功能详解
    在一些工地、后厨、化工、电力等特定的场景中,工服的穿戴是必不可少的。这不仅是安全制度的要求,更能降低工作风险、提高工作效率。TSINGSEE青犀AI边缘计算网关硬件——智能分析网关可以通过实时监测和识别工人的工装穿戴情况,确保他们符合安全要求。只需在施工场地等监控区域内对......