feat(hardware): 自 go-hua 迁入硬件信息采集与变更检测

- WMI 采集主板/BIOS/显卡/内存/CPU/硬盘等 11 类设备 + 变更比对
- 新增依赖 gopsutil/yusufpapurcu/wmi, 附测试、例程与 README
This commit is contained in:
2026-09-20 12:29:36 +08:00
parent ef7cd3e3c4
commit 138c929bd4
7 changed files with 708 additions and 0 deletions
+297
View File
@@ -0,0 +1,297 @@
package hardware
// CheckBaseBoardChanged 检测主板是否发生变化(对比两次采集结果)
func CheckBaseBoardChanged(now []BaseBoard, newest []BaseBoard) bool {
if len(now) != len(newest) {
return true
}
for _, n1 := range now {
in := false
for _, n2 := range newest {
if n1.Product != n2.Product {
continue
}
if n1.Manufacturer != n2.Manufacturer {
continue
}
in = true
break
}
if !in {
return true
}
}
return false
}
// CheckBiosChanged 检测 BIOS 是否发生变化
func CheckBiosChanged(now []Bios, newest []Bios) bool {
if len(now) != len(newest) {
return true
}
for _, n1 := range now {
in := false
for _, n2 := range newest {
if n1.SMBIOSBIOSVersion != n2.SMBIOSBIOSVersion {
continue
}
in = true
break
}
if !in {
return true
}
}
return false
}
// CheckProcessorChanged 检测 CPU 是否发生变化(按名称对比)
func CheckProcessorChanged(now []Processor, newest []Processor) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Name != n2.Name {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
}
if !in {
return true
}
}
return false
}
// CheckPhysicalMemoryChanged 检测内存条是否发生变化(按容量对比)
func CheckPhysicalMemoryChanged(now []PhysicalMemory, newest []PhysicalMemory) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Capacity != n2.Capacity {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckVideoControllerChanged 检测显卡是否发生变化(按名称对比)
func CheckVideoControllerChanged(now []VideoController, newest []VideoController) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Name != n2.Name {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckSoundDeviceChanged 检测声卡是否发生变化(按名称对比)
func CheckSoundDeviceChanged(now []SoundDevice, newest []SoundDevice) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Name != n2.Name {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckNetworkAdapterChanged 检测网卡是否发生变化(按名称对比)
func CheckNetworkAdapterChanged(now []NetworkAdapter, newest []NetworkAdapter) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Name != n2.Name {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckDiskDriveChanged 检测硬盘是否发生变化(按型号对比)
func CheckDiskDriveChanged(now []DiskDrive, newest []DiskDrive) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Caption != n2.Caption {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckDesktopMonitorChanged 检测显示器是否发生变化(按 PNP 设备 ID 对比)
func CheckDesktopMonitorChanged(now []DesktopMonitor, newest []DesktopMonitor) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.PNPDeviceID != n2.PNPDeviceID {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckKeyboardChanged 检测键盘是否发生变化(按描述对比)
func CheckKeyboardChanged(now []Keyboard, newest []Keyboard) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Description != n2.Description {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}
// CheckPointingDeviceChanged 检测指点设备是否发生变化(按描述对比)
func CheckPointingDeviceChanged(now []PointingDevice, newest []PointingDevice) bool {
if len(now) != len(newest) {
return true
}
// 有多个相同硬件时,顺序可能是乱序,对比过的放入索引列表中,防止重复对比
// 例如: now = [1,1,1] newest = [1,2,3] 一定要将已对比的排除掉
index := make(map[int]int)
for _, n1 := range now {
in := false
for i2, n2 := range newest {
if n1.Description != n2.Description {
continue
}
if _, ok := index[i2]; ok {
continue
}
in = true
index[i2] = i2
break
}
if !in {
return true
}
}
return false
}