tencent cloud

.NET
Last updated:2026-01-30 15:02:26
.NET
Last updated: 2026-01-30 15:02:26

<0>Feature Overview<0>

MQTTnet is a high-performance .NET MQTT client library that supports MQTT protocol versions 3.1.1 and 5.0. Written entirely in C#, it provides fully-featured MQTT client and server implementations.

Key Features

Supports .NET Framework 4.5.2+ and .NET Core/NET 5+.
Supports both synchronous and asynchronous operations.
Fully supports the MQTT v3.1.1 and v5.0 protocols.
Supports TCP, WebSocket, and TLS/SSL encrypted connections.
Supports advanced features such as shared subscriptions, retained messages, and will messages.

Cloud Resource Preparation

Please refer to the relevant documentation to complete cloud resource preparation and obtain the following information:
MQTT Broker address
Port number (typically 1883 or 8883)
Username and password (if authentication is required)
TLS/SSL Certificates (if using encrypted connections)

Preparing the Environment

System Requirements

.NET 6.0 or later (recommended)
.NET Framework 4.5.2+ or .NET Core 2.0+

Install the MQTTnet SDK

Method 1: Use the NuGet Package Manager
dotnet add package MQTTnet
Method 2: Using Visual Studio
1.1 Right-click the project > "Manage NuGet Packages".
1.2 Search for "MQTTnet".
1.3 Install the latest stable version.
Method 3: Edit the .csproj file.

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MQTTnet" Version="4.3.7.1207" />
</ItemGroup>
</Project>

Example Code

MQTT5
MQTT5 TLS
MQTT3.1.1
MQTT3.1.1 TLS
using System;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet.Formatter;

