Example #1
0
        public void Setup()
        {
            var message = new MqttApplicationMessageBuilder()
                          .WithTopic("A")
                          .Build();

            _packet = message.ToPublishPacket();
            var serializer       = new MqttPacketSerializer();
            var serializedPacket = Join(serializer.Serialize(_packet));

            _iterations = 10000;

            _stream = new MemoryStream(_iterations * serializedPacket.Length);

            for (var i = 0; i < _iterations; i++)
            {
                _stream.Write(serializedPacket, 0, serializedPacket.Length);
            }

            _stream.Position = 0;

            var channel = new TestMqttChannel(_stream);

            _channelAdapter = new MqttChannelAdapter(channel, serializer, new MqttNetLogger().CreateChildLogger(nameof(MqttChannelAdapter)));
        }
Example #2
0
        public IMqttChannelAdapter CreateClientAdapter(IMqttClientOptions options, IMqttNetChildLogger logger)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var serializer = new MqttPacketSerializer {
                ProtocolVersion = options.ProtocolVersion
            };

            switch (options.ChannelOptions)
            {
            case MqttClientTcpOptions _:
            {
                return(new MqttChannelAdapter(new MqttTcpChannel(options), serializer, logger));
            }

            case MqttClientWebSocketOptions webSocketOptions:
            {
                return(new MqttChannelAdapter(new MqttWebSocketChannel(webSocketOptions), serializer, logger));
            }

            default:
            {
                throw new NotSupportedException();
            }
            }
        }
Example #3
0
        public void TestTryDeserialize()
        {
            var serializer = new MqttPacketSerializer();

            var buffer = serializer.Serialize(new MqttPublishPacket()
            {
                Topic = "a", Payload = new byte[5]
            });

            var sequence = new ReadOnlySequence <byte>(buffer.Array, buffer.Offset, buffer.Count);

            var            part = sequence;
            MqttBasePacket packet;
            var            consumed = part.Start;
            var            observed = part.Start;
            var            result   = false;

            part   = sequence.Slice(sequence.Start, 0); // empty message should fail
            result = serializer.TryDeserialize(part, out packet, out consumed, out observed);
            Assert.IsFalse(result);


            part   = sequence.Slice(sequence.Start, 1); // partial fixed header should fail
            result = serializer.TryDeserialize(part, out packet, out consumed, out observed);
            Assert.IsFalse(result);

            part   = sequence.Slice(sequence.Start, 4); // partial body should fail
            result = serializer.TryDeserialize(part, out packet, out consumed, out observed);
            Assert.IsFalse(result);

            part   = sequence; // complete msg should work
            result = serializer.TryDeserialize(part, out packet, out consumed, out observed);
            Assert.IsTrue(result);
        }
Example #4
0
        public IMqttChannelAdapter CreateClientAdapter(IMqttClientOptions options, IMqttNetChildLogger logger)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var serializer = new MqttPacketSerializer {
                ProtocolVersion = options.ProtocolVersion
            };

            switch (options.ChannelOptions)
            {
            case MqttClientTcpOptions tcpOptions:
            {
                var endpoint      = new DnsEndPoint(tcpOptions.Server, tcpOptions.GetPort());
                var tcpConnection = new TcpConnection(endpoint);
                return(new MqttConnectionContext(serializer, tcpConnection));
            }

            default:
            {
                throw new NotSupportedException();
            }
            }
        }
        private static void SerializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
        {
            var serializer = new MqttPacketSerializer {
                ProtocolVersion = protocolVersion
            };
            var chunks = serializer.Serialize(packet);

            Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(chunks)));
        }
Example #6
0
        public void Setup()
        {
            var message = new MqttApplicationMessageBuilder()
                          .WithTopic("A")
                          .Build();

            _packet           = message.ToPublishPacket();
            _serializer       = new MqttPacketSerializer();
            _serializedPacket = _serializer.Serialize(_packet);
        }
        public override async Task OnConnectedAsync(ConnectionContext connection)
        {
            var serializer = new MqttPacketSerializer();

            using (var adapter = new MqttConnectionContext(serializer, connection))
            {
                var args = new MqttServerAdapterClientAcceptedEventArgs(adapter);
                ClientAccepted?.Invoke(this, args);

                await args.SessionTask;
            }
        }
Example #8
0
        public async Task TestReceivePacketAsyncThrowsWhenReaderCompleted()
        {
            var serializer = new MqttPacketSerializer {
            };
            var pipe       = new DuplexPipeMockup();
            var connection = new DefaultConnectionContext();

            connection.Transport = pipe;
            var ctx = new MqttConnectionContext(serializer, connection);

            pipe.Receive.Writer.Complete();

            await Assert.ThrowsExceptionAsync <MqttCommunicationException>(() => ctx.ReceivePacketAsync(TimeSpan.FromSeconds(1), CancellationToken.None));
        }
