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

Flutter中mqtt_client无法订阅韩文MQTT主题问题求助

解决Flutter中mqtt_client 9.7.2版本无法订阅/发布韩文主题的问题

问题核心

mqtt_client处理非ASCII主题时,需确保协议版本兼容UTF-8、主题编码正确,且相关回调已正确注册——你的日志缺少订阅确认和消息通知,大概率是协议版本不匹配或回调未设置导致。

解决方案步骤

1. 指定兼容UTF-8的MQTT协议版本

MQTT 3.1不支持UTF-8主题,必须使用3.1.1或5.0版本:

final client = MqttServerClient.withPort('你的 broker 地址', '客户端ID', 1883);
client.setProtocolV311(); // 或使用 client.setProtocolV5();

2. 确保主题的UTF-8编码正确性

显式将韩文主题转换为UTF-8字节再转回字符串,避免编码异常:

final topic = "test/안녕";
final encodedTopic = String.fromCharCodes(utf8.encode(topic));

3. 注册订阅确认回调

添加onSubscribed回调,接收订阅成功的通知:

client.onSubscribed = (String topic) {
  print('EXAMPLE::Subscription confirmed for topic $topic');
};

4. 注册消息接收回调

通过updates监听消息,解码韩文化负载:

client.updates?.listen((List<MqttReceivedMessage<MqttMessage>> c) {
  final recMess = c[0].payload as MqttPublishMessage;
  final payload = utf8.decode(recMess.payload.message);
  print('EXAMPLE::Change notification:: topic is <${c[0].topic}>, payload is <-- $payload -->');
});

5. 发布韩文主题与负载

发布时沿用同样的编码逻辑,确保主题和负载正确传递:

final builder = MqttClientPayloadBuilder();
builder.addString('Hello 안녕하세요');
client.publishMessage(encodedTopic, MqttQos.exactlyOnce, builder.payload!);
print('EXAMPLE::Published notification:: topic is $topic, with Qos MqttQos.exactlyOnce');

完整可运行示例

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

void main() async {
  final client = MqttServerClient.withPort('test.mosquitto.org', 'flutter_kr_client', 1883);
  client.setProtocolV311();
  client.keepAlivePeriod = 20;

  client.onConnected = () {
    print('EXAMPLE::Connected to broker');
    final topic = "test/안녕";
    final encodedTopic = String.fromCharCodes(utf8.encode(topic));
    print('EXAMPLE::Subscribing to the $topic topic');
    client.subscribe(encodedTopic, MqttQos.exactlyOnce);

    print('EXAMPLE::Publishing our topic');
    final builder = MqttClientPayloadBuilder();
    builder.addString('Hello 안녕하세요');
    client.publishMessage(encodedTopic, MqttQos.exactlyOnce, builder.payload!);
    print('EXAMPLE::Published notification:: topic is $topic, with Qos MqttQos.exactlyOnce');
  };

  client.onSubscribed = (String topic) {
    print('EXAMPLE::Subscription confirmed for topic $topic');
  };

  client.updates?.listen((List<MqttReceivedMessage<MqttMessage>> c) {
    final recMess = c[0].payload as MqttPublishMessage;
    final payload = utf8.decode(recMess.payload.message);
    print('EXAMPLE::Change notification:: topic is <${c[0].topic}>, payload is <-- $payload -->');
  });

  client.onFailed = (String reason) {
    print('EXAMPLE::Connection failed: $reason');
    client.disconnect();
  };

  try {
    await client.connect();
  } catch (e) {
    print('EXAMPLE::Exception: $e');
    client.disconnect();
  }
}

关键注意事项

  • 必须使用MQTT 3.1.1或5.0协议,3.1版本不支持UTF-8主题
  • 显式编码主题可避免Dart字符串与MQTT库之间的编码冲突
  • 所有回调必须在connect()之前注册,否则无法触发通知

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:50