Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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?
                    }
                }
            }
        }