import 'dart:async'; import 'package:dio/dio.dart'; import '../models/models.dart'; import 'network_service.dart'; /// 网速测试服务 class SpeedTestService { static final SpeedTestService _instance = SpeedTestService._internal(); factory SpeedTestService() => _instance; SpeedTestService._internal(); final Dio _dio = Dio(); // 测试文件URL(可配置) static const _testUrls = [ 'https://speed.cloudflare.com/__down?bytes=10000000', // 10MB 'https://speed.hetzner.de/100MB.bin', ]; /// 测试下载速度 Future testDownloadSpeed({int testDurationSeconds = 5}) async { double totalBytes = 0; final stopwatch = Stopwatch()..start(); try { final response = await _dio.get>( _testUrls[0], options: Options( responseType: ResponseType.bytes, receiveTimeout: Duration(seconds: testDurationSeconds + 2), ), onReceiveProgress: (received, total) { totalBytes = received.toDouble(); }, ); stopwatch.stop(); // 计算速度 (Mbps) final seconds = stopwatch.elapsedMilliseconds / 1000; final mbps = (totalBytes * 8) / (seconds * 1000000); return mbps; } catch (e) { return 0; } } /// 测试上传速度(简化版,通过POST测试) Future testUploadSpeed({int testDurationSeconds = 5}) async { // 生成测试数据 (1MB) final testData = List.generate(1024 * 1024, (i) => i % 256); final stopwatch = Stopwatch()..start(); try { await _dio.post( 'https://speed.cloudflare.com/__up', data: testData, options: Options( sendTimeout: Duration(seconds: testDurationSeconds + 2), ), ); stopwatch.stop(); final seconds = stopwatch.elapsedMilliseconds / 1000; final mbps = (testData.length * 8) / (seconds * 1000000); return mbps; } catch (e) { return 0; } } /// 完整网速测试 Future runFullTest() async { final networkService = NetworkService(); // 检测连接 final isConnected = await networkService.checkInternetConnection(); if (!isConnected) { return NetworkStatus( isConnected: false, lastCheck: DateTime.now(), ); } // 获取本地IP final localIp = await networkService.getLocalIp(); // 测量延迟 final latency = await networkService.measureLatency('8.8.8.8'); // 测试下载速度 final downloadSpeed = await testDownloadSpeed(); // 测试上传速度 final uploadSpeed = await testUploadSpeed(); return NetworkStatus( isConnected: true, downloadSpeed: downloadSpeed, uploadSpeed: uploadSpeed, latency: latency, localIp: localIp, lastCheck: DateTime.now(), ); } /// 快速网络检测(仅检测连通性和延迟) Future quickCheck() async { final networkService = NetworkService(); final isConnected = await networkService.checkInternetConnection(); final localIp = await networkService.getLocalIp(); final latency = isConnected ? await networkService.measureLatency('8.8.8.8') : -1; return NetworkStatus( isConnected: isConnected, latency: latency, localIp: localIp, lastCheck: DateTime.now(), ); } }