Exemple #1
0
        internal void PublishReceived(IMqttSession session, MqttPublishMessage publishMessage)
        {
            if (publishMessage.Header.Qos == MqttQos.BestEffort && session.HasQoS2(publishMessage.VariableHeader.MessageIdentifier))
            {
                var pubRec = new MqttPublishReceivedMessage()
                             .WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier);
                session.Write(pubRec);
            }
            if (publishMessage.Header.Retain)
            {
                this.storageProvider.PutRetained(publishMessage.VariableHeader.TopicName, publishMessage.Payload.Message.ToArray());
            }
            PublishMessage(GetSubscriptions(publishMessage.VariableHeader.TopicName), publishMessage.VariableHeader.TopicName, publishMessage.Payload.Message.ToArray());

            switch (publishMessage.Header.Qos)
            {
            case MqttQos.AtLeastOnce:
                var puback = new MqttPublishAckMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier);
                session.Write(puback);
                break;

            case MqttQos.AtMostOnce:
                session.StoreQoS2(publishMessage.VariableHeader.MessageIdentifier);
                var pubRec = new MqttPublishReleaseMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier);
                session.Write(pubRec);
                break;

            case MqttQos.BestEffort:
            default:
                break;
            }
        }
Exemple #2
0
        public void ValidPayload()
        {
            // Message Specs________________
            // <40><02><00><04> (Pub ack for Message ID 4)
            var sampleMessage = new[]
            {
                (byte)0x40,
                (byte)0x02,
                (byte)0x0,
                (byte)0x4,
            };

            MqttMessage baseMessage = MqttMessage.CreateFrom(sampleMessage);

            Console.WriteLine(baseMessage.ToString());

            // check that the message was correctly identified as a connect message.
            Assert.IsType <MqttPublishAckMessage>(baseMessage);
            MqttPublishAckMessage message = (MqttPublishAckMessage)baseMessage;

            // validate the message deserialization
            Assert.Equal <MqttMessageType>(MqttMessageType.PublishAck, message.Header.MessageType);
            Assert.Equal <int>(2, message.Header.MessageSize);

            // make sure the publish message length matches the expectred size.
            Assert.Equal <int>(4, message.VariableHeader.MessageIdentifier);
        }
Exemple #3
0
        public void ValidPayload()
        {
            // publish ack msg with message identifier 4
            var expected = new[]
            {
                (byte)0x40,
                (byte)0x02,
                (byte)0x0,
                (byte)0x4,
            };

            MqttPublishAckMessage msg = new MqttPublishAckMessage().WithMessageIdentifier(4);

            Console.WriteLine(msg.ToString());

            byte[] actual = MessageSerializationHelper.GetMessageBytes(msg);

            Assert.Equal <int>(expected.Length, actual.Length);
            Assert.Equal <byte>(expected[0], actual[0]); // msg type of header
            Assert.Equal <byte>(expected[1], actual[1]); // remaining length
            Assert.Equal <byte>(expected[2], actual[2]); // connect ack - compression? always empty
            Assert.Equal <byte>(expected[3], actual[3]); // return code.
        }
Exemple #4
0
        internal void PublishReceived(WebSocketSession session, MqttPublishMessage publishMessage)
        {
            try
            {
                string topic = publishMessage.VariableHeader.TopicName;
                List <MqttSubscriberConstrains> clients = new List <MqttSubscriberConstrains>();

                if (this.MqTTSubscriptions.ContainsKey(topic))
                {
                    var subscribers = (List <MqttSubscriberConstrains>) this.MqTTSubscriptions[topic];
                    foreach (var item in subscribers)
                    {
                        if (!clients.Exists(el => el.SubsciberId == item.SubsciberId))
                        {
                            clients.Add(item);
                        }
                    }
                    foreach (var client in clients)
                    {
                        var websocketsession = this.GetAppSessionByID(client.SubsciberId);
                        websocketsession.Send(new ArraySegment <Byte>(publishMessage.Payload.Message.ToArray()));
                    }
                }

                switch (publishMessage.Header.Qos)
                {
                case MqttQos.AtLeastOnce:
                    var puback = new MqttPublishAckMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier);
                    using (var messageStream = new MemoryStream())
                    {
                        puback.WriteTo(messageStream);
                        ArraySegment <byte> bytes = new ArraySegment <byte>(messageStream.ToArray());
                        session.Send(bytes);
                    }
                    break;

                case MqttQos.AtMostOnce:
                    //session.StoreQoS2(publishMessage.VariableHeader.MessageIdentifier);
                    //var pubRec = new MqttPublishReleaseMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier);
                    //session.Write(pubRec);
                    break;

                case MqttQos.BestEffort:
                    var pubRec = new MqttPublishReceivedMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier);
                    using (var messageStream = new MemoryStream())
                    {
                        pubRec.WriteTo(messageStream);
                        ArraySegment <byte> bytes = new ArraySegment <byte>(messageStream.ToArray());
                        session.Send(bytes);
                    }
                    break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                log.Error("Error on Publich ", ex);
            }
        }