/// <summary> /// start as an asynchronous operation. /// </summary> /// <param name="endPoint">The end point.</param> public async Task StartAsync(EndPoint endPoint) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug($"准备启动Mqtt服务主机,监听地址:{endPoint}。"); } IEventLoopGroup bossGroup = new MultithreadEventLoopGroup(1); IEventLoopGroup workerGroup = new MultithreadEventLoopGroup(); //Default eventLoopCount is Environment.ProcessorCount * 2 var bootstrap = new ServerBootstrap(); if (AppConfig.ServerOptions.Libuv) { var dispatcher = new DispatcherEventLoopGroup(); bossGroup = dispatcher; workerGroup = new WorkerEventLoopGroup(dispatcher); bootstrap.Channel <TcpServerChannel>(); } else { bossGroup = new MultithreadEventLoopGroup(1); workerGroup = new MultithreadEventLoopGroup(); bootstrap.Channel <TcpServerSocketChannel>(); } bootstrap .Option(ChannelOption.SoBacklog, AppConfig.ServerOptions.SoBacklog) .ChildOption(ChannelOption.Allocator, PooledByteBufferAllocator.Default) .Group(bossGroup, workerGroup) .Option(ChannelOption.TcpNodelay, true) .ChildHandler(new ActionChannelInitializer <IChannel>(channel => { var pipeline = channel.Pipeline; pipeline.AddLast(MqttEncoder.Instance, new MqttDecoder(true, 256 * 1024), new ServerHandler(async(context, packetType, message) => { var mqttHandlerService = new ServerMqttHandlerService(_logger, _channelService, _mqttBehaviorProvider); await ChannelWrite(context, message, packetType, mqttHandlerService); }, _logger, _channelService, _mqttBehaviorProvider)); })); try { _channel = await bootstrap.BindAsync(endPoint); if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation($"Mqtt服务主机启动成功,监听地址:{endPoint}。"); } } catch { _logger.LogError($"Mqtt服务主机启动失败,监听地址:{endPoint}。 "); } }
public async Task ChannelWrite(IChannelHandlerContext context, object message, PacketType packetType, ServerMqttHandlerService mqttHandlerService) { switch (packetType) { case PacketType.CONNECT: await mqttHandlerService.Login(context, message as ConnectPacket); break; case PacketType.PUBLISH: await mqttHandlerService.Publish(context, message as PublishPacket); break; case PacketType.PUBACK: await mqttHandlerService.PubAck(context, message as PubAckPacket); break; case PacketType.PUBREC: await mqttHandlerService.PubRec(context, message as PubRecPacket); break; case PacketType.PUBREL: await mqttHandlerService.PubRel(context, message as PubRelPacket); break; case PacketType.PUBCOMP: await mqttHandlerService.PubComp(context, message as PubCompPacket); break; case PacketType.SUBSCRIBE: await mqttHandlerService.Subscribe(context, message as SubscribePacket); break; case PacketType.SUBACK: await mqttHandlerService.SubAck(context, message as SubAckPacket); break; case PacketType.UNSUBSCRIBE: await mqttHandlerService.Unsubscribe(context, message as UnsubscribePacket); break; case PacketType.UNSUBACK: await mqttHandlerService.UnsubAck(context, message as UnsubAckPacket); break; case PacketType.PINGREQ: await mqttHandlerService.PingReq(context, message as PingReqPacket); break; case PacketType.PINGRESP: await mqttHandlerService.PingResp(context, message as PingRespPacket); break; case PacketType.DISCONNECT: await mqttHandlerService.Disconnect(context, message as DisconnectPacket); break; } }