コード例 #1
0
        public Task <IMqttResult> Subscribe(MqttClientSession clientSession, SubscribePacket subscribePacket)
        {
            if (!CLIENT_DIC.TryGetValue(clientSession.ClientId, out List <MqttSubscription> subList))
            {
                subList = new List <MqttSubscription>();

                CLIENT_DIC.TryAdd(clientSession.ClientId, subList);
            }

            foreach (SubscriptionRequest subReq in subscribePacket.Requests)
            {
                if (!subList.Exists(x => x.Topic.Equals(subReq.TopicFilter, StringComparison.OrdinalIgnoreCase)))
                {
                    subList.Add(new MqttSubscription {
                        ClientSession = clientSession,
                        Topic         = subReq.TopicFilter,
                        Qos           = subReq.QualityOfService
                    });
                }

                if (!TOPIC_DIC.TryGetValue(subReq.TopicFilter, out List <string> clientIds))
                {
                    clientIds = new List <string>();
                    TOPIC_DIC.TryAdd(subReq.TopicFilter, clientIds);
                }
                clientIds.Add(clientSession.ClientId);
            }

            return(Task.FromResult <IMqttResult>(SubscribeResult.SUCCESS));
        }
コード例 #2
0
        public override void OnReceive(ISocketContext <MqttMessage> context, MqttMessage msg)
        {
            this._logger.LogTrace("receive Packet from {0}", context.RemoteEndPoint);

            if (msg?.Packet == null)
            {
                this._logger.LogWarning("receive receive message from {0}, but packet is null", context.RemoteEndPoint);
                return;
            }

            Task.Run(
                async() =>
            {
                this._logger.LogDebug("receive Packet from {0}, type ={1}", context.RemoteEndPoint, msg.Packet.PacketType);

                MqttClientSession clientSession = this._sessionManager.GetClientSession(context, msg.Packet);

                IPacketProcessor processor = this._processorManager.GetProcessor(msg.Packet.PacketType);
                if (processor != null)
                {
                    MqttMessage rsp = await processor.ProcessAsync(clientSession, msg.Packet);
                    if (rsp != null)
                    {
                        if (rsp.Packet != null)
                        {
                            await context.SendAsync(rsp);
                        }

                        if (rsp.Code != 0)    //主动断开
                        {
                            await ShutdownChannel(context, msg.Packet);
                        }
                    }
                }
                else
                {
                    this._logger.LogWarning("PacketType:{0} has no processor", msg.Packet.PacketType);
                }
            }).ConfigureAwait(false);

            /*
             * switch (msg.Packet.PacketType)
             * {
             *  case  PacketType.CONNECT:
             *      Console.WriteLine("receive connect pack client_id = {0}",((ConnectPacket)msg.Packet).ClientId);
             *      var ack = new ConnAckPacket { ReturnCode = ConnectReturnCode.Accepted, SessionPresent = true};
             *      context.SendAsync(new MqttMessage { Packet =  ack});
             *      break;
             *  case PacketType.PINGREQ:
             *      context.SendAsync(new MqttMessage { Packet =   PingRespPacket.Instance});
             *      break;
             *  default:
             *      Console.WriteLine("receive Packet from {0}, type ={1}",context.RemoteEndPoint,msg.Packet.PacketType);
             *      break;
             *
             * }*/
        }
コード例 #3
0
        public Task <IMqttResult> UnSubscribe(MqttClientSession clientSession, UnsubscribePacket unSubscribePacket)
        {
            if (CLIENT_DIC.TryGetValue(clientSession.ClientId, out List <MqttSubscription> subList))
            {
                foreach (string topicFilter in unSubscribePacket.TopicFilters)
                {
                    subList.RemoveAll(x => x.Topic == topicFilter);

                    if (TOPIC_DIC.TryGetValue(topicFilter, out List <string> clientIds))
                    {
                        clientIds.Remove(clientSession.ClientId);
                    }
                }
            }

            return(Task.FromResult <IMqttResult>(SubscribeResult.SUCCESS));
        }
コード例 #4
0
        public MqttClientSession GetClientSession(ISocketContext <MqttMessage> context, Packet msgPacket)
        {
            MqttClientSession session = null;

            if (msgPacket.PacketType == PacketType.CONNECT)
            {
                if (msgPacket is ConnectPacket connectPacket)
                {
                    session = new MqttClientSession(connectPacket.ClientId);
                }

                if (session == null)
                {
                    return(null);
                }

                _sessions.TryAdd(session.ChannelId, session);
                return(session);
            }

            _sessions.TryGetValue(context.Id, out session);
            return(session);
        }