首页 > 其他分享 >硬件管理平台-硬件网关-XML操作

硬件管理平台-硬件网关-XML操作

时间:2023-08-16 09:02:40浏览次数:31  
标签:XML node 网关 return xml 标签 功能 硬件

硬件管理平台-硬件网关-XML操作

简介

本周主要接上一章,将与硬件交互的部分进行说明。

创建交互类

在上一篇我们将相关的辅助类进行了编写,本文主要介绍的是xml与硬件的交互有哪些,他们的作用是什么及相关代码。

按照我们约定的HardwareInfo.xml可知,我们需要对xml进行增删改查操作,并通过相关的查询信息来获取硬件标签(HardwareInfo标签)。

下面为相关操作代码,每个方法上我都加上了注释。

/// <summary>
/// 硬件与xml交互的操作类,主要用于操作xml来转换为硬件的类(HardwareXmlEntity)
/// </summary>
public class HardwareOptXml
{
    private readonly XmlHelper _xmlHelper;
    private const string _hardwareXmlFile = "HardwareInfo.xml";
    /// <summary>
    /// 初始化时实例化XmlHelper类
    /// 将默认操作的xml当作参数传递给XmlHelper类
    /// </summary>
    public HardwareOptXml()
    {
        _xmlHelper = new XmlHelper(_hardwareXmlFile);
    }
    /// <summary>
    /// 根据硬件主键删除硬件信息
    /// </summary>
    /// <param name="key">硬件主键</param>
    /// <returns>删除成功则返回true;否则返回false</returns>
    public bool RemoveHardwareInfo(string key)
    {
        //找到设备主键属性等于key的Node
        XmlNode xmlNode = _xmlHelper.GetNode(@"HardwareInfos/HardwareInfo[@设备主键='" + key + "']");
        if (xmlNode != null)
        {
            // 删除该Node
            _xmlHelper.RemoveNode(@"HardwareInfos/HardwareInfo[@设备主键='" + key + "']");
            return true;
        }
        return false;
    }
    /// <summary>
    /// 获得HardwareInfos标签并在该标签中添加HardwareInfo标签及硬件的相关属性值
    /// HardwareInfo标签中添加的内容为属性是HardwareInfo类(或者他的重载类)的变量名称及变量值
    /// HardwareInfo标签中的子标签分别保存了初始化功能,定时功能和操作功能,每个类型的功能独立标签存储
    /// 注意:HardwareInfos标签在调用本方法之前必须是存在的,否则将无法添加
    /// </summary>
    /// <param name="hardwareDic">xml和硬件的操作类</param>
    public void AddHardwareInfo(HardwareXmlEntity hardwareDic)
    {
        XmlNode xmlNode = _xmlHelper.GetNode(@"HardwareInfos");
        // 判断如果存在则直接删除
        RemoveHardwareInfo(hardwareDic.PrimaryKey);
        // 创建一个新的HardwareInfo标签
        XmlElement hardwareInfo = _xmlHelper.CreateElement("HardwareInfo");
        // 如果有属性变量则新增,如果没有则跳出 
        if (hardwareDic.Param != null && hardwareDic.Param.Count > 0)
        {
            // 遍历属性值
            foreach (string key in hardwareDic.Param.Keys)
            {
                // 添加属性及属性值,例如设备主键、设备类型等
                hardwareInfo.SetAttribute(key, hardwareDic.Param[key]);
            }
            // 判断功能是否存在,如果存在则创建“操作标签”,然后将操作功能的描述保存到xml中
            // 这里使用描述可以通过查看xml来知道相关的操作功能,如果使用编码,还需要看对应的意思,太麻烦了
            if (hardwareDic.OperationFun != null && hardwareDic.OperationFun.Count > 0)
            {
                // 创建新的标签:操作功能
                XmlElement operationNode = _xmlHelper.CreateElement("操作功能");
                // 向”操作功能“标签添加功能的描述项
                operationNode.InnerText = AssemblyUtil.GetDescriptionByEnumLis(hardwareDic.OperationFun);
                hardwareInfo.AppendChild(operationNode);
            }
            // 添加初始化功能,例如与操作功能一致,唯一的区别是操作功能是点击或者调用的,而初始化则是需要立马加载的
            if (hardwareDic.InitializationFun != null && hardwareDic.InitializationFun.Count > 0)
            {
                XmlElement initNode = _xmlHelper.CreateElement("初始化");
                initNode.InnerText = AssemblyUtil.GetDescriptionByEnumLis(hardwareDic.InitializationFun);
                hardwareInfo.AppendChild(initNode);
            }
            // 添加定时功能的标签,该功能后期会进行描述,这里的标签还有子标签,原因是每个定时任务都应该有独立的标签
            if (hardwareDic.SettingsFun != null && hardwareDic.SettingsFun.Count > 0)
            {
                XmlElement timingNode = _xmlHelper.CreateElement("定时功能");
                hardwareDic.SettingsFun.ForEach(setting => {
                    timingNode.AppendChild(GetSettingNode(setting));
                });
                hardwareInfo.AppendChild(timingNode);
            }
            xmlNode.AppendChild(hardwareInfo);
            _xmlHelper.Save();
        }
    }
    /// <summary>
    /// 定时任务的子标签,用于表示某个功能对应的Cron
    /// </summary>
    /// <param name="setting"></param>
    /// <returns></returns>
    private XmlNode GetSettingNode(FunctionSetting setting)
    {
        XmlElement hardwareInfo = _xmlHelper.CreateElement("FunctionSetting");
        hardwareInfo.SetAttribute("RunFunction", AssemblyUtil.GetDescriptionByEnum<Function>(setting.RunFunction));
        return hardwareInfo;
    }

