PowerShell 技能连载 - 物联网设备状态监控实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
function Start-EdgeDeviceMonitor {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$BrokerUrl,

[Parameter(Mandatory=$true)]
[string[]]$DeviceTopics
)

Add-Type -Path "MQTTnet.dll"
$factory = [MQTTnet.MqttFactory]::new()
$client = $factory.CreateMqttClient()

$report = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
ConnectedDevices = @()
HealthStatus = @()
}

$clientOptions = [MQTTnet.Client.MqttClientOptionsBuilder]::new()
.WithTcpServer($BrokerUrl)
.Build()

$client.ConnectAsync($clientOptions).Wait()

$DeviceTopics | ForEach-Object {
$client.SubscribeAsync([MQTTnet.MqttTopicFilterBuilder]::new()
.WithTopic($_)
.Build()).Wait()

$client.ApplicationMessageReceivedHandler = [MQTTnet.MqttApplicationMessageReceivedHandler]{
param($e)
$payload = [System.Text.Encoding]::UTF8.GetString($e.ApplicationMessage.Payload)

$report.ConnectedDevices += [PSCustomObject]@{
DeviceID = $e.ApplicationMessage.Topic.Split('/')[-1]
LastSeen = Get-Date
Telemetry = $payload | ConvertFrom-Json
}

if ($payload -match '"status":"error"') {
$report.HealthStatus += [PSCustomObject]@{
DeviceID = $e.ApplicationMessage.Topic.Split('/')[-1]
ErrorCode = ($payload | ConvertFrom-Json).errorCode
Recommendation = "检查设备固件版本并重启服务"
}
}
}
}

Register-ObjectEvent -InputObject $client -EventName ApplicationMessageReceived -Action {
$global:report = $eventArgs | ForEach-Object { $_.UserEventArgs }
}

$report | Export-Csv -Path "$env:TEMP/EdgeDeviceReport_$(Get-Date -Format yyyyMMdd).csv"
return $report
}

核心功能

  1. MQTT协议设备状态实时订阅
  2. 边缘计算设备健康状态分析
  3. 异常事件自动化预警
  4. CSV报告持续输出

典型应用场景

  • 智能制造产线监控
  • 智慧城市基础设施管理
  • 农业物联网传感器网络
  • 能源设备远程诊断