Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
plugins {
kotlin("jvm") version "1.3.21"
kotlin("jvm") version "1.3.72"
id("com.jfrog.bintray") version "1.8.5"
`maven-publish`
publishing
maven
}

Expand All @@ -9,20 +12,45 @@ repositories {
}

group = "be.teletask.onvif"
version = "1.0.3"
version = "1.1.5"

dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("org.jetbrains", "annotations", "15.0")
implementation("net.sf.kxml", "kxml2", "2.3.0")
implementation("com.squareup.okhttp3", "okhttp", "3.11.0")
implementation("com.burgstaller", "okhttp-digest", "1.18")
implementation("org.jetbrains.kotlinx", "kotlinx-coroutines-core", "1.1.1")
implementation("org.jetbrains.kotlinx", "kotlinx-coroutines-core", "1.3.4")
}

publishing {
publications {
register<MavenPublication>("mavenJava") {
from(components["java"])
}
}
}

bintray {
user = System.getenv("bintrayUser")
key = System.getenv("bintrayApiKey")
setPublications("mavenJava")
with(pkg) {
repo = "maven"
name = "onvif-java"
desc = "ONVIF client library for Java and Kotlin"
userOrg = "szantogab"
setLicenses("MIT")
vcsUrl = "https://github.com/szantogab/ONVIF-Java"
with(version) {
name = project.version.toString()
}
}
}

val sourcesJar by tasks.creating(Jar::class) {
classifier = "sources"
from(sourceSets["main"].allSource)
}

artifacts.add("archives", sourcesJar)
artifacts.add("archives", sourcesJar)
Empty file modified gradlew
100644 → 100755
Empty file.
58 changes: 29 additions & 29 deletions src/main/java/be/teletask/onvif/OnvifExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
import be.teletask.onvif.listeners.OnvifResponseListener;
import be.teletask.onvif.models.OnvifDevice;
import be.teletask.onvif.models.OnvifServices;
import be.teletask.onvif.parsers.*;
import be.teletask.onvif.requests.*;
import be.teletask.onvif.parsers.GetDeviceInformationParser;
import be.teletask.onvif.parsers.GetMediaProfilesParser;
import be.teletask.onvif.parsers.GetMediaStreamParser;
import be.teletask.onvif.parsers.GetServicesParser;
import be.teletask.onvif.requests.OnvifRequest;
import be.teletask.onvif.responses.OnvifResponse;
import com.burgstaller.okhttp.AuthenticationCacheInterceptor;
import com.burgstaller.okhttp.CachingAuthenticatorDecorator;
Expand All @@ -14,7 +17,6 @@
import okhttp3.*;
import okio.Buffer;


