public string Subscribe(string uid, string topicFilter, Action <MqttApplicationMessageReceivedEventArgs> callback) { if (topicFilter == null) { throw new ArgumentNullException(nameof(topicFilter)); } if (callback == null) { throw new ArgumentNullException(nameof(callback)); } if (string.IsNullOrEmpty(uid)) { uid = Guid.NewGuid().ToString("D"); } lock (_subscribers) { _subscribers[uid] = new MqttSubscriber(uid, topicFilter, callback); } // Enqueue all retained messages to match the expected MQTT behavior. // Here we have no client per subscription. So we need to adopt some // features here manually. var retainedMessages = _mqttServer.GetRetainedApplicationMessagesAsync().GetAwaiter().GetResult(); foreach (var retainedMessage in retainedMessages) { _incomingMessages.Add(new MqttApplicationMessageReceivedEventArgs(null, retainedMessage)); } return(uid); }
void TryNotifySubscriber(MqttSubscriber subscriber, MqttApplicationMessageReceivedEventArgs message) { try { subscriber.Notify(message); } catch (OperationCanceledException) { } catch (Exception exception) { _logger.Log(LogLevel.Error, exception, $"Error while notifying subscriber '{subscriber.Uid}'."); } }
public string Subscribe(string uid, string topicFilter, Action <MqttApplicationMessageReceivedEventArgs> callback) { if (topicFilter == null) { throw new ArgumentNullException(nameof(topicFilter)); } if (callback == null) { throw new ArgumentNullException(nameof(callback)); } if (string.IsNullOrEmpty(uid)) { uid = Guid.NewGuid().ToString("D"); } lock (_subscribers) { _subscribers[uid] = new MqttSubscriber(uid, topicFilter, callback); } return(uid); }