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 }
|
核心功能:
- MQTT协议设备状态实时订阅
- 边缘计算设备健康状态分析
- 异常事件自动化预警
- CSV报告持续输出
典型应用场景:
- 智能制造产线监控
- 智慧城市基础设施管理
- 农业物联网传感器网络
- 能源设备远程诊断