MQTT连接遇SocketException(连接拒绝),求重连函数问题排查
MQTT连接被拒绝(SocketException 111)排查与解决
一、先排查网络与Broker端问题
- 确认目标Broker(192.168.1.149)是否正在运行:登录该主机,查看MQTT服务进程状态(比如
systemctl status mosquitto,如果用的是Mosquitto)。 - 验证端口38772是否开放:在客户端主机执行命令测试连通性:
如果提示无法连接,说明Broker未监听该端口,或者主机防火墙/安全组拦截了这个端口。telnet 192.168.1.149 38772 # 或者用nc nc -zv 192.168.1.149 38772 - 核对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
相关产品推荐
相关产品推荐

