不管是业务功能需要还是开发诊断需要,经常需要用到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 方法来刷新。