private async Task PublishMessages(IMqttSession session, Stream stream, IEnumerable <Tuple <string, QoS, byte[]> > messages, bool retained) { foreach (var message in messages) { string messageId = null; short? packetId = null; //QOS 1 or 2, store in storage, and in session. if (message.Item2 != QoS.BestEffort) { messageId = await storageProvider.StoreMessage(new InFlightMessage(message.Item1, message.Item3)); session.Publish(messageId, message.Item2); } else { //QoS 0 just publish, that way the session can keep a straight up queue and not block QoS 0 messages from //intervening. PublishMessage publishMessage = new PublishMessage(false, retained, message.Item2, message.Item1, message.Item3, packetId); await publishMessage.Write(stream); } } }
private void PublishMessage(IEnumerable <Tuple <IMqttSession, MqttQos> > subscriptions, String topic, byte[] payload) { String messageId = null; //Used to for non QoS 0 messages, to store message for sending. MqttPublishMessage message = null; //Used for QoS 0 messages, to send the message. Can reuse since there is no message identifier. foreach (Tuple <IMqttSession, MqttQos> subscription in subscriptions) { //Persist a reference and queue if QoS > 0 if (subscription.Item2 != MqttQos.BestEffort) { //Save the message if we haven't already. if (messageId == null) { messageId = storageProvider.StoreMessage(new InFlightMessage(topic, payload)); } else { storageProvider.ReferenceMessage(messageId); } subscription.Item1.Publish(messageId, subscription.Item2); } else { if (message == null) { message = new MqttPublishMessage().WithQos(MqttQos.AtMostOnce); } try { subscription.Item1.Write(message); } catch (Exception) { //Close socket? } } } }