您如何将MQTT消息打印到控制台?

发布于 2025-01-31 18:52:02 字数 1669 浏览 4 评论 0原文

我有一个非常简单的C#命令行应用程序,该应用程序连接到MQTT服务器并将消息打印到控制台。

using MQTTnet;
using MQTTnet.Client.Options;
using MQTTnet.Extensions.ManagedClient;
using System.Text;

var options = new MqttClientOptionsBuilder()
    .WithTcpServer(MqttConfig.Server, MqttConfig.Port)
    .WithCredentials(MqttConfig.User, MqttConfig.Password)
    .WithClientId("MqttTest")
    .WithCleanSession()
    .Build();

var MqttClient = new MqttFactory().CreateMqttClient();

var cancellationToken = new CancellationToken();

var subscribeOptions = new MQTTnet.Client.Subscribing.MqttClientSubscribeOptions();
subscribeOptions.TopicFilters.Add(new MqttTopicFilter { Topic = MqttConfig.Topic });

MqttClient.ConnectAsync(options, cancellationToken);

MqttClient.SubscribeAsync(subscribeOptions, cancellationToken);

MqttClient.UseApplicationMessageReceivedHandler(e => { HandleMessageReceived(e.ApplicationMessage); });

while (true)
{
    Task.Delay(1000).GetAwaiter().GetResult();
}

static void HandleMessageReceived(MqttApplicationMessage applicationMessage)
{
    Console.WriteLine("### RECEIVED MESSAGE ###");
    Console.WriteLine($"+ Topic = {applicationMessage.Topic}");
    Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(applicationMessage.Payload)}");
    Console.WriteLine();
}

abstract class MqttConfig
{
    public static readonly string Server   = "servername";
    public static readonly int    Port     = 1883;
    public static readonly string User     = "user";
    public static readonly string Password = "password";
    public static readonly string Topic    = "#";
}

mqttConfig类信息放入

I have a very simple C# command line app that connects to an MQTT server and prints messages to the console.

using MQTTnet;
using MQTTnet.Client.Options;
using MQTTnet.Extensions.ManagedClient;
using System.Text;

var options = new MqttClientOptionsBuilder()
    .WithTcpServer(MqttConfig.Server, MqttConfig.Port)
    .WithCredentials(MqttConfig.User, MqttConfig.Password)
    .WithClientId("MqttTest")
    .WithCleanSession()
    .Build();

var MqttClient = new MqttFactory().CreateMqttClient();

var cancellationToken = new CancellationToken();

var subscribeOptions = new MQTTnet.Client.Subscribing.MqttClientSubscribeOptions();
subscribeOptions.TopicFilters.Add(new MqttTopicFilter { Topic = MqttConfig.Topic });

MqttClient.ConnectAsync(options, cancellationToken);

MqttClient.SubscribeAsync(subscribeOptions, cancellationToken);

MqttClient.UseApplicationMessageReceivedHandler(e => { HandleMessageReceived(e.ApplicationMessage); });

while (true)
{
    Task.Delay(1000).GetAwaiter().GetResult();
}

static void HandleMessageReceived(MqttApplicationMessage applicationMessage)
{
    Console.WriteLine("### RECEIVED MESSAGE ###");
    Console.WriteLine(
quot;+ Topic = {applicationMessage.Topic}");
    Console.WriteLine(
quot;+ Payload = {Encoding.UTF8.GetString(applicationMessage.Payload)}");
    Console.WriteLine();
}

abstract class MqttConfig
{
    public static readonly string Server   = "servername";
    public static readonly int    Port     = 1883;
    public static readonly string User     = "user";
    public static readonly string Password = "password";
    public static readonly string Topic    = "#";
}

Putting the MqttConfig class information into an app like MQTT X shows a bunch of incoming messages. But running this C# app just shows a blank console.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

剧终人散尽 2025-02-07 18:52:02

我最终将应用程序基于

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using System.Text.Json;

#region Subscribe to topic & handle incoming messages
var mqttFactory = new MqttFactory();

using (var mqttClient = mqttFactory.CreateMqttClient())
{
    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(MqttConfig.Server, MqttConfig.Port)
        .WithCredentials(MqttConfig.User, MqttConfig.Password)
        .Build();

    mqttClient.UseApplicationMessageReceivedHandler(e =>
    {
        Console.WriteLine("Received application message.");
        e.DumpToConsole();
        return Task.CompletedTask;
    });

    await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);

    var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
        .WithTopicFilter(f => f.WithTopic(MqttConfig.Topic))
        .Build();

    await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);

    Console.WriteLine("MQTT client subscribed to topic.");
    Console.ReadLine(); // Prevents app from immediately closing once MQTT subscription is complete.
                        // Will close if user presses "enter" before any messages are received.
}

static class ObjectExtensions
{
    public static TObject DumpToConsole<TObject>(this TObject @object)
    {
        var output = "NULL";
        if (@object != null)
        {
            output = JsonSerializer.Serialize(@object, new JsonSerializerOptions { WriteIndented = true });
        }

        Console.WriteLine($"[{@object?.GetType().Name}]:\r\n{output}");
        return @object;
    }
}
#endregion

static class MqttConfig
{
    public static readonly string Server   = "servername";
    public static readonly int    Port     = 1883;
    public static readonly string User     = "user";
    public static readonly string Password = "password";
    public static readonly string Topic    = "#";
}

I ended up basing the application on an MQTTnet sample. I'm posting it as an answer here in case anyone else has the same question in the future.

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using System.Text.Json;

#region Subscribe to topic & handle incoming messages
var mqttFactory = new MqttFactory();

using (var mqttClient = mqttFactory.CreateMqttClient())
{
    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(MqttConfig.Server, MqttConfig.Port)
        .WithCredentials(MqttConfig.User, MqttConfig.Password)
        .Build();

    mqttClient.UseApplicationMessageReceivedHandler(e =>
    {
        Console.WriteLine("Received application message.");
        e.DumpToConsole();
        return Task.CompletedTask;
    });

    await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);

    var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
        .WithTopicFilter(f => f.WithTopic(MqttConfig.Topic))
        .Build();

    await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);

    Console.WriteLine("MQTT client subscribed to topic.");
    Console.ReadLine(); // Prevents app from immediately closing once MQTT subscription is complete.
                        // Will close if user presses "enter" before any messages are received.
}

static class ObjectExtensions
{
    public static TObject DumpToConsole<TObject>(this TObject @object)
    {
        var output = "NULL";
        if (@object != null)
        {
            output = JsonSerializer.Serialize(@object, new JsonSerializerOptions { WriteIndented = true });
        }

        Console.WriteLine(
quot;[{@object?.GetType().Name}]:\r\n{output}");
        return @object;
    }
}
#endregion

static class MqttConfig
{
    public static readonly string Server   = "servername";
    public static readonly int    Port     = 1883;
    public static readonly string User     = "user";
    public static readonly string Password = "password";
    public static readonly string Topic    = "#";
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文