async void SendD2CMessage(DeviceDataPacket dataPacket) { Contract.Requires(this.identity != null); if (identity?.Id != dataPacket.DeviceId) { if (this.stateFlags == StateFlags.ProcessingConnect || this.stateFlags == StateFlags.Connected) { this.stateFlags = StateFlags.InvalidConfiguration; this.Shutdown(this.capturedContext, new SocketIoTGatewayException(ErrorCode.UnResolvedSendingClient, "Invalid device identity")); return; } } if (this.ConnectedToService) { PreciseTimeSpan startedTimestamp = PreciseTimeSpan.FromStart; IMessage message = null; try { ITcpIoTHubMessagingServiceClient sendingClient = null; if (this.messagingBridge.TryResolveClient("Events", out sendingClient)) { message = sendingClient.CreateMessage(dataPacket.EventTopicAddress, dataPacket.Payload); message.Properties[this.settings.ServicePropertyPrefix + "MessageType"] = dataPacket.PacketType.ToString(); await sendingClient.SendAsync(message); message = null; } else { throw new SocketIoTGatewayException(ErrorCode.UnResolvedSendingClient, $"Could not resolve a sending client based on topic name `Events`."); } } finally { message?.Dispose(); } } else { dataPacket.Release(); } }
public override void ChannelRead(IChannelHandlerContext context, object message) { var tenancyContext = context.GetAttribute <AbstractTenancyContext>(AttributeKey <AbstractTenancyContext> .ValueOf(AbstractTenancyContext.TENANCY_CONTEXT_KEY)).Get(); this.messagingBridgeFactory = tenancyContext.IotBridgeFactory; var packets = message as IDictionary <PacketType, Packet>; if (packets == null || (packets != null && packets.Count <= 0)) { Console.WriteLine(($"No messages (`{typeof(Packet).FullName}` ) received")); return; } var connectPacket = packets[PacketType.CONNECT] as ConnectPacket; var dataPacket = packets[PacketType.D2C] as DeviceDataPacket; this.lastClientActivityTime = DateTime.Now; if (this.IsInState(StateFlags.Connected)) //Already Connected, process DeviceDataPacket { this.ProcessPacket(context, dataPacket); } else if (this.IsInState(StateFlags.ProcessingConnect)) //Connect processing in progress, queue newer connect requests { //TODO Implement queue/ priority queue based on supported cases Queue <Packet> queue = this.connectPendingQueue ?? (this.connectPendingQueue = new Queue <Packet>(4)); queue.Enqueue(dataPacket); } else { //Not Connected and Not processing a connect - Use connect packet to create connection to IoTHub this.dataPacketWithConnect = dataPacket; this.ProcessPacket(context, connectPacket); } context.WriteAsync(message); }