【问题标题】:setting qos to 1 always sending the message将 qos 设置为 1 始终发送消息
【发布时间】:2015-10-03 02:46:08
【问题描述】:

我测试了一个示例代码并将 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

【问题讨论】:

    标签: ruby mqtt mosquitto


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多