本地WSL2 Docker中获取最新版的 NanoMQ 0.20.8 slim 版本,配置订阅云端如下:
subscription = [
{
remote_topic = “xxx/cmd/down”
local_topic = “down”
qos = 2
retain_as_published = 1
retain_handing = 1
}
]
启动 NanoMQ 之后,其日志中输出订阅成功,有 [qos = 2, rap = 1, rh = 1] 内容,貌似配置生效了,但是使用 MQTTX 发送【保留】消息到云端 topic 【xxx/cmd/down】,重连之前已订阅 topic 【down】的客户端,等待10秒左右,连续收到发往云端的消息,每个消息并没有 【Retain】标识,且并非只接收最后一条。哪位大佬能解释一下?
jaylin
2
这选项只有mqtt5生效
请了解一下retain和这几个订阅选项的意思,都retain as publish了,肯定没有retain标识啊…
togger
3
桥接设置选项中,协议版本设置为5即支持MQTT5;retain as published = 1 表示再发布时保留啊,我理解错了?
jaylin
4
Sub请求中 rap值为1,表示向此订阅转发应用消息时保持消息被发布时设置的保留(RETAIN)标志。所以1是会保持原来的retain flag的。
不是很理解你的消息流。连上10s后才收到之前的msg,应该不是retain msg。更可能是会话保持缓存的消息,retain是sub之后立刻受到的。
另外,nano收到retain消息在本地转发的时候也会受到本地客户端订阅的rap rh属性影响。
togger
5
感谢及时回复!
rap/rh 这两个选项,nano文档中没有提及,观看B站中MQTT 5视频后,发现有这两个选项,所以尝试着加上,看到nano日志发现貌似生效。
关于延迟10s依次收到多条订阅云端的消息,我不确定是不是配置中 sqlite.resend_interval (5000) 和 bridges.mqtt.xxx.resend_interval (5000) 两个选项的累计效果。
我的消息流:多个 nanomq 作为设备消息的网关(clientid 固定),桥接一个 emqx,既要 forward 设备采集的数据至 emqx,又要 subscribe 业务平台下发至 emqx 的命令。上行数据丢失无所谓(qos=0),要保证每个 nanomq 网关都能上线后能收到离线时下发的命令(qos=2),于是尝试使用 rap/rh 保留 retain 标识,但是没有达到预期效果。
rap: retain_as_published = 1,表示转发时保留原始 retian 标识
rh: retain_handling = 1,表示订阅建立时,若该订阅当前不存在则发送保留消息
又被你搞的有点糊涂…
如果是期望桥接链接能收到远端broker的retain消息,那你并不需要做什么,桥接建立的时候订阅就有。
若桥接连接收到之前发的消息,应该是因为开启了桥接的会话保持,你又是用的QoS 1/2,所以断的时候消息被保存了,这些肯定不是retain
你这些下行的命令是谁发的,让那个pub方把消息设置成retain就行了。
之前说的rap等配置是修改从nano本地通过桥接转发到远端broker的消息里的retain flag用的
感谢你的耐心解释!
桥接sub远端broker的retain消息,回头我试试QoS 0,之前一直尝试的是1或2。
尝试的rap/rh选项,是用在桥接sub设置而非fwd设置中,这俩选项没有在文档中提及,看来我的理解有误。
1 个赞