import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -64,7 +66,7 @@ public class OnvifExecutor {
* @param device
* @param request
*/
void sendRequest(OnvifDevice device, OnvifRequest request) {
void sendRequest(OnvifDevice device, OnvifRequest<?> request) {
credentials.setUserName(device.getUsername());
credentials.setPassword(device.getPassword());
reqBody = RequestBody.create(reqBodyType, OnvifXMLBuilder.getSoapHeader() + request.getXml() + OnvifXMLBuilder.getEnvelopeEnd());
Expand All @@ -84,17 +86,15 @@ public void setOnvifResponseListener(OnvifResponseListener onvifResponseListener
this.onvifResponseListener = onvifResponseListener;
}

private void performXmlRequest(OnvifDevice device, OnvifRequest request, Request xmlRequest) {
if (xmlRequest == null)
return;
private void performXmlRequest(OnvifDevice device, OnvifRequest<?> request, Request xmlRequest) {
if (xmlRequest == null) return;

client.newCall(xmlRequest)
.enqueue(new Callback() {

@Override
public void onResponse(Call call, Response xmlResponse) throws IOException {

OnvifResponse response = new OnvifResponse(request);
OnvifResponse<Object> response = new OnvifResponse(request);
ResponseBody xmlBody = xmlResponse.body();

if (xmlResponse.code() == 200 && xmlBody != null) {
Expand All @@ -108,61 +108,61 @@ public void onResponse(Call call, Response xmlResponse) throws IOException {
if (xmlBody != null)
errorMessage = xmlBody.string();

onvifResponseListener.onError(device, xmlResponse.code(), errorMessage);
if (request.getListener() != null)
request.getListener().onError(new OnvifRequest.OnvifException(device, xmlResponse.code(), errorMessage));
if (onvifResponseListener != null)
onvifResponseListener.onError(new OnvifRequest.OnvifException(device, xmlResponse.code(), errorMessage));
}

@Override
public void onFailure(Call call, IOException e) {
onvifResponseListener.onError(device, -1, e.getMessage());
if (request.getListener() != null)
request.getListener().onError(new OnvifRequest.OnvifException(device, -1, e.getMessage()));
if (onvifResponseListener != null)
onvifResponseListener.onError(new OnvifRequest.OnvifException(device, -1, e.getMessage()));
}

});
}

private void parseResponse(OnvifDevice device, OnvifResponse response) {
private void parseResponse(OnvifDevice device, OnvifResponse<Object> response) {
Object data = null;
switch (response.request().getType()) {
case GET_SERVICES:
OnvifServices path = new GetServicesParser().parse(response);
device.setPath(path);
((GetServicesRequest) response.request()).getListener().onServicesReceived(device, path);
data = path;
break;
case GET_DEVICE_INFORMATION:
((GetDeviceInformationRequest) response.request()).getListener().onDeviceInformationReceived(device,
new GetDeviceInformationParser().parse(response));
data = new GetDeviceInformationParser().parse(response);
break;
case GET_MEDIA_PROFILES:
((GetMediaProfilesRequest) response.request()).getListener().onMediaProfilesReceived(device,
new GetMediaProfilesParser().parse(response));
data = new GetMediaProfilesParser().parse(response);
break;
case GET_STREAM_URI:
GetMediaStreamRequest streamRequest = (GetMediaStreamRequest) response.request();
streamRequest.getListener().onMediaStreamURIReceived(device, streamRequest.getMediaProfile(),
new GetMediaStreamParser().parse(response));
break;
case GET_SNAPSHOT_URI:
GetSnapshotUriRequest snapshotRequest = (GetSnapshotUriRequest) response.request();
snapshotRequest.getListener().onMediaSnapshotURIReceived(device, snapshotRequest.getProfile(),
new GetMediaStreamParser().parse(response));
break;
data = new GetMediaStreamParser().parse(response);
break;
default:
onvifResponseListener.onResponse(device, response);
break;
}

response.request().getListener().onSuccess(device, data);
}

private Request buildOnvifRequest(OnvifDevice device, OnvifRequest request) {
private Request buildOnvifRequest(OnvifDevice device, OnvifRequest<?> request) {
return new Request.Builder()
.url(getUrlForRequest(device, request))
.addHeader("Content-Type", "text/xml; charset=utf-8")
.post(reqBody)
.build();
}

private String getUrlForRequest(OnvifDevice device, OnvifRequest request) {
private String getUrlForRequest(OnvifDevice device, OnvifRequest<?> request) {
return device.getHostName() + getPathForRequest(device, request);
}

private String getPathForRequest(OnvifDevice device, OnvifRequest request) {
private String getPathForRequest(OnvifDevice device, OnvifRequest<?> request) {
switch (request.getType()) {
case GET_SERVICES:
return device.getPath().getServicesPath();
Expand Down
50 changes: 37 additions & 13 deletions src/main/java/be/teletask/onvif/OnvifManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import be.teletask.onvif.listeners.*;
import be.teletask.onvif.models.OnvifDevice;
import be.teletask.onvif.models.OnvifDeviceInformation;
import be.teletask.onvif.models.OnvifMediaProfile;
import be.teletask.onvif.models.OnvifServices;
import be.teletask.onvif.requests.*;
import be.teletask.onvif.responses.OnvifResponse;

import java.util.List;


/**
* Created by Tomas Verhelst on 03/09/2018.
Expand All @@ -31,32 +35,52 @@ private OnvifManager(OnvifResponseListener onvifResponseListener) {
}

//Methods
public void getServices(OnvifDevice device, OnvifServicesListener listener) {
OnvifRequest request = new GetServicesRequest(listener);
public void getServices(OnvifDevice device, OnvifRequest.Listener<OnvifServices> listener) {
final GetServicesRequest request = new GetServicesRequest(listener);
executor.sendRequest(device, request);
}

public void getDeviceInformation(OnvifDevice device, OnvifRequest.Listener<OnvifDeviceInformation> listener) {
final GetDeviceInformationRequest request = new GetDeviceInformationRequest(listener);
executor.sendRequest(device, request);
}

public void getMediaProfiles(OnvifDevice device, OnvifRequest.Listener<List<OnvifMediaProfile>> listener) {
final GetMediaProfilesRequest request = new GetMediaProfilesRequest(listener);
executor.sendRequest(device, request);
}

public void getMediaStreamURI(OnvifDevice device, OnvifMediaProfile profile, OnvifRequest.Listener<String> listener) {
final GetMediaStreamRequest request = new GetMediaStreamRequest(profile, listener);
executor.sendRequest(device, request);
}

public void getMediaSnapshotURI(OnvifDevice device, OnvifMediaProfile profile, OnvifRequest.Listener<String> listener) {
final GetSnapshotUriRequest request = new GetSnapshotUriRequest(profile, listener);
executor.sendRequest(device, request);
}

public void getDeviceInformation(OnvifDevice device, OnvifDeviceInformationListener listener) {
OnvifRequest request = new GetDeviceInformationRequest(listener);
public void ptzContinuousMove(OnvifDevice device, String profileToken, Double velocityX, Double velocityY, Double velocityZ, Integer timeout, OnvifRequest.Listener<Void> listener) {
final ContinuousMoveRequest request = new ContinuousMoveRequest(profileToken, timeout, velocityX, velocityY, velocityZ, listener);
executor.sendRequest(device, request);
}

public void getMediaProfiles(OnvifDevice device, OnvifMediaProfilesListener listener) {
OnvifRequest request = new GetMediaProfilesRequest(listener);
public void ptzRelativeMove(OnvifDevice device, String profileToken, Double translationX, Double translationY, Double zoom, OnvifRequest.Listener<Void> listener) {
final RelativeMoveRequest request = new RelativeMoveRequest(profileToken, translationX, translationY, zoom, listener);
executor.sendRequest(device, request);
}

public void getMediaStreamURI(OnvifDevice device, OnvifMediaProfile profile, OnvifMediaStreamURIListener listener) {
OnvifRequest request = new GetMediaStreamRequest(profile, listener);
public void ptzAbsoluteMove(OnvifDevice device, String profileToken, Double positionX, Double positionY, Double zoom, OnvifRequest.Listener<Void> listener) {
final AbsoluteMoveRequest request = new AbsoluteMoveRequest(profileToken, positionX, positionY, zoom, listener);
executor.sendRequest(device, request);
}

public void getMediaSnapshotURI(OnvifDevice device, OnvifMediaProfile profile, OnvifMediaSnapshotURIListener listener) {
OnvifRequest request = new GetSnapshotUriRequest(profile, listener);
public void ptzStop(OnvifDevice device, String profileToken, boolean panTilt, boolean zoom, OnvifRequest.Listener<Void> listener) {
final StopRequest request = new StopRequest(profileToken, panTilt, zoom, listener);
executor.sendRequest(device, request);
}

public void sendOnvifRequest(OnvifDevice device, OnvifRequest request) {
public void sendOnvifRequest(OnvifDevice device, OnvifRequest<?> request) {
executor.sendRequest(device, request);
}

Expand All @@ -79,9 +103,9 @@ public void onResponse(OnvifDevice onvifDevice, OnvifResponse response) {
}

@Override
public void onError(OnvifDevice onvifDevice, int errorCode, String errorMessage) {
public void onError(OnvifRequest.OnvifException exception) {
if (onvifResponseListener != null)
onvifResponseListener.onError(onvifDevice, errorCode, errorMessage);
onvifResponseListener.onError(exception);
}

}
40 changes: 38 additions & 2 deletions src/main/java/be/teletask/onvif/OnvifUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

/**
* Created by Tomas Verhelst on 03/09/2018.
Expand Down Expand Up @@ -60,21 +62,55 @@ public static String retrieveXAddr(XmlPullParser xpp) throws IOException, XmlPul
* Util method for parsing.
* Retrieve the XAddrs from the XmlPullParser given.
*/
public static String retrieveXAddrs(XmlPullParser xpp) throws IOException, XmlPullParserException {
public static UriAndScopes retrieveXAddrsAndScopes(XmlPullParser xpp) throws IOException, XmlPullParserException {
String[] scopes = new String[]{};
String uri = "";
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {

if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("Scopes")) {
xpp.next();
scopes = xpp.getText().split("\\s+");
uri = OnvifUtils.retrieveXaddr(xpp);
break;
}
eventType = xpp.next();
}

return new UriAndScopes(uri, Arrays.asList(scopes));
}

private static String retrieveXaddr(XmlPullParser xpp) throws IOException, XmlPullParserException {
String result = "";
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {

if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("XAddrs")) {
xpp.next();
result = xpp.getText();
break;
}
eventType = xpp.next();
}

return result;
}

public static class UriAndScopes {
private String uri;
private List<String> scopes;

public UriAndScopes(String uri, List<String> scopes) {
this.uri = uri;
this.scopes = scopes;
}

public String getUri() {
return uri;
}

public List<String> getScopes() {
return scopes;
}
}
}

Loading