Skip to content

openlink2/link-onvif-client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

link-onvif-client

License

link-onvif-client is a Java toolkit for ONVIF protocol device discovery and management:

  • onvif-client-core — Core library. Implements WS-Discovery, SOAP/XML messaging, WS-Security authentication, and all major ONVIF services (Device, Media, PTZ, Imaging, Events, Recording). Packaged as a single JAR with no runtime dependencies beyond SLF4J.
  • onvif-dashboard — Web application. Spring Boot backend + SPA frontend, providing a simple dashboard page for device discovery, configuration, PTZ control, and live preview.
  • onvif-cli — Command-line interface. Built on picocli, enables direct ONVIF operations from the terminal with support for both interactive and scripted usage.

For questions or issues, feel free to open an issue or submit a pull request.


Features

  • Device discovery — WS-Discovery multicast probe for ONVIF devices on the LAN
  • Device management — Query and configure device info, hostname, network, users, date/time, NTP, DNS, and system maintenance (reboot, factory reset)
  • Media streaming — Enumerate profiles, video/audio sources and encoder configurations; retrieve RTSP stream URIs and snapshot URIs
  • PTZ control — Continuous, absolute, and relative moves; preset management; home position
  • Imaging — Read and adjust brightness, contrast, sharpness, focus; move/stop focus
  • Event subscription — Pull-point and push-mode event monitoring
  • Recording — Query recording service capabilities and recording list
  • Dashboard visual UI — Real-time device discovery, PTZ panel, stream preview, and event display
  • CLI — Discover, interrogate, and control devices from the command line, suitable for automation and headless environments

onvif-client-core

A self-contained ONVIF library — single JAR with only SLF4J as a runtime dependency, feature-complete for device interaction. Add it to your project and start working with ONVIF devices immediately.

Build & Install Locally

git clone https://github.com/openlink2/link-onvif-client.git
cd link-onvif-client
mvn clean install -pl onvif-client-core -DskipTests

Then add the dependency to your pom.xml:

<!-- Maven -->
<dependency>
    <groupId>com.openlink2.onvif</groupId>
    <artifactId>onvif-client-core</artifactId>
    <version>1.0.1</version>
</dependency>

Quick Example

// Connect and query device info
try (var client = new OnvifClient("http://192.168.1.100/onvif/device_service", "admin", "pass")) {

    // Device information
    DeviceInfo info = client.getDeviceInformation();
    System.out.println(info.manufacturer() + " " + info.model());

    // Hostname and time
    System.out.println("Hostname: " + client.getHostname());
    System.out.println("Time: " + client.getSystemDateAndTime());

    // Media profiles and stream URIs
    List<Profile> profiles = client.getProfiles();
    for (Profile p : profiles) {
        System.out.println("Profile: " + p.token() + " (" + p.name() + ")");
        System.out.println("  RTSP: " + client.getStreamUri(p.token(), "RTSP").uri());
        System.out.println("  Snapshot: " + client.getSnapshotUri(p.token()).uri());
    }

    // PTZ control (if supported)
    var status = client.getPtzStatus(profiles.get(0).token());
    client.continuousMove(profiles.get(0).token(), 0.5, 0, 0);
    Thread.sleep(1000);
    client.stopPtz(profiles.get(0).token());

    // Imaging settings
    var videoSources = client.getVideoSources();
    if (!videoSources.isEmpty()) {
        var img = client.getImagingSettings(videoSources.get(0).token());
        System.out.println("Brightness: " + img.brightness());
    }
}
// Blocking — returns all results after timeout
List<DiscoveryProbeResult> devices = WSDiscoveryService.discover(5000);
devices.forEach(d -> System.out.println(d.getDeviceUrl() + "  " + d.getHardware()));

// Streaming — Consumer callback per device (real-time as they arrive)
WSDiscoveryService.discover(5000, device -> {
    System.out.println("Found: " + device.getDeviceUrl()
                       + " (" + device.getHardware() + ")");
});

