适用场景:企业内有UPS给网络设备供电,笔记本连接墙插市电,检测笔记本是直流电还是交流电来知道市电中断,可以结合邮箱、企业微信、飞书相关接口实现市电告警
import time
import ctypes
from ctypes import wintypes
def getACstatue():
class SYSTEM_POWER_STATUS(ctypes.Structure):
_fields_ = [
('ACLineStatus', wintypes.BYTE),
]
SYSTEM_POWER_STATUS_P = ctypes.POINTER(SYSTEM_POWER_STATUS)
GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus
GetSystemPowerStatus.argtypeS = [SYSTEM_POWER_STATUS_P]
GetSystemPowerStatus.restype = wintypes.BOOL
status = SYSTEM_POWER_STATUS()
if not GetSystemPowerStatus(ctypes.pointer(status)):
raise ctypes.WinError()
# 0为直流电市电断开、1为交流电市电无异常
print('ACLineStatus', status.ACLineStatus)
return ('ACLineStatus', status.ACLineStatus)
getACstatue()
可以结合prometheus exporter推送告警,代码如下
import time
from prometheus_client import Gauge, start_http_server
import ctypes
from ctypes import wintypes
# 定义和注册指标
random_value = Gauge(‘PowerMonitor’, ‘直流电/交流电’)
def getACstatue():
class SYSTEM_POWER_STATUS(ctypes.Structure):
_fields_ = [
(‘ACLineStatus’, wintypes.BYTE),
]
SYSTEM_POWER_STATUS_P = ctypes.POINTER(SYSTEM_POWER_STATUS)
GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus
GetSystemPowerStatus.argtypeS = [SYSTEM_POWER_STATUS_P]
GetSystemPowerStatus.restype = wintypes.BOOL
status = SYSTEM_POWER_STATUS()
if not GetSystemPowerStatus(ctypes.pointer(status)):
raise ctypes.WinError()
# print(‘ACLineStatus’, status.ACLineStatus)
# 0为直流电市电断开、1为交流电市电无异常
random_value.set(status.ACLineStatus)
return (‘ACLineStatus’, status.ACLineStatus)
# 启动 HTTP 服务器,暴露 metrics 接口
start_http_server(8000)
while True:
getACstatue()
# 等待 5 秒钟,再次进行收集
time.sleep(5)
import psutil
power_info = psutil.sensors_battery()
print(power_info)
print(power_info.power_plugged)
go语言检测Windows电脑是直流供电还是交流供电代码
package main
import (
“fmt”
“syscall”
“unsafe”
)
var (
modkernel32 = syscall.NewLazyDLL(“kernel32.dll”)
procGetSystemPowerStatus = modkernel32.NewProc(“GetSystemPowerStatus”)
)
// SYSTEM_POWER_STATUS 结构体用于存储电源状态信息
type SYSTEM_POWER_STATUS struct {
ACLineStatus byte // 电源状态,1表示AC电源,255表示直流电源
BatteryFlag byte
BatteryLifePercent byte
Reserved1 byte
}
func main() {
var ps SYSTEM_POWER_STATUS
r, _, err := procGetSystemPowerStatus.Call(uintptr(unsafe.Pointer(&ps)))
if r == 0 {
fmt.Println(“调用GetSystemPowerStatus失败:”, err)
return
}
//print(ps.ACLineStatus)
switch ps.ACLineStatus {
case 1:
fmt.Println(“电脑正在使用交流电(AC)”)
case 0:
fmt.Println(“电脑正在使用直流电(DC)”)
default:
fmt.Println(“电源状态未知”)
}
}