예제 #1
0
        public static void Setup(Cumulus cumulus)
        {
            MqttPublisher.cumulus = cumulus;

            var mqttFactory = new MqttFactory();

            mqttClient = (MqttClient)mqttFactory.CreateMqttClient();

            var clientId = Guid.NewGuid().ToString();

            var mqttTcpOptions = new MQTTnet.Client.MqttClientTcpOptions
            {
                Server     = cumulus.MQTT.Server,
                Port       = cumulus.MQTT.Port,
                TlsOptions = new MQTTnet.Client.MqttClientTlsOptions {
                    UseTls = cumulus.MQTT.UseTLS
                }
            };

            switch (cumulus.MQTT.IpVersion)
            {
            case 4:
                mqttTcpOptions.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork;
                break;

            case 6:
                mqttTcpOptions.AddressFamily = System.Net.Sockets.AddressFamily.InterNetworkV6;
                break;

            default:
                mqttTcpOptions.AddressFamily = System.Net.Sockets.AddressFamily.Unspecified;
                break;
            }

            var mqttOptions = new MQTTnet.Client.MqttClientOptions
            {
                ChannelOptions = mqttTcpOptions,
                ClientId       = clientId,
                Credentials    = string.IsNullOrEmpty(cumulus.MQTT.Password)
                                        ? null
                                        : new MQTTnet.Client.MqttClientCredentials(cumulus.MQTT.Username, System.Text.Encoding.UTF8.GetBytes(cumulus.MQTT.Password)),
                CleanSession = true
            };

            Connect(mqttOptions);

            mqttClient.DisconnectedAsync += (async e =>
            {
                cumulus.LogMessage("Error: MQTT disconnected from the server");
                await Task.Delay(TimeSpan.FromSeconds(5));

                cumulus.LogDebugMessage("MQTT attempting to reconnect with server");
                try
                {
                    Connect(mqttOptions);
                    cumulus.LogDebugMessage("MQTT reconnected OK");
                }
                catch
                {
                    cumulus.LogMessage("Error: MQTT reconnection to server failed");
                }
            });

            configured = true;
        }