using System.Threading.Tasks;
using MQTTnet.Client.Options;
using MQTTnet.Client.Receiving;
using MQTTnet.Extensions.ManagedClient;
static async Task Main(string[] args)
var factory = new MqttFactory();
var clientId = Guid.NewGuid().ToString();
var managedOptions = new ManagedMqttClientOptionsBuilder()
.WithAutoReconnectDelay(TimeSpan.FromSeconds(1))
.WithClientOptions(new MqttClientOptionsBuilder()
.WithTcpServer("iot.cht.com.tw", 2883)
.WithCredentials("USERNAME_IS_YOUR-API-KEY", "PASWORD_IS_YOUR-API-KEY")
using (var client = factory.CreateManagedMqttClient())
client.UseConnectedHandler(async e =>
Console.WriteLine("Connected to MQTT broker");
await client.SubscribeAsync(new MqttTopicFilterBuilder()
.WithTopic("phone-conn/calloutResult/SNKEY_TOKEN")
await client.SubscribeAsync(new MqttTopicFilterBuilder()
.WithTopic("phone-conn/callEvent/SNKEY_TOKEN")
await client.SubscribeAsync(new MqttTopicFilterBuilder()
.WithTopic("phone-conn/callActionDebug/SNKEY_TOKEN")
client.UseDisconnectedHandler(async e =>
Console.WriteLine("Disconnected from MQTT broker. Reconnecting in 1 second...");
await Task.Delay(TimeSpan.FromSeconds(1));
await client.StartAsync(managedOptions);
client.UseApplicationMessageReceivedHandler(async e =>
var message = e.ApplicationMessage;
var payload = Encoding.UTF8.GetString(message.Payload);
Console.WriteLine($"Received message on topic '{message.Topic}': {payload}");
if (message.Topic == "phone-conn/callEvent/SNKEY_TOKEN")
var publishMessage = new MqttApplicationMessageBuilder()
.WithTopic("phone-conn/callAction/SNKEY_TOKEN")
""node"": ""getDTMFNode"",
await client.PublishAsync(publishMessage);
await client.StartAsync(managedOptions);
Console.WriteLine("Press any key to exit");
await client.StopAsync();