91 lines
2.5 KiB
PowerShell
91 lines
2.5 KiB
PowerShell
param(
|
|
[string]$Port = "COM3",
|
|
[int]$BaudRate = 115200,
|
|
[double]$IntervalSeconds = 1
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
function Get-Percent {
|
|
param([double]$Value)
|
|
if ([double]::IsNaN($Value) -or [double]::IsInfinity($Value)) {
|
|
return 0
|
|
}
|
|
$rounded = [math]::Round($Value)
|
|
if ($rounded -lt 0) { return 0 }
|
|
if ($rounded -gt 100) { return 100 }
|
|
return [int]$rounded
|
|
}
|
|
|
|
function Get-SystemMetricLine {
|
|
$cpu = Get-CimInstance Win32_PerfFormattedData_PerfOS_Processor |
|
|
Where-Object { $_.Name -eq "_Total" } |
|
|
Select-Object -First 1
|
|
|
|
$os = Get-CimInstance Win32_OperatingSystem
|
|
$totalMemory = [double]$os.TotalVisibleMemorySize
|
|
$freeMemory = [double]$os.FreePhysicalMemory
|
|
$memoryPercent = if ($totalMemory -gt 0) {
|
|
(($totalMemory - $freeMemory) / $totalMemory) * 100
|
|
} else {
|
|
0
|
|
}
|
|
|
|
$disk = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'"
|
|
$diskPercent = if ($disk -and [double]$disk.Size -gt 0) {
|
|
(([double]$disk.Size - [double]$disk.FreeSpace) / [double]$disk.Size) * 100
|
|
} else {
|
|
0
|
|
}
|
|
|
|
$network = Get-CimInstance Win32_PerfFormattedData_Tcpip_NetworkInterface |
|
|
Where-Object {
|
|
$_.Name -notmatch "Loopback|isatap|Teredo" -and
|
|
([double]$_.BytesReceivedPersec -gt 0 -or [double]$_.BytesSentPersec -gt 0)
|
|
}
|
|
|
|
$rxBytes = 0.0
|
|
$txBytes = 0.0
|
|
foreach ($adapter in $network) {
|
|
$rxBytes += [double]$adapter.BytesReceivedPersec
|
|
$txBytes += [double]$adapter.BytesSentPersec
|
|
}
|
|
|
|
$cpuPercent = Get-Percent ([double]$cpu.PercentProcessorTime)
|
|
$memPercent = Get-Percent $memoryPercent
|
|
$diskUsedPercent = Get-Percent $diskPercent
|
|
$rxKbps = [int][math]::Max(0, [math]::Round($rxBytes / 1024))
|
|
$txKbps = [int][math]::Max(0, [math]::Round($txBytes / 1024))
|
|
|
|
return "SYS,$cpuPercent,$memPercent,$diskUsedPercent,$rxKbps,$txKbps"
|
|
}
|
|
|
|
$serial = [System.IO.Ports.SerialPort]::new(
|
|
$Port,
|
|
$BaudRate,
|
|
[System.IO.Ports.Parity]::None,
|
|
8,
|
|
[System.IO.Ports.StopBits]::One
|
|
)
|
|
$serial.NewLine = "`n"
|
|
$serial.DtrEnable = $false
|
|
$serial.RtsEnable = $false
|
|
$serial.WriteTimeout = 1000
|
|
|
|
try {
|
|
$serial.Open()
|
|
Write-Host "Streaming PC metrics to $Port at $BaudRate baud. Press Ctrl+C to stop."
|
|
|
|
while ($true) {
|
|
$line = Get-SystemMetricLine
|
|
$serial.WriteLine($line)
|
|
Write-Host $line
|
|
Start-Sleep -Seconds $IntervalSeconds
|
|
}
|
|
}
|
|
finally {
|
|
if ($serial.IsOpen) {
|
|
$serial.Close()
|
|
}
|
|
}
|