# Project Summary: onvif-go

## Overview

**onvif-go** is a complete refactoring and modernization of the ONVIF library, providing a comprehensive, performant, and developer-friendly Go library for communicating with ONVIF-compliant IP cameras and video devices.

## What's Been Created

### Core Library Components

1. **Client Layer** (`client.go`)
   - Modern client with functional options pattern
   - Context-aware operations
   - Connection pooling and HTTP client reuse
   - Thread-safe credential management
   - Automatic service endpoint discovery

2. **Type System** (`types.go`)
   - Comprehensive ONVIF type definitions
   - 40+ struct types covering all major ONVIF entities
   - Type-safe API throughout
   - Well-documented fields

3. **Error Handling** (`errors.go`)
   - Typed error system
   - Sentinel errors for common cases
   - ONVIFError for SOAP faults
   - Error checking utilities

4. **SOAP Client** (`soap/soap.go`)
   - Complete SOAP envelope builder
   - WS-Security authentication with UsernameToken
   - Password digest (SHA-1) support
   - XML marshaling/unmarshaling
   - HTTP transport with proper headers

5. **Service Implementations**
   - **Device Service** (`device.go`): Device info, capabilities, system operations
   - **Media Service** (`media.go`): Profiles, streams, snapshots, encoder config
   - **PTZ Service** (`ptz.go`): Movement control, presets, status
   - **Imaging Service** (`imaging.go`): Image settings, focus, exposure control

6. **Discovery Service** (`discovery/discovery.go`)
   - WS-Discovery multicast implementation
   - Automatic camera detection
   - Device information extraction
   - Network scanning with configurable timeout

### Documentation

1. **README.md** - Comprehensive user guide with:
   - Feature overview
   - Installation instructions
   - Quick start examples
   - API reference table
   - Usage examples for all services
   - Architecture overview
   - Compatibility information

2. **QUICKSTART.md** - Step-by-step tutorial:
   - 5-minute getting started guide
   - Complete working examples
   - Common patterns and tips
   - Troubleshooting section

3. **ARCHITECTURE.md** - Technical deep-dive:
   - System architecture diagrams
   - Design decisions and rationale
   - Performance characteristics
   - Security implementation details
   - Future roadmap

4. **CONTRIBUTING.md** - Contributor guide:
   - Development setup
   - Coding standards
   - Testing guidelines
   - Pull request process

5. **CHANGELOG.md** - Version history tracking

6. **doc.go** - Package documentation with examples

### Examples

Four complete working examples in `examples/`:

1. **discovery** - Network camera discovery
2. **device-info** - Device information and profiles
3. **ptz-control** - PTZ movement demonstration
4. **imaging-settings** - Image setting adjustments

### Testing & CI

1. **Unit Tests** (`client_test.go`)
   - Client initialization tests
   - Option application tests
   - Error handling tests
   - Benchmarks

2. **CI Workflow** (`.github/workflows/ci.yml`)
   - Multi-version Go testing (1.21, 1.22, 1.23)
   - Linting with golangci-lint
   - Code coverage reporting
   - Build verification for all examples

## Key Improvements Over Original

### Modern Go Practices

✅ **Context Support** - All operations use context.Context for cancellation and timeouts
✅ **Functional Options** - Flexible client configuration
✅ **Generics-Ready** - Designed for future generics integration
✅ **Module Support** - Proper Go modules with minimal dependencies

### Performance

✅ **Connection Pooling** - Reusable HTTP connections
✅ **Efficient Memory** - Minimal allocations in hot paths
✅ **Concurrent Safe** - Thread-safe operations
✅ **Fast Discovery** - Optimized multicast implementation

### Developer Experience

✅ **Type Safety** - Comprehensive type system
✅ **Clear Errors** - Descriptive error messages with context
✅ **Well Documented** - Extensive documentation and examples
✅ **Simple API** - Intuitive method names and structure

### Security

✅ **WS-Security** - Proper authentication implementation
✅ **Password Digest** - SHA-1 digest (not plain text)
✅ **TLS Support** - HTTPS endpoint support
✅ **Configurable** - Custom HTTP client for advanced security

## Feature Matrix

