我测试示例代码并将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
答案 0 :(得分:0)
由于QoS 1的MQTT specifications表明消息至少一次 ,可能会多次传递 。 (例如,PUBACK超时,网络问题)
从规格链接引用:
尽管TCP通常保证数据包的传递,但在某些情况下可能无法接收MQTT消息。在期望响应(QoS> 0 PUBLISH,PUBREL,SUBSCRIBE,UNSUBSCRIBE)的MQTT消息的情况下,如果在特定时间段内没有接收到响应,则发送方可以重试传送。发件人应在邮件上设置DUP标志。
这可能是ruby客户端实现中的一个错误。经纪人符合规范并重新传递信息 如果您需要准确传递一次消息,请尝试使用QoS 2。