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

时间:2015-10-03 02:46:09

标签: ruby mqtt mosquitto

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

1 个答案:

答案 0 :(得分:0)

由于QoS 1的MQTT specifications表明消息至少一次 可能会多次传递 。 (例如,PUBACK超时,网络问题)

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

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