- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本篇主要描述的是如何创建一个硬件项目,并将硬件信息进行展示.
讲了这么多至少应该能出个效果吧 。
在产品库文件夹中创建一个 硬件集合 文件夹,该文件夹存放所有硬件项目,在创建硬件项目前我们需要创建某类硬件项目的硬件接口.
我们在此以门禁和空调为例。门禁的功能有监听门禁事件,获取人员列表;空调的功能有开关机,定时获取温湿度等.
关于海康门禁的功能可以查看我的博客中的相关代码,在这里就不重复说明了。例如: 门禁实时获取记录 。
在 硬件集合 文件夹中创建 硬件接口 文件夹,并创建 IAccessControlLibrary 和 IAirConditionLibrary 项目 。
在这两个项目中分别创建 IAccessControlClient 和 IAriConditionClient 类,并设置为抽象类(abstract),继承 HardwareAbstract 类.
以 IAriConditionClient 为例 。
public abstract class IAriConditionClient : HardwareAbstract
{
public static readonly string Type = "空调";
}
public class AirConditionInfo : HardwareInfo
{
string _设备地址;
/// <summary>
/// 设备号
/// </summary>
public string 设备地址 { get => _设备地址; set => _设备地址 = value; }
}
IAriConditionClient 。
IAriConditionClient中Type为该类型的名称,用于进行分类 。
HardwareInfo 。
该类是硬件信息,与HardwareProperties的区别如下:
该类的属性信息如下:
/// <summary>
/// 设备类型
/// </summary>
private string _设备类型;
/// <summary>
/// 设备主键
/// </summary>
private string _设备主键;
/// <summary>
/// 设备型号
/// </summary>
private string _设备型号;
/// <summary>
/// 设备ip地址
/// </summary>
private string _Ip地址;
/// <summary>
/// 设备端口号
/// </summary>
private string _端口号;
/// <summary>
/// 备注
/// </summary>
private string _备注;
/// <summary>
/// 定时功能设定
/// </summary>
private List<FunctionSetting> _定时功能;
/// <summary>
/// 功能列表
/// </summary>
private List<Function> _操作功能;
/// <summary>
/// 初始化
/// </summary>
private List<Function> _初始化;
其中FunctionSetting类为调度任务所需要的类,为防止后续忘记,在此也将属性进行罗列 。
/// <summary>
/// 功能码
/// </summary>
private Function _runFunction;
/// <summary>
/// 功能码说明
/// </summary>
private string _functionStr;
/// <summary>
/// Cron
/// </summary>
private string _cronTime;
本来还有_nextFunction,意为执行该功能码后是否有关联功能码直接调用,之后由于并没有因此将该属性去掉.
_cronTime 原来为执行时间(_dateTime),之后改为了cron,因此在此将属性进行修改.
门禁项目接口同空调接口,本文就不再重复,门禁接口代码如下:
在硬件集合文件夹中添加门禁和空调的文件夹,并分别创建两个硬件类,实现各自的抽象类.
项目创建如图:
这里将之前的 硬件接口 文件夹改为了 00硬件接口 ,每个硬件类都创建了单独的文件夹,硬件类前面的标号为约定好的硬件类型编号,而例如 01HkAccessControlLibrary 表示为门禁类中,海康门禁的型号是 0501 ,这样就有了唯一的硬件类别和唯一标识与该dll对应。该唯一标识在硬件实现类中也有使用.
在 01TestAirConditionLibrary 中创建 TestAirConditionClient.cs 类,并继承抽象类 IAriConditionClient 。
public class TestAirConditionClient : IAriConditionClient
{
public override AjaxResult Execute(Function function, string hardware, string param)
{
throw new NotImplementedException();
}
public override HardwareProperties GetHardwareInfo()
{
throw new NotImplementedException();
}
}
注: 这里改正之前描述的错误,就是abstract抽象接口与interface的接口方法一致,class继承后必须实现该类,否则会报错。之前编写的时候有误.
对 TestAirConditionClient 进行修改,添加GetHardwareInfo方法的返回值 。
#region 约定的相关信息
private const String Model = "实际硬件型号";
private const int Version = 1;
private const String Describe = "对于该硬件的信息描述";
#endregion
#region 功能部分
private readonly List<Function> OperationFun = new List<Function>() { Function.SettingTemputre, Function.HumAndTem, Function.OpenMachine, Function.CloseMachine};
private readonly List<Function> TimeingFun = new List<Function>() { Function.HumAndTem, Function.Beat };
#endregion
public override HardwareProperties GetHardwareInfo()
{
return new HardwareProperties("04", "0401", IAriConditionClient.Type, Model, null, null, Version, Describe, typeof(AirConditionInfo), OperationFun, null, TimeingFun, null);
}
HardwareProperties构造函数传入的属性请参见上文的构造类。其中OperationFun和TimeingFun分别表示的可操作功能和定时功能.
Function.HumAndTem和Function.Beat为新增功能,需要在Function中添加 。
/// <summary>
/// 获取温湿度
/// </summary>
[Description("获取温湿度")]
HumAndTem = 08,
/// <summary>
/// 心跳
/// </summary>
[Description("心跳")]
Beat = 09,
门禁项目接口类似,就不一一描述了,最后实现类如下:
private const string Model = "海康门禁";
private const int Version = 1;
private const string Describe = "海康门禁";
private const string RelyOnFolder = "hk";
private readonly List<Function> OperationFun = new List<Function>() { Function.GetPersonList, Function.Beat };
private readonly List<Function> TimeingFun = new List<Function>() { Function.Beat };
private readonly List<Function> InitializationFun = new List<Function>() { Function.Initialization };
public override AjaxResult Execute(Function function, string hardware, string param)
{
throw new NotImplementedException();
}
public override HardwareProperties GetHardwareInfo()
{
return new HardwareProperties("05", "0501", IAccessControlClient.Type, Model, RelyOnFolder, null, Version, Describe, typeof(AccessInfo), OperationFun, InitializationFun, TimeingFun, null);
}
编译一下,如果有问题,可能是引用问题,需使用Alt+Enter进行库的引用.
将 HardwareGatewayProductization 项目的生成路径改为: ..\bin\Debug\产品库\ 。
将硬件项目的生成路径改为: ..\..\..\bin\Debug\产品库\plugins\硬件类型名称 ,例如 01HkAccessControlLibrary 可修改为: ..\..\..\bin\Debug\产品库\plugins\空调 .
重新生成后,生成路径会修改为 。
同级依然还存在很多dll,而且每个硬件中也有大量dll,让我们来精简一下.
..\..\bin\Debug\产品库\dlls\
。 ..\..\..\bin\Debug\产品库\dlls\
。 复制本地
都改为false。 重新生成,查看效果.
此时exe同级下 就没有多余的dll依赖文件了(如果有,可以删除然后重新生成产品库的项目).
硬件项目也只有本项目自己的dll,而其他依赖都没有进行复制,如果生成时还有,可将所有dll删除然后重新尝试.
此时,所有的依赖都来到了dlls文件夹中,这样在后期复制时可以直接复制dlls文件夹到硬件网关项目即可.
目前会发现这个报错(提示是未找到引用),不过我这边并不影响运行使用,因此就直接忽略了红线的报错.
运行后效果如图:
最后此篇关于硬件管理平台-硬件产品库-硬件项目的文章就讲到这里了,如果你想了解更多关于硬件管理平台-硬件产品库-硬件项目的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我刚刚意识到二进制编译器会将源代码转换为目标平台的二进制文件。有点明显...但如果编译器以这种方式工作,那么同一个编译器如何用于不同的系统,如 x86、ARM、MIPS 等? 难道他们不应该“知道”硬
在我的 SDL 游戏中,出于游戏玩法和性能原因,我希望保留固定的游戏区域分辨率。 我想做的是有一个小分辨率(例如 320 * 240),并且在调整窗口大小时/切换到全屏模式时让 SDL/显卡缩放每个像
我正在使用这些方法来激活 SurFaceView 上的触摸焦点 private SurfaceView surfaceiew; private CameraSource camSource; priv
您好,当我从硬件菜单更改设备时,我遇到了这个奇怪的问题,但我想我可能遗漏了一些简单的东西。 我的 View Controller 中有这段代码: - (void)touchesBegan:(NSSet
编写一个名为 weird() 的函数,它将三个字符串作为参数并向后打印最长的一个。 (在平局的情况下,应该选择较早的参数字符串。 函数调用: weird("I", "Love", "Python")
您好,我正在尝试设置 hadoop 环境。简而言之,我要解决的问题涉及数十亿个大小为几 MB 的 XML 文件,使用 HIVE 从中提取相关信息,并对这些信息进行一些分析工作。我知道这在 hadoop
我知道 Phidgets,但是,我正在寻找可以与 C# 接口(interface)的一些其他类型的硬件。 谁有好东西? 最佳答案 查看 Netduino .它基于 Arduino,但使用 .Net
说一个函数(例如模乘法、正弦函数)是在硬件而不是软件中实现是什么意思? 最佳答案 在硬件中实现意味着电路(通过逻辑门等)可以执行操作。 例如,在 ALU 中,处理器在物理上能够将一个字节加到另一个字节
我需要编写一个程序,在可能状态的大空间中执行并行搜索,在此过程中发现了新区域(并开始了他们的探索),并且由于在其他地方获得的中间结果消除了可能性,因此提前终止了对某些区域的探索在其中发现新的有用结果。
我们需要通过带有硬件 token 的 EV 代码对 InstallShield 2013 Express 的安装进行签名,但是无法导出私钥证书文件,因此唯一的方法是使用 DigiCertUtil 工具
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 2 年前。 Improve this ques
我考虑从库中丢弃处理大端情况的代码,如果平台不是小端,则在初始化期间简单地抛出一个异常。如果我们限制为,我无法想象会有任何大端硬件 托管任何网站的典型服务器硬件 服务器根据开放计算项目规范 所有常见的
我知道这可以做到,但找不到交换目标调试设备的地方。我现在正在使用模拟器,但想切换到设备,反之亦然。谁能指出我正确的方向? 谢谢。 最佳答案 像这样.. 右键单击 PROJECT--->Run As--
我正在尝试创建一个监听音量键事件的服务。 每当按下音量键时,服务应向号码发送短信,但我无法检测到音量键事件。 最佳答案 您可以使用 OnKeyListener可以检测按键事件(包括音量键)。您可以找到
谁能解释一下中断如何从最低层(硬件)传递到应用程序。 所以在下图中我知道处理器之后发生了什么。 但是我想要从键盘按下到处理器的中断过程在硬件中发生了什么,例如它如何传递扫描代码,中断 Controll
我的任务是构建一个应用程序,其中业务用户将定义一些数据操作和处理规则(例如,取一个数值并将其平均分配给根据中指定的条件选择的多个记录)规则)。 每月必须运行一个批处理应用程序,以便根据定义的规则处理大
所以这是我的愚蠢问题: PGP/GPGP可以用来对文本进行签名,其他的使用公钥来验证。 比方说,非对称密码算法处理空间。 有没有什么算法可以处理时间? 例如在 2011-10-10 10:10:10
使用 nvcc 编译 CUDA 程序是否需要安装支持 CUDA 的显卡(在 Linux 中)?或者可以在任何地方编译程序并且只能在这样的系统上运行? 最佳答案 不,编译不需要显卡。 您甚至不需要一个来
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有一个奇怪的问题,但我对这个话题很感兴趣。 是否有可能直接访问当前基于 x64 的计算机的硬件,而无需使用某种 HAL(硬件抽象层)或其他操作系统(udev、upower 等)的附属物?我不是在谈论
我是一名优秀的程序员,十分优秀!