异常:SocketException:主机查找失败:'tcp://********:1883'(操作系统错误:没有与主机名关联的地址,errno = 7)

问题描述 投票:0回答:1

当我将 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"/>
flutter flutter-dependencies mqtt socketexception android-mqtt-client
1个回答
0
投票

来自 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

© www.soinside.com 2019 - 2024. All rights reserved.