订户未主动接收已发布的消息
subscriber not actively receiving published message
我已成功将 MQTT 连接到我的代理,发布者和订阅者都工作正常,但我的订阅者没有主动接收消息时出现问题,函数 mqtt_publishedRecieved 仅触发一次,当我重新启动订阅者应用程序,一次只接收一条消息。为了收到另一条消息,我必须重新启动我的应用程序。好吧,根据我的理解,这是因为我在启动时调用了 class 的配置方法。因此它仅在启动时检查订阅的主题。但我真的希望我的订阅者 class 中的该功能能够在接收者发布消息后立即接收消息,这意味着两者应该并行工作。
我的要求是
=> 如果订阅者已连接,则在发布者触发后立即收到消息。
=> 如果订阅者断开连接,消息应该排队,稍后当订阅者再次连接时,所有消息都将收到。
我研究了将 mqtt clean session 设置为 false 将确保持久会话,因此我将该标志设置为 false 以占用持久会话,但它对我不起作用。
在我看来,我应该添加接收消息的功能,例如,一个按钮,因此当单击该按钮时它开始接收消息,但我无法将 trigger/callback/button 设置为接收订阅主题的消息。我的应用程序应该在服务启动时开始接收所有已发布的消息,并在服务断开连接时停止。
下面是发布者的代码class。
public class publisher : IDatabaseSubscription
{
public publisher()
{
_mqttClient = new MqttClient("127.0.0.1");
_mqttClient.Connect("clientId", null, null, false, 60);
}
private void MQTT_OnChanged(object sender, RecordChangedEventArgs<EventDto> e)
{
if (_mqttClient != null && _mqttClient.IsConnected)
{
var message = System.Text.Encoding.UTF8.GetBytes("Hello from app 1");
var statusCode = _mqttClient.Publish("Message1",message , MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
}
}
}
以下是订阅者代码class
public class subscriber
{
private MqttClient _mqttClient;
public subscriber()
{
}
public void configure ()
{
_mqttClient = new MqttClient("127.0.0.1");
_mqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
var status = _mqttClient.Subscribe(new string[] { "Message1" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
_mqttClient.Connect("clientId", null, null , false, 60) ;
}
private void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
var message = System.Text.Encoding.UTF8.GetString(e.Message);
}
}
下面是启动中的代码
if(IsSubscriptionEnabled())
{
var service = _container.GetInstance<subscription>();
service.configure();
}
由于publisher和subscriber的client id相同,如果新的client连接了相同的client id,broker会踢掉这个client
我已成功将 MQTT 连接到我的代理,发布者和订阅者都工作正常,但我的订阅者没有主动接收消息时出现问题,函数 mqtt_publishedRecieved 仅触发一次,当我重新启动订阅者应用程序,一次只接收一条消息。为了收到另一条消息,我必须重新启动我的应用程序。好吧,根据我的理解,这是因为我在启动时调用了 class 的配置方法。因此它仅在启动时检查订阅的主题。但我真的希望我的订阅者 class 中的该功能能够在接收者发布消息后立即接收消息,这意味着两者应该并行工作。 我的要求是 => 如果订阅者已连接,则在发布者触发后立即收到消息。 => 如果订阅者断开连接,消息应该排队,稍后当订阅者再次连接时,所有消息都将收到。
我研究了将 mqtt clean session 设置为 false 将确保持久会话,因此我将该标志设置为 false 以占用持久会话,但它对我不起作用。
在我看来,我应该添加接收消息的功能,例如,一个按钮,因此当单击该按钮时它开始接收消息,但我无法将 trigger/callback/button 设置为接收订阅主题的消息。我的应用程序应该在服务启动时开始接收所有已发布的消息,并在服务断开连接时停止。
下面是发布者的代码class。
public class publisher : IDatabaseSubscription
{
public publisher()
{
_mqttClient = new MqttClient("127.0.0.1");
_mqttClient.Connect("clientId", null, null, false, 60);
}
private void MQTT_OnChanged(object sender, RecordChangedEventArgs<EventDto> e)
{
if (_mqttClient != null && _mqttClient.IsConnected)
{
var message = System.Text.Encoding.UTF8.GetBytes("Hello from app 1");
var statusCode = _mqttClient.Publish("Message1",message , MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
}
}
}
以下是订阅者代码class
public class subscriber
{
private MqttClient _mqttClient;
public subscriber()
{
}
public void configure ()
{
_mqttClient = new MqttClient("127.0.0.1");
_mqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
var status = _mqttClient.Subscribe(new string[] { "Message1" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
_mqttClient.Connect("clientId", null, null , false, 60) ;
}
private void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
var message = System.Text.Encoding.UTF8.GetString(e.Message);
}
}
下面是启动中的代码
if(IsSubscriptionEnabled())
{
var service = _container.GetInstance<subscription>();
service.configure();
}
由于publisher和subscriber的client id相同,如果新的client连接了相同的client id,broker会踢掉这个client