evaluateQuality method

Future<NetworkQualityScore> evaluateQuality({
  1. NetworkDiagnosticConfig config = const NetworkDiagnosticConfig(),
  2. bool includePing = true,
  3. bool includeDns = true,
  4. bool includeSpeedTest = true,
  5. bool includeUpload = true,
  6. String? pingHost,
  7. int? pingCount,
  8. Duration? pingTimeout,
  9. String? dnsDomain,
  10. List<String>? dnsServers,
  11. Duration? dnsTimeout,
  12. String? downloadUrl,
  13. String? uploadUrl,
})

评估当前网络质量 / Evaluates the current network quality.

includeSpeedTest 会消耗较多流量,测试环境中建议关闭 / includeSpeedTest transfers a sizable amount of data; disable it in tests.

Implementation

Future<NetworkQualityScore> evaluateQuality({
  NetworkDiagnosticConfig config = const NetworkDiagnosticConfig(),
  bool includePing = true,
  bool includeDns = true,
  bool includeSpeedTest = true,
  bool includeUpload = true,
  String? pingHost,
  int? pingCount,
  Duration? pingTimeout,
  String? dnsDomain,
  List<String>? dnsServers,
  Duration? dnsTimeout,
  String? downloadUrl,
  String? uploadUrl,
}) async {
  final connection = await connectivity.checkConnection();

  PingResult? pingResult;
  if (includePing) {
    pingResult = await ping.ping(
      host: pingHost ?? config.pingHost,
      count: pingCount ?? config.pingCount,
      timeout: pingTimeout ?? config.pingTimeout,
      interval: config.pingInterval,
      port: config.pingPort,
    );
  }

  double? dnsLatency;
  if (includeDns) {
    final results = await dns.testDns(
      domain: dnsDomain ?? config.dnsDomain,
      dnsServers: dnsServers ?? config.dnsServers,
      timeout: dnsTimeout ?? config.dnsTimeout,
    );
    final successful = results
        .where((result) => result.isSuccess)
        .toList(growable: false);
    if (successful.isNotEmpty) {
      final total = successful.fold<double>(
        0,
        (previous, result) => previous + result.responseTimeMs,
      );
      dnsLatency = total / successful.length;
    }
  }

  SpeedTestResult? speed;
  if (includeSpeedTest) {
    try {
      speed = await speedTest.runSpeedTest(
        downloadUrl: downloadUrl ?? config.downloadUrl,
        uploadUrl: uploadUrl ?? config.uploadUrl,
        timeout: config.speedTestTimeout,
        maxDuration: config.speedTestMaxDuration,
        uploadPayloadBytes: config.uploadPayloadBytes,
        pingHost: pingHost ?? config.pingHost,
        pingCount: pingCount ?? config.pingCount,
        includeUpload: includeUpload,
        includePing: false,
      );
    } catch (_) {
      speed = null;
    }
  }

  final latency = pingResult?.isSuccess == true
      ? pingResult!.averageTime
      : (speed != null && speed.ping > 0 ? speed.ping : null);
  final jitter = pingResult?.isSuccess == true
      ? pingResult!.jitter
      : (speed != null && speed.ping > 0 ? speed.jitter : null);
  final packetLoss = pingResult?.sent != null && pingResult!.sent > 0
      ? pingResult.packetLoss
      : null;

  return NetworkQualityEvaluator.evaluate(
    latency: latency,
    jitter: jitter,
    packetLoss: packetLoss,
    download: speed?.downloadSpeed,
    upload: includeUpload ? speed?.uploadSpeed : null,
    dns: dnsLatency,
    signalStrength: connection.signalStrength,
    targets: config.qualityTargets,
  );
}