如何使用Golang开发类似hwmoniter的工具

如何使用Golang开发类似hwmoniter的工具 我无法获取电压或温度等数据。 我需要帮助。

%EC%A0%9C%EB%AA%A9%20%EC%97%86%EC%9D%8C

2 回复

我认为你可以使用Sigar来收集这些信息。

它提供了Go语言绑定

GitHub

hyperic/sigar

头像

hyperic/sigar

系统信息收集和报告器。通过在GitHub上创建账户来为hyperic/sigar开发做贡献。

更多关于如何使用Golang开发类似hwmoniter的工具的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中开发类似hwmonitor的工具,需要直接读取系统硬件监控数据。这通常涉及访问特定的系统文件或使用操作系统提供的接口。以下是一个基础示例,展示如何读取Linux系统中的温度数据(通常位于/sys/class/thermal目录下)。注意:此方法依赖于Linux的sysfs文件系统,其他操作系统(如Windows)可能需要不同的方法,例如调用WMI或系统API。

示例代码:读取CPU温度

假设你的系统在/sys/class/thermal/thermal_zone0/temp文件中提供CPU温度数据(以毫摄氏度为单位),你可以使用以下Go代码读取它:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "strconv"
    "strings"
)

// readTemperature 从指定路径读取温度值并转换为摄氏度
func readTemperature(path string) (float64, error) {
    data, err := ioutil.ReadFile(path)
    if err != nil {
        return 0, fmt.Errorf("无法读取温度文件: %v", err)
    }
    
    // 去除换行符并转换为字符串
    tempStr := strings.TrimSpace(string(data))
    tempMilliC, err := strconv.Atoi(tempStr)
    if err != nil {
        return 0, fmt.Errorf("无效的温度数据: %v", err)
    }
    
    // 转换为摄氏度(除以1000)
    tempC := float64(tempMilliC) / 1000.0
    return tempC, nil
}

func main() {
    tempPath := "/sys/class/thermal/thermal_zone0/temp" // 常见路径,可能因系统而异
    temp, err := readTemperature(tempPath)
    if err != nil {
        log.Fatalf("错误: %v", err)
    }
    fmt.Printf("当前CPU温度: %.2f°C\n", temp)
}

扩展说明

  • 硬件数据源:在Linux中,硬件监控数据通常通过sysfs(位于/sys/class/sys/devices)或procfs(如/proc/cpuinfo)提供。例如:

    • 电压数据可能位于/sys/class/hwmon/hwmon*/in*_input文件中。
    • 风扇速度可能位于/sys/class/hwmon/hwmon*/fan*_input
  • 跨平台支持:对于Windows,你可能需要使用github.com/StackExchange/wmi包通过WMI查询硬件数据。例如,读取CPU温度:

    package main
    
    import (
        "fmt"
        "log"
        "github.com/StackExchange/wmi"
    )
    
    type Win32_TemperatureProbe struct {
        CurrentReading int64
    }
    
    func main() {
        var temps []Win32_TemperatureProbe
        query := "SELECT CurrentReading FROM Win32_TemperatureProbe"
        err := wmi.Query(query, &temps)
        if err != nil {
            log.Fatalf("WMI查询失败: %v", err)
        }
        for _, temp := range temps {
            fmt.Printf("温度读数: %d\n", temp.CurrentReading)
        }
    }
    

    注意:WMI数据可能因硬件和驱动而异,并非所有系统都支持温度探头。

  • 错误处理:在实际工具中,应添加更多错误检查,例如验证文件路径是否存在或处理权限问题。如果无法获取数据,请检查系统文档或使用ls /sys/class/hwmon/等命令探索可用传感器。

运行示例前,请确保Go环境已设置,并使用go run main.go测试。如果遇到权限错误,可能需要以root身份运行。

回到顶部