我正在通过此链接使用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的消息(使用相同的代码)。
是否可以制作两个不同的应用程序。一个应用程序将发布到主题。第二应用程序将收到有关该主题的消息(因为它是订阅者)
答案 0 :(得分:1)
您的按钮单击处理程序会为每次单击创建一个新的MQTT客户端,并且每个客户端使用相同的客户端ID。在任何特定实例中,只有一个客户端使用给定的客户端ID,因此重新使用相同的客户端ID将断开先前的MQTT客户端的连接。
这种断开连接意味着永远不会有一个窗口,在该窗口中客户端可以订阅某个主题,而另一个(或相同)客户端可以将其发布到该主题。可以通过在Form构造函数中连接一次并在应用程序中使用相同的MQTT连接来解决此问题。这意味着从两个点击处理程序中删除以下两行:
client = new MqttClient("broker.hivemq.com");
byte code = client.Connect("lenovofullondude");
是否可以制作两个不同的应用程序。一个应用程序将发布到主题。第二应用程序将收到有关该主题的消息(因为它是订阅者)
是的。但是在MQTT连接期间,两个应用程序都需要使用不同的客户端ID。