MQTT c#示例。订户未收到已发布的消息

时间:2019-03-24 06:35:43

标签: c# asp.net winforms uwp mqtt

我正在通过此链接使用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订阅正常,但未收到已发布的消息。

谁能建议我在做什么错。而且我很好奇,我当前的应用程序发布并收到有关Topic的消息(使用相同的代码)。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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