当我将 mqtt5_client 库用于我使用物理 Android 设备时的 flutter 项目。当我尝试使用 kotlin 在 android studio 上使用 MQTT 和 paho 库时,我能够建立连接并发布数据。但是,当我尝试将 mqtt 与 flutter 结合使用时,我收到此失败的主机查找错误。
我尝试在清单文件中添加诸如 INTERNET 之类的权限。我之前使用过mqtt_client,然后换成了mqtt5_client,希望能够建立连接,但问题仍然存在。我不确定可能是什么导致了这个问题。任何帮助将不胜感激。
下面是我正在使用的代码。
import 'package:logger/logger.dart';
import 'package:mqtt5_client/mqtt5_client.dart';
import 'package:mqtt5_client/mqtt5_server_client.dart';
class MQTTClientService {
late MqttServerClient _client;
var logger = Logger();
MQTTClientService(String brokerURL, String clientId, int port) {
_client = MqttServerClient(brokerURL, clientId);
_client.port = port;
_client.logging(on: true);
_client.onConnected = _onConnected;
_client.onDisconnected = _onDisconnected;
_client.onUnsubscribed = _onUnsubscribed;
_client.onSubscribed = _onSubscribed;
_client.onSubscribeFail = _onSubscribeFail;
_client.pongCallback = _pong;
_client.keepAlivePeriod = 60;
}
Future<void> establishConnection() async {
final connectMessage =
MqttConnectMessage().startClean().withWillQos(MqttQos.atLeastOnce);
logger.i('MQTT_LOGS::Mosquitto client connecting....');
_client.connectionMessage = connectMessage;
try {
await _client.connect();
} catch (e) {
logger.e('Exception: $e');
_client.disconnect();
}
if (_client.connectionStatus!.state == MqttConnectionState.connected) {
logger.i('MQTT_LOGS::Mosquitto client connected');
} else {
logger.i(
'MQTT_LOGS::ERROR Mosquitto client connection failed - disconnecting, status is ${_client.connectionStatus}');
_client.disconnect();
}
}
void subscribeToTopic(String topic) {
// code to subscribe
}
void publishMessage(String topic, String message) {
// code to publish
}
void terminateClientConnection() {
_client.disconnect();
}
void _onConnected() {
logger.i('MQTT_LOGS:: Connected');
}
void _onDisconnected() {
logger.i('MQTT_LOGS:: Disconnected');
}
void _onSubscribed(MqttSubscription subscription) {
logger.i('MQTT_LOGS:: Subscribed topic: ${subscription.topic}');
}
void _onSubscribeFail(MqttSubscription subscription) {
logger.i('MQTT_LOGS:: Failed to subscribe ${subscription.topic}');
}
void _onUnsubscribed(MqttSubscription? subscription) {
if (subscription != null) {
logger.i('MQTT_LOGS:: Unsubscribed topic: ${subscription.topic}');
}
}
void _pong() {
logger.i('MQTT_LOGS:: Ping response client callback invoked');
}
}
我当前使用的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
来自 API 文档 (https://pub.dev/documentation/mqtt5_client/latest/mqtt5_server_client/MqttServerClient/MqttServerClient.html)
MqttServerClient( String server, String clientIdentifier, {int maxConnectionAttempts = 3} )
使用以下方法初始化 MqttServerClient 类的新实例 默认 Mqtt 端口。连接到客户端的服务器主机名 用于连接的标识符
MqttServerClient(brokerURL, clientId);
采用主机名而不是 URI
brokerURL
应该只是代理的主机名,而不是 URI(开头没有 tcp://
,结尾没有 :1883
)