dotnet add package MQTTnet
<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>
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 URIvar uri = new Uri(serverUri);// Create a client.var factory = new MqttFactory();var client = factory.CreateMqttClient();// Configure connection optionsvar options = new MqttClientOptionsBuilder().WithTcpServer(uri.Host, uri.Port).WithCredentials(username, password).WithClientId(clientId).WithProtocolVersion(MqttProtocolVersion.V500).WithCleanStart(true).Build();// Message receiving and processingclient.ApplicationMessageReceivedAsync += e =>{Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");return Task.CompletedTask;};try{// 1. Connectawait client.ConnectAsync(options);Console.WriteLine("Connected");// 2. Subscribefor (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. Publishfor (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 receiveawait Task.Delay(2000);// 5. Disconnectawait 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 URIvar 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 itif (!string.IsNullOrEmpty(caCertPath)){var caCert = new X509Certificate2(caCertPath);tls.WithClientCertificates(new[] { caCert });}// Certificate verification callbacktls.WithCertificateValidationHandler(context =>{var certificate = context.Certificate as X509Certificate2;// Test environment: accept all certificates// return true;// Production environment: strict certificate verificationreturn ValidateServerCertificate(certificate, context.Chain, context.SslPolicyErrors);});}).Build();// Message receiving and processingclient.ApplicationMessageReceivedAsync += e =>{Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");return Task.CompletedTask;};try{// 1. Connectawait client.ConnectAsync(options);Console.WriteLine("Connected (TLS encrypted)");// 2. Subscribefor (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. Publishfor (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 receiveawait Task.Delay(2000);// 5. Disconnectawait 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 directlyif (sslPolicyErrors == SslPolicyErrors.None){return true;}// If the certificate is null, rejectif (certificate == null){Console.WriteLine("Certificate verification failed: certificate is null");return false;}// 1. Check certificate validity periodDateTime 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 chainif (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 URIvar uri = new Uri(serverUri);// Create a client.var factory = new MqttFactory();var client = factory.CreateMqttClient();// Configure connection optionsvar options = new MqttClientOptionsBuilder().WithTcpServer(uri.Host, uri.Port).WithCredentials(username, password).WithClientId(clientId).WithProtocolVersion(MqttProtocolVersion.V311).WithCleanSession(true).Build();// Message receiving and processingclient.ApplicationMessageReceivedAsync += e =>{Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");return Task.CompletedTask;};try{// 1. Connectawait client.ConnectAsync(options);Console.WriteLine("Connected");// 2. Subscribefor (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. Publishfor (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 receiveawait Task.Delay(2000);// 5. Disconnectawait 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 URIvar 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 itif (!string.IsNullOrEmpty(caCertPath)){var caCert = new X509Certificate2(caCertPath);tls.WithClientCertificates(new[] { caCert });}// Certificate verification callbacktls.WithCertificateValidationHandler(context =>{var certificate = context.Certificate as X509Certificate2;// Test environment: accept all certificates// return true;// Production environment: strict certificate verificationreturn ValidateServerCertificate(certificate, context.Chain, context.SslPolicyErrors);});}).Build();// Message receiving and processingclient.ApplicationMessageReceivedAsync += e =>{Console.WriteLine($"Received message: {e.ApplicationMessage.Topic} -> {Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment)}");return Task.CompletedTask;};try{// 1. Connectawait client.ConnectAsync(options);Console.WriteLine("Connected (TLS encrypted)");// 2. Subscribefor (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. Publishfor (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 receiveawait Task.Delay(2000);// 5. Disconnectawait 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 directlyif (sslPolicyErrors == SslPolicyErrors.None){return true;}// If the certificate is null, rejectif (certificate == null){Console.WriteLine("Certificate verification failed: certificate is null");return false;}// 1. Check certificate validity periodDateTime 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 chainif (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 |
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. |
Feedback