【问题标题】:MQTT c# example . Subscriber not receiving published messagesMQTT c# 示例。订阅者未收到已发布的消息
【发布时间】:2019-03-24 06:35:43
【问题描述】:

我正在使用此链接中的 MQTT 客户端库

https://www.hivemq.com/blog/mqtt-client-library-encyclopedia-m2mqtt/

我的示例代码如下:-

 public partial class Form1 : Form
{
    MqttClient client = null;
    public Form1()
    {
        InitializeComponent();
         client = new MqttClient("broker.hivemq.com");
        byte code = client.Connect("lenovofullondude");

    }

    private void button1_Click(object sender, EventArgs e)
    {
         client = new MqttClient("broker.hivemq.com");
        byte code = client.Connect("lenovofullondude");
        client.ProtocolVersion = MqttProtocolVersion.Version_3_1;

        client.MqttMsgPublished += client_MqttMsgPublished;

        ushort msgId = client.Publish("/my_topic", // topic
           Encoding.UTF8.GetBytes("MyMessageBody"), // message body
           MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, // QoS level
           false);
    }

    void client_MqttMsgPublished(object sender, MqttMsgPublishedEventArgs e)
    {
        Debug.WriteLine("MessageId = " + e.MessageId + " Published = " + e.IsPublished);
    }



    void client_MqttMsgSubscribed(object sender, MqttMsgSubscribedEventArgs e)
    {
        Debug.WriteLine("Subscribed for id = " + e.MessageId);
    }

    private void button2_Click(object sender, EventArgs e)
    {

        try
        {

            client = new MqttClient("broker.hivemq.com");
            byte code = client.Connect("lenovofullondude");
            client.ProtocolVersion = MqttProtocolVersion.Version_3_1;

            client.MqttMsgSubscribed += Client_MqttMsgSubscribed;
            client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;

            ushort msgId = client.Subscribe(new string[] { "/my_topic" },
     new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });



        }
        catch (Exception H)
        {

        }
    }

    private void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
    {
        Debug.WriteLine("Received = " + Encoding.UTF8.GetString(e.Message) + " on topic " + e.Topic);
    }


    private void Client_MqttMsgSubscribed(object sender, MqttMsgSubscribedEventArgs e)
    {
        Debug.WriteLine("Subscribed for id = " + e.MessageId);
    }
}

代码的工作原理如下:-

当我单击按钮 1 发布消息时,我的应用程序上有 2 个按钮。 单击按钮 2 预计将通过此处理程序 Client_MqttMsgPublishReceived 通过 MQTT 订阅和接收发布的消息。

问题:- 按钮 1 单击工作正常,但单击按钮 2 订阅工作正常,但未收到已发布的消息。

谁能建议我做错了什么。而且我很好奇我当前的应用程序发布和接收主题上的消息(使用相同的代码)。

是否可以制作两个不同的应用程序。一个应用程序将发布到主题。第二个应用程序将收到关于该主题的消息(因为它是订阅者)

【问题讨论】:

    标签: c# asp.net winforms uwp mqtt


    【解决方案1】:

    您的按钮单击处理程序为每次单击创建一个新的 MQTT 客户端,并且每个客户端使用相同的客户端 ID。在任何特定实例中只能有一个客户端使用给定的客户端 ID,因此重新使用相同的客户端 ID 将断开之前的 MQTT 客户端。

    这种断开连接意味着永远不会有一个窗口在此期间客户端订阅一个主题并且另一个(或相同)客户端正在发布到该主题。这可以通过在 Form 构造函数中连接一次并在您的应用程序中使用相同的 MQTT 连接来解决。这意味着从两个点击处理程序中删除以下两行:

    client = new MqttClient("broker.hivemq.com");
    byte code = client.Connect("lenovofullondude");
    

    是否可以制作两个不同的应用程序?一个应用程序将发布到主题。第二个应用程序将收到关于该主题的消息(因为它是订阅者)

    是的。但在 MQTT 连接期间,两个应用程序都需要不同的客户端 ID。

    【讨论】:

    • 我尝试删除这两行,但我仍然无法收到消息
    • 感谢@blt,它帮助了我终于让它工作了。我使用了不同的 MQTT 库,它的工作原理很迷人,但以前我在这个库中也犯了同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多