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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:52:32