예제 #1
0
        /// <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;
            }
        }