class MQTT5_TCP_Sample
{
static async Task Main(string[] args)
{
// ============ Connection Configuration ============
String serverUri = "tcp://mqtt-xxx.mqtt.tencenttdmq.com:1883";
String clientId = "QuickStart";
String username = "YOUR_USERNAME";
String password = "YOUR_PASSWORD";
String pubTopic = "home/test";
String[] topicFilters = new String[] { pubTopic, "home/#", "home/+" };
int[] qos = new int[] { 1, 1, 1 };

// Parse the URI
var uri = new Uri(serverUri);
// Create a client.
var factory = new MqttFactory();
var client = factory.CreateMqttClient();

// Configure connection options
var options = new MqttClientOptionsBuilder()
.WithTcpServer(uri.Host, uri.Port)
.WithCredentials(username, password)
.WithClientId(clientId)
.WithProtocolVersion(MqttProtocolVersion.V500)
.WithCleanStart(true)
.Build();

// Message receiving and processing
client.ApplicationMessageReceivedAsync += e =>
{
Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");
return Task.CompletedTask;
};

try
{
// 1. Connect
await client.ConnectAsync(options);
Console.WriteLine("Connected");

// 2. Subscribe
for (int i = 0; i < topicFilters.Length; i++)
{
await client.SubscribeAsync(new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(f => f.WithTopic(topicFilters[i]).WithQualityOfServiceLevel((MqttQualityOfServiceLevel)qos[i]))
.Build());
}
Console.WriteLine("Subscribed");

// 3. Publish
for (int i = 1; i <= 16; i++)
{
await client.PublishAsync(new MqttApplicationMessageBuilder()
.WithTopic(pubTopic)
.WithPayload($"Message #{i}")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
.Build());
await Task.Delay(500);
}
Console.WriteLine("Publish completed");

// 4. Wait to receive
await Task.Delay(2000);

// 5. Disconnect
await client.DisconnectAsync();
Console.WriteLine("Disconnected");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}

using System;
using System.Text;
using System.Threading.Tasks;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet.Formatter;

class MQTT5_TLS_Sample
{
static async Task Main(string[] args)
{

// ============ Connection Configuration ============
String serverUri = "ssl://mqtt-xxx.mqtt.tencenttdmq.com:8883";
String clientId = "QuickStart";
String username = "YOUR_USERNAME";
String password = "YOUR_PASSWORD";
String pubTopic = "home/test";
String[] topicFilters = new String[] { pubTopic, "home/#", "home/+" };
int[] qos = new int[] { 1, 1, 1 };

// CA certificate path (optional, used to verify the server certificate)
String caCertPath = null; // e.g. "/path/to/ca.crt"

// Parse the URI
var uri = new Uri(serverUri);
// Create a client.
var factory = new MqttFactory();
var client = factory.CreateMqttClient();

// Configure connection options (including TLS)
var options = new MqttClientOptionsBuilder()
.WithTcpServer(uri.Host, uri.Port)
.WithCredentials(username, password)
.WithClientId(clientId)
.WithProtocolVersion(MqttProtocolVersion.V500)
.WithCleanStart(true)
.WithTlsOptions(tls =>
{
tls.UseTls();
tls.WithSslProtocols(SslProtocols.Tls12 | SslProtocols.Tls13);
// If a CA certificate is provided, load it
if (!string.IsNullOrEmpty(caCertPath))
{
var caCert = new X509Certificate2(caCertPath);
tls.WithClientCertificates(new[] { caCert });
}
// Certificate verification callback
tls.WithCertificateValidationHandler(context =>
{
var certificate = context.Certificate as X509Certificate2;
// Test environment: accept all certificates
// return true;
// Production environment: strict certificate verification
return ValidateServerCertificate(certificate, context.Chain, context.SslPolicyErrors);
});
})
.Build();

// Message receiving and processing
client.ApplicationMessageReceivedAsync += e =>
{
Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");
return Task.CompletedTask;
};

try
{
// 1. Connect
await client.ConnectAsync(options);
Console.WriteLine("Connected (TLS encrypted)");

// 2. Subscribe
for (int i = 0; i < topicFilters.Length; i++)
{
await client.SubscribeAsync(new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(f => f.WithTopic(topicFilters[i]).WithQualityOfServiceLevel((MqttQualityOfServiceLevel)qos[i]))
.Build());
}
Console.WriteLine("Subscribed");

// 3. Publish
for (int i = 1; i <= 16; i++)
{
await client.PublishAsync(new MqttApplicationMessageBuilder()
.WithTopic(pubTopic)
.WithPayload($"Message #{i}")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
.Build());
await Task.Delay(500);
}
Console.WriteLine("Publish completed");

// 4. Wait to receive
await Task.Delay(2000);

// 5. Disconnect
await client.DisconnectAsync();
Console.WriteLine("Disconnected");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}

/// <summary>
/// Verify server certificate
/// </summary>
static bool ValidateServerCertificate(X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// If there is no error, proceed directly
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}

// If the certificate is null, reject
if (certificate == null)
{
Console.WriteLine("Certificate verification failed: certificate is null");
return false;
}

// 1. Check certificate validity period
DateTime now = DateTime.Now;
if (now < certificate.NotBefore || now > certificate.NotAfter)
{
Console.WriteLine($"Certificate verification failed: the certificate has expired or is not yet valid (Validity period: {certificate.NotBefore} - {certificate.NotAfter})");
return false;
}

// 2. Check certificate chain
if (chain != null && chain.ChainStatus.Length > 0)
{
foreach (var status in chain.ChainStatus)
{
// Ignore offline revocation check errors (optional)
if (status.Status == X509ChainStatusFlags.RevocationStatusUnknown ||
status.Status == X509ChainStatusFlags.OfflineRevocation)
{
continue;
}
if (status.Status != X509ChainStatusFlags.NoError)
{
Console.WriteLine($"Certificate verification failed: {status.StatusInformation}");
return false;
}
}
}

// 3. Check certificate subject name (Optional, depending on actual requirements)
// string expectedSubject = "CN=*.mqtt.tencenttdmq.com";
// if (!certificate.Subject.Contains(expectedSubject))
// {
// Console.WriteLine($"Certificate verification failed: Subject mismatch (Expected: {expectedSubject}, Actual: {certificate.Subject})");
// return false;
// }

Console.WriteLine("Certificate verification passed");
return true;
}
}



using System;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet.Formatter;

class MQTT311_TCP_Sample
{
static async Task Main(string[] args)
{
// ============ Connection Configuration ============
String serverUri = "tcp://mqtt-xxx.mqtt.tencenttdmq.com:1883";
String clientId = "QuickStart";
String username = "YOUR_USERNAME";
String password = "YOUR_PASSWORD";
String pubTopic = "home/test";
String[] topicFilters = new String[] { pubTopic, "home/#", "home/+" };
int[] qos = new int[] { 1, 1, 1 };

// Parse the URI
var uri = new Uri(serverUri);
// Create a client.
var factory = new MqttFactory();
var client = factory.CreateMqttClient();

// Configure connection options
var options = new MqttClientOptionsBuilder()
.WithTcpServer(uri.Host, uri.Port)
.WithCredentials(username, password)
.WithClientId(clientId)
.WithProtocolVersion(MqttProtocolVersion.V311)
.WithCleanSession(true)
.Build();

// Message receiving and processing
client.ApplicationMessageReceivedAsync += e =>
{
Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");
return Task.CompletedTask;
};

try
{
// 1. Connect
await client.ConnectAsync(options);
Console.WriteLine("Connected");

// 2. Subscribe
for (int i = 0; i < topicFilters.Length; i++)
{
await client.SubscribeAsync(new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(f => f.WithTopic(topicFilters[i]).WithQualityOfServiceLevel((MqttQualityOfServiceLevel)qos[i]))
.Build());
}
Console.WriteLine("Subscribed");

// 3. Publish
for (int i = 1; i <= 16; i++)
{
await client.PublishAsync(new MqttApplicationMessageBuilder()
.WithTopic(pubTopic)
.WithPayload($"Message #{i}")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
.Build());
await Task.Delay(500);
}
Console.WriteLine("Publish completed");

// 4. Wait to receive
await Task.Delay(2000);

// 5. Disconnect
await client.DisconnectAsync();
Console.WriteLine("Disconnected");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}


using System;
using System.Text;
using System.Threading.Tasks;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet.Formatter;

class MQTT311_TLS_Sample
{
static async Task Main(string[] args)
{

// ============ Connection Configuration ============
String serverUri = "ssl://mqtt-xxx.mqtt.tencenttdmq.com:8883";
String clientId = "QuickStart";
String username = "YOUR_USERNAME";
String password = "YOUR_PASSWORD";
String pubTopic = "home/test";
String[] topicFilters = new String[] { pubTopic, "home/#", "home/+" };
int[] qos = new int[] { 1, 1, 1 };

// CA certificate path (optional, used to verify the server certificate)
String caCertPath = null; // e.g. "/path/to/ca.crt"

// Parse the URI
var uri = new Uri(serverUri);
// Create a client.
var factory = new MqttFactory();
var client = factory.CreateMqttClient();

// Configure connection options (including TLS)
var options = new MqttClientOptionsBuilder()
.WithTcpServer(uri.Host, uri.Port)
.WithCredentials(username, password)
.WithClientId(clientId)
.WithProtocolVersion(MqttProtocolVersion.V311)
.WithCleanSession(true)
.WithTlsOptions(tls =>
{
tls.UseTls();
tls.WithSslProtocols(SslProtocols.Tls12 | SslProtocols.Tls13);
// If a CA certificate is provided, load it
if (!string.IsNullOrEmpty(caCertPath))
{
var caCert = new X509Certificate2(caCertPath);
tls.WithClientCertificates(new[] { caCert });
}
// Certificate verification callback
tls.WithCertificateValidationHandler(context =>
{
var certificate = context.Certificate as X509Certificate2;
// Test environment: accept all certificates
// return true;
// Production environment: strict certificate verification
return ValidateServerCertificate(certificate, context.Chain, context.SslPolicyErrors);
});
})
.Build();

// Message receiving and processing
client.ApplicationMessageReceivedAsync += e =>
{
Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");
return Task.CompletedTask;
};

try
{
// 1. Connect
await client.ConnectAsync(options);
Console.WriteLine("Connected (TLS encrypted)");

// 2. Subscribe
for (int i = 0; i < topicFilters.Length; i++)
{
await client.SubscribeAsync(new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter(f => f.WithTopic(topicFilters[i]).WithQualityOfServiceLevel((MqttQualityOfServiceLevel)qos[i]))
.Build());
}
Console.WriteLine("Subscribed");

// 3. Publish
for (int i = 1; i <= 16; i++)
{
await client.PublishAsync(new MqttApplicationMessageBuilder()
.WithTopic(pubTopic)
.WithPayload($"Message #{i}")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
.Build());
await Task.Delay(500);
}
Console.WriteLine("Publish completed");

// 4. Wait to receive
await Task.Delay(2000);

// 5. Disconnect
await client.DisconnectAsync();
Console.WriteLine("Disconnected");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}

/// <summary>
/// Verify server certificate
/// </summary>
static bool ValidateServerCertificate(X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// If there is no error, proceed directly
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}

// If the certificate is null, reject
if (certificate == null)
{
Console.WriteLine("Certificate verification failed: certificate is null");
return false;
}

// 1. Check certificate validity period
DateTime now = DateTime.Now;
if (now < certificate.NotBefore || now > certificate.NotAfter)
{
Console.WriteLine($"Certificate verification failed: the certificate has expired or is not yet valid (Validity period: {certificate.NotBefore} - {certificate.NotAfter})");
return false;
}

// 2. Check certificate chain
if (chain != null && chain.ChainStatus.Length > 0)
{
foreach (var status in chain.ChainStatus)
{
// Ignore offline revocation check errors (optional)
if (status.Status == X509ChainStatusFlags.RevocationStatusUnknown ||
status.Status == X509ChainStatusFlags.OfflineRevocation)
{
continue;
}
if (status.Status != X509ChainStatusFlags.NoError)
{
Console.WriteLine($"Certificate verification failed: {status.StatusInformation}");
return false;
}
}
}

// 3. Check certificate subject name (Optional, depending on actual requirements)
// string expectedSubject = "CN=*.mqtt.tencenttdmq.com";
// if (!certificate.Subject.Contains(expectedSubject))
// {
// Console.WriteLine($"Certificate verification failed: Subject mismatch (Expected: {expectedSubject}, Actual: {certificate.Subject})");
// return false;
// }

Console.WriteLine("Certificate verification passed");
return true;
}
}




Parameter Description

Parameter
Description
ADDRESS
broker connection address can be copied from the Basic Information > Access Information section of the target cluster in the console, as shown below. Format: mqtt-xxx-gz.mqtt.qcloud.tencenttdmq.com:1883.
CLIENTID
Client ID is obtained from the Client Management page in the cluster details page on the console.
USERNAME
User name can be obtained on the Authentication Management page in the console.
PASSWORD
Password can be obtained on the Authentication Management page in the console.
Was this page helpful?
You can also Contact Sales or Submit a Ticket for help.
Yes
No

Feedback