Skip to content

Commit 17f8cbf

Browse files
authored
Refactor Packet ID Generation (#179)
1 parent 5894e4f commit 17f8cbf

8 files changed

+175
-49
lines changed

Source/HiveMQtt/Client/HiveMQClient.cs

+16-11
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public async Task<ConnectResult> ConnectAsync()
9797

9898
// Construct the MQTT Connect packet and queue to send
9999
var connPacket = new ConnectPacket(this.Options);
100-
Logger.Trace($"Queuing packet for send: {connPacket.GetType().Name} id={connPacket.PacketIdentifier}");
100+
Logger.Trace($"Queuing CONNECT packet for send.");
101101
this.SendQueue.Enqueue(connPacket);
102102

103103
ConnAckPacket connAck;
@@ -174,7 +174,7 @@ public async Task<bool> DisconnectAsync(DisconnectOptions? options = null)
174174
EventHandler<OnDisconnectSentEventArgs> eventHandler = TaskHandler;
175175
this.OnDisconnectSent += eventHandler;
176176

177-
Logger.Trace($"Queuing packet for send: {disconnectPacket.GetType().Name} id={disconnectPacket.PacketIdentifier}");
177+
Logger.Trace($"Queuing DISCONNECT packet for send.");
178178
this.SendQueue.Enqueue(disconnectPacket);
179179

180180
try
@@ -201,23 +201,25 @@ public async Task<PublishResult> PublishAsync(MQTT5PublishMessage message, Cance
201201
{
202202
message.Validate();
203203

204-
var packetIdentifier = this.GeneratePacketIdentifier();
205-
var publishPacket = new PublishPacket(message, (ushort)packetIdentifier);
206-
207204
// QoS 0: Fast Service
208205
if (message.QoS == QualityOfService.AtMostOnceDelivery)
209206
{
210-
Logger.Trace($"Queuing packet for send: {publishPacket.GetType().Name} id={publishPacket.PacketIdentifier}");
207+
var publishPacket = new PublishPacket(message, 0);
208+
Logger.Trace($"Queuing QoS 0 publish packet for send: {publishPacket.GetType().Name}");
209+
211210
this.OutgoingPublishQueue.Enqueue(publishPacket);
212211
return new PublishResult(publishPacket.Message);
213212
}
214213
else if (message.QoS == QualityOfService.AtLeastOnceDelivery)
215214
{
216215
// QoS 1: Acknowledged Delivery
217-
Logger.Trace($"Queuing packet for send: {publishPacket.GetType().Name} id={publishPacket.PacketIdentifier}");
216+
var packetIdentifier = await this.PacketIDManager.GetAvailablePacketIDAsync().ConfigureAwait(false);
217+
var publishPacket = new PublishPacket(message, (ushort)packetIdentifier);
218+
PubAckPacket pubAckPacket;
219+
220+
Logger.Trace($"Queuing QoS 1 publish packet for send: {publishPacket.GetType().Name} id={publishPacket.PacketIdentifier}");
218221
this.OutgoingPublishQueue.Enqueue(publishPacket);
219222

220-
PubAckPacket pubAckPacket;
221223
try
222224
{
223225
// Wait on the QoS 1 handshake
@@ -236,8 +238,11 @@ public async Task<PublishResult> PublishAsync(MQTT5PublishMessage message, Cance
236238
else if (message.QoS == QualityOfService.ExactlyOnceDelivery)
237239
{
238240
// QoS 2: Assured Delivery
241+
var packetIdentifier = await this.PacketIDManager.GetAvailablePacketIDAsync().ConfigureAwait(false);
242+
var publishPacket = new PublishPacket(message, (ushort)packetIdentifier);
239243
PublishResult? publishResult = null;
240-
Logger.Trace($"Queuing packet for send: {publishPacket.GetType().Name} id={publishPacket.PacketIdentifier}");
244+
245+
Logger.Trace($"Queuing QoS 2 publish packet for send: {publishPacket.GetType().Name} id={publishPacket.PacketIdentifier}");
241246
this.OutgoingPublishQueue.Enqueue(publishPacket);
242247

243248
List<ControlPacket> packetList;
@@ -314,7 +319,7 @@ public async Task<SubscribeResult> SubscribeAsync(SubscribeOptions options)
314319

315320
// FIXME: We should only ever have one subscribe in flight at any time (for now)
316321
// Construct the MQTT Subscribe packet
317-
var packetIdentifier = this.GeneratePacketIdentifier();
322+
var packetIdentifier = await this.PacketIDManager.GetAvailablePacketIDAsync().ConfigureAwait(false);
318323
var subscribePacket = new SubscribePacket(options, (ushort)packetIdentifier);
319324

320325
// Setup the task completion source to wait for the SUBACK
@@ -422,7 +427,7 @@ public async Task<UnsubscribeResult> UnsubscribeAsync(UnsubscribeOptions unsubOp
422427
// Fire the corresponding event
423428
this.BeforeUnsubscribeEventLauncher(unsubOptions.Subscriptions);
424429

425-
var packetIdentifier = this.GeneratePacketIdentifier();
430+
var packetIdentifier = await this.PacketIDManager.GetAvailablePacketIDAsync().ConfigureAwait(false);
426431
var unsubscribePacket = new UnsubscribePacket(unsubOptions, (ushort)packetIdentifier);
427432

428433
var taskCompletionSource = new TaskCompletionSource<UnsubAckPacket>();

0 commit comments

Comments
 (0)