Mqttnet:如何从 PublishAsync 获取 MqttClientPublishResult 而不引发错误?

问题描述 投票:0回答:1

我正在测试在调用 Mqttnet 的

PublishAsync()
到一个不好的主题(例如“####”)时的错误处理,但我遇到了意外的行为。

预期: 我期望

PublishAsync()
返回一个
MqttClientPublishResult
实例,其中
ReasonCode
具有值
MqttClientPublishReasonCode.TopicNameInvalid

实际: 相反,我遇到了异常:

MQTTnet.Exceptions.MqttProtocolViolationException: 'The character '#' is not allowed in topics.'

这是相当不幸的,因为使用

MqttClientPublishReasonCode
中的特定
MqttClientPublishResult
值将有助于我的错误处理。有没有办法在方法不抛出错误的情况下接收这个结果对象?

我尝试使用

MqttClientOptionsBuilder
及其方法
WithRequestProblemInformation()
WithRequestResponseInformation()
实例化我的客户端,但仍然抛出错误。我知道通过调用
PingAsync()
可以解决此问题,但我找不到
TryPingAsync()
的类似替代方案。
谢谢你。

mqtt mqttnet
1个回答
0
投票
MQTT v5

规范第 3.3.2.1 节规定:

PUBLISH 数据包中的主题名称不得包含通配符 [MQTT-3.3.2-2]。

PublishAsync()

是通配符,因此您的主题不符合规范。发生这种情况时,MQTT 服务器应断开网络连接(使用 v5,您可能会收到“格式错误的数据包”原因代码)。

#

原因代码144(“主题名称无效”),您在问题中提到,

用于当
“主题名称格式正确,但不被此客户端或服务器接受。”。所以它不适用于这种情况(因为主题格式错误)。 MQTTNet 的作者有两个主要选择,发送

PUBACK

(意味着服务器断开连接)或引发异常。虽然发送数据包可能是一种有效的方法,但它可能会导致令人困惑的问题(例如,每次连接建立时重新发送数据包时会出现断开/重新连接循环)。

如果您查看

here

,您可以看到主题无效时引发的各种异常。处理 PUBLISH 异常不应使事情变得太复杂,更好的选择可能是验证配置/用户输入,以避免首先使用此类主题。

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.