| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- using MQTTnet.Client.ExtendedAuthenticationExchange;
- using MQTTnet.Formatter;
- using MQTTnet.Packets;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace MQTTnet.Client.Options
- {
- public class MqttClientOptionsBuilder
- {
- readonly MqttClientOptions _options = new MqttClientOptions();
- MqttClientTcpOptions _tcpOptions;
- MqttClientWebSocketOptions _webSocketOptions;
- MqttClientOptionsBuilderTlsParameters _tlsParameters;
- MqttClientWebSocketProxyOptions _proxyOptions;
- public MqttClientOptionsBuilder WithProtocolVersion(MqttProtocolVersion value)
- {
- if (value == MqttProtocolVersion.Unknown)
- {
- throw new ArgumentException("Protocol version is invalid.");
- }
- _options.ProtocolVersion = value;
- return this;
- }
- public MqttClientOptionsBuilder WithCommunicationTimeout(TimeSpan value)
- {
- _options.CommunicationTimeout = value;
- return this;
- }
- public MqttClientOptionsBuilder WithCleanSession(bool value = true)
- {
- _options.CleanSession = value;
- return this;
- }
- public MqttClientOptionsBuilder WithNoKeepAlive()
- {
- return WithKeepAlivePeriod(TimeSpan.Zero);
- }
- public MqttClientOptionsBuilder WithKeepAlivePeriod(TimeSpan value)
- {
- _options.KeepAlivePeriod = value;
- return this;
- }
- public MqttClientOptionsBuilder WithKeepAliveSendInterval(TimeSpan value)
- {
- _options.KeepAliveSendInterval = value;
- return this;
- }
- public MqttClientOptionsBuilder WithClientId(string value)
- {
- _options.ClientId = value;
- return this;
- }
- public MqttClientOptionsBuilder WithWillMessage(MqttApplicationMessage value)
- {
- _options.WillMessage = value;
- return this;
- }
- public MqttClientOptionsBuilder WithAuthentication(string method, byte[] data)
- {
- _options.AuthenticationMethod = method;
- _options.AuthenticationData = data;
- return this;
- }
- public MqttClientOptionsBuilder WithWillDelayInterval(uint? willDelayInterval)
- {
- _options.WillDelayInterval = willDelayInterval;
- return this;
- }
- public MqttClientOptionsBuilder WithTopicAliasMaximum(ushort? topicAliasMaximum)
- {
- _options.TopicAliasMaximum = topicAliasMaximum;
- return this;
- }
- public MqttClientOptionsBuilder WithMaximumPacketSize(uint? maximumPacketSize)
- {
- _options.MaximumPacketSize = maximumPacketSize;
- return this;
- }
- public MqttClientOptionsBuilder WithReceiveMaximum(ushort? receiveMaximum)
- {
- _options.ReceiveMaximum = receiveMaximum;
- return this;
- }
- public MqttClientOptionsBuilder WithRequestProblemInformation(bool? requestProblemInformation = true)
- {
- _options.RequestProblemInformation = requestProblemInformation;
- return this;
- }
- public MqttClientOptionsBuilder WithRequestResponseInformation(bool? requestResponseInformation = true)
- {
- _options.RequestResponseInformation = requestResponseInformation;
- return this;
- }
- public MqttClientOptionsBuilder WithSessionExpiryInterval(uint? sessionExpiryInterval)
- {
- _options.SessionExpiryInterval = sessionExpiryInterval;
- return this;
- }
- public MqttClientOptionsBuilder WithUserProperty(string name, string value)
- {
- if (name is null) throw new ArgumentNullException(nameof(name));
- if (value is null) throw new ArgumentNullException(nameof(value));
- if (_options.UserProperties == null)
- {
- _options.UserProperties = new List<MqttUserProperty>();
- }
- _options.UserProperties.Add(new MqttUserProperty(name, value));
- return this;
- }
- public MqttClientOptionsBuilder WithCredentials(string username, string password = null)
- {
- byte[] passwordBuffer = null;
- if (password != null)
- {
- passwordBuffer = Encoding.UTF8.GetBytes(password);
- }
- return WithCredentials(username, passwordBuffer);
- }
- public MqttClientOptionsBuilder WithCredentials(string username, byte[] password = null)
- {
- _options.Credentials = new MqttClientCredentials
- {
- Username = username,
- Password = password
- };
- return this;
- }
- public MqttClientOptionsBuilder WithCredentials(IMqttClientCredentials credentials)
- {
- _options.Credentials = credentials;
- return this;
- }
- public MqttClientOptionsBuilder WithExtendedAuthenticationExchangeHandler(IMqttExtendedAuthenticationExchangeHandler handler)
- {
- _options.ExtendedAuthenticationExchangeHandler = handler;
- return this;
- }
- public MqttClientOptionsBuilder WithTcpServer(string server, int? port = null)
- {
- _tcpOptions = new MqttClientTcpOptions
- {
- Server = server,
- Port = port
- };
- return this;
- }
- // TODO: Consider creating _MqttClientTcpOptionsBuilder_ as overload.
- public MqttClientOptionsBuilder WithTcpServer(Action<MqttClientTcpOptions> optionsBuilder)
- {
- if (optionsBuilder == null) throw new ArgumentNullException(nameof(optionsBuilder));
- _tcpOptions = new MqttClientTcpOptions();
- optionsBuilder.Invoke(_tcpOptions);
- return this;
- }
- public MqttClientOptionsBuilder WithProxy(string address, string username = null, string password = null, string domain = null, bool bypassOnLocal = false, string[] bypassList = null)
- {
- _proxyOptions = new MqttClientWebSocketProxyOptions
- {
- Address = address,
- Username = username,
- Password = password,
- Domain = domain,
- BypassOnLocal = bypassOnLocal,
- BypassList = bypassList
- };
- return this;
- }
- public MqttClientOptionsBuilder WithProxy(Action<MqttClientWebSocketProxyOptions> optionsBuilder)
- {
- if (optionsBuilder == null) throw new ArgumentNullException(nameof(optionsBuilder));
- _proxyOptions = new MqttClientWebSocketProxyOptions();
- optionsBuilder(_proxyOptions);
- return this;
- }
- public MqttClientOptionsBuilder WithWebSocketServer(string uri, MqttClientOptionsBuilderWebSocketParameters parameters = null)
- {
- _webSocketOptions = new MqttClientWebSocketOptions
- {
- Uri = uri,
- RequestHeaders = parameters?.RequestHeaders,
- CookieContainer = parameters?.CookieContainer
- };
- return this;
- }
- public MqttClientOptionsBuilder WithWebSocketServer(Action<MqttClientWebSocketOptions> optionsBuilder)
- {
- if (optionsBuilder == null) throw new ArgumentNullException(nameof(optionsBuilder));
- _webSocketOptions = new MqttClientWebSocketOptions();
- optionsBuilder.Invoke(_webSocketOptions);
- return this;
- }
- public MqttClientOptionsBuilder WithTls(MqttClientOptionsBuilderTlsParameters parameters)
- {
- _tlsParameters = parameters;
- return this;
- }
- public MqttClientOptionsBuilder WithTls()
- {
- return WithTls(new MqttClientOptionsBuilderTlsParameters { UseTls = true });
- }
- public MqttClientOptionsBuilder WithTls(Action<MqttClientOptionsBuilderTlsParameters> optionsBuilder)
- {
- if (optionsBuilder == null) throw new ArgumentNullException(nameof(optionsBuilder));
- _tlsParameters = new MqttClientOptionsBuilderTlsParameters();
- optionsBuilder(_tlsParameters);
- return this;
- }
- public IMqttClientOptions Build()
- {
- if (_tcpOptions == null && _webSocketOptions == null)
- {
- throw new InvalidOperationException("A channel must be set.");
- }
- if (_tlsParameters != null)
- {
- if (_tlsParameters?.UseTls == true)
- {
- var tlsOptions = new MqttClientTlsOptions
- {
- UseTls = true,
- SslProtocol = _tlsParameters.SslProtocol,
- AllowUntrustedCertificates = _tlsParameters.AllowUntrustedCertificates,
- #if WINDOWS_UWP
- Certificates = _tlsParameters.Certificates?.Select(c => c.ToArray()).ToList(),
- #else
- Certificates = _tlsParameters.Certificates?.ToList(),
- #endif
- CertificateValidationCallback = _tlsParameters.CertificateValidationCallback,
- CertificateValidationHandler = _tlsParameters.CertificateValidationHandler,
- IgnoreCertificateChainErrors = _tlsParameters.IgnoreCertificateChainErrors,
- IgnoreCertificateRevocationErrors = _tlsParameters.IgnoreCertificateRevocationErrors
- };
- if (_tcpOptions != null)
- {
- _tcpOptions.TlsOptions = tlsOptions;
- }
- else if (_webSocketOptions != null)
- {
- _webSocketOptions.TlsOptions = tlsOptions;
- }
- }
- }
- if (_proxyOptions != null)
- {
- if (_webSocketOptions == null)
- {
- throw new InvalidOperationException("Proxies are only supported for WebSocket connections.");
- }
- _webSocketOptions.ProxyOptions = _proxyOptions;
- }
- _options.ChannelOptions = (IMqttClientChannelOptions)_tcpOptions ?? _webSocketOptions;
- return _options;
- }
- }
- }
|