tencent cloud

TDMQ for MQTT

Release Notes and Announcements
Release Notes
Product Introduction
TDMQ Product Series Introduction and Selection
What Is TDMQ for MQTT
Scenarios
Technical Architecture
Product series
MQTT Protocol Compatibility Notes
Comparison with Apache
High Availability
Product Constraints and Usage Quota
Basic Concepts
Supported Regions
Billing
Billing Overview
Renewal Instructions
Viewing Consumption Details
Overdue Payment Instructions
Refund
Getting Started
Guide for Getting Started
Preparations
Public Network Access
VPC Network Access
User Guide
Usage Process Guide
Configuring Account Permission
Creating a Cluster
Managing Topic
Connecting to the Cluster
Querying Messages
Managing Client
Managing a Cluster
Viewing Monitoring Metrics and Configuring Alarm Policies
Data Integration
Integrating Data Into SCF
Integrating Data Into CKafka
Integrating Data into RocketMQ
Development Guide
MQTT 5 Advanced Features
Data Plane HTTP API Description
Quota and Flow Control Mechanism Description
Configuring a Custom Domain Name
Configuring SQL Filtering
Configuring Point-to-Point Subscription
MQTT over QUIC
Managing Client Subscription
Message Enhancement Rule
Use Cases
Must-Knows for MQTT Client Development
Observability
Topic and Wildcard Subscriptions
​​API Reference
History
Introduction
API Category
Making API Requests
Cluster APIs
Topic APIs
Authorization Policy APIs
User APIs
Client APIs
Message Enhancement Rule APIs
Message APIs
Data Types
Error Codes
SDK Reference
Access Point Format
Java SDK
C SDK
Javascript/Node.JS/Mini Program
Go SDK
iOS SDK
JavaScript SDK
Dart SDK
Python SDK
.NET
Security and Compliance
Permission Management
FAQs
Related Agreement
Privacy Policy
Data Privacy And Security Agreement
TDMQ for MQTT Service Level Agreement
Contact Us

.NET

Focus Mode
Font Size
Last updated: 2026-04-01 16:37:52

Feature Overview

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 feature-rich 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 certificate (if using encrypted connections)

Environment Preparation

System Requirements

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

Installing the MQTTnet SDK

Method 1: using the NuGet package manager
dotnet add package MQTTnet
Method 2: using Visual Studio
1.1 Right-click Project > Manage NuGet Packages.
1.2 Search for "MQTTnet".
1.3 Install the latest stable version.
Method 3: editing 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>

Sample 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("Published");

// 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("Published");

// 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 the 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: The certificate is null");
return false;
}

// 1. Check the 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 the 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 the certificate subject name (optional, based 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("Published");

// 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("Published");

// 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 the 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: The certificate is null");
return false;
}

// 1. Check the 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 the 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 the certificate subject name (optional, based 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, 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, obtained from the Client Management page on the cluster details page in the console.
USERNAME
Username, obtained on the Authentication Management page in the console.
PASSWORD
Password, obtained on the Authentication Management page in the console.

Help and Support

Was this page helpful?

Help us improve! Rate your documentation experience in 5 mins.

Feedback