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

MQTT连接遇SocketException(连接拒绝),求重连函数问题排查

MQTT连接被拒绝(SocketException 111)排查与解决

一、先排查网络与Broker端问题

  • 确认目标Broker(192.168.1.149)是否正在运行:登录该主机,查看MQTT服务进程状态(比如systemctl status mosquitto,如果用的是Mosquitto)。
  • 验证端口38772是否开放:在客户端主机执行命令测试连通性:
    telnet 192.168.1.149 38772
    # 或者用nc
    nc -zv 192.168.1.149 38772
    
    如果提示无法连接,说明Broker未监听该端口,或者主机防火墙/安全组拦截了这个端口。
  • 核对Broker端口配置:确认MQTT Broker的配置文件中,监听端口是否设置为38772(默认是1883/8883,自定义端口必须在Broker端配置生效)。

二、检查客户端初始化参数

确保_client初始化时参数正确:

  • 地址、端口是否与Broker配置一致;
  • 客户端ID是否唯一(部分Broker要求客户端ID不能重复);
  • 如果Broker开启了认证,是否正确设置了用户名和密码:
// 示例(以mqtt_client库为例)
final client = MqttServerClient('192.168.1.149', 'unique_client_id_xxx', port: 38772);
// 若需认证
client.authenticateAs('your_username', 'your_password');

三、优化重连函数代码

原代码存在状态处理不严谨的问题,优化后更简洁且能避免脏状态:

Future<bool> _attemptConnectionWithTimeout() async {
  const timeout = Duration(seconds: 10);

  try {
    // 同时等待连接完成与超时事件
    final result = await Future.any([
      _connectAndVerify(),
      Future.delayed(timeout, () => false),
    ]);
    return result;
  } catch (e) {
    return false;
  }
}

Future<bool> _connectAndVerify() async {
  try {
    // 连接前重置客户端状态(避免上次失败的残留影响)
    if (_client != null && _client!.connectionStatus?.state != MqttConnectionState.disconnected) {
      await _client!.disconnect();
    }
    
    await _client!.connect();
    return _client!.connectionStatus!.state == MqttConnectionState.connected;
  } catch (e) {
    print('连接失败详情: $e');
    // 失败后确保客户端断开
    if (_client != null) {
      _client!.disconnect();
    }
    return false;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:50:09