Example #9
0
        public void Serialize_LargePacket()
        {
            var serializer = new MqttPacketSerializer {
                ProtocolVersion = MqttProtocolVersion.V311
            };

            const int payloadLength = 80000;

            var payload = new byte[payloadLength];

            var value = 0;

            for (var i = 0; i < payloadLength; i++)
            {
                if (value > 255)
                {
                    value = 0;
                }

                payload[i] = (byte)value;
            }

            var publishPacket = new MqttPublishPacket
            {
                Topic   = "abcdefghijklmnopqrstuvwxyz0123456789",
                Payload = payload
            };

            var buffer      = serializer.Serialize(publishPacket);
            var testChannel = new TestMqttChannel(new MemoryStream(buffer.Array, buffer.Offset, buffer.Count));

            var header = MqttPacketReader.ReadFixedHeaderAsync(
                testChannel,
                new byte[2],
                new byte[1],
                CancellationToken.None).GetAwaiter().GetResult();

            var eof = buffer.Offset + buffer.Count;

            var receivedPacket = new ReceivedMqttPacket(
                header.Flags,
                new MqttPacketBodyReader(buffer.Array, eof - header.RemainingLength, buffer.Count + buffer.Offset));

            var packet = (MqttPublishPacket)serializer.Deserialize(receivedPacket);

            Assert.AreEqual(publishPacket.Topic, packet.Topic);
            Assert.IsTrue(publishPacket.Payload.SequenceEqual(packet.Payload));
        }
        private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value)
        {
            var serializer = new MqttPacketSerializer();

            var buffer1 = serializer.Serialize(packet);

            using (var headerStream = new MemoryStream(Join(buffer1)))
            {
                var header = MqttPacketReader.ReadHeaderFromSource(headerStream, CancellationToken.None);

                using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.BodyLength))
                {
                    var deserializedPacket = serializer.Deserialize(header, bodyStream.ToArray());
                    var buffer2            = serializer.Serialize(deserializedPacket);

                    Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(buffer2)));
                }
            }
        }
Example #11
0
        public async Task TestParallelWrites()
        {
            var serializer = new MqttPacketSerializer {
            };
            var pipe       = new DuplexPipeMockup();
            var connection = new DefaultConnectionContext();

            connection.Transport = pipe;
            var ctx = new MqttConnectionContext(serializer, connection);

            var tasks = Enumerable.Range(1, 10).Select(_ => Task.Run(async() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    await ctx.SendPacketAsync(new MqttPublishPacket(), CancellationToken.None).ConfigureAwait(false);
                }
            }));

            await Task.WhenAll(tasks).ConfigureAwait(false);
        }
Example #12
0
        public override async Task OnConnectedAsync(ConnectionContext connection)
        {
            // required for websocket transport to work
            var transferFormatFeature = connection.Features.Get <ITransferFormatFeature>();

            if (transferFormatFeature != null)
            {
                transferFormatFeature.ActiveFormat = TransferFormat.Binary;
            }


            var serializer = new MqttPacketSerializer();

            using (var adapter = new MqttConnectionContext(serializer, connection))
            {
                var args = new MqttServerAdapterClientAcceptedEventArgs(adapter);
                ClientAccepted?.Invoke(this, args);

                await args.SessionTask;
            }
        }
Example #13
0
        private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
        {
            var serializer = new MqttPacketSerializer {
                ProtocolVersion = protocolVersion
            };

            var buffer1 = serializer.Serialize(packet);

            using (var headerStream = new MemoryStream(Join(buffer1)))
            {
                var header = MqttPacketReader.ReadHeaderAsync(headerStream, CancellationToken.None).GetAwaiter().GetResult();

                using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.BodyLength))
                {
                    var deserializedPacket = serializer.Deserialize(header, bodyStream);
                    var buffer2            = serializer.Serialize(deserializedPacket);

                    Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(buffer2)));
                }
            }
        }
Example #14
0
        private static T Roundtrip <T>(T packet, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
            where T : MqttBasePacket
        {
            var serializer = new MqttPacketSerializer {
                ProtocolVersion = protocolVersion
            };

            var buffer1 = serializer.Serialize(packet);

            using (var headerStream = new MemoryStream(Join(buffer1)))
            {
                var channel          = new TestMqttChannel(headerStream);
                var fixedHeader      = new byte[2];
                var singleByteBuffer = new byte[1];

                var header = MqttPacketReader.ReadFixedHeaderAsync(channel, fixedHeader, singleByteBuffer, CancellationToken.None).GetAwaiter().GetResult();

                using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.RemainingLength))
                {
                    return((T)serializer.Deserialize(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0, (int)bodyStream.Length))));
                }
            }
        }
Example #15
0
        private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
        {
            var serializer = new MqttPacketSerializer {
                ProtocolVersion = protocolVersion
            };

            var buffer1 = serializer.Serialize(packet);

            using (var headerStream = new MemoryStream(Join(buffer1)))
            {
                var channel          = new TestMqttChannel(headerStream);
                var fixedHeader      = new byte[2];
                var singleByteBuffer = new byte[1];
                var header           = MqttPacketReader.ReadFixedHeaderAsync(channel, fixedHeader, singleByteBuffer, CancellationToken.None).GetAwaiter().GetResult();

                using (var bodyStream = new MemoryStream(Join(buffer1), (int)headerStream.Position, header.RemainingLength))
                {
                    var deserializedPacket = serializer.Deserialize(new ReceivedMqttPacket(header.Flags, new MqttPacketBodyReader(bodyStream.ToArray(), 0, (int)bodyStream.Length)));
                    var buffer2            = serializer.Serialize(deserializedPacket);

                    Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(buffer2)));
                }
            }
        }