Пример #1
0
        public void ValidPayload()
        {
            // Message Specs________________
            // <B0><02><00><04> (Subscribe ack for message id 4)
            var sampleMessage = new[]
            {
                (byte)0xB0,
                (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 <MqttUnsubscribeAckMessage>(baseMessage);
            MqttUnsubscribeAckMessage message = (MqttUnsubscribeAckMessage)baseMessage;

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

            // make sure the UnSubscribe message length matches the expectred size.
            Assert.Equal <int>(4, message.VariableHeader.MessageIdentifier);
        }
Пример #2
0
        void PubSubWebSocketServer_NewDataReceived(WebSocketSession session, byte[] value)
        {
            MqttMessage incoming = MqttMessage.CreateFrom(value);

            switch (incoming.Header.MessageType)
            {
            case MqttMessageType.Publish:
                PublishReceived(session, (MqttPublishMessage)incoming);
                break;

            case MqttMessageType.Subscribe:
                SubscribeReceived(session, (MqttSubscribeMessage)incoming);
                break;

            case MqttMessageType.Unsubscribe:
                RemoveSubscriptions(session, ((MqttUnsubscribeMessage)incoming).Payload.Subscriptions);
                var unsubAck = new MqttUnsubscribeAckMessage().WithMessageIdentifier(((MqttPublishReceivedMessage)incoming).VariableHeader.MessageIdentifier);
                using (var messageStream = new MemoryStream())
                {
                    unsubAck.WriteTo(messageStream);
                    ArraySegment <byte> bytes = new ArraySegment <byte>(messageStream.ToArray());
                    session.Send(bytes);
                }
                break;

            case MqttMessageType.PublishAck:
                //string messageId = session.PublishAcknowledged(((MqttPublishAckMessage)incoming).VariableHeader.MessageIdentifier);
                //if (messageId != null)
                //    storageProvider.ReleaseMessage(messageId);
                break;

            case MqttMessageType.PublishReceived:
                //messageId = session.PublishReceived(((MqttPublishReceivedMessage)incoming).VariableHeader.MessageIdentifier);
                //if (messageId != null)
                //    storageProvider.ReleaseMessage(messageId);
                break;

            case MqttMessageType.PublishRelease:
                //session.RemoveQoS2(((MqttPublishReleaseMessage)incoming).VariableHeader.MessageIdentifier);
                //var pubComp = new MqttPublishCompleteMessage().WithMessageIdentifier(((MqttPublishReleaseMessage)incoming).VariableHeader.MessageIdentifier);
                //session.Write(pubComp);
                break;

            case MqttMessageType.PublishComplete:
                //session.PublishCompleted(((MqttPublishCompleteMessage)incoming).VariableHeader.MessageIdentifier);
                break;
            }
        }
Пример #3
0
        public void BasicSerialization()
        {
            var expected = new[]
            {
                (byte)0xB0,
                (byte)0x02,
                (byte)0x0,
                (byte)0x4,
            };

            MqttUnsubscribeAckMessage msg = new MqttUnsubscribeAckMessage().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.
        }
Пример #4
0
        public virtual void Route(byte[] messageData, T session)
        {
            try
            {
                MqttMessage incoming = MqttMessage.CreateFrom(messageData);
                switch (incoming.Header.MessageType)
                {
                case MqttMessageType.Publish:
                    PublishReceived(session, (MqttPublishMessage)incoming);
                    break;

                case MqttMessageType.Subscribe:
                    SubscribeReceived(session, (MqttSubscribeMessage)incoming);
                    break;

                case MqttMessageType.Unsubscribe:
                    RemoveSubscriptions(session, ((MqttUnsubscribeMessage)incoming).Payload.Subscriptions);
                    var unsubAck = new MqttUnsubscribeAckMessage().WithMessageIdentifier(((MqttPublishReceivedMessage)incoming).VariableHeader.MessageIdentifier);
                    session.Write(unsubAck);
                    break;

                case MqttMessageType.PublishAck:
                    string messageId = session.PublishAcknowledged(((MqttPublishAckMessage)incoming).VariableHeader.MessageIdentifier);
                    if (messageId != null)
                    {
                        storageProvider.ReleaseMessage(messageId);
                    }
                    break;

                case MqttMessageType.PublishReceived:
                    messageId = session.PublishReceived(((MqttPublishReceivedMessage)incoming).VariableHeader.MessageIdentifier);
                    if (messageId != null)
                    {
                        storageProvider.ReleaseMessage(messageId);
                    }
                    break;

                case MqttMessageType.PublishRelease:
                    session.RemoveQoS2(((MqttPublishReleaseMessage)incoming).VariableHeader.MessageIdentifier);
                    var pubComp = new MqttPublishCompleteMessage().WithMessageIdentifier(((MqttPublishReleaseMessage)incoming).VariableHeader.MessageIdentifier);
                    session.Write(pubComp);
                    break;

                case MqttMessageType.PublishComplete:
                    session.PublishCompleted(((MqttPublishCompleteMessage)incoming).VariableHeader.MessageIdentifier);
                    break;
                }
            }
            catch (TargetInvocationException ex)
            {
                var inner = ex.InnerException as HttpException;
                session.Write(inner != null ? new ErrorMessage(inner.GetHttpCode(), inner.Message) : new ErrorMessage((ex.InnerException ?? ex).Message));
            }
            catch (HttpException ex)
            {
                session.Write(new ErrorMessage(ex.Message));
            }
            catch (Exception ex)
            {
                session.Write(new ErrorMessage(ex.Message));
            }
        }