You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用mqtt_client连接MQTT Broker后立即断开问题求助

MQTT连接成功后立即断开问题排查

我在首个MQTT项目中使用mqtt_client包开发,调用initializeMQTTClient初始化后执行connect,连接成功建立后会立即自动断开,偶尔会抛出Connection reset by peer错误。

项目代码

import 'dart:io';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';

enum MQTTAppConnectionState { connected, disconnected, connecting }

class MQTTManager {
  // Private instance of client
  MQTTAppConnectionState _currentState = MQTTAppConnectionState.disconnected;
  MqttServerClient? _client;
  final String _identifier = 'test';
  final String _host = 'test.mosquitto.org';
  final String _topic = 'TTestTopic';

  void initializeMQTTClient() {
    _client = MqttServerClient(_host, _identifier);
    _client!.setProtocolV311();
    _client!.port = 1883;
    _client!.keepAlivePeriod = 60;
    _client!.onDisconnected = onDisconnected;
    _client!.logging(on: true);
    _client!.onConnected = onConnected;
    _client!.onSubscribed = onSubscribed;

    final MqttConnectMessage connMess = MqttConnectMessage()
        .withClientIdentifier(_identifier)
        .withWillTopic('willTopic')
        .withWillMessage('My Will message')
        .startClean()
        .withWillQos(MqttQos.atLeastOnce);
    _client!.connectionMessage = connMess;
    print('Initialize::Mosquitto client connecting....');
  }

  void connect() async {
    try {
      await _client!.connect();
    } on NoConnectionException catch (e) {
      print('Connect::client exception - $e');
      disconnect();
    } on SocketException catch (e) {
      print('Connect::socket exception - $e');
      disconnect();
    }

    if (_client!.connectionStatus!.state == MqttConnectionState.connected) {
      print('Connect::Mosquitto client connected');
    } else {
      print(
          'Connect::ERROR Mosquitto client connection failed - disconnecting, status is ${_client!.connectionStatus}');
      disconnect();
    }
  }

  void disconnect() {
    print('Disconnect::Mosquitto client Disconnecting...');
    _client!.disconnect();
  }

  void publish(String message) {
    final MqttClientPayloadBuilder builder = MqttClientPayloadBuilder();
    builder.addString(message);
    _client!.publishMessage(_topic, MqttQos.exactlyOnce, builder.payload!);
    print('Publish::The Message published');
  }

  void onSubscribed(String topic) {
    print('onSubscribed::Subscription confirmed for topic $topic');
  }

  void onDisconnected() {
    print(
        'onDisconnected::OnDisconnected client callback - Client disconnection');
    if (_client!.connectionStatus!.disconnectionOrigin ==
        MqttDisconnectionOrigin.solicited) {
      print(
          'onDisconnected::OnDisconnected callback is solicited, this is correct');
    } else {
      print(
          'onDisconnected::OnDisconnected callback is unsolicited or none, this is incorrect - exiting');
      print(_client!.connectionStatus!.disconnectionOrigin);
    }
  }

  void onConnected() {
    print('onConnected::Mosquitto client connected');
    publish('test-message');
  }
}

连接日志

