mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-18 02:13:00 +08:00
remove async and framing from serializer
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Core.Channel;
|
||||
using System.IO;
|
||||
using MQTTnet.Core.Packets;
|
||||
|
||||
namespace MQTTnet.Core.Serializer
|
||||
@@ -8,8 +7,8 @@ namespace MQTTnet.Core.Serializer
|
||||
{
|
||||
MqttProtocolVersion ProtocolVersion { get; set; }
|
||||
|
||||
Task SerializeAsync(MqttBasePacket mqttPacket, IMqttCommunicationChannel destination);
|
||||
byte[] Serialize(MqttBasePacket mqttPacket);
|
||||
|
||||
Task<MqttBasePacket> DeserializeAsync(IMqttCommunicationChannel source);
|
||||
MqttBasePacket Deserialize(MqttPacketHeader header, MemoryStream stream);
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ namespace MQTTnet.Core.Serializer
|
||||
private readonly MqttPacketHeader _header;
|
||||
|
||||
public MqttPacketReader(Stream stream, MqttPacketHeader header)
|
||||
: base(stream)
|
||||
: base(stream, Encoding.UTF8, true)
|
||||
{
|
||||
_header = header;
|
||||
}
|
||||
@@ -49,13 +49,13 @@ namespace MQTTnet.Core.Serializer
|
||||
return ReadBytes(_header.BodyLength - (int)BaseStream.Position);
|
||||
}
|
||||
|
||||
public static MqttPacketHeader ReadHeaderFromSource(IMqttCommunicationChannel source)
|
||||
public static MqttPacketHeader ReadHeaderFromSource(Stream stream)
|
||||
{
|
||||
var fixedHeader = (byte)source.Stream.ReadByte();
|
||||
var fixedHeader = (byte)stream.ReadByte();
|
||||
var byteReader = new ByteReader(fixedHeader);
|
||||
byteReader.Read(4);
|
||||
var controlPacketType = (MqttControlPacketType)byteReader.Read(4);
|
||||
var bodyLength = ReadBodyLengthFromSource(source);
|
||||
var bodyLength = ReadBodyLengthFromSource(stream);
|
||||
|
||||
return new MqttPacketHeader()
|
||||
{
|
||||
@@ -65,7 +65,7 @@ namespace MQTTnet.Core.Serializer
|
||||
};
|
||||
}
|
||||
|
||||
private static int ReadBodyLengthFromSource(IMqttCommunicationChannel source)
|
||||
private static int ReadBodyLengthFromSource(Stream stream)
|
||||
{
|
||||
// Alorithm taken from http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html.
|
||||
var multiplier = 1;
|
||||
@@ -73,7 +73,7 @@ namespace MQTTnet.Core.Serializer
|
||||
byte encodedByte;
|
||||
do
|
||||
{
|
||||
encodedByte = (byte)source.Stream.ReadByte();
|
||||
encodedByte = (byte)stream.ReadByte();
|
||||
value += (encodedByte & 127) * multiplier;
|
||||
multiplier *= 128;
|
||||
if (multiplier > 128 * 128 * 128)
|
||||
|
||||
@@ -17,12 +17,10 @@ namespace MQTTnet.Core.Serializer
|
||||
private static byte[] ProtocolVersionV310Name { get; } = Encoding.UTF8.GetBytes("MQIs");
|
||||
|
||||
public MqttProtocolVersion ProtocolVersion { get; set; } = MqttProtocolVersion.V311;
|
||||
private Task _sendTask = Task.FromResult( 0 );
|
||||
|
||||
public async Task SerializeAsync(MqttBasePacket packet, IMqttCommunicationChannel destination)
|
||||
public byte[] Serialize(MqttBasePacket packet)
|
||||
{
|
||||
if (packet == null) throw new ArgumentNullException(nameof(packet));
|
||||
if (destination == null) throw new ArgumentNullException(nameof(destination));
|
||||
|
||||
using (var stream = new MemoryStream())
|
||||
using (var writer = new MqttPacketWriter(stream))
|
||||
@@ -37,17 +35,10 @@ namespace MQTTnet.Core.Serializer
|
||||
Buffer.BlockCopy( headerArray, 0, writeBuffer, 0, headerArray.Length );
|
||||
Buffer.BlockCopy( body, 0, writeBuffer, headerArray.Length, body.Length );
|
||||
|
||||
_sendTask = Send( writeBuffer, destination );
|
||||
await _sendTask.ConfigureAwait( false );
|
||||
return writeBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task Send(byte[] buffer, IMqttCommunicationChannel destination )
|
||||
{
|
||||
await _sendTask.ConfigureAwait( false );
|
||||
await destination.Stream.WriteAsync( buffer, 0, buffer.Length ).ConfigureAwait( false );
|
||||
}
|
||||
|
||||
private byte SerializePacket(MqttBasePacket packet, MqttPacketWriter writer)
|
||||
{
|
||||
if (packet is MqttConnectPacket connectPacket)
|
||||
@@ -123,29 +114,11 @@ namespace MQTTnet.Core.Serializer
|
||||
throw new MqttProtocolViolationException("Packet type invalid.");
|
||||
}
|
||||
|
||||
public async Task<MqttBasePacket> DeserializeAsync(IMqttCommunicationChannel source)
|
||||
public MqttBasePacket Deserialize(MqttPacketHeader header, MemoryStream body)
|
||||
{
|
||||
if (source == null) throw new ArgumentNullException(nameof(source));
|
||||
if (header == null) throw new ArgumentNullException(nameof(header));
|
||||
if (body == null) throw new ArgumentNullException(nameof(body));
|
||||
|
||||
var header = MqttPacketReader.ReadHeaderFromSource(source);
|
||||
|
||||
MemoryStream body = null;
|
||||
if ( header.BodyLength > 0 )
|
||||
{
|
||||
var totalRead = 0;
|
||||
var readBuffer = new byte[header.BodyLength];
|
||||
do
|
||||
{
|
||||
var read = await source.Stream.ReadAsync( readBuffer, totalRead, header.BodyLength - totalRead ).ConfigureAwait(false);
|
||||
totalRead += read;
|
||||
} while ( totalRead < header.BodyLength );
|
||||
body = new MemoryStream( readBuffer, 0, header.BodyLength );
|
||||
}
|
||||
else
|
||||
{
|
||||
body = new MemoryStream();
|
||||
}
|
||||
|
||||
using (var reader = new MqttPacketReader(body, header))
|
||||
{
|
||||
return Deserialize( header, reader );
|
||||
|
||||
Reference in New Issue
Block a user