/// <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(); }); }
/// <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); }