Need help with mqtt?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

264 Stars 69 Forks MIT License 420 Commits 34 Opened issues


Minimalist and intuitive MQTT broker and client written entirely in C#

Services available


Need anything else?

Contributors list


Code name: Hermes (messenger of the Greek gods)

Build Status Client Downloads Server Downloads

MQTT is a Client Server publish/subscribe messaging transport protocol, designed to be lightweight, open and simple to use and implement. This makes it suitable for Internet of Things (IoT) messaging, machine to machine communication, mobile devices, etc.

System.Net.Mqtt is a lightweight and simple implementation of the MQTT protocol version 3.1.1, written entirely in C# and divided in two libraries: System.Net.Mqtt and System.Net.Mqtt.Server.

The foundation of the System.Net.Mqtt libraries is to provide an intuitive and very easy to use API, hiding most of the protocol concepts that don't need to be exposed, letting consumers just focus on the main protocol operations, which are: CONNECT, SUBSCRIBE, UNSUBSCRIBE, PUBLISH, DISCONNECT.

All the protocol packets acknowledgement happens under the hood in an asynchronous way, adding a level of simplicity reduced to just awaiting the client method calls in a native .net style without worring about low level protocol concepts.

Also, the reception of the subscribed messages is handled using an IObservable implementation, which makes the stream of messages to receive more natural and aligned to the concept of Publish/Subscribe on which the protocol already relies. Finally, this allows subscribers of the received messages to query and filter them using Reactive Extensions, which adds an extra level of flexibility and control over the messages processing.

Usage samples

  • Creating and connecting an MQTT client with default options:

    var configuration = new MqttConfiguration();    
    var client = await MqttClient.CreateAsync("", configuration);
    var sessionState = await client.ConnectAsync (new `MqttClientCredentials`(clientId: "foo"));

    The ConnectAsync method returns once the CONNACK packet has been received from the Server.

    The session state value contains information about if the session has been re used or cleared

  • Creating and connecting an MQTT client specifying configuration and clean session:

    var configuration = new MqttConfiguration {
        BufferSize = 128 * 1024,
        Port = 55555,
        KeepAliveSecs = 10,
        WaitTimeoutSecs = 2,
        MaximumQualityOfService = MqttQualityOfService.AtMostOnce,  
        AllowWildcardsInTopicFilters = true };
    var client = await MqttClient.CreateAsync("", configuration);
    var sessionState = await client.ConnectAsync (new `MqttClientCredentials`(clientId: "foo"), cleanSession: true);

    The ConnectAsync method returns once the CONNACK packet has been received from the Server

  • Subscribing and unsubscribing to topics:

    await client.SubscribeAsync("foo/bar/topic1", MqttQualityOfService.AtMostOnce); //QoS0
    await client.SubscribeAsync("foo/bar/topic2", MqttQualityOfService.AtLeastOnce); //QoS1
    await client.SubscribeAsync("foo/bar/topic3", MqttQualityOfService.ExactlyOnce); //QoS2

    The SubscribeAsync method returns once the SUBACK packet has been received from the Server

    await client.UnsubscribeAsync("foo/bar/topic1");
    await client.UnsubscribeAsync("foo/bar/topic2");
    await client.UnsubscribeAsync("foo/bar/topic3");

    The UnsubscribeAsync method returns once the UNSUBACK packet has been received from the Server

  • Reception of messages from the subscribed topics:

        .Subscribe(msg => Console.WriteLine($"Message received in topic {msg.Topic}"));

    client .MessageStream .Where(msg => msg.Topic == "foo/bar/topic2") .Subscribe(msg => Console.WriteLine($"Message received in topic {msg.Topic}"));`

  • Publishing messages to topics:

    var message1 = new MqttApplicationMessage("foo/bar/topic1", Encoding.UTF8.GetBytes("Foo Message 1"));
    var message2 = new MqttApplicationMessage("foo/bar/topic2", Encoding.UTF8.GetBytes("Foo Message 2"));
    var message3 = new MqttApplicationMessage("foo/bar/topic3", Encoding.UTF8.GetBytes("Foo Message 3"));

    await client.PublishAsync(message1, MqttQualityOfService.AtMostOnce); //QoS0 await client.PublishAsync(message2, MqttQualityOfService.AtLeastOnce); //QoS1 await client.PublishAsync(message3, MqttQualityOfService.ExactlyOnce); //QoS2

    The PublishAsync method returns once the corresponding ACK packet has been received from the Server, based on the configured QoS

  • Disconnecting an MQTT client:

    await client.DisconnectAsync();


System.Net.Mqtt and System.Net.Mqtt.Server are distributed as [NuGet][1] packages and can be installed from Visual Studio by searching for the "System.Net.Mqtt" packages or by running the following commands from the Package Manager Console:

Client Package:

Install-Package System.Net.Mqtt -Pre

Server Package:

Install-Package System.Net.Mqtt.Server -Pre

Current package dependencies:

System.Diagnostics.Tracer (>= 2.0.4) System.Net.Sockets (>= 4.1.0) System.Reactive (>= 3.0.0) System.Runtime.Serialization.Primitives (>= 4.1.1)


For more specific information about the MQTT protocol, please see the latest Oasis spec.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.