Пример #1
0
        /// <summary>
        /// Constructor.
        /// </summary>
        public MqttSubscriber(
            OnEnablementUpdatedCallback onEnablementUpdatedCallback,
            OnLightLevelUpdated onLightLevelUpdatedCallback,
            OnFluxStatusUpdatedCallback onFluxStatusUpdatedCallback)
        {
            if (null == onEnablementUpdatedCallback)
            {
                throw new ArgumentNullException(nameof(onEnablementUpdatedCallback));
            }

            if (null == onLightLevelUpdatedCallback)
            {
                throw new ArgumentNullException(nameof(onLightLevelUpdatedCallback));
            }

            MqttFactory = new MqttFactory();
            MqttClient  = MqttFactory.CreateMqttClient();

            // Handle callbacks
            MqttClient.UseApplicationMessageReceivedHandler(e =>
            {
                try
                {
                    string utfString = Encoding.UTF8.GetString(e.ApplicationMessage.Payload, 0, e.ApplicationMessage.Payload.Length);

                    if (e.ApplicationMessage.Topic.Equals($"{MqttConfig.Topic}/set", StringComparison.OrdinalIgnoreCase))
                    {
                        bool enable = Convert.ToBoolean(utfString);
                        onEnablementUpdatedCallback(enable);
                    }
                    else if (e.ApplicationMessage.Topic.Equals($"{MqttConfig.Topic}/lightlevel", StringComparison.OrdinalIgnoreCase))
                    {
                        double lightLevel = Convert.ToDouble(utfString);
                        onLightLevelUpdatedCallback(lightLevel);
                    }
                    else if (e.ApplicationMessage.Topic.Equals($"{MqttConfig.Topic}/status", StringComparison.OrdinalIgnoreCase))
                    {
                        FluxStatus fluxStatus = JsonConvert.DeserializeObject <FluxStatus>(utfString);
                        onFluxStatusUpdatedCallback(fluxStatus.Brightness, fluxStatus.ColorTemperature);
                    }
                }
                catch (Exception)
                {
                }
            });

            // Handle subscription connection
            MqttClient.UseConnectedHandler(async e =>
            {
                Log.Debug($"{nameof(MqttSubscriber)} is connected. Attempting to subscribe to topic '{MqttConfig.Topic}'.");

                // Subscribe to the desired topic when connected
                MqttClientSubscribeResult result = await MqttClient.SubscribeAsync(new TopicFilterBuilder()
                                                                                   .WithTopic($"{MqttConfig.Topic}/#")
                                                                                   .Build());
            });

            // Handle disconnects
            MqttClient.UseDisconnectedHandler(async e =>
            {
                Log.Debug($"{nameof(MqttSubscriber)} is disconnected. Attempting to reconnect.");

                // Allow time for network connectivy hiccups to be resolved before trying again.
                await Task.Delay(TimeSpan.FromSeconds(1));

                // Reconnect when disconnected
                Connect();
            });
        }
Пример #2
0
 /// <summary>
 /// Publishes a FluxStatus payload.
 /// </summary>
 /// <param name="topic">Topic</param>
 /// <param name="payload">Payload</param>
 /// <param name="retain">Retain</param>
 /// <returns></returns>
 public async Task PublishFluxStatus(FluxStatus fluxStatus)
 {
     await Publish("status", JsonConvert.SerializeObject(fluxStatus), true);
 }