    /// <summary>
    /// 根据节点属性获得数值
    /// </summary>
    /// <param name="node"></param>
    /// <param name="key"></param>
    /// <param name="defaultStr"></param>
    /// <returns></returns>
    private String GetAttribute(XmlNode node, String key, String defaultStr = "")
    {
        if (node.Attributes.Count > 0)
        {
            if (node.Attributes[key] != null)
            {
                return node.Attributes[key].Value;
            }
        }
        return defaultStr;
    }
    /// <summary>
    /// 根据主键获取硬件类,没有则返回null
    /// </summary>
    /// <param name="key">硬件主键</param>
    /// <returns></returns>
    public HardwareXmlEntity GetHardwareDic(String key)
    {
        XmlNode xmlNode = _xmlHelper.GetNode(@"HardwareInfos/HardwareInfo[@设备主键='" + key + "']");
        if (xmlNode != null)
        {
            // 将node转换为硬件与xml的操作类
            return GetHardwareInfo(xmlNode);
        }
        return null;
    }
    /// <summary>
    /// 获取所有硬件信息
    /// </summary>
    /// <returns>硬件与xml的操作类的数组</returns>
    public List<HardwareXmlEntity> GetHardwareInfos()
    {
        List<HardwareXmlEntity> hardwares = new List<HardwareXmlEntity>();
        XmlNode rootNode = _xmlHelper.GetNode(@"HardwareInfos");
        if (rootNode != null)
        {
            XmlNodeList hardwareList = rootNode.ChildNodes;
            foreach (XmlNode node in hardwareList)
            {
                hardwares.Add(GetHardwareInfo(node));
            }
            return hardwares;
        }
        return new List<HardwareXmlEntity>();
    }
    /// <summary>
    /// 只获取该Node的属性部分信息
    /// </summary>
    /// <param name="node"></param>
    /// <returns></returns>
    private Dictionary<string, string> GetParam(XmlNode node)
    {
        Dictionary<string, string> valuePairs = new Dictionary<string, string>();
        //遍历属性名称与属性值
        foreach (XmlAttribute attribute in node.Attributes)
        {
            valuePairs.Add(attribute.Name, attribute.Value);
        }
        return valuePairs;
    }
    /// <summary>
    /// 根据内嵌的值获得功能列表
    /// 也就是将功能的描述变为功能的enum
    /// </summary>
    /// <param name="node">功能标签,例如操作功能</param>
    /// <returns>功能实例的list</returns>
    private List<Function> GetParamByFunction(XmlNode node)
    {
        if (node == null)
        {
            return new List<Function>();
        }
        string[] strFun = node.InnerText.Split(',');
        return AssemblyUtil.GetEnumByDescriptions(strFun);
    }

