我在我的应用程序中使用 MQTTNet 库进行 MQTT 连接。我正在使用 Mosquitto Broker 作为 MQTT 代理。我的应用程序位于 .Net core 3.1 中。
我需要在应用程序连接、正常断开和意外断开时将 MQTT 消息发送到设备。
对于连接的场景,我使用的UseConnectedHandler
是IMQTTClient
.
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 我可以发送断开连接之前的消息吗?