Files
onvif-go/examples/complete-demo/main.go
T
ProtoTess 5a21df55f8 fix: update remaining go-onvif references to onvif-go for complete branding consistency
- server/types.go: Manufacturer identifier 'go-onvif' → 'onvif-go'
- cmd/onvif-server/main.go: Manufacturer flag default 'go-onvif' → 'onvif-go'
- server/README.md: Documentation updated
- examples/manual-soap-test/main.go: Code comments updated (2 instances)
- examples/complete-demo/main.go: Code comment updated

Now using 'onvif-go' consistently across all project files, including
device identifiers, code comments, and documentation.
2025-11-17 16:06:13 +00:00

276 lines
7.2 KiB
Go

package main
import (
"context"
"fmt"
"log"
"time"
"github.com/0x524a/onvif-go"
"github.com/0x524a/onvif-go/discovery"
)
// This is a comprehensive demonstration of all onvif-go features
func main() {
// Step 1: Discover cameras on the network
fmt.Println("=== Step 1: Discovering ONVIF Cameras ===")
discoverCameras()
// Step 2: Connect to a specific camera
fmt.Println("\n=== Step 2: Connecting to Camera ===")
client := connectToCamera()
// Step 3: Get device information
fmt.Println("\n=== Step 3: Getting Device Information ===")
getDeviceInfo(client)
// Step 4: Get media profiles and streams
fmt.Println("\n=== Step 4: Getting Media Profiles ===")
profiles := getMediaProfiles(client)
// Step 5: Control PTZ
if len(profiles) > 0 {
fmt.Println("\n=== Step 5: PTZ Control ===")
controlPTZ(client, profiles[0].Token)
}
// Step 6: Adjust imaging settings
if len(profiles) > 0 && profiles[0].VideoSourceConfiguration != nil {
fmt.Println("\n=== Step 6: Adjusting Imaging Settings ===")
adjustImaging(client, profiles[0].VideoSourceConfiguration.SourceToken)
}
fmt.Println("\n=== All operations completed successfully! ===")
}
// discoverCameras demonstrates network discovery
func discoverCameras() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
devices, err := discovery.Discover(ctx, 5*time.Second)
if err != nil {
log.Printf("Discovery error: %v", err)
return
}
fmt.Printf("Found %d device(s):\n", len(devices))
for i, device := range devices {
fmt.Printf(" [%d] %s at %s\n", i+1, device.GetName(), device.GetDeviceEndpoint())
}
}
// connectToCamera creates and initializes a client
func connectToCamera() *onvif.Client {
// Replace with your camera's details
endpoint := "http://192.168.1.100/onvif/device_service"
username := "admin"
password := "password"
client, err := onvif.NewClient(
endpoint,
onvif.WithCredentials(username, password),
onvif.WithTimeout(30*time.Second),
)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
// Initialize to discover service endpoints
ctx := context.Background()
if err := client.Initialize(ctx); err != nil {
log.Fatalf("Failed to initialize: %v", err)
}
fmt.Printf("Connected to: %s\n", endpoint)
return client
}
// getDeviceInfo retrieves and displays device information
func getDeviceInfo(client *onvif.Client) {
ctx := context.Background()
info, err := client.GetDeviceInformation(ctx)
if err != nil {
log.Printf("Failed to get device info: %v", err)
return
}
fmt.Printf("Manufacturer: %s\n", info.Manufacturer)
fmt.Printf("Model: %s\n", info.Model)
fmt.Printf("Firmware: %s\n", info.FirmwareVersion)
fmt.Printf("Serial: %s\n", info.SerialNumber)
// Get capabilities
caps, err := client.GetCapabilities(ctx)
if err != nil {
log.Printf("Failed to get capabilities: %v", err)
return
}
fmt.Println("\nSupported Services:")
if caps.Media != nil {
fmt.Printf(" ✓ Media (Streaming)\n")
}
if caps.PTZ != nil {
fmt.Printf(" ✓ PTZ (Pan/Tilt/Zoom)\n")
}
if caps.Imaging != nil {
fmt.Printf(" ✓ Imaging (Image Settings)\n")
}
if caps.Events != nil {
fmt.Printf(" ✓ Events\n")
}
}
// getMediaProfiles retrieves media profiles and stream URIs
func getMediaProfiles(client *onvif.Client) []*onvif.Profile {
ctx := context.Background()
profiles, err := client.GetProfiles(ctx)
if err != nil {
log.Printf("Failed to get profiles: %v", err)
return nil
}
fmt.Printf("Found %d profile(s):\n", len(profiles))
for i, profile := range profiles {
fmt.Printf("\nProfile [%d]: %s\n", i+1, profile.Name)
// Video configuration
if profile.VideoEncoderConfiguration != nil {
fmt.Printf(" Encoding: %s\n", profile.VideoEncoderConfiguration.Encoding)
if profile.VideoEncoderConfiguration.Resolution != nil {
fmt.Printf(" Resolution: %dx%d\n",
profile.VideoEncoderConfiguration.Resolution.Width,
profile.VideoEncoderConfiguration.Resolution.Height)
}
}
// Get stream URI
streamURI, err := client.GetStreamURI(ctx, profile.Token)
if err != nil {
fmt.Printf(" Stream URI: Error - %v\n", err)
} else {
fmt.Printf(" Stream URI: %s\n", streamURI.URI)
}
// Get snapshot URI
snapshotURI, err := client.GetSnapshotURI(ctx, profile.Token)
if err != nil {
fmt.Printf(" Snapshot URI: Error - %v\n", err)
} else {
fmt.Printf(" Snapshot URI: %s\n", snapshotURI.URI)
}
}
return profiles
}
// controlPTZ demonstrates PTZ operations
func controlPTZ(client *onvif.Client, profileToken string) {
ctx := context.Background()
// Get current status
status, err := client.GetStatus(ctx, profileToken)
if err != nil {
log.Printf("PTZ not supported: %v", err)
return
}
fmt.Println("PTZ is supported!")
if status.Position != nil && status.Position.PanTilt != nil {
fmt.Printf("Current Position: Pan=%.2f, Tilt=%.2f\n",
status.Position.PanTilt.X,
status.Position.PanTilt.Y)
}
// Get presets
presets, err := client.GetPresets(ctx, profileToken)
if err != nil {
log.Printf("Failed to get presets: %v", err)
} else {
fmt.Printf("Available Presets: %d\n", len(presets))
for _, preset := range presets {
fmt.Printf(" - %s\n", preset.Name)
}
}
// Demonstrate movement (commented out to avoid camera movement)
/*
// Move right
velocity := &onvif.PTZSpeed{
PanTilt: &onvif.Vector2D{X: 0.3, Y: 0.0},
}
timeout := "PT1S"
if err := client.ContinuousMove(ctx, profileToken, velocity, &timeout); err != nil {
log.Printf("Move failed: %v", err)
}
time.Sleep(1 * time.Second)
client.Stop(ctx, profileToken, true, false)
// Return to home
home := &onvif.PTZVector{
PanTilt: &onvif.Vector2D{X: 0.0, Y: 0.0},
}
client.AbsoluteMove(ctx, profileToken, home, nil)
*/
fmt.Println("PTZ operations available (commented out in demo)")
}
// adjustImaging demonstrates imaging settings
func adjustImaging(client *onvif.Client, videoSourceToken string) {
ctx := context.Background()
// Get current settings
settings, err := client.GetImagingSettings(ctx, videoSourceToken)
if err != nil {
log.Printf("Failed to get imaging settings: %v", err)
return
}
fmt.Println("Current Imaging Settings:")
if settings.Brightness != nil {
fmt.Printf(" Brightness: %.1f\n", *settings.Brightness)
}
if settings.Contrast != nil {
fmt.Printf(" Contrast: %.1f\n", *settings.Contrast)
}
if settings.ColorSaturation != nil {
fmt.Printf(" Saturation: %.1f\n", *settings.ColorSaturation)
}
if settings.Sharpness != nil {
fmt.Printf(" Sharpness: %.1f\n", *settings.Sharpness)
}
if settings.Exposure != nil {
fmt.Printf(" Exposure Mode: %s\n", settings.Exposure.Mode)
}
if settings.Focus != nil {
fmt.Printf(" Focus Mode: %s\n", settings.Focus.AutoFocusMode)
}
if settings.WhiteBalance != nil {
fmt.Printf(" White Balance: %s\n", settings.WhiteBalance.Mode)
}
// Demonstrate setting adjustment (commented out to avoid changes)
/*
// Adjust brightness
newBrightness := 55.0
settings.Brightness = &newBrightness
if err := client.SetImagingSettings(ctx, videoSourceToken, settings, true); err != nil {
log.Printf("Failed to set imaging settings: %v", err)
} else {
fmt.Println("\nImaging settings updated!")
}
*/
fmt.Println("Imaging adjustment available (commented out in demo)")
}