将 qos 设置为 1 始终发送消息

setting qos to 1 always sending the message

我测试了一个示例代码并将 QOS 设置为 1。为什么服务器总是向订阅客户端发送消息,即使订阅客户端已经收到消息,并且在我搜索时 https://github.com/njh/ruby-mqtt/pull/58 这应该可以解决问题是因为在 MQTT 规范中,订阅客户端应在收到消息后发送 PUBACK 以确认已收到消息。我错过了什么吗?有什么建议吗?

sub.rb

require 'rubygems'
require 'mqtt'

MQTT::Client.connect('192.168.9.105') do |client|
  client.get_packet('test'=>1) do |packet|
    puts packet.inspect
  end
end

pub.rb

require 'rubygems'
require 'mqtt'

# Publish example
MQTT::Client.connect('192.168.9.105') do |c|
  c.publish('test', 'message 3', 0, 1)
end

因为 QoS 1 的 MQTT specifications 声明消息被传递 至少一次 ,它 可能 被传递超过一度。 (例如,PUBACK 超时、网络问题)

引用规范 link:
虽然 TCP 通常保证数据包的传送,但在某些情况下可能无法收到 MQTT 消息。对于需要响应的 MQTT 消息(QoS >0 PUBLISH、PUBREL、SUBSCRIBE、UNSUBSCRIBE),如果在特定时间段内未收到响应,发送方可能会重试传递。发件人应在邮件上设置 DUP 标志。

这可能是 ruby 客户端实现中的错误。经纪人符合规范并重新传送消息。
如果您需要一次传递消息,请尝试使用 QoS 2。