示例#1
0
        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();
            }
        }
示例#2
0
        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);
        }