// Streaming — DiscoveryListener lifecycle callbacks
WSDiscoveryService.discover(5000, new DiscoveryListener() {
    @Override
    public void onDiscoveryStarted() {
        System.out.println("Scanning network...");
    }

    @Override
    public void onDeviceDiscovered(DiscoveryProbeResult device) {
        System.out.println("  + " + device.getDeviceName()
                           + " @ " + device.getDeviceUrl());
    }

    @Override
    public void onDiscoveryFinished(List<DiscoveryProbeResult> devices) {
        System.out.println("Done — found " + devices.size() + " device(s)");
    }
});

// Filter by device capabilities
DiscoveryProbeResult first = WSDiscoveryService.discover(3000).stream()
    .filter(d -> d.getDeviceTypes().contains(DiscoveryProbeResult.DeviceType.PTZ))
    .findFirst()
    .orElse(null);

onvif-dashboard

A Spring Boot web application providing a full visual interface for ONVIF device management.

Dashboard Screenshot

Dashboard Screenshot2

Dashboard Demo

Pre-built Release

# Download and start the dashboard
wget https://github.com/openlink2/link-onvif-client/releases/download/v1.0.1/link-onvif-dashboard.jar
java -jar link-onvif-dashboard.jar

# Or start the lighter version without stream preview
wget https://github.com/openlink2/link-onvif-client/releases/download/v1.0.1/link-onvif-dashboard-no-stream-feature.jar
java -jar link-onvif-dashboard-no-stream-feature.jar

Open http://localhost:19998 in your browser.

Build from source

cd onvif-dashboard
mvn spring-boot:run

Open http://localhost:19998 in your browser.


onvif-cli

A command-line tool for direct ONVIF device operations, built with picocli.

Pre-built Release

Linux

# 1. Download
wget https://github.com/openlink2/link-onvif-client/releases/download/v1.0.1/onvif-cli-linux.tar.gz

# 2. Extract
tar xzf onvif-cli-linux.tar.gz

# 3. Add to PATH (temporary, for current session)
export PATH="$PWD/onvif-cli-linux/bin:$PATH"

# 4. Verify installation
onvif-cli --help

To make it permanent, append to your shell profile:

echo 'export PATH="$PATH:/path/to/onvif-cli-linux/bin"' >> ~/.bashrc
source ~/.bashrc

Windows (PowerShell)

# 1. Download
Invoke-WebRequest -Uri "https://github.com/openlink2/link-onvif-client/releases/download/v1.0.1/onvif-cli-windows.zip" -OutFile "onvif-cli-windows.zip"

# 2. Extract
Expand-Archive -Path "onvif-cli-windows.zip" -DestinationPath "onvif-cli"

# 3. Add to PATH (temporary, for current session)
$env:Path += ";$pwd\onvif-cli\bin"

# 4. Verify installation
onvif-cli --help

To make it permanent, add onvif-cli\bin to your system PATH via:
System Properties → Environment Variables → Path → New.

Usage examples

# Discover devices on the LAN
onvif-cli discover -t 5000

# Probe with auto-authentication (try credentials to identify authenticated devices)
onvif-cli discover -t 5000 --probe -U admin -P pass

# Query device information
onvif-cli device info http://192.168.1.100/onvif/device_service -U admin -P pass

Build from source

# Windows distribution (produces a zip with bundled JRE)
mvn package -Pcli-win

# Linux distribution (requires Docker)
mvn package -Pcli-linux

The output will be in onvif-cli/target/dist/.


Project Build

Requires JDK 17+ and Maven 3.

# Build all modules
mvn clean install -DskipTests

# Include frontend dashboard
mvn clean install -DskipTests -Pfrontend

# Include RTSP streaming support
mvn clean install -DskipTests -Pfrontend,with-stream

License

This project is licensed under the Apache License, Version 2.0 — see the LICENSE file for details.

About

A modern Java ONVIF client/toolkit. Features a lightweight, embeddable core with full support for WS-Discovery, PTZ control, and secure device management via SOAP/WS-Security. Includes a Spring Boot dashboard and a picocli command-line tool.

Topics

Resources

License

Stars

20 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors