Step 1. Add the JitPack repository to your build file
Add it in your root settings.gradle at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
Add it in your settings.gradle.kts at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
Add to pom.xml
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Add it in your build.sbt at the end of resolvers:
resolvers += "jitpack" at "https://jitpack.io"
Add it in your project.clj at the end of repositories:
:repositories [["jitpack" "https://jitpack.io"]]
Step 2. Add the dependency
dependencies {
implementation 'com.github.Grk26:speed-test-lib:1.33'
}
dependencies {
implementation("com.github.Grk26:speed-test-lib:1.33")
}
<dependency>
<groupId>com.github.Grk26</groupId>
<artifactId>speed-test-lib</artifactId>
<version>1.33</version>
</dependency>
libraryDependencies += "com.github.Grk26" % "speed-test-lib" % "1.33"
:dependencies [[com.github.Grk26/speed-test-lib "1.33"]]
Speed Test client library for Java/Android with HTTP & FTP support
Check a non-exhaustive list of compatible speed test server.
compile 'fr.bmartel:jspeedtest:1.30'
SpeedTestSocket speedTestSocket = new SpeedTestSocket();
// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {
@Override
public void onCompletion(SpeedTestReport report) {
// called when download/upload is complete
System.out.println("[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
System.out.println("[COMPLETED] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onError(SpeedTestError speedTestError, String errorMessage) {
// called when a download/upload error occur
}
@Override
public void onProgress(float percent, SpeedTestReport report) {
// called to notify download/upload progress
System.out.println("[PROGRESS] progress : " + percent + "%");
System.out.println("[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
System.out.println("[PROGRESS] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onInterruption() {
// triggered when forceStopTask is called
}
});
2.testdebit.info
speedTestSocket.startDownload("http://2.testdebit.info/fichiers/1Mo.dat");
speedtest.tele2.net
speedTestSocket.startDownload("ftp://speedtest.tele2.net/1MB.zip");
ftp.otenet.gr
with credentials (username/password), default is anonymous/no passwordspeedTestSocket.startDownload("ftp://speedtest:speedtest@ftp.otenet.gr/test1Mb.db");
2.testdebit.info
speedTestSocket.startUpload("http://2.testdebit.info/", 1000000);
speedtest.tele2.net
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startUpload("ftp://speedtest.tele2.net/upload/" + fileName, 1000000);
Download during a fixed duration. Download will be stopped when the max duration is reached.
At the end of the max duration, onInterruption
is called if download has not be fully completed
2.testdebit.info
speedTestSocket.startFixedDownload("http://2.testdebit.info/fichiers/100Mo.dat", 10000);
speedtest.tele2.net
speedTestSocket.startFixedDownload("ftp://speedtest.tele2.net/100MB.zip");
Upload during a fixed duration. Upload will be stopped when the max duration is reached
At the end of the max duration, onInterruption
is called if upload has not be fully completed
2.testdebit.info
speedTestSocket.startFixedUpload("http://2.testdebit.info/", 10000000, 10000);
speedtest.tele2.net
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startFixedUpload("ftp://speedtest.tele2.net/upload/" + fileName, 10000000, 10000);
You can define your own report interval (interval between each onDownloadProgress
& onUploadProgress
) in milliseconds.
speedTestSocket.startDownload("http://2.testdebit.info/fichiers/1Mo.dat", 1500);
speedTestSocket.startDownload("ftp://speedtest.tele2.net/1MB.zip", 1500);
speedTestSocket.startUpload("http://2.testdebit.info/", 10000000, 1500);
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startUpload("ftp://speedtest.tele2.net/upload/" + fileName, 10000000, 1500);
You can chain multiple download/upload requests during a fixed duration. This way, there will be as much download/upload request until the end of the period
The following will download regularly for 20 seconds a file of 1Mo with download report each 2 seconds. Download reports will appear in onReport
callback of IRepeatListener
instead of onDownloadProgress
:
speedTestSocket.startDownloadRepeat("http://2.testdebit.info/fichiers/1Mo.dat",
20000, 2000, new
IRepeatListener() {
@Override
public void onCompletion(final SpeedTestReport report) {
// called when repeat task is finished
}
@Override
public void onReport(final SpeedTestReport report) {
// called when a download report is dispatched
}
});
The following will upload regularly for 20 seconds a file of 1Mo with download report each 2 seconds. Upload reports will appear in onReport
callback of IRepeatListener
instead of onUploadProgress
:
speedTestSocket.startUploadRepeat("http://2.testdebit.info/", 1000000
20000, 2000, new
IRepeatListener() {
@Override
public void onCompletion(final SpeedTestReport report) {
// called when repeat task is finished
}
@Override
public void onReport(final SpeedTestReport report) {
// called when an upload report is dispatched
}
});
SpeedTestReport getLiveDownloadReport()
SpeedTestReport getLiveUploadReport()
Setup time is the amount of time in milliseconds from which speed test will be calculated :
The following will set the setup time to 5 seconds which mean, the speed rate will begin to be computed 5 seconds after the speed test start :
speedTestSocket.setDownloadSetupTime(5000);
speedTestSocket.setUploadSetupTime(5000);
By default, data to be uploaded is stored in RAM, for large data it is recommended to used file storage :
speedTestSocket.setUploadStorageType(UploadStorageType.FILE_STORAGE);
It will create a temporary file containing random data. File will be deleted automatically at the end of the upload.
speedTestSocket.setUploadChunkSize(65535);
You can set download/upload socket timeout in milliseconds :
speedTestSocket.setSocketTimeout(5000);
These settings are used to alter transfer rate float rounding / scale :
speedTestSocket.setDefaultRoundingMode(RoundingMode.HALF_EVEN);
Default RoundingMode
used for transfer rate calculation is HALF_EVEN
. It can be override with :
speedTestSocket.setDefaultScale(4);
Default scale used for transfer rate calculation is 4
<uses-permission android:name="android.permission.INTERNET" />
AsyncTask
to run your speed test :public class SpeedTestTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
SpeedTestSocket speedTestSocket = new SpeedTestSocket();
// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {
@Override
public void onCompletion(SpeedTestReport report) {
// called when download/upload is finished
Log.v("speedtest", "[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
Log.v("speedtest", "[COMPLETED] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onError(SpeedTestError speedTestError, String errorMessage) {
// called when a download/upload error occur
}
@Override
public void onProgress(float percent, SpeedTestReport report) {
// called to notify download/upload progress
Log.v("speedtest", "[PROGRESS] progress : " + percent + "%");
Log.v("speedtest", "[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
Log.v("speedtest", "[PROGRESS] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onInterruption() {
// triggered when forceStopTask is called
}
});
speedTestSocket.startDownload("http://2.testdebit.info/fichiers/1Mo.dat");
return null;
}
}
Execute it with : new SpeedTestTask().execute();
All following examples use speed test server 1.testdebit.info
for HTTP and speedtest.tele2.net
for FTP
./gradlew downloadFile
./gradlew uploadFile
./gradlew downloadFTP
./gradlew uploadFTP
./gradlew fixedDownload
./gradlew fixedUpload
./gradlew repeatDownload
./gradlew repeatUpload
./gradlew repeatChain
It's important to choose an adequate speed test server depending on latency/jitter. This library is not responsible for the speed test server choice.
Note that this library :
This library does provide an average of transfer rate for all individual chunks read/written for download/upload.
The 2 following links describe the process of speedtest.net :
JRE 1.7 compliant
./gradlew clean build -x test
./gradlew clean build
./gradlew test --tests "fr.bmartel.speedtest.test.SpeedTestFunctionalTest"
The MIT License (MIT) Copyright (c) 2016 Bertrand Martel