0

我在我的应用程序中使用 MQTTNet 库进行 MQTT 连接。我正在使用 Mosquitto Broker 作为 MQTT 代理。我的应用程序位于 .Net core 3.1 中。

我需要在应用程序连接、正常断开和意外断开时将 MQTT 消息发送到设备。

对于连接的场景,我使用的UseConnectedHandlerIMQTTClient.

mqttClient.UseConnectedHandler((MqttClientConnectedEventArgs e) =>
         {
            // Console.WriteLine("MqttClient - Connected");
            // Publish the Connect Message
         });

对于意外断开连接的情况,我正在使用该WithWillMessage功能。

var mqttOptions = new ManagedMqttClientOptionsBuilder()
            .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
            .WithClientOptions(new MqttClientOptionsBuilder()
            .WithWillMessage(_options.LastWillMessage)
               .WithCleanSession()
               .WithClientId(_options.DevcommMqttClientId)
               .WithProtocolVersion(MqttProtocolVersion.V500)
               .WithCommunicationTimeout(TimeSpan.FromSeconds(30))
               .WithCredentials(_options.DevcommMqttUsername ?? string.Empty, _options.DevcommMqttPassword ?? string.Empty)
               .WithTcpServer(_options.DevcommMqttHost, _options.DevcommMqttPort)
               .WithTls(o =>
               {
                  o.UseTls = _options.DevcommUseTls;
                  o.AllowUntrustedCertificates = _options.DevcommTlsAllowUntrustedCertificates;
                  o.IgnoreCertificateChainErrors = _options.DevcommTlsIgnoreCertificateChainErrors;
                  o.IgnoreCertificateRevocationErrors = _options.DevcommTlsIgnoreCertificateRevocationErrors;
                  o.SslProtocol = ParseSslProtocols(_options.DevcommTlsProtocols);
                  o.Certificates = _options.DevcommTlsClientCertificates.AsEnumerable();
                  o.CertificateValidationHandler = CertificateValidationHandler;
               })
               .Build())
            .Build();

我现在陷入了优雅的断开连接场景。在UseDisconnectedHandler断开连接之后而不是在断开连接之前调用扩展方法。

Mosquitto broker 提供了关闭消息的功能,类似于断开连接之前的事件。

无论如何,使用 MQTTNet 我可以发送断开连接之前的消息吗?

4

0 回答 0