From 07b72e75ed6c70b0f2fd7929ba5dedcb50aca19b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:49:16 +0000 Subject: [PATCH] Add comprehensive documentation and smoke tests for PowerShell module Co-authored-by: chkr1011 <6939810+chkr1011@users.noreply.github.com> --- Source/MQTTnet.PowerShell/README.md | 375 ++++++++++++++++++++++++ Source/MQTTnet.PowerShell/SmokeTest.ps1 | 17 ++ 2 files changed, 392 insertions(+) create mode 100644 Source/MQTTnet.PowerShell/README.md create mode 100644 Source/MQTTnet.PowerShell/SmokeTest.ps1 diff --git a/Source/MQTTnet.PowerShell/README.md b/Source/MQTTnet.PowerShell/README.md new file mode 100644 index 00000000..3b7fd238 --- /dev/null +++ b/Source/MQTTnet.PowerShell/README.md @@ -0,0 +1,375 @@ +# MQTTnet PowerShell Module + +A PowerShell module for MQTTnet that provides cmdlets for MQTT communication in PowerShell. + +## Features + +- **Full MQTT Protocol Support**: Connect, subscribe, publish, and manage MQTT connections +- **TCP and WebSocket Transports**: Support for both TCP and WebSocket connections +- **TLS/SSL Support**: Secure connections with TLS encryption +- **Async Message Handling**: Register PowerShell ScriptBlocks as message handlers +- **Advanced MQTT Features**: + - Quality of Service (QoS) levels 0, 1, and 2 + - Retained messages + - Last Will and Testament (LWT) + - User properties + - Message expiry intervals + - Response topics + +## Installation + +1. Build the MQTTnet.PowerShell project: + ```powershell + dotnet build Source/MQTTnet.PowerShell/MQTTnet.PowerShell.csproj + ``` + +2. Import the module: + ```powershell + Import-Module ./Source/MQTTnet.PowerShell/bin/Debug/net8.0/MQTTnet.PowerShell.dll + ``` + +## Quick Start + +### Basic Connection and Publish + +```powershell +# Create a new MQTT session +$session = New-MqttSession + +# Connect to a broker +Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 1883 + +# Publish a message +Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello MQTT!" + +# Disconnect and cleanup +Disconnect-MqttSession -Session $session +Remove-MqttSession -Session $session +``` + +### Subscribe and Receive Messages + +```powershell +$session = New-MqttSession +Connect-MqttSession -Session $session -Host "broker.hivemq.com" + +# Subscribe to a topic +Subscribe-MqttTopic -Session $session -Topic "test/demo" + +# Wait for a message (with timeout) +$message = Receive-MqttMessage -Session $session -TimeoutSeconds 30 +Write-Host "Received: $($message.Payload)" + +Disconnect-MqttSession -Session $session +Remove-MqttSession -Session $session +``` + +### Async Message Handler + +```powershell +$session = New-MqttSession +Connect-MqttSession -Session $session -Host "broker.hivemq.com" + +Subscribe-MqttTopic -Session $session -Topic "test/#" + +# Register a message handler +Register-MqttMessageHandler -Session $session -Action { + param($topic, $payload, $message) + Write-Host "Message on $topic : $payload" + Write-Host "QoS: $($message.QoS), Retain: $($message.Retain)" +} + +# Messages will be handled asynchronously +Start-Sleep -Seconds 60 + +Disconnect-MqttSession -Session $session +Remove-MqttSession -Session $session +``` + +## Available Cmdlets + +### Session Management + +#### New-MqttSession +Creates a new MQTT session. + +```powershell +$session = New-MqttSession +``` + +#### Connect-MqttSession +Connects to an MQTT broker with various options. + +**TCP Connection:** +```powershell +Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 1883 +``` + +**TCP with TLS:** +```powershell +Connect-MqttSession -Session $session -Host "broker.hivemq.com" -Port 8883 ` + -UseTls -AllowUntrustedCertificates +``` + +**WebSocket Connection:** +```powershell +Connect-MqttSession -Session $session -WebSocketUri "broker.hivemq.com:8000/mqtt" +``` + +**With Authentication:** +```powershell +Connect-MqttSession -Session $session -Host "broker.hivemq.com" ` + -Username "user" -Password "pass" +``` + +**With Last Will and Testament:** +```powershell +Connect-MqttSession -Session $session -Host "broker.hivemq.com" ` + -WillTopic "status/client" -WillPayload "Offline" -WillQoS 1 -WillRetain +``` + +**Parameters:** +- `Session`: The MQTT session (mandatory) +- `Host`: Broker hostname (for TCP) +- `Port`: Broker port (default: 1883) +- `WebSocketUri`: WebSocket URI (for WebSocket connections) +- `Username`: Username for authentication +- `Password`: Password for authentication +- `ClientId`: Client identifier (auto-generated if not specified) +- `CleanSession`: Use clean session (default: true) +- `UseTls`: Enable TLS encryption +- `AllowUntrustedCertificates`: Allow untrusted certificates +- `KeepAlivePeriod`: Keep-alive period in seconds (default: 15) +- `Timeout`: Connection timeout in seconds (default: 10) +- `WillTopic`: Last Will topic +- `WillPayload`: Last Will payload +- `WillQoS`: Last Will QoS level (0-2) +- `WillRetain`: Retain Last Will message + +#### Get-MqttSessionStatus +Gets the current status of the MQTT session. + +```powershell +$status = Get-MqttSessionStatus -Session $session +Write-Host "Connected: $($status.IsConnected)" +``` + +#### Disconnect-MqttSession +Disconnects from the MQTT broker. + +```powershell +Disconnect-MqttSession -Session $session +``` + +**Parameters:** +- `Session`: The MQTT session (mandatory) +- `Reason`: Disconnect reason code +- `ReasonString`: Human-readable reason +- `SessionExpiryInterval`: Session expiry interval + +#### Remove-MqttSession +Disposes the MQTT session and releases resources. + +```powershell +Remove-MqttSession -Session $session +``` + +### Publishing + +#### Publish-MqttMessage +Publishes a message to a topic. + +**Basic:** +```powershell +Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello" +``` + +**With QoS and Retain:** +```powershell +Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello" ` + -QoS 1 -Retain +``` + +**With User Properties:** +```powershell +$props = @{ + "source" = "PowerShell" + "version" = "1.0" +} +Publish-MqttMessage -Session $session -Topic "test/topic" -Payload "Hello" ` + -UserProperties $props +``` + +**Parameters:** +- `Session`: The MQTT session (mandatory) +- `Topic`: Topic to publish to (mandatory) +- `Payload`: Message payload (mandatory) +- `QoS`: Quality of Service level (0-2, default: 0) +- `Retain`: Retain flag +- `ContentType`: Content type of the payload +- `ResponseTopic`: Response topic for request/response pattern +- `UserProperties`: Hashtable of user properties +- `TopicAlias`: Topic alias +- `MessageExpiryInterval`: Message expiry interval in seconds + +### Subscribing + +#### Subscribe-MqttTopic +Subscribes to a topic. + +```powershell +Subscribe-MqttTopic -Session $session -Topic "test/demo" -QoS 1 +``` + +**Parameters:** +- `Session`: The MQTT session (mandatory) +- `Topic`: Topic filter to subscribe to (mandatory) +- `QoS`: Quality of Service level (0-2, default: 0) +- `NoLocal`: No local flag +- `RetainAsPublished`: Retain as published flag +- `RetainHandling`: Retain handling option +- `SubscriptionIdentifier`: Subscription identifier + +#### Unsubscribe-MqttTopic +Unsubscribes from a topic. + +```powershell +Unsubscribe-MqttTopic -Session $session -Topic "test/demo" +``` + +### Message Handling + +#### Receive-MqttMessage +Waits for and receives a single message. + +```powershell +# Wait indefinitely +$message = Receive-MqttMessage -Session $session + +# Wait with timeout +$message = Receive-MqttMessage -Session $session -TimeoutSeconds 30 +``` + +**Parameters:** +- `Session`: The MQTT session (mandatory) +- `TimeoutSeconds`: Timeout in seconds (0 = no timeout) + +#### Register-MqttMessageHandler +Registers an asynchronous message handler using a PowerShell ScriptBlock. + +```powershell +Register-MqttMessageHandler -Session $session -Action { + param($topic, $payload, $message) + + Write-Host "Topic: $topic" + Write-Host "Payload: $payload" + Write-Host "QoS: $($message.QoS)" + + # Access full message properties + if ($message.UserProperties) { + foreach ($prop in $message.UserProperties) { + Write-Host "Property: $($prop.Name) = $($prop.Value)" + } + } +} +``` + +The ScriptBlock receives three parameters: +1. `$topic`: The message topic (string) +2. `$payload`: The message payload as UTF-8 string +3. `$message`: The full message object with properties: + - `Topic`: Message topic + - `Payload`: Payload as string + - `RawPayload`: Payload as byte array + - `QoS`: Quality of Service level + - `Retain`: Retain flag + - `ContentType`: Content type + - `ResponseTopic`: Response topic + - `UserProperties`: List of user properties + +**Parameters:** +- `Session`: The MQTT session (mandatory) +- `Action`: ScriptBlock to execute for each message (mandatory) + +#### Unregister-MqttMessageHandler +Removes all registered message handlers. + +```powershell +Unregister-MqttMessageHandler -Session $session +``` + +## Advanced Examples + +### Request-Response Pattern + +```powershell +$session = New-MqttSession +Connect-MqttSession -Session $session -Host "broker.hivemq.com" + +# Responder +Subscribe-MqttTopic -Session $session -Topic "request/topic" +Register-MqttMessageHandler -Session $session -Action { + param($topic, $payload, $message) + if ($message.ResponseTopic) { + $response = "Response to: $payload" + Publish-MqttMessage -Session $session -Topic $message.ResponseTopic ` + -Payload $response + } +} + +# Requestor (in another session) +$responseSession = New-MqttSession +Connect-MqttSession -Session $responseSession -Host "broker.hivemq.com" +Subscribe-MqttTopic -Session $responseSession -Topic "response/topic" +Publish-MqttMessage -Session $responseSession -Topic "request/topic" ` + -Payload "Request data" -ResponseTopic "response/topic" + +# Wait for response +$response = Receive-MqttMessage -Session $responseSession -TimeoutSeconds 10 +``` + +### High QoS Publishing + +```powershell +# Publish with QoS 2 (exactly once delivery) +$result = Publish-MqttMessage -Session $session -Topic "critical/data" ` + -Payload "Important data" -QoS 2 + +Write-Host "Publish result: $($result.ReasonCode)" +``` + +### Error Handling in Message Handler + +```powershell +Register-MqttMessageHandler -Session $session -Action { + param($topic, $payload, $message) + try { + # Process message + $data = ConvertFrom-Json $payload + # Do something with data + } + catch { + Write-Host "Error processing message: $_" -ForegroundColor Red + } +} +``` + +## Tips and Best Practices + +1. **Always disconnect cleanly**: Use `Disconnect-MqttSession` before `Remove-MqttSession` +2. **Use appropriate QoS levels**: QoS 0 for best performance, QoS 1 for reliability, QoS 2 for critical data +3. **Handle errors in message handlers**: Wrap handler code in try-catch blocks +4. **Use meaningful client IDs**: Set custom client IDs for debugging +5. **Secure connections**: Use TLS for production environments +6. **Topic design**: Use hierarchical topic structures like `device/sensor/temperature` +7. **Clean session**: Use `-CleanSession:$false` to maintain subscriptions across reconnects + +## Requirements + +- .NET 8.0 or later +- PowerShell 7.0 or later +- MQTTnet library + +## License + +This project is licensed under the MIT License - see the LICENSE file in the repository root for details. diff --git a/Source/MQTTnet.PowerShell/SmokeTest.ps1 b/Source/MQTTnet.PowerShell/SmokeTest.ps1 new file mode 100644 index 00000000..3b642b9a --- /dev/null +++ b/Source/MQTTnet.PowerShell/SmokeTest.ps1 @@ -0,0 +1,17 @@ +# Quick smoke test for MQTTnet PowerShell Module +Import-Module ./bin/Debug/net8.0/MQTTnet.PowerShell.dll + +Write-Host "Testing module load..." -ForegroundColor Yellow +$commands = Get-Command -Module MQTTnet.PowerShell +Write-Host "Found $($commands.Count) cmdlets:" -ForegroundColor Green +$commands | ForEach-Object { Write-Host " - $($_.Name)" -ForegroundColor Cyan } + +Write-Host "`nTesting session creation..." -ForegroundColor Yellow +$session = New-MqttSession +Write-Host "Session created successfully!" -ForegroundColor Green + +Write-Host "`nTesting session cleanup..." -ForegroundColor Yellow +Remove-MqttSession -Session $session +Write-Host "Session removed successfully!" -ForegroundColor Green + +Write-Host "`n✓ All smoke tests passed!" -ForegroundColor Green