    /// <summary>
    /// 说白了就是把当前的xml关闭然后重新读取
    /// </summary>
    public void RefreshXml()
    {
        _xmlHelper.RefreshXml();
    }
    /// <summary>
    /// 根据定时功能标签的node遍历获取定时任务,并返回
    /// </summary>
    /// <param name="nodes"></param>
    /// <param name="settingList"></param>
    /// <returns></returns>
    private List<FunctionSetting> GetParamBySetting(XmlNodeList nodes, ref List<string> settingList)
    {
        List<FunctionSetting> settings = new List<FunctionSetting>();
        foreach (XmlNode node in nodes)
        {
            settings.Add(GetSettionFunction(node, ref settingList));
        }
        return settings;

    }
    /// <summary>
    /// 获取定时任务的相关功能的迭代方法
    /// </summary>
    /// <param name="node"></param>
    /// <param name="settingList"></param>
    /// <returns></returns>
    private FunctionSetting GetSettionFunction(XmlNode node, ref List<string> settingList)
    {
        FunctionSetting setting = new FunctionSetting();
        if (node.Attributes["RunFunction"] != null && !string.IsNullOrEmpty(node.Attributes["RunFunction"].Value))
        {
            settingList.Add(node.Attributes["RunFunction"].Value);
            setting.FunctionStr = node.Attributes["RunFunction"].Value;
            setting.RunFunction = AssemblyUtil.GetEnumByDescription<Function>(node.Attributes["RunFunction"].Value);
        }
        return setting;
    }
    /// <summary>
    /// 将单个node转换为HardwareXmlEntity(xml和硬件的entity)
    /// </summary>
    /// <param name="node"></param>
    /// <returns></returns>
    private HardwareXmlEntity GetHardwareInfo(XmlNode node)
    {
        HardwareXmlEntity info = new HardwareXmlEntity
        {
            // 先获得属性信息
            Param = GetParam(node),
            // 操作功能部分
            OperationFun = GetParamByFunction(node["操作功能"])
        };
        if (info.OperationFun.Count > 0)
        {
            // 操作的功能说明
            info.OperationTxt = node["操作功能"].InnerText;
        }
        // 初始化的赋值
        info.InitializationFun = GetParamByFunction(node["初始化"]);
        if (info.InitializationFun.Count > 0)
        {
            // 初始化的功能说明
            info.InitializationTxt = node["初始化"].InnerText;
        }
        List<string> settingList = new List<string>();
        if (node["定时功能"] != null && node["定时功能"].ChildNodes != null)
        {
            // 定时功能
            info.SettingsFun = GetParamBySetting(node["定时功能"].ChildNodes, ref settingList);
            // 功能说明
            info.SettingsTxt = string.Join(",", settingList);
        }
        return info;
    }
}

交互类说明

该类的作用是在Xml帮助类和硬件中间包了一层,当硬件业务需要调用xml时,可通过在交互类中找到相关方法,如果没有可以继续添加,这样的好处是使得操作xml类只有一种方式,不需要到处编写方法。按照Mvc三层原则(虽然这个没有),每层之间建议只有一个口区输入输出,不然多个类来回使用,指不定哪天就发现自己都忘记这个类的作用和为什么要分这么多类去调用了。

四种标签的说明

HardwareInfo的属性标签

该标签主要存储的是HardwareInfo类的属性信息,例如设备主键,设备类型,设备编号,ip地址,端口号等等,HardwareInfo类为基类,硬件项目可通过该类来集成并添加新的属性值,就像门禁中添加了用户名和密码属性,此时该标签中也会保存用户名和密码的属性信息及相关数值。

操作功能

操作功能标签内存储的是操作功能的文字描述,例如空调的开机、关机、设置温度等,表述的是这个硬件的哪些功能能被操作或者说类似遥控器,哪些功能可以被遥控到。

初始化功能

