PSMQTT.psm1

#Region '.\prefix.ps1' 0
# The content of this file will be prepended to the top of the psm1 module file. This is useful for custom module setup is needed on import.
Add-Type -Path "$PSScriptRoot\Include\M2Mqtt.Net.dll"
#EndRegion '.\prefix.ps1' 3
#Region '.\Private\Assert-FolderExist.ps1' 0
function Assert-FolderExist
{
    <#
    .SYNOPSIS
        Verify and create folder
    .DESCRIPTION
        Verifies that a folder path exists, if not it will create it
    .PARAMETER Path
        Defines the path to be validated
    .EXAMPLE
        'C:\Temp' | Assert-FolderExist
 
        This will verify that the path exists and if it does not the folder will be created
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [string]
        $Path
    )

    process
    {
        $exists = Test-Path -Path $Path -PathType Container
        if (!$exists)
        {
            $null = New-Item -Path $Path -ItemType Directory
        }
    }
}
#EndRegion '.\Private\Assert-FolderExist.ps1' 31
#Region '.\Private\Invoke-GarbageCollect.ps1' 0
function Invoke-GarbageCollect
{
    <#
    .SYNOPSIS
        Calls system.gc collect method. Purpose is mainly for readability.
    .DESCRIPTION
        Calls system.gc collect method. Purpose is mainly for readability.
    .EXAMPLE
        Invoke-GarbageCollect
    #>

    [system.gc]::Collect()
}
#EndRegion '.\Private\Invoke-GarbageCollect.ps1' 13
#Region '.\Public\Connect-MQTTBroker.ps1' 0
function Connect-MQTTBroker
{
    <#
      .DESCRIPTION
      This function establishes a session with the MQTT broker and returns a session object that should then be passed along when using other cmdlets.
 
      .EXAMPLE
      $MQTTSession = Connect-MQTTBroker -Hostname mqttbroker.contoso.com -Port 1234 -Username mqttuser -Password (ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force)
 
      .PARAMETER Hostname
      Defines the hostname of the MQTT Broker to connect to
 
      .PARAMETER Port
      Defines the port of the MQTT Broker. Defaults to 1883.
 
      .PARAMETER Username
      Defines the username to use when connecting to the MQTT broker
 
      .PARAMETER Password
      Defines the password (securestring) to use when connecting to the MQTT Broker
 
      .PARAMETER TLS
      Defines if the connection should be encrypted
 
    #>

    [cmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]
        $Hostname,

        [Parameter()]
        [int]
        $Port,

        [Parameter()]
        [string]
        $Username,

        [Parameter()]
        [securestring]
        $Password,

        [Parameter()]
        [switch]
        $TLS
    )

    #TODO implement additional connection properties like certificate ssl options etc. Different default ports based on

    if (-not $PSBoundParameters['Port'])
    {
        if ($TLS)
        {
            $Port = 1884
        }
        else
        {
            $Port = 1883
        }
    }

    $MqttClient = New-Object -TypeName uPLibrary.Networking.M2Mqtt.MqttClient -ArgumentList $Hostname, $Port, $TLS, $null, $null, 'None'
    $MqttClient.Connect([guid]::NewGuid(), $Username, ($Password.GetNetworkCredentials.Password))

    return $MqttClient
}
#EndRegion '.\Public\Connect-MQTTBroker.ps1' 68
#Region '.\Public\Disconnect-MQTTBroker.ps1' 0
function Disconnect-MQTTBroker
{
    <#
      .DESCRIPTION
      This function will disconnect a MQTTBroker session
 
      .EXAMPLE
      Get-Something -Data 'Get me this text'
 
      .PARAMETER Session
      Defines the MQTTBroker session to use
 
    #>

    [cmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [uPLibrary.Networking.M2Mqtt.MqttClient]
        $Session
    )

    $Session.Disconnect()
}
#EndRegion '.\Public\Disconnect-MQTTBroker.ps1' 23
#Region '.\Public\Send-MQTTMessage.ps1' 0
function Send-MQTTMessage
{
    <#
      .DESCRIPTION
      This function will publish a message to a MQTT topic.
 
      .EXAMPLE
      Get-Something -Data 'Get me this text'
 
      .PARAMETER Session
      Defines the MQTTBroker session to use
 
      .PARAMETER Topic
      Defines the topic to publish the message to
 
      .PARAMETER Payload
      Defines the message as a string
 
    #>

    [cmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [uPLibrary.Networking.M2Mqtt.MqttClient]
        $Session,

        [Parameter(Mandatory)]
        [string]
        $Topic,

        [Parameter()]
        [string]
        $Payload
    )

    try
    {
        $PayloadBytes = [System.Text.Encoding]::UTF8.GetBytes($Payload)
        $Session.Publish($Topic, $PayloadBytes)
        [pscustomobject]@{
            TimeStamp = (Get-Date)
            Topic     = $Topic
            Payload   = $Payload
        }
    }
    catch
    {
        $_
    }
}
#EndRegion '.\Public\Send-MQTTMessage.ps1' 50
#Region '.\Public\Watch-MQTTTopic.ps1' 0
function Watch-MQTTTopic
{
    <#
      .DESCRIPTION
      This function will publish a message to a MQTT topic.
 
      .EXAMPLE
      Watch-MQTTTopic -Session $Session -Topic "topic/#"
 
      .PARAMETER Session
      Defines the MQTTBroker session to use
 
      .PARAMETER Topic
      Defines the topic to publish the message to
 
    #>

    [cmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [uPLibrary.Networking.M2Mqtt.MqttClient]
        $Session,

        [Parameter(Mandatory)]
        [string]
        $Topic
    )

    try
    {
        Register-ObjectEvent -InputObject $Session -EventName MqttMsgPublishReceived -Action {
            [pscustomobject]@{
                TimeStamp = (Get-Date)
                Topic     = $args[1].topic
                Payload   = [System.Text.Encoding]::ASCII.GetString($args[1].Message)
            }
        }

        $Session.Subscribe($Topic, 0)

    }
    catch
    {
        $_
    }
}
#EndRegion '.\Public\Watch-MQTTTopic.ps1' 46
#Region '.\suffix.ps1' 0
# The content of this file will be appended to the top of the psm1 module file. This is useful for custom procesedures after all module functions are loaded.
#EndRegion '.\suffix.ps1' 2