private async Task <ConnectReturnCode> AuthenticateAsync(ReadListeningHandler readListener) { var connectPacket = new ConnectPacket { ClientId = ClientId, CleanSession = true }; //if (!string.IsNullOrEmpty(username)) //{ // packet.UsernameFlag = true; // packet.UserName = username; //} //if (!string.IsNullOrEmpty(password)) //{ // packet.PasswordFlag = true; // packet.Password = password; //} //connectPacket.KeepAlive = KeepAlive; await _clientChannel.WriteAndFlushAsync(connectPacket); if (await readListener.ReceiveAsync() is ConnAckPacket connAckPacket) { return(connAckPacket.ConnectReturnCode); } return(ConnectReturnCode.UnacceptedProtocolVersion); }
/// <summary> /// 连接 /// </summary> /// <param name="username">用户名</param> /// <param name="password">密码</param> /// <returns></returns> public async Task <ConnectReturnCode> ConnectAsync(string username = default, string password = default) { var clientReadListener = new ReadListeningHandler(); var bootstrap = new Bootstrap(); bootstrap .Group(_group) .Channel <TcpSocketChannel>() .Option(ChannelOption.TcpNodelay, true) .Handler(new ActionChannelInitializer <ISocketChannel>(channel => { var pipeline = channel.Pipeline; pipeline.AddLast(MqttEncoder.Instance, new MqttDecoder(false, 256 * 0124), clientReadListener); })); try { _clientChannel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse("118.126.96.166"), 1883)).ConfigureAwait(false); var connectResponse = await AuthenticateAsync(clientReadListener).ConfigureAwait(false);; if (connectResponse == ConnectReturnCode.ConnectionAccepted) { StartReceivingPackets(clientReadListener); } OnConnected?.Invoke(connectResponse); return(connectResponse); } catch { await DisconnectAsync(); throw new Exception("BrokerUnavailable"); } }
private async Task ReceivePacketsAsync(ReadListeningHandler clientReadListener) { while (true) { if (await clientReadListener.ReceiveAsync() is Packet packet) { await ProcessReceivedPacketAsync(packet); } } }
private void StartReceivingPackets(ReadListeningHandler clientReadListener) { Task.Run(() => ReceivePacketsAsync(clientReadListener)); }