前言
对于如何在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和移动端原生开发相关的文章。欢迎在下面留言交流。
网友评论