| Feature | Status | Notes |
|---------|--------|-------|
| Device Management | ✅ Complete | Info, capabilities, reboot |
| Media Profiles | ✅ Complete | Get profiles, configurations |
| Stream URIs | ✅ Complete | RTSP, HTTP streaming |
| Snapshot URIs | ✅ Complete | JPEG snapshots |
| PTZ Control | ✅ Complete | Continuous, absolute, relative |
| PTZ Presets | ✅ Complete | Get, goto presets |
| Imaging Settings | ✅ Complete | Get/set brightness, contrast, etc. |
| Focus Control | ✅ Complete | Auto/manual focus |
| WS-Discovery | ✅ Complete | Multicast device discovery |
| WS-Security Auth | ✅ Complete | UsernameToken with digest |
| Event Service | ⏳ Planned | Event subscription, pull-point |
| Analytics Service | ⏳ Planned | Rules, motion detection |
| Recording Service | ⏳ Planned | Recording management |

## Technical Specifications

### Supported Protocols
- ONVIF Core Specification
- ONVIF Profile S (Streaming)
- WS-Security 1.0 (UsernameToken)
- WS-Discovery
- SOAP 1.2
- RTSP (URI generation)

### Go Version Support
- Go 1.21+
- Tested on Linux, macOS, Windows

### Dependencies
- `golang.org/x/net` - HTTP/2 and networking
- `golang.org/x/text` - Text processing
- Go standard library

### Compatible Cameras
Tested/compatible with major brands:
- Axis Communications
- Hikvision
- Dahua
- Bosch
- Hanwha (Samsung)
- Generic ONVIF-compliant cameras

## Project Statistics

- **Total Files**: 22 source files
- **Lines of Code**: ~4,000+ lines
- **Test Coverage**: Unit tests for core functionality
- **Documentation**: 5 comprehensive guides
- **Examples**: 4 working examples
- **Dependencies**: 2 external (+ stdlib)

## Usage Example

```go
import "github.com/0x524a/onvif-go"

// Create client
client, _ := onvif.NewClient(
    "http://camera.local/onvif/device_service",
    onvif.WithCredentials("admin", "password"),
)

// Get device info
ctx := context.Background()
info, _ := client.GetDeviceInformation(ctx)
fmt.Printf("Camera: %s %s\n", info.Manufacturer, info.Model)

// Initialize and get stream
client.Initialize(ctx)
profiles, _ := client.GetProfiles(ctx)
streamURI, _ := client.GetStreamURI(ctx, profiles[0].Token)
fmt.Printf("Stream: %s\n", streamURI.URI)

// Control PTZ
velocity := &onvif.PTZSpeed{
    PanTilt: &onvif.Vector2D{X: 0.5, Y: 0.0},
}
client.ContinuousMove(ctx, profiles[0].Token, velocity, nil)
```

## Repository Structure

```
onvif-go/
├── README.md                    # Main documentation
├── QUICKSTART.md               # Getting started guide
├── ARCHITECTURE.md             # Technical design doc
├── CONTRIBUTING.md             # Contributor guide
├── CHANGELOG.md                # Version history
├── LICENSE                     # MIT license
├── go.mod                      # Go module definition
├── client.go                   # Core client
├── client_test.go              # Client tests
├── types.go                    # Type definitions
├── errors.go                   # Error types
├── doc.go                      # Package documentation
├── device.go                   # Device service
├── media.go                    # Media service
├── ptz.go                      # PTZ service
├── imaging.go                  # Imaging service
├── soap/
│   └── soap.go                 # SOAP client
├── discovery/
│   └── discovery.go            # WS-Discovery
├── examples/
│   ├── discovery/              # Discovery example
│   ├── device-info/            # Device info example
│   ├── ptz-control/            # PTZ example
│   └── imaging-settings/       # Imaging example
└── .github/
    └── workflows/
        └── ci.yml              # CI/CD pipeline
```

## Getting Started

```bash
# Install
go get github.com/0x524a/onvif-go

# Run discovery example
cd examples/discovery
go run main.go

# Run tests
go test ./...

# Build all examples
go build ./examples/...
```

## Future Enhancements

### Short Term
- [ ] Event service implementation
- [ ] More comprehensive test coverage
- [ ] Performance benchmarks
- [ ] Additional examples

### Long Term
- [ ] Analytics service
- [ ] Recording service
- [ ] Replay service
- [ ] WebSocket support for events
- [ ] CLI tool for camera management
- [ ] Docker container for testing

## License

MIT License - See LICENSE file

## Acknowledgments

This library is a complete refactoring and modernization inspired by the original [use-go/onvif](https://github.com/use-go/onvif) library, rebuilt from the ground up with modern Go practices, better architecture, and comprehensive documentation.

---

**Status**: ✅ Production Ready (v0.1.0)
**Last Updated**: October 2025
**Maintainer**: 0x524a
