最新要闻
- 微信被爆测试“小绿书”,此前商标已被注册
- 直击酱香型白酒佳酿I肆拾玖坊宗师酒、茅台王子酒、水井坊井台
- 钛合金的硬度是高还是低(钛合金的硬度)
- 日本推出长颈鹿式站立睡眠舱,半小时收费41元人民币
- 大学生“新农人”的田园创业梦
- 爱的真谛歌词 爱的真谛歌词
- 村民自发救助被困乘客女书记发声 中国人的力量无与伦比
- 紧跟时代 书写人民 《贾大山文学作品全集典藏版》出版
- 2023年农村老人养老金每月多少钱计算,看看你那里能领多少
- 巴拿马以南海域发生5.9级地震 震源深度10千米
- 复旦大学张志安:慎贴标签,网暴治理需抓情境、抓重点、抓底线
- 南宁市良庆区这个地方大变样 未来或打造成公园
- 和平公园篮球场开放啦!
- 中科微至08月02日沪股通持有量16.16万股
- 奥迪“神车”跌入专车档
- 迪哲医药定增募资26亿被第二轮问询 是否重复投入被重点关注
手机

持续火爆 国缆检测连续20cm涨停!“牛市旗手”再度活跃 财达证券2连板

dnf什么时候维护结束2020.4.4_dnf什么时候维护
- 持续火爆 国缆检测连续20cm涨停!“牛市旗手”再度活跃 财达证券2连板
- dnf什么时候维护结束2020.4.4_dnf什么时候维护
- 蔡澜作品:夏天的鬼故事(关于蔡澜作品:夏天的鬼故事简述)
- A股申购 | 水环境系统治理综合服务商科净源(301372.SZ)开启申购 关注公司偿债风险
- 盖里奇百科(盖里奇简介)
- 阜阳电信多措并举开展传统机楼节能改造
家电
硬件管理平台-硬件产品库-底层实现
HardwareAbstract
在编写LoadLibrary前,我们需要完善HardwareAbstract类,否则TreeView显示什么?后续的内容应该如何操作?都将是一个坑。
由于本项目已完成,所以就不再一点一点的回顾HardwareAbstract类中添加的一堆一堆的代码了,先大体阐述一下类中的内容,具体代码展示
(资料图片仅供参考)
abstract or interface
由于要进行反射,所以必然要将所有硬件的公共部分提取出来,而抽象和接口都可以实现这个工作,使用接口更规范,如果不实现接口类,是会报错的;而使用抽象可以编写一些内部类,只要继承了该抽象类就可以调用内部类,虽然使用静态类也能实现,不过还是抽象类的封装更好一些,随着项目内容增多,公共方法不好找。不过最后还是使用了abstract抽象类,因为如果使用interface的话还是要在上面加一层,这样子就无法体现接口的好处了。
之前的项目使用的是abstract,导致了该类过于臃肿
该抽象类一共550多行代码,这还是注释不全的情况下,看到以后说实话都不太想动他了。
HardwareAbstract应该有什么
何为HardwareAbstract,肯定是与硬件相关的抽象方法和抽象类(再加上interface部分),那对于硬件的交互信息和展示信息都应该在该类中,因此该类应该设计成一个硬件的集合抽象,其中包含了必须的接口和公共实现类。接口中必须要能返回硬件的所有信息,例如该硬件的功能,调用该功能必须要输入的信息以及该功能内部的执行接口。分别为GetHardwareInfo和Execute。
GetHardwareInfo
该方法主要是为了获取硬件的所有信息,包含硬件类型,名称,描述等基础信息,又包含了该硬件的功能信息,其中功能可分为初始化,定时和可调用三个维度。
- 初始化指的是系统利用反射加载完现有的硬件模块后,通过硬件模块获得现场的真实数据后需要对该硬件进行初始化,例如我们反射加载了一个海康门禁的模块,门禁模块提出,我需要ip地址,端口号,用户名和密码才能工作。而现场肯定要将一个真实存在的海康门禁进行添加,加上这些门禁所需的信息。通过对这个门禁实例化后,会调用初始化方法,初始化方法的内容可能是模拟登录,拿到Handle的句柄,则初始化维度中将有一个模拟登录的功能。
- 定时指的是定时触发的功能,例如获取温湿度如果需要定时触发,则定时这个维度中应该有一个功能叫获取温湿度。
- 可调用值得是该硬件中有哪些功能是上位机可以调用的。
Execute
真正执行调用维度的接口实现方法,通过GetHardwareInfo方法获得的信息中,只有可调用的维度是需要上位机主动调用的,其他的都是系统内部调用。Execute方法应该为async/wait还是同步的,之前的实现是同步的,在网关服务中统一调用。这样的不便之处就是对于某个功能或者某类功能要异步或者同步需要动态设定或者写死,而在Execute中可通过编写人员的判断来约定好这个功能,好处是服务不需要去管理这个。
公用方法
目前公用的方法很全,包括了log4j,配置文件(ini),异步execute方法的事件,心跳公用方法,测试类,http相关类等。
实现
HardwareAbstract
在公共包中创建一个HardwareLibrary项目,该项目的位置位于Public文件下。将AssemblyLibrary项目的HardwareAbstract类放到新建的项目中。此时HardwareGateWebApi、AssemblyLibrary和HardwareGatewayProductization**项目会报错,因此需要添加对新项目的引用。
在HardwareLibrary中创建HardwareAbstract类,用于存放抽象方法;在创建一个abstract文件夹,用于存放HardwareAbstract继承的抽象类,该类主要用于存放一些公共的方法,如果写在一起对于维护不好维护。
注意:这样子的namespace会报错,所以我直接将namespace改为了HardwareLibrary,没有加文件夹名称。
在HardwareAbstract.cs中添加代码
/// /// 获得设备相关配置项/// /// public abstract HardwareProperties GetHardwareInfo();/// /// 执行方法/// /// 功能码/// 设备基础信息/// 调用参数/// 如果返回值是非空,则出现错误信息,记录或将日志放到服务器上 public abstract AjaxResult Execute(Function function, string hardware, string param);
AjaxResult
该类在之前提到过,此时我们需要将该类放到公共包中使用,重新创建一个类项目,命名为UtilsLibaray,将该类放到此项目中
之前添加后,忘记说使用Nuget下载Newtonsoft.Json了,在此补上,添加的依赖如下
HardwareProperties
该类为硬件信息参数,大体展现内容已在前文描述,代码如下
public class HardwareProperties{ private string _type; private string _model; private string _folder; private string _relyOnFolder; private List _relyOnFiles; private string _version; private string _describe; private List _operationFun; private List _initializationFun; private List _timeingFun; private List _params; /// /// 类型 /// public string Type { get => _type; set => _type = value; } /// /// 类型主键 /// public string TypeId { get; set; } /// /// 型号 /// public string Model { get => _model; set => _model = value; } /// /// 型号主键 /// public string ModelId { get; set; } /// /// 依赖文件夹 /// 单一文件夹 /// public string RelyOnFolder { get => _relyOnFolder; set => _relyOnFolder = value; } /// /// 版本号 /// public string Version { get => _version; set => _version = value; } /// /// 模块描述 /// public string Describe { get => _describe; set => _describe = value; } /// /// 所在文件夹 /// dll所在文件夹的路径 /// public string Folder { get => _folder; set => _folder = value; } /// /// 依赖文件列表 /// runtime文件夹中个别dll /// public List RelyOnFiles { get => _relyOnFiles; set => _relyOnFiles = value; } /// /// 可操作功能 /// public List OperationFun { get => _operationFun; set => _operationFun = value; } /// /// 初始化时触发功能 /// public List InitializationFun { get => _initializationFun; set => _initializationFun = value; } /// /// 定时功能 /// public List TimeingFun { get => _timeingFun; set => _timeingFun = value; } public List IndependentFun { get; set; } public List Params { get => _params; set => _params = value; } /// /// 构造函数 /// /// 类型ID /// 型号ID /// 类型 /// 型号 /// 依赖的文件夹 /// 依赖的文件列表 /// 版本号 /// 描述 /// 类型描述 /// 操作功能 /// 初始功能 /// 定时功能 /// 模块功能 public HardwareProperties(string typeId, string modelId, string type, string model, string relyOnFolder, List relyOnFiles, string version, string describe, Type typeClass, List operationFun, List initializationFun, List timeingFun, List independentFun) { TypeId = typeId; ModelId = modelId; _type = type; _model = model; _relyOnFolder = relyOnFolder; _relyOnFiles = relyOnFiles; _version = version; _describe = describe; _operationFun = operationFun; _initializationFun = initializationFun; _timeingFun = timeingFun; if (typeClass == null) { _params = new List(); } else { _params = AssemblyControl.GetParams(typeClass, new List() { "定时功能", "操作功能", "初始化", "模块功能" }); } IndependentFun = independentFun; }}
该代码我放到了entity文件夹中,此时interface和abstract有些怪怪的,就新建了一个util将这两个文件夹放入其中。
AssemblyControl.GetParams
该方法为通过硬件的功能类型获得各自的功能值,主要用于展示。
我们将它作为HardwareProperties的扩展类,新建一个extends文件夹,创建HardwarePropertiesExt扩展类,将代码放入
/// /// 根据类型获取展示信息/// /// /// public static List GetParams(this HardwareProperties properties, Type typeClass, List ignoreFun){ List retList = new List(); foreach (PropertyInfo info in typeClass.GetProperties()) { if (ignoreFun == null || !ignoreFun.Contains(info.Name)) { retList.Add(info.Name); } } return retList;}
布局如图:
Function
此时生成解决方案时还会报错,报错为未识别Function类,该类为枚举类,主要是列出了所有的硬件功能。
一开始打算细分,例如空调的功能为一个枚举,灯控的为一个枚举,这样子更清晰,后来放弃了。虽然清晰了,但是会形成同一个功能重复,例如空调的关机和一体机的关机是一个功能,而空调的设置温度可能是一个特定的值,也有可能是设置温度范围。所以这里就没有分的那么清晰。而且有些值的确有歧义,例如空调的开机可能是风机工作(直接485控制),也有可能是接通电源(红外控制)。
public enum Function{ /// /// 文件下载 /// [Description("文件下载")] DownLoadFile = 03, /// /// 开机 /// [Description("开机")] OpenMachine = 05, /// /// 关机 /// [Description("关机")] CloseMachine = 06, /// /// 设置温度 /// [Description("设置温度")] SettingTemputre = 07, /// /// 自动 /// [Description("自动")] SettingAuto = 08,}
AHardware
该方法用于存放抽象类的公共方法,例如模拟数据方法,心跳返回等,该部分在后续进行说明。
LoadLibrary方法
此时就可以在MainForm中添加LoadLibrary方法了,该方法主要就是利用放射类获得硬件属性来进行展示。
Dictionary> valuePairs = new Dictionary>();_properties.Clear();// 解析硬件反射类_hardwares.ForEach(hardwareAbstract =>{ // 获得硬件信息 HardwareProperties hardware = hardwareAbstract.GetHardwareInfo(); // 将引用的路径赋值给硬件信息 hardware.Folder = hardwareAbstract.IncludeDll; _properties.Add(hardware); // 形成 类型为key的字典,便于后面初始化TreeView控件 if (!valuePairs.ContainsKey(hardware.Type)) { valuePairs.Add(hardware.Type, new List()); } valuePairs[hardware.Type].Add(hardware);});hardwareTV.Nodes.Clear();foreach (string item in valuePairs.Keys){ // 创建一个硬件类型的Node TreeNode typeNode = new TreeNode(item); // 遍历硬件,获取硬件的型号(该型号必须唯一) valuePairs[item].ForEach(propertie => { TreeNode modelNode = typeNode.Nodes.Add(propertie.Model); modelNode.Tag = propertie; }); // 展示时树的顶级为硬件类型分类,下面为各型号分类 hardwareTV.Nodes.Add(typeNode);}
编译成功,但是还无法查看效果,需要创建硬件项目。
关键词:
-
-
-
-
硬件管理平台-硬件产品库-底层实现
强化学习——策略梯度之Reinforce
开心档之DTD - 元素
小儿诗歌(描写儿童的诗句)
成都市气象台发布暴雨黄色预警信号
宾服(关于宾服介绍)
龙港以人居环境提升打底美好生活
持续火爆 国缆检测连续20cm涨停!“牛市旗手”再度活跃 财达证券2连板
高考指南2023在哪买 高考指南2019
玉米:需求疲软,后市价格偏弱运行
dnf什么时候维护结束2020.4.4_dnf什么时候维护
郑州一车主在行驶中撞上石头,如何挽回损失?回应来了
山水比德8月3日盘中涨幅达5%
蔡澜作品:夏天的鬼故事(关于蔡澜作品:夏天的鬼故事简述)
港股持续走低,港股医药ETF(159718)溢价0.65%
微信被爆测试“小绿书”,此前商标已被注册
液冷服务器板块走强
惠誉下调美国评级引争议?高盛安抚投资者:这没什么大不了的!
特殊商品:橡胶缺乏主要矛盾,盘面窄幅震荡
雄鹰图片展翅高飞霸气(展翅高飞中文版攻略)
双丝光棉的优点和缺点(双丝光棉)
K396次列车上900余名旅客和工作人员全部平安
直击酱香型白酒佳酿I肆拾玖坊宗师酒、茅台王子酒、水井坊井台
亿咖通科技在ATC 2023技术峰会全貌展示
两部门紧急预拨1.1亿元支持京津冀地区防汛救灾
微博热搜榜排名今日8.1微博热搜榜今日事件8月1日
广西柳州:织密双拥保障网 暖军服务落实处
来宝山这个创意园开启艺术之旅,纵享城市绿洲
手背上痣的位置与命运(手上痣相图解大全)
7年拍摄70位老兵 行程3万公里 摄影爱好者史云鹏:他们才是青年一代应该追的星
“封神质子团”真火了!你知道男演员为了练好胸肌有多拼吗?
钛合金的硬度是高还是低(钛合金的硬度)
研究发现BMI较高的乳腺癌患者在化疗期间更容易出现心脏损伤
快速关机的快捷键是哪个?(快速关机)
注意!昌平区仍处于洪水和地质灾害红色预警,务必远离河道水库!
浙江绍兴推出优化提升营商环境“二十条”
大唐海南1200MW海上风电项目机组采购(二次)招标
中国石化在重庆获深层煤层气突破
广州:2023年安排21.66亿元支持生活垃圾分类处理工作
A股申购 | 水环境系统治理综合服务商科净源(301372.SZ)开启申购 关注公司偿债风险
新股消息 | 德康集团三次递表港交所 专注于生猪及黄羽肉鸡的育种及养殖
日本推出长颈鹿式站立睡眠舱,半小时收费41元人民币
章节读后感《基督山伯爵》第二章 父与子
vivo X90 续航掉的很快是电池的问题吗
vivo X90 电池发烫充不进去电怎么办
红米Note 11R手机星空拍摄技巧介绍
街道将楼顶违法游泳池称为消防水池 广州番禺:成立调查组调查
《茶啊二中》:中学校园动画IP背后的原创团队 坚持东北味东北话也能让全国观众一起笑一起忆青春
大学生“新农人”的田园创业梦
香港青年剑手期待“最高等级全国赛”
房地产政策调控新信号出现,南京有二手房东连夜跳价100万……
新华全媒+|为人民群众生命安全筑防线——天津防汛泄洪现场直击
盖里奇百科(盖里奇简介)
十年磨一剑,敢为天下先
恒生指数低开0.58% 恒生科技指数跌0.13%
官降的车型,要怎么帮买最划算?
蔡致乐(关于蔡致乐简述)
即将国产!新一代普拉多发布
【环球财经】7月Judo Bank澳大利亚服务业PMI降至47.9点
粤港澳青少年在穗共享国家植物园“自然之美”
爱的真谛歌词 爱的真谛歌词
跃跃御市:新势力7月呈阶梯状排列,大众牵手小鹏引猜想
阜阳电信多措并举开展传统机楼节能改造
民事诉讼二审能提反诉吗,民事诉讼二审的审理期限多长
如何评定轻伤及其标准
“双中枢”模式是平台经济转型升级的关键
东营联通智能井盖保足下平安
金源博:日线持续下行 反弹后继续做空
6-1后突然掉线,张之臻1-2大满贯冠军,无缘8强,4号种子爆冷出局
清理水草 净化水质
商品日报(8月3日):市场情绪转弱商品大面积下跌 双焦大幅回落跌幅居首
新能源汽车领衔 各方为提振消费出招
大运会开幕式凉山唱歌女孩:把民族文化唱给全世界听
刘涛:每个人都能成为自己的光
今日上市:N金凯、N长华
做馒头怎么发面才松软
苹果iPhone 15 Pro Max将独享潜望式长焦镜头 最高支持6倍光学变焦
天风证券赵晓光:智能手机仍是一个被严重低估的行业
今日上市:金凯生科、长华化学
芜湖鸠江区一男子用雨伞掩护 盗窃婴儿金手镯
荣昌区委书记高洪波:对监管不力行为严肃问责 确保各项目按时序推进
村民自发救助被困乘客女书记发声 中国人的力量无与伦比
人民币贬值的影响(人民币贬值何以影响经济)
养老保险什么时候可以领(领取养老保险的时间是什么)
广东做大做强制造业 推动产业转型升级
7月接待游客1214万人次!兰州市城关区迎来暑期旅游高峰
山西省第十六届运动会开幕在即 五大亮点值得期待
青年说丨列车避险停车,值班员值得点赞
紧跟时代 书写人民 《贾大山文学作品全集典藏版》出版
做好人才引育用留全链条工作
三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏
北京消防员徒步打通生命救援线 丰沙铁路列车人员已妥善安置
京津冀多地受灾 部队官兵和民兵连续奋战抗洪抢险一线
8月3日中钢矿业正蓝旗萤石价格暂稳
灵活就业人员退休年龄多少岁?灵活社保被要求55岁退休怎么办
2023年农村老人养老金每月多少钱计算,看看你那里能领多少
华谊千金深夜为好友庆生晒美照,疑戴男友帽子抿嘴傻笑满脸幸福!
银行配资渠道-银行配资流程是什么
巴拿马以南海域发生5.9级地震 震源深度10千米
邮储银行“智能权证管理机器人”案例获全国“第三届RPA+AI开发者大赛”特等奖