mqtt quic pynng-mqtt client端使用keep alive会出现send PINGREQ 0 2然后在下一次心跳时间connection shotdowm

问题1:
我使用python的pynng-mqtt库和emqx打开quic使用quic方式
我在客户端的连接参数设置了keep alive(5)和其他全部参数如下
connmsg.set_packet_type(1)
connmsg.set_connect_proto_version(4)
connmsg.set_connect_keep_alive(5)
connmsg.set_connect_clean_session(True)
发现心跳大部分时间可以每5秒发送并打印[mqtt_timer_cb]: send PINGREQ 0 1
但是偶尔却会出现
[mqtt_timer_cb]: send PINGREQ 0 2
[mqtt_timer_cb]: Close the quic connection due to timeout
[mqtt_timer_cb]: connection shutting down
然后无论是recv_msg还是send_msg都不再能正常工作。
我还了解到[mqtt_timer_cb]: send PINGREQ 0 2的出现和nng源代码中被注释掉的#_quic_tls_config = lib.conf_quic_create(to_char(cafile), to_char(certfile), to_char(keyfile), pynng.ffi.NULL, to_char(verify_peer), to_char(multi_stream), to_char(qos_first), qkeepalive, qconnect_timeout, qdiscon_timeout, qidle_timeout)中的qidle_timeout参数等有关系。我的c同事在调整qdiscon_timeout等参数后成功复现了[mqtt_timer_cb]: send PINGREQ 0 2出现,但是我在pyng-mqtt似乎无法配置这些参数。
这会导致我使用mqtt quic出现不稳定的情况,即一旦出现[mqtt_timer_cb]: send PINGREQ 0 2后此连接无法使用了,我不希望出现,但是不知道如何配置参数让心跳能100%稳定的工作。
我还尝试将keep alive()的值设置的很大,然后自己新开一个定时任务持续send_msg来手动保持心跳,并使用recv_msg在连接断开时捕获except pynng.exceptions.NNGException并暂时停止手动心跳,待恢复连接后再打开手动心跳来代替keep alive的功能,目前看起来比较稳定。
但是我还是希望使用官方的keep alive来保持连接。
我还想知道:
问题2
pynng-mqtt是否有ACK回调,send_msg的回调,断连回调等支持,我在c代码里都发现了对应的回调,但是在pynng-mqtt里却并未支持。
[mqtt_timer_cb]: send PINGREQ 0 1打印信息是否能在python里给拦截下来

你好, pynng-mqtt 由nanomq 维护,可否转去NanoMQ询问?

好的,抱歉发错了

python 版本是对C NanoSDK的binding 不支持Callback。需要请使用NanoSDK

希望社区可以帮忙实现

那keep alive打印0 2后下一次心跳会关闭链接导致此链接无法继续send_msg或recv_msg有什么解决办法吗,为什么会偶尔出现心跳send PINGREQ 0 2但是大多数时间都是正常的send PINGREQ 0 1呢,c语言可以配置quic的qkeepalive等参数,似乎和send PINGREQ0 2的出现有关,我在pynng-mqtt也看到mqtt-quic-tls有写到相关参数,但是没实现这些参数的配置

send PINGREQ 应该是开发过程留下来的debug log… 记录发了几次PING,有没收到的时候就主动断开了。

是的 和mqtt与quic 的 keepalive 有关,mqtt的可以设置,quic的没暴露,等下个版本更新会加上吧