美文网首页
flutter mqtt,解决中文乱码

flutter mqtt,解决中文乱码

作者: 微风_10a5 | 来源:发表于2023-03-22 18:11 被阅读0次

前言

对于如何在flutter里面 使用mqtt,可以参考之前写的一篇文章flutter mqtt的使用看这里

正题

如本文标题,本文是来解决中文乱码的问题的。(基于之前的那篇文章,做一些修改)

在网络上搜索了,如何解决flutter里面 mqtt中文乱码的问题,始终没有找到合适的答案
后面是通过Chat-GPT来找到答案的,亲测有用

import 'dart:async';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
import 'package:typed_data/typed_buffers.dart';

typedef ConnectedCallback = void Function();

class MqttTool {
  MqttQos qos = MqttQos.atLeastOnce;
  late MqttServerClient mqttClient;
  static  MqttTool? _instance;
  static MqttTool? getInstance() {
    // if (_instance == null) {
    //   _instance = MqttTool();
    // }
    _instance ??= MqttTool();
    return _instance;
  }

  Future<MqttClientConnectionStatus?> connect(String server, int port,
      String clientIdentifier, String username, String password,
      {bool isSsl = false}) {
    mqttClient = MqttServerClient.withPort(server, clientIdentifier, port);

    mqttClient.onConnected = onConnected;

    mqttClient.onSubscribed = _onSubscribed;

    mqttClient.onSubscribeFail = _onSubscribeFail;

    mqttClient.onUnsubscribed = _onUnSubscribed;

    mqttClient.setProtocolV311();
    mqttClient.logging(on: false);
    if (isSsl) {
      mqttClient.secure = true;
      mqttClient.onBadCertificate = (dynamic a) => true;
    }
    _log("_正在连接中...");
    return mqttClient.connect(username, password);
  }

  disconnect() {
    mqttClient.disconnect();
    _log("_disconnect");
  }

  int publishMessage(String pTopic, String msg) {

    _log("_发送数据-topic:$pTopic,playLoad:$msg");
    Uint8Buffer uint8buffer = Uint8Buffer();
    var codeUnits = msg.codeUnits;
    uint8buffer.addAll(codeUnits);

    return mqttClient.publishMessage(pTopic, qos, uint8buffer, retain: false);
  }

  int publishRawMessage(String pTopic, List<int> list) {
    _log("_发送数据-topic:$pTopic,playLoad:$list");
    Uint8Buffer uint8buffer = Uint8Buffer();
//    var codeUnits = msg.codeUnits;
    uint8buffer.addAll(list);
    return mqttClient.publishMessage(pTopic, qos, uint8buffer, retain: false);
  }

  Subscription? subscribeMessage(String subtopic) {
    return mqttClient.subscribe(subtopic, qos);
  }

  void unsubscribeMessage(String? unSubtopic) {
    mqttClient.unsubscribe(unSubtopic!);
  }

  MqttClientConnectionStatus? getMqttStatus() {
    return mqttClient.connectionStatus;
  }

  Stream<List<MqttReceivedMessage<MqttMessage>>>? updates() {
    _log("_监听成功!");
    return mqttClient.updates;
  }

  onConnected() {
//    mqttClient.onConnected = callback;
    _log("_onConnected");
  }

  onDisConnected(ConnectedCallback callback) {
    mqttClient.onDisconnected = callback;
  }

  _onSubscribed(String topic) {
    _log("_订阅主题成功---topic:$topic");
  }

  _onUnSubscribed(String? topic) {
    _log("_取消订阅主题成功---topic:$topic");
  }

  _onSubscribeFail(String topic) {
    _log("_onSubscribeFail");
  }

  _log(String msg) {
    print("MQTT-->$msg");
  }
}

之前发送命令如下,是用flutter默认的UTF-16 List<int>的形式

  int publishMessage(String pTopic, String msg) {

    _log("_发送数据-topic:$pTopic,playLoad:$msg");
    Uint8Buffer uint8buffer = Uint8Buffer();
    var codeUnits = msg.codeUnits;
    uint8buffer.addAll(codeUnits);

    return mqttClient.publishMessage(pTopic, qos, uint8buffer, retain: false);
  }

修改为,转化成字节流的形式(兼容GBK类型,兼容中文)
  ///此方法可以兼容中文
  int publishMessage(String pTopic, String msg) {

    _log("_发送数据-topic:$pTopic,playLoad:$msg");

    final bytes = utf8.encode(msg);
    // 创建MQTT消息并发送
    final message = MqttClientPayloadBuilder();
    bytes.forEach((element) {
      message.addByte(element);
    });

    return mqttClient.publishMessage(pTopic, qos, message.payload, retain: false);
  }

结尾

flutter 的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点个赞加关注吧~~ 后续分享更多有关flutter和移动端原生开发相关的文章。欢迎在下面留言交流。

相关文章

网友评论

      本文标题:flutter mqtt,解决中文乱码

      本文链接:https://www.haomeiwen.com/subject/fwkbrdtx.html