MQTT QoS1模式下如何设置Dup标志为d1?技术求助
如何让MQTT QoS1消息的Dup标志设为1(Broker日志显示d1)
首先明确:Dup标志不是你手动通过mosquitto_publish设置的。你当前代码里最后一个参数false是设置消息的retain属性,和Dup完全无关。
Dup标志的本质
MQTT协议中,Dup(Duplicate)标志的作用是告诉Broker:这是一条重发的QoS 1/2消息。这个标志是客户端库自动设置的,只有当客户端需要重发那些未收到确认(比如没拿到PUBACK)的QoS1消息时,才会把Dup设为1。第一次发送的消息,Dup必然是0,也就是你现在看到的d0。
触发Dup=1的具体方法
要让Broker日志显示d1,你需要模拟消息重发的场景,比如:
- 方法一:客户端发送QoS1消息后,立即断开连接,不等Broker返回PUBACK。之后重新连接客户端,此时客户端会自动重发这条未确认的消息,Broker日志里就会显示
d1。 - 方法二:拦截客户端的PUBACK响应(比如用网络工具阻断这个包),客户端在重试超时后会自动重发消息,此时Dup标志就是1。
修正你的代码误解
你的代码里定义了bool dup = true;但完全没用到,而且mosquitto_publish的参数顺序是:
int mosquitto_publish(struct mosquitto *mosq, int *mid, const char *topic, int payloadlen, const void *payload, int qos, bool retain);
最后一个参数是retain,和Dup没有关系,Dup是客户端库根据消息是否为重发来自动设置的,没有暴露给用户手动配置的接口。
内容的提问来源于stack exchange,提问作者Arshi
相关产品推荐
相关产品推荐

