1.MQTT在订阅回复的消息主题时,只要请示过一次,回复主题就一直在接收
2.确认主题只回复了一次
3.回复时用WithRetainFlag(false)时,要发很多次才收到一次
4.确认mqtt接收服务端分别只收到了一次发送请示和回复主题
5.即使在获取到回复时,取消订阅,仍会继续收到该主题
怎样确保回复主题只接收一次呢?目前情况貌似请示端一直自己的触发接收.
一.请示数据时,发送主题
var message = new MqttApplicationMessageBuilder()
.WithTopic(MQTTHelper.GetPubTopic(clientIP))
.WithPayload(clientIP)
.WithAtMostOnceQoS()
//.WithAtLeastOnceQoS()
.WithRetainFlag()
.Build();
mqttClient.PublishAsync(message);
二.回复数据时,发送主题
var message = new MqttApplicationMessageBuilder()
.WithTopic(MQTTHelper.GetPubTopic(device.PC_IPAddr))
.WithPayload(JsonConvert.SerializeObject(Data))
//.WithAtMostOnceQoS()
.WithExactlyOnceQoS()
//.WithAtLeastOnceQoS()
.WithRetainFlag()//设为false时,很容易出现收不到的情况
.Build();
mqttClient.PublishAsync(message);
三、mqtt服务端
private static void Server_ApplicationMessageReceived(MqttApplicationMessageReceivedEventArgs e)
{
var topic = e.ApplicationMessage.Topic;//确认mqtt服务端只回复了一次
}
引用 皆我百晓生 小程序回复内容作答:
要确保回复主题只接收一次,可以在订阅回复消息的时候使用QoS为1(AtLeastOnce)或2(ExactlyOnce)。这样,在发布回复消息的时候,可以设置WithAtLeastOnceQoS()或WithExactlyOnceQoS(),确保消息的可靠传输。同时,为了避免重复接收,可以在订阅回复消息的时候,使用MqttClientUnsubscribeResult unsubscribeResult = await mqttClient.UnsubscribeAsync(topic),取消订阅该主题。这样,回复消息只会被接收一次。
知道原因了,是分配了同样的连接ID造成