Flutter中MQTT WebSocket连接升级失败问题求助
MQTT WebSocket连接失败:未升级为WebSocket问题解决
问题描述
未处理异常:WebSocketException:连接至'https://broker.emqx.io:8084#'未升级为WebSocket
我更换了其他主机和端口,但仍出现此问题
问题原因
初始化MqttServerClient时错误传入了带wss://前缀的完整URL,MqttServerClient的第一个参数仅需主机域名(如broker.emqx.io),协议前缀会由useWebSocket = true和端口自动组合生成,错误的URL格式会导致服务器无法正确识别WebSocket升级请求。
修复后的代码
import 'dart:io'; import 'package:mqtt_client/mqtt_client.dart'; import 'package:mqtt_client/mqtt_server_client.dart'; // 仅传入主机域名,不要带wss://前缀 final client = MqttServerClient('broker.emqx.io', ''); connect() async { client.useWebSocket = true; client.port = 8084; // EMQX的WSS端口 // 统一使用规范的WebSocket协议配置 client.websocketProtocols = MqttClientConstants.protocolsSingleDefault; client.logging(on: false); client.setProtocolV311(); client.keepAlivePeriod = 20; final connMess = MqttConnectMessage() .withClientIdentifier('mqttx_93ffp4ak') .withWillTopic('willtopic') .withWillMessage('My Will message') .startClean() .withWillQos(MqttQos.atLeastOnce); print('EXAMPLE::Mosquitto client connecting....'); client.connectionMessage = connMess; try { await client.connect(); } on NoConnectionException catch (e) { print('EXAMPLE::client exception - $e'); client.disconnect(); exit(-1); } on SocketException catch (e) { print('EXAMPLE::socket exception - $e'); client.disconnect(); exit(-1); } }
关键修改点
- 将
MqttServerClient的第一个参数从'wss://broker.emqx.io'改为'broker.emqx.io' - 移除重复的
client.websocketProtocols = ['mqtt'];设置,统一使用MqttClientConstants.protocolsSingleDefault(内部已封装['mqtt'],更符合规范)
内容的提问来源于stack exchange,提问作者Kinlu Ong
相关产品推荐
相关产品推荐

