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)); }
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; * * }*/ }
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)); }
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); }