初始化功能主要存储的是当要初始化的功能,当xml被转换为硬件相关类(HardwareXmlEntity)时,如果发现有该标签的存在,应该马上调用,例如我们计划门禁在被初始化以后,马上获得人员名称列表,那么就可以在初始化功能中添加获取人员列表的功能,当获得HardwareXmlEntity后,直接调用初始化,后台调用获取人员列表。

定时功能

定时功能存储的是定时任务信息,后期添加定时模块后会再进行说明。

标签:XML,node,网关,return,xml,标签,功能,硬件
From: https://www.cnblogs.com/wanghun315/p/17632018.html

相关文章

  • Android平台内网RTSP网关和轻量级RTSP服务的区别和联系
     技术背景我们在对接轻量级RTSP服务的时候,遇到客户这样的使用场景:客户是用于车载自组网环境,确保多辆车之间可以相互看到对方的实时视频,以期可以了解到前方路况等关注的信息。除了安卓自带摄像头的数据,还有车载RTSP摄像头,由于系统部署在安卓端,我们初步设计的方案,是走轻量级RTSP服务......
  • 2011-2012学年 XML期末考试考试题
    2011-2012学年期末考试考试题一、填空题(每题3分,共27分)请将每道题的正确答案填写在题目中的横线上,其余答题 方式均无效。1、下面代码中的“学生信息”是根原素____根元素_________元素; <?xmlversion=”1.0”> <?DOCTYPE学生信息SYSTEM“stu.dtd”> <!ELEMENT学生信息(#......
  • Net6.0 集成 支持 Nacos 的 Ocelot 网关
    1-创建Ocelot网关webapi 2-添加引用https://www.cnblogs.com/wucy/p/13353824.htmlInstall-Packagenacos-sdk-csharp-Version1.3.5Install-PackageOcelot.Provider.Nacos-Version1.3.5Install-PackageOcelot.Provider.Polly-Version1.3.53-配置appset......
  • 视频集中存储安防监控平台EasyCVR优化AI硬件接入时的通道显示异常问题
    安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。安防监控视频云存储平台EasyCVR既具备传统安防视频监控的能力,比如:视频监控......
  • ThingsKit物联网平台网关MQTT接入
    入门介绍在物联网中,网关的作用是将那些本身不能直接连接平台的设备,通过网关的中转,让设备接入平台。网关起到的作用是数据转发和协议转换。网关和平台的通信主要分为:网关设备自身和平台的通信,例如:上报网关自身的设备状态和属性,接收平台对网关的控制指令等。网关子设备和平台的......
  • 硬件管理平台-硬件网关-XML相关基础类
    硬件管理平台-硬件网关-XML相关基础类简介本章是硬件管理平台-硬件网关-插件模块-集成(上)的延申部分,因集成模块时还需要有配置文件的相关操作,因此需要将xml部分进行说明,其中需要说明的部分有xml的操作类、xml与硬件的交互类以及配置文件中对于xml的获取及操作。主要工作是约定xml......
  • 工业物联网网关:连接智能制造的关键
    随着工业4.0和智能制造的快速发展,工业物联网网关逐渐成为智能制造体系中的核心组件。这个物联网设备承担着设备连接、数据采集、协议转换和数据处理等多重任务,对于实现工业互联网的实时监控、远程控制、故障诊断和预测维护等功能具有重要作用。例如,在生产设备的智能化改造中,物联网......
  • 第五章 Gateway--服务网关
    5.1网关简介大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。 这样的架构,会存在着诸多的问题:客户端多次请求不同的微服务,增加客户端代码或......
  • spring spring.core IOC xml 注册
    publicclassSpringUtils{staticIApplicationContextcontext;publicstaticTGetObject<T>(stringname)whereT:class{if(context==null){context=newXmlApplicatio......
  • LAXCUS和GPU软硬件结合,构建强大算力生态​
    随着科技的不断进步,计算机技术已经进入到我们生活的方方面面。其中,GPU(图形处理器)作为一种强大的计算设备,已经成为了人工智能、大数据、云计算等领域的核心硬件之一。然而,传统操作系统都是单机系统,只能在一台计算机上运行,对GPU的利用能力有限,无法充分发挥GPU强大计算性能,限制了其......