Performing hot restart...                                               
Restarted application in 2,774ms.
D/ViewRootImpl@7dfadf8[MainActivity]( 3522): ViewPostIme pointer 0
D/ViewRootImpl@7dfadf8[MainActivity]( 3522): ViewPostIme pointer 1
I/flutter ( 3522): Initialize::Mosquitto client connecting....
D/ViewRootImpl@7dfadf8[MainActivity]( 3522): ViewPostIme pointer 0
D/ViewRootImpl@7dfadf8[MainActivity]( 3522): ViewPostIme pointer 1
I/flutter ( 3522): 1-2022-07-20 12:49:24.073836 -- MqttClient::connect - keep alive is enabled with a value of 60 seconds
I/flutter ( 3522): 1-2022-07-20 12:49:24.086424 -- MqttConnectionKeepAlive:: Initialised with a keep alive value of 60 seconds
I/flutter ( 3522): 1-2022-07-20 12:49:24.086761 -- MqttConnectionKeepAlive:: Disconnect on no ping response is disabled
I/flutter ( 3522): 1-2022-07-20 12:49:24.091955 -- MqttConnectionHandlerBase::connect - server test.mosquitto.org, port 1883
I/flutter ( 3522): 1-2022-07-20 12:49:24.098246 -- SynchronousMqttServerConnectionHandler::internalConnect entered
I/flutter ( 3522): 1-2022-07-20 12:49:24.099240 -- SynchronousMqttServerConnectionHandler::internalConnect - initiating connection try 0, auto reconnect in progress false
I/flutter ( 3522): 1-2022-07-20 12:49:24.101517 -- SynchronousMqttServerConnectionHandler::internalConnect - insecure TCP selected
I/flutter ( 3522): 1-2022-07-20 12:49:24.103563 -- SynchronousMqttServerConnectionHandler::internalConnect - calling connect
I/flutter ( 3522): 1-2022-07-20 12:49:24.106087 -- MqttNormalConnection::connect - entered
I/flutter ( 3522): 1-2022-07-20 12:49:26.946207 -- MqttServerConnection::_startListening
I/flutter ( 3522): 1-2022-07-20 12:49:26.957122 -- SynchronousMqttServerConnectionHandler::internalConnect - connection complete
I/flutter ( 3522): 1-2022-07-20 12:49:26.957554 -- SynchronousMqttServerConnectionHandler::internalConnect sending connect message
I/flutter ( 3522): 1-2022-07-20 12:49:26.958760 -- MqttConnectionHandlerBase::sendMessage - MQTTMessage of type MqttMessageType.connect
I/flutter ( 3522): Header: MessageType = MqttMessageType.connect, Duplicate = false, Retain = false, Qos = MqttQos.atMostOnce, Size = 0
I/flutter ( 3522): Connect Variable Header: ProtocolName=MQTT, ProtocolVersion=4, ConnectFlags=Connect Flags: Reserved1=false, CleanStart=true, WillFlag=true, WillQos=MqttQos.atLeastOnce, WillRetain=false, PasswordFlag=false, UserNameFlag=false, KeepAlive=60
I/flutter ( 3522): MqttConnectPayload - client identifier is : test
I/flutter ( 3522): 1-2022-07-20 12:49:27.006966 -- SynchronousMqttServerConnectionHandler::internalConnect - pre sleep, state = Connection status is connecting with return code of noneSpecified and a disconnection origin of none
I/flutter ( 3522): 1-2022-07-20 12:49:27.594101 -- MqttConnection::_onData
I/flutter ( 3522): 1-2022-07-20 12:49:27.612564 -- MqttServerConnection::_onData - message received MQTTMessage of type MqttMessageType.connectAck
I/flutter ( 3522): Header: MessageType = MqttMessageType.connectAck, Duplicate = false, Retain = false, Qos = MqttQos.atMostOnce, Size = 2
I/flutter ( 3522): Connect Variable Header: TopicNameCompressionResponse={0}, ReturnCode={MqttConnectReturnCode.connectionAccepted}
I/flutter ( 3522): 1-2022-07-20 12:49:27.617457 -- MqttServerConnection::_onData - message available event fired
I/flutter ( 3522): 1-2022-07-20 12:49:27.625087 -- MqttConnectionHandlerBase::_connectAckProcessor
I/flutter ( 3522): 1-2022-07-20 12:49:27.625838 -- MqttConnectionHandlerBase:_connectAckProcessor - state = connected
I/flutter ( 3522): onConnected::Mosquitto client connected
I/flutter ( 3522): 1-2022-07-20 12:49:27.635989 -- PublishingManager::publish - entered with topic TTestTopic
I/flutter ( 3522): 1-2022-07-20 12:49:27.641728 -- MqttConnectionHandlerBase::sendMessage - MQTTMessage of type MqttMessageType.publish
I/flutter ( 3522): Header: MessageType = MqttMessageType.publish, Duplicate = false, Retain = false, Qos = MqttQos.exactlyOnce, Size = 0
I/flutter ( 3522): Publish Variable Header: TopicName={TTestTopic}, MessageIdentifier={1}, VH Length={0}
I/flutter ( 3522): Payload: {12 bytes={<116><101><115><116><45><109><101><115><115><97><103><101>
I/flutter ( 3522): Publish::The Message published
I/flutter ( 3522): 1-2022-07-20 12:49:27.648302 -- MqttConnectionHandlerBase:: cancelling connect timer
I/flutter ( 3522): 1-2022-07-20 12:49:27.649860 -- SynchronousMqttServerConnectionHandler::internalConnect - post sleep, state = Connection status is connected with return code of connectionAccepted and a disconnection origin of none
I/flutter ( 3522): 1-2022-07-20 12:49:27.650373 -- SynchronousMqttServerConnectionHandler::internalConnect exited with state Connection status is connected with return code of connectionAccepted and a 
disconnection origin of none
I/flutter ( 3522): Connect::Mosquitto client connected
I/flutter ( 3522): 1-2022-07-20 12:49:27.837663 -- MqttConnectionBase::_onDone - calling disconnected callback
I/flutter ( 3522): 1-2022-07-20 12:49:27.846350 -- MqttConnectionKeepAlive::stop - stopping keep alive
I/flutter ( 3522): onDisconnected::OnDisconnected client callback - Client disconnection
I/flutter ( 3522): onDisconnected::OnDisconnected callback is unsolicited or none, this is incorrect - exiting
I/flutter ( 3522): MqttDisconnectionOrigin.unsolicited

偶发错误日志

Unhandled Exception: SocketException: Connection reset by peer (OS Error: Connection reset by peer, errno = 104), address = test.mosquitto.org, port = 40274

已尝试的解决操作

  • 执行flutter clean
  • 执行flutter pub cache repair
  • 更换ISP网络

以上操作均未能解决问题,请求帮忙排查原因。

内容的提问来源于stack exchange,提问作者MrDark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:15:42