internal void InternalGeneralSubscribe(string topicId, ActionStringDelegate actionToTakeOnReceivedMessage) { var fullTopic = topicId; // Keeping a subscribtion topic list, because it is needed when (re)connecting to broker. if (_topicHandlerMap.Contains(fullTopic) == false) { _topicHandlerMap.Add(fullTopic, new ArrayList()); } ((ArrayList)_topicHandlerMap[fullTopic]).Add(actionToTakeOnReceivedMessage); _subscriptionList.Add(fullTopic); if (IsConnected) { _broker.Subscribe(fullTopic); } }
/// <summary> /// Initializes the entire Client Device tree: actually creates internal property variables, subscribes to topics and so on. This method must be called, or otherwise entire Client Device tree will not work. /// </summary> public void Initialize(IClientDeviceConnection broker) { base.Initialize(broker, NLog.LogManager.GetCurrentClassLogger()); // Initializing properties. They will start using broker immediatelly. foreach (ClientPropertyBase property in _properties) { property.Initialize(this); } var homieTopic = $"{_baseTopic}/{DeviceId}/$homie"; ActionStringDelegate handlerForTopicHomie = delegate(string value) { HomieVersion = value; RaisePropertyChanged(this, new PropertyChangedEventArgs(nameof(HomieVersion))); }; InternalGeneralSubscribe(homieTopic, handlerForTopicHomie); var nameTopic = $"{_baseTopic}/{DeviceId}/$name"; ActionStringDelegate handlerForTopicName = delegate(string value) { Name = value; RaisePropertyChanged(this, new PropertyChangedEventArgs(nameof(Name))); }; InternalGeneralSubscribe(nameTopic, handlerForTopicName); var stateTopic = $"{_baseTopic}/{DeviceId}/$state"; ActionStringDelegate handlerForTopicState = delegate(string value) { if (Helpers.TryParseHomieState(value, out var parsedState)) { State = parsedState; RaisePropertyChanged(this, new PropertyChangedEventArgs(nameof(State))); } ; }; InternalGeneralSubscribe(stateTopic, handlerForTopicState); }
internal void InternalPropertySubscribe(string propertyTopic, ActionStringDelegate actionToTakeOnReceivedMessage) { InternalGeneralSubscribe($"{_baseTopic}/{DeviceId}/{propertyTopic}", actionToTakeOnReceivedMessage); }