不管是业务功能需要还是开发诊断需要,经常需要用到CPU内存硬盘等信息,或者需要主板编号和系统编号做唯一设备标识。于是设计了机器信息类 MachineInfo ,支持Windows、Linux、Raspberry、Android、macOS等。

Nuget包:NewLife.Core

源码:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Common/MachineInfo.cs

视频:https://www.bilibili.com/video/BV1ne4y1E75i


最佳实践

获取本机机器信息,从nuget应用 NewLife.Core 包

var info = MachineInfo.GetCurrent();
XTrace.WriteLine(info.ToJson(true));


快速入门

星尘代理 StarAgent 支持查看机器信息。

Win10台式机的机器信息:


嵌入式工业计算机的机器信息(带有温度值):


树莓派Zero的机器信息(60~100块钱,跑Mono):


阿里云服务器的机器信息:


星尘上查看A2工业计算机的信息(http://star.newlifex.com/Nodes/NodeData?nodeId=988):


基础信息

  • OSName,系统名称,例如显示“Windows 10 企业版”,而不是“Microsoft Windows NT 10.0.19042.0”
  • OSVersion,系统版本。
  • Product,产品名称,制造商,例如“Alibaba Cloud ECS
  • Vendor,制造商,例如“FeiFanLink”
  • Processor,处理器型号

设备标识

  • UUID,硬件唯一标识,主板编码。小牌子主板该号码大量重复
  • Guid,操作系统标识,重装系统后改变。Ghost系统大量重复
  • Serial,计算机序列号。适用于品牌机,跟笔记本标签显示一致,一般用于企业内资产管理
  • Board,主板。序列号或家族信息,不是唯一编码
  • DiskID,磁盘序列号,仅固定硬盘,剔除TF卡和U盘。遇到虚拟盘容易改变,例如云服务器或者树莓派TF卡。在本地客户端中该号码唯一性很好。


在实际应用中,星尘就采用UUID+Guid+DiskID混合后计算Crc的方式,来作为客户端唯一标识。

某些系统中,可能无法读取到这些标识,特别是不同的Linux发行版。此时MachineInfo会生成随机guid,并以0-开头。


状态信息

  • Memory,内存总量,单位Byte
  • AvailableMemory,可用内存,单位Byte
  • CpuRate,CPU使用率,Windows和Linux皆采用系统空闲时间和总处理器时间比值来计算,避免系统指标不统一
  • Temperature,温度,主要用于Raspberry等嵌入式板卡中,也可用于监控A2/A4工业计算机的环境温度
  • Battery,电池剩余,小于1的小数,百分比表示
  • UplinkSpeed,网络上行速度。字节每秒,初始化后首次读取为0
  • DownlinkSpeed,网络下行速度。字节每秒,初始化后首次读取为0


缓存与刷新

机器硬件信息一般很少改变,为了加速系统启动速度,可以提前调用 MachineInfo.RegisterAsync() 来优化。

该方法内部会异步读取机器硬件信息,并生成machine_info.json文件,缓存到本地Data数据目录和系统Temp临时目录。本地Data数据目录是为了方便下次启动加速,而系统Temp临时目录则是为其它应用而优化缓存。


同时,某些信息需要系统管理员权限才能获取,而并非所有应用都有该权限,同一台服务器上,只要有一个应用具备管理员权限,其它所有应用也可得到准确的硬件信息。


再者,对于读取不到或者不存在的硬件,例如主板UUID,会自动生成一个随机guid,放置在系统Temp目录,可以避免同一台服务器上的不同应用生成不同的UUID。


为了读取得到最新状态信息,读取之前需要调用 Refresh 方法来刷新。


作者:大石头 发布:2023-12-09 09:28:43 浏览:4,458)