3bf078ed3f
- Introduced a new directory `testdata/captures/` containing captured XML archives and README documentation for the camera test framework. - Added a mock server implementation to replay captured SOAP responses for testing. - Created automated tests for Bosch FLEXIDOME indoor 5100i IR using captured responses, validating device information, system date and time, capabilities, and profiles. - Implemented enhanced device features tests, covering hostname, DNS, NTP, network interfaces, scopes, and user management. - Added support for enhanced media and imaging features, including video and audio sources, and imaging options. - Updated types to include new configurations and options for network, imaging, and device capabilities.
707 lines
22 KiB
Markdown
707 lines
22 KiB
Markdown
# ONVIF Camera Analysis Report
|
|
|
|
Generated: November 7, 2025
|
|
|
|
## Executive Summary
|
|
|
|
Analysis of 5 ONVIF-compliant cameras from 3 manufacturers (REOLINK, AXIS, Bosch) reveals diverse implementations and capabilities. All cameras successfully responded to ONVIF commands with varying feature sets.
|
|
|
|
---
|
|
|
|
## Camera Inventory
|
|
|
|
### 1. REOLINK E1 Zoom
|
|
- **Firmware**: v3.1.0.2649_23083101
|
|
- **Serial**: 192168261
|
|
- **IP**: 192.168.2.61:8000
|
|
- **Type**: PTZ Indoor Camera
|
|
- **Key Features**: PTZ support, dual stream, basic imaging
|
|
|
|
### 2. AXIS Q3819-PVE
|
|
- **Firmware**: 10.12.153
|
|
- **Serial**: B8A44F9DC7ED
|
|
- **IP**: 192.168.2.190
|
|
- **Type**: Panoramic Fixed Dome
|
|
- **Key Features**: Ultra-wide 8192x1728 resolution, analytics, advanced imaging
|
|
|
|
### 3. AXIS P3818-PVE
|
|
- **Firmware**: 11.9.60
|
|
- **Serial**: B8A44FA04F26
|
|
- **IP**: 192.168.2.82
|
|
- **Type**: Panoramic Fixed Dome
|
|
- **Key Features**: 5120x2560 resolution, analytics, dual encoding (H264/JPEG)
|
|
|
|
### 4. Bosch FLEXIDOME panoramic 5100i
|
|
- **Firmware**: 9.00.0210
|
|
- **Serial**: 404705923918060213
|
|
- **IP**: 192.168.2.24
|
|
- **Type**: 360° Panoramic Dome
|
|
- **Key Features**: 16 profiles, dewarping, circular image (2112x2112)
|
|
|
|
### 5. Bosch FLEXIDOME IP starlight 8000i
|
|
- **Firmware**: 7.70.0126
|
|
- **Serial**: 044518807925140011
|
|
- **IP**: 192.168.2.200
|
|
- **Type**: Fixed Dome with Low-Light Performance
|
|
- **Key Features**: Starlight imaging, I/O connectors, relay output
|
|
|
|
---
|
|
|
|
## Comparative Analysis
|
|
|
|
### Resolution Capabilities
|
|
|
|
| Camera | Max Resolution | Aspect Ratio | Primary Use Case |
|
|
|--------|---------------|--------------|------------------|
|
|
| REOLINK E1 Zoom | 2048x1536 | 4:3 | Standard surveillance |
|
|
| AXIS Q3819-PVE | 8192x1728 | ~4.7:1 | 180° panoramic |
|
|
| AXIS P3818-PVE | 5120x2560 | 2:1 | 180° panoramic |
|
|
| Bosch panoramic 5100i | 2112x2112 | 1:1 | 360° fisheye |
|
|
| Bosch starlight 8000i | 1536x864 | 16:9 | Low-light environments |
|
|
|
|
### Profile Count
|
|
|
|
| Camera | Total Profiles | Video Profiles | Notes |
|
|
|--------|----------------|----------------|-------|
|
|
| REOLINK E1 Zoom | 2 | 2 | MainStream + SubStream |
|
|
| AXIS Q3819-PVE | 2 | 2 | H264 + JPEG |
|
|
| AXIS P3818-PVE | 2 | 2 | H264 + JPEG |
|
|
| Bosch panoramic 5100i | 16 | 9 valid | Includes metadata/audio profiles |
|
|
| Bosch starlight 8000i | 3 | 3 | 2x H264 + 1x JPEG |
|
|
|
|
### ONVIF Service Support
|
|
|
|
| Service | REOLINK | AXIS Q3819 | AXIS P3818 | Bosch Panoramic | Bosch Starlight |
|
|
|---------|---------|------------|------------|-----------------|-----------------|
|
|
| Device | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
| Media | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
| Imaging | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
| Events | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
| Analytics | ✗ | ✓ | ✓ | ✓ | ✗ |
|
|
| PTZ | ✓ | ✗ | ✗ | ✓ | ✗ |
|
|
|
|
### Video Encoding
|
|
|
|
| Camera | H264 | JPEG | MPEG4 | Notes |
|
|
|--------|------|------|-------|-------|
|
|
| REOLINK | ✓ | ✗ | ✗ | H264 only |
|
|
| AXIS Q3819 | ✓ | ✓ | ✗ | Dual encoding |
|
|
| AXIS P3818 | ✓ | ✓ | ✗ | Dual encoding |
|
|
| Bosch Panoramic | ✓ | ✗ | ✗ | H264 only |
|
|
| Bosch Starlight | ✓ | ✓ | ✗ | Dual encoding |
|
|
|
|
### Network Capabilities
|
|
|
|
| Feature | REOLINK | AXIS Q3819 | AXIS P3818 | Bosch Panoramic | Bosch Starlight |
|
|
|---------|---------|------------|------------|-----------------|-----------------|
|
|
| RTP Multicast | ✗ | ✓ | ✓ | ✓ | ✓ |
|
|
| RTP/TCP | ✓ | ✓ | ✓ | ✗ | ✗ |
|
|
| RTP/RTSP/TCP | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
| IPv6 Support | ✗ | ✓ | ✓ | ✗ | ✗ |
|
|
| TLS 1.2 | ✗ | ✓ | ✓ | ✓ | ✓ |
|
|
|
|
### Imaging Features
|
|
|
|
| Feature | REOLINK | AXIS Q3819 | AXIS P3818 | Bosch Panoramic | Bosch Starlight |
|
|
|---------|---------|------------|------------|-----------------|-----------------|
|
|
| Brightness Control | ✓ (128) | ✓ (50) | ✓ (50) | ✓ (127) | ✓ (128) |
|
|
| Saturation Control | ✓ (128) | ✓ (50) | ✓ (50) | ✓ (127) | ✓ (128) |
|
|
| Contrast Control | ✓ (128) | ✓ (50) | ✓ (50) | ✓ (127) | ✓ (128) |
|
|
| Sharpness Control | ✓ (128) | ✓ (50) | ✓ (50) | ✗ | ✗ |
|
|
| IrCutFilter | AUTO | AUTO | AUTO | ✗ | ✗ |
|
|
| WDR | ✗ | ON | ON | ✗ | ✗ |
|
|
| WhiteBalance | ✗ | AUTO | AUTO | ✗ | ✗ |
|
|
| Exposure Control | ✗ | AUTO | AUTO | ✗ | ✗ |
|
|
|
|
### I/O and Security
|
|
|
|
| Feature | REOLINK | AXIS Q3819 | AXIS P3818 | Bosch Panoramic | Bosch Starlight |
|
|
|---------|---------|------------|------------|-----------------|-----------------|
|
|
| Input Connectors | 0 | 2 | 2 | 0 | 2 |
|
|
| Relay Outputs | 0 | 0 | 0 | 0 | 1 |
|
|
| IP Filter | ✗ | ✓ | ✓ | ✗ | ✗ |
|
|
| TLS 1.1 | ✗ | ✓ | ✓ | ✗ | ✓ |
|
|
| TLS 1.2 | ✗ | ✓ | ✓ | ✓ | ✓ |
|
|
|
|
---
|
|
|
|
## Manufacturer-Specific Findings
|
|
|
|
### REOLINK
|
|
- **Strengths**:
|
|
- Simple, straightforward ONVIF implementation
|
|
- PTZ support with status reporting
|
|
- Good value camera with basic features
|
|
- **Limitations**:
|
|
- Limited imaging controls (no WDR, exposure, focus)
|
|
- Only H264 encoding (no JPEG profile)
|
|
- No analytics support
|
|
- Lower security features (no TLS)
|
|
- **RTSP Pattern**: `rtsp://IP:554/` (main), `rtsp://IP:554/h264Preview_01_sub` (sub)
|
|
- **Snapshot Pattern**: `http://IP:80/cgi-bin/api.cgi?cmd=onvifSnapPic&channel=0`
|
|
|
|
### AXIS
|
|
- **Strengths**:
|
|
- Excellent ONVIF compliance and feature richness
|
|
- Ultra-high resolution panoramic cameras
|
|
- Advanced imaging with WDR, exposure control, white balance
|
|
- Strong security (TLS 1.1/1.2, IP filtering, access policy)
|
|
- Analytics and rule-based event support
|
|
- **Consistent Implementation**:
|
|
- Both cameras share similar ONVIF structure
|
|
- Dual H264/JPEG encoding profiles
|
|
- Same URL patterns and capabilities
|
|
- **RTSP Pattern**: `rtsp://IP/onvif-media/media.amp?profile=X&sessiontimeout=60&streamtype=unicast`
|
|
- **Snapshot Pattern**: `http://IP/onvif-cgi/jpg/image.cgi?resolution=WxH&compression=30`
|
|
- **Notable**: Q3819 has wider aspect ratio (8192x1728 vs 5120x2560)
|
|
|
|
### Bosch
|
|
- **Strengths**:
|
|
- Specialized cameras with unique features
|
|
- Panoramic 5100i has comprehensive dewarping profiles
|
|
- Starlight 8000i optimized for low-light
|
|
- Good I/O options (starlight model has relay output)
|
|
- **Quirks**:
|
|
- Panoramic model has 16 profiles (many without video encoders)
|
|
- Some profiles return "IncompleteConfiguration" errors
|
|
- Less standardized RTSP URLs (tunnel-based)
|
|
- **RTSP Pattern**: `rtsp://IP/rtsp_tunnel?p=X&line=Y&inst=Z` (various parameters)
|
|
- **Snapshot Pattern**: `http://IP/snap.jpg?JpegCam=X`
|
|
- **Notable**:
|
|
- Panoramic uses circular (2112x2112) and dewarped (3072x1728) views
|
|
- 3 profiles failed GetStreamURI with incomplete configuration
|
|
|
|
---
|
|
|
|
## Performance Metrics
|
|
|
|
### Response Times (Average)
|
|
|
|
| Operation | REOLINK | AXIS Q3819 | AXIS P3818 | Bosch Panoramic | Bosch Starlight |
|
|
|-----------|---------|------------|------------|-----------------|-----------------|
|
|
| DeviceInfo | 117.7ms | 5.0ms | 4.9ms | 8.5ms | 7.9ms |
|
|
| Capabilities | 85.6ms | 72.7ms | 69.3ms | 21.9ms | 27.1ms |
|
|
| GetProfiles | 832.1ms | 70.9ms | 8.0ms | 706.2ms | 258.3ms |
|
|
| GetStreamURI | ~129ms avg | ~20ms avg | ~4ms avg | ~11ms avg | ~10ms avg |
|
|
| GetSnapshot | ~170ms avg | ~20ms avg | ~4ms avg | ~11ms avg | ~6ms avg |
|
|
| Imaging | 111.8ms | 55.8ms | 67.2ms | 57.3ms | 14.8ms |
|
|
|
|
**Key Observations**:
|
|
- AXIS cameras have fastest response times overall
|
|
- REOLINK has higher latency (likely due to port 8000, may be proxy/gateway)
|
|
- Bosch cameras have moderate, consistent response times
|
|
- GetProfiles is slowest operation for most cameras
|
|
|
|
### Error Analysis
|
|
|
|
| Camera | Total Errors | Error Types |
|
|
|--------|--------------|-------------|
|
|
| REOLINK E1 Zoom | 0 | None |
|
|
| AXIS Q3819-PVE | 0 | None |
|
|
| AXIS P3818-PVE | 0 | None |
|
|
| Bosch panoramic 5100i | 3 | GetStreamURI: IncompleteConfiguration (profiles 9,10,11) |
|
|
| Bosch starlight 8000i | 0 | None |
|
|
|
|
**Bosch Panoramic Errors**: Profiles 9, 10, 11 have no VideoEncoderConfiguration, causing legitimate failures. These appear to be metadata-only or incomplete profiles.
|
|
|
|
---
|
|
|
|
## Stream URI Patterns
|
|
|
|
### REOLINK Pattern
|
|
```
|
|
rtsp://192.168.2.61:554/ # MainStream
|
|
rtsp://192.168.2.61:554/h264Preview_01_sub # SubStream
|
|
```
|
|
|
|
### AXIS Pattern
|
|
```
|
|
rtsp://IP/onvif-media/media.amp?profile=profile_1_h264&sessiontimeout=60&streamtype=unicast
|
|
rtsp://IP/onvif-media/media.amp?profile=profile_1_jpeg&sessiontimeout=60&streamtype=unicast
|
|
```
|
|
|
|
### Bosch Patterns
|
|
|
|
**Indoor 5100i IR** (from previous report):
|
|
```
|
|
rtsp://IP/rtsp_tunnel?p=0&line=1&inst=1&vcd=2
|
|
```
|
|
|
|
**Panoramic 5100i**:
|
|
```
|
|
rtsp://192.168.2.24/rtsp_tunnel?p=0&line=3&inst=4 # E_PTZ view
|
|
rtsp://192.168.2.24/rtsp_tunnel?p=1&line=2&inst=1 # Dewarped view
|
|
rtsp://192.168.2.24/rtsp_tunnel?p=2&line=1&inst=4 # Full circle
|
|
rtsp://192.168.2.24/rtsp_tunnel?von=0&aon=1&aud=1 # Audio only
|
|
rtsp://192.168.2.24/rtsp_tunnel?von=0&vcd=2&line=1 # Metadata
|
|
```
|
|
|
|
**Starlight 8000i**:
|
|
```
|
|
rtsp://192.168.2.200/rtsp_tunnel?p=0&h26x=4&vcd=2
|
|
rtsp://192.168.2.200/rtsp_tunnel?p=1&inst=2&h26x=4
|
|
rtsp://192.168.2.200/rtsp_tunnel?h26x=0 # JPEG
|
|
```
|
|
|
|
**Parameter Meanings**:
|
|
- `p`: Profile index
|
|
- `line`: Video line/source (1=full, 2=dewarped, 3=ePTZ)
|
|
- `inst`: Instance number
|
|
- `vcd`: Video codec (2=metadata)
|
|
- `h26x`: H.26x codec (0=JPEG, 4=H264)
|
|
- `von`: Video on/off
|
|
- `aon`: Audio on/off
|
|
|
|
---
|
|
|
|
## PTZ Capabilities
|
|
|
|
### REOLINK E1 Zoom (PTZ Enabled)
|
|
- **PTZ Service**: http://192.168.2.61:8000/onvif/ptz_service
|
|
- **Status**: Both profiles report IDLE for PanTilt and Zoom
|
|
- **Presets**: 0 configured
|
|
- **Configuration**: PTZ config present but with empty position spaces
|
|
- **Notes**: PTZ capability exists but requires further testing for movement commands
|
|
|
|
### Bosch Panoramic 5100i (ePTZ)
|
|
- **PTZ Service**: http://192.168.2.24/onvif/ptz_service
|
|
- **Type**: Electronic PTZ (digital zoom/pan on panoramic image)
|
|
- **Profile**: Dedicated ePTZ profile (token "0", 1920x1080)
|
|
- **Notes**: Digital PTZ on dewarped 360° image, not mechanical movement
|
|
|
|
### Other Cameras
|
|
- AXIS Q3819-PVE, P3818-PVE, Bosch starlight 8000i: No PTZ support
|
|
|
|
---
|
|
|
|
## Snapshot URI Patterns
|
|
|
|
| Manufacturer | Pattern | Authentication Required |
|
|
|--------------|---------|------------------------|
|
|
| REOLINK | `http://IP:80/cgi-bin/api.cgi?cmd=onvifSnapPic&channel=0` | Yes |
|
|
| AXIS | `http://IP/onvif-cgi/jpg/image.cgi?resolution=WxH&compression=30` | Yes |
|
|
| Bosch | `http://IP/snap.jpg?JpegCam=N` | Yes |
|
|
|
|
**InvalidAfterConnect/Reboot**:
|
|
- REOLINK: InvalidAfterConnect=true, InvalidAfterReboot=true
|
|
- AXIS: All false (persistent URIs)
|
|
- Bosch: InvalidAfterReboot=true
|
|
|
|
---
|
|
|
|
## Bitrate and Frame Rate Analysis
|
|
|
|
### REOLINK E1 Zoom
|
|
- **MainStream**: 1024 kbps @ 15fps (2048x1536)
|
|
- **SubStream**: 512 kbps @ 15fps (640x480)
|
|
- **Quality**: 0 (main), 2 (sub)
|
|
|
|
### AXIS Q3819-PVE
|
|
- **H264**: Max bitrate @ 30fps (8192x1728)
|
|
- **JPEG**: Max bitrate @ 30fps (8192x1728)
|
|
- **Quality**: 70 for both
|
|
- **Bitrate Limit**: 2147483647 (max int32 = unlimited)
|
|
|
|
### AXIS P3818-PVE
|
|
- **H264**: Max bitrate @ 30fps (1920x960)
|
|
- **JPEG**: Max bitrate @ 30fps (5120x2560)
|
|
- **Quality**: 70 for both
|
|
- **Bitrate Limit**: 2147483647 (unlimited)
|
|
|
|
### Bosch Panoramic 5100i
|
|
- **Highest**: 13000 kbps @ 30fps (3072x1728 dewarped)
|
|
- **Lowest**: 400 kbps @ 30fps (512x288)
|
|
- **Standard**: 5200 kbps @ 30fps (1920x1080)
|
|
- **Quality**: 50 across all profiles
|
|
|
|
### Bosch Starlight 8000i
|
|
- **H264**: 1400 kbps @ 30fps (1536x864)
|
|
- **JPEG**: 6000 kbps @ 1fps (1536x864)
|
|
- **Quality**: 50 (H264), 70 (JPEG)
|
|
|
|
---
|
|
|
|
## Testing Recommendations
|
|
|
|
### Priority 1: Create Camera-Specific Tests
|
|
|
|
Each manufacturer has distinct patterns worthy of dedicated test files:
|
|
|
|
1. **reolink_e1_zoom_test.go**
|
|
- Test PTZ status retrieval
|
|
- Verify dual-stream profiles
|
|
- Test CGI-based snapshot URLs
|
|
- Validate 15fps frame rate limits
|
|
|
|
2. **axis_q3819_test.go**
|
|
- Test ultra-wide resolution (8192x1728)
|
|
- Verify analytics service
|
|
- Test dual H264/JPEG encoding
|
|
- Validate WDR and exposure settings
|
|
- Test multicast support
|
|
|
|
3. **axis_p3818_test.go**
|
|
- Test 5120x2560 panoramic resolution
|
|
- Similar to Q3819 but different aspect ratio
|
|
- Benchmark performance differences
|
|
|
|
4. **bosch_panoramic_5100i_test.go**
|
|
- Test circular (2112x2112) image profiles
|
|
- Test dewarped profiles
|
|
- Handle IncompleteConfiguration errors gracefully
|
|
- Test metadata and audio-only profiles
|
|
- Test 16 different profiles
|
|
|
|
5. **bosch_starlight_8000i_test.go**
|
|
- Test low-light imaging capabilities
|
|
- Test I/O connectors (2 inputs, 1 relay output)
|
|
- Test JPEG motion (1fps) vs H264 (30fps)
|
|
|
|
### Priority 2: Cross-Manufacturer Tests
|
|
|
|
Create tests that verify common ONVIF compliance:
|
|
|
|
1. **stream_uri_compatibility_test.go**
|
|
- Parse and validate different RTSP URL formats
|
|
- Test RTSP connection to each pattern
|
|
- Verify authentication handling
|
|
|
|
2. **imaging_settings_test.go**
|
|
- Test brightness/contrast/saturation ranges
|
|
- Test optional features (WDR, exposure, white balance)
|
|
- Verify manufacturer-specific defaults
|
|
|
|
3. **profile_enumeration_test.go**
|
|
- Test handling of 2-16 profiles
|
|
- Verify profile names and tokens
|
|
- Test resolution validation
|
|
|
|
### Priority 3: Edge Case Tests
|
|
|
|
1. **incomplete_profile_handling_test.go**
|
|
- Test cameras with profiles lacking video encoders
|
|
- Verify graceful error handling for IncompleteConfiguration
|
|
- Test metadata-only and audio-only profiles
|
|
|
|
2. **performance_benchmark_test.go**
|
|
- Benchmark GetProfiles (100ms to 800ms variation)
|
|
- Test response time consistency
|
|
- Measure concurrent request handling
|
|
|
|
---
|
|
|
|
## Code Patterns for Tests
|
|
|
|
### Example: Testing AXIS Cameras
|
|
|
|
```go
|
|
func TestAXISQ3819PVE_UltraWideResolution(t *testing.T) {
|
|
skipIfNoCamera(t)
|
|
|
|
client := createTestClient(t)
|
|
profiles, err := client.GetProfiles()
|
|
require.NoError(t, err)
|
|
|
|
// AXIS Q3819 should have H264 and JPEG profiles
|
|
assert.Equal(t, 2, len(profiles))
|
|
|
|
// Find H264 profile
|
|
var h264Profile *onvif.Profile
|
|
for _, p := range profiles {
|
|
if p.VideoEncoderConfiguration != nil &&
|
|
p.VideoEncoderConfiguration.Encoding == "H264" {
|
|
h264Profile = &p
|
|
break
|
|
}
|
|
}
|
|
|
|
require.NotNil(t, h264Profile, "H264 profile should exist")
|
|
|
|
// Verify ultra-wide resolution
|
|
assert.Equal(t, 8192, h264Profile.VideoEncoderConfiguration.Resolution.Width)
|
|
assert.Equal(t, 1728, h264Profile.VideoEncoderConfiguration.Resolution.Height)
|
|
|
|
// Verify 30fps
|
|
assert.Equal(t, 30, h264Profile.VideoEncoderConfiguration.RateControl.FrameRateLimit)
|
|
}
|
|
```
|
|
|
|
### Example: Testing Bosch Panoramic Profiles
|
|
|
|
```go
|
|
func TestBoschPanoramic5100i_MultipleProfiles(t *testing.T) {
|
|
skipIfNoCamera(t)
|
|
|
|
client := createTestClient(t)
|
|
profiles, err := client.GetProfiles()
|
|
require.NoError(t, err)
|
|
|
|
// Should have 16 profiles
|
|
assert.Equal(t, 16, len(profiles))
|
|
|
|
// Count profiles with valid video encoders
|
|
validVideoProfiles := 0
|
|
for _, p := range profiles {
|
|
if p.VideoEncoderConfiguration != nil {
|
|
validVideoProfiles++
|
|
}
|
|
}
|
|
|
|
assert.Equal(t, 9, validVideoProfiles, "Should have 9 video profiles")
|
|
|
|
// Test that incomplete profiles fail gracefully
|
|
for _, p := range profiles {
|
|
uri, err := client.GetStreamURI(p.Token, "RTP-Unicast")
|
|
|
|
if p.VideoEncoderConfiguration != nil {
|
|
// Valid profiles should succeed
|
|
if err != nil {
|
|
t.Logf("Profile %s failed: %v", p.Token, err)
|
|
}
|
|
} else {
|
|
// Incomplete profiles should fail
|
|
assert.Error(t, err, "Profile %s should fail (no video encoder)", p.Token)
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Example: Testing PTZ Status
|
|
|
|
```go
|
|
func TestREOLINKE1Zoom_PTZStatus(t *testing.T) {
|
|
skipIfNoCamera(t)
|
|
|
|
client := createTestClient(t)
|
|
profiles, err := client.GetProfiles()
|
|
require.NoError(t, err)
|
|
|
|
for _, profile := range profiles {
|
|
if profile.PTZConfiguration != nil {
|
|
status, err := client.GetPTZStatus(profile.Token)
|
|
require.NoError(t, err)
|
|
|
|
// Should report IDLE when not moving
|
|
assert.NotNil(t, status.MoveStatus)
|
|
assert.Contains(t, []string{"IDLE", "MOVING"}, status.MoveStatus.PanTilt)
|
|
assert.Contains(t, []string{"IDLE", "MOVING"}, status.MoveStatus.Zoom)
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Integration Test Suite Structure
|
|
|
|
```
|
|
tests/
|
|
├── manufacturers/
|
|
│ ├── reolink/
|
|
│ │ └── e1_zoom_test.go
|
|
│ ├── axis/
|
|
│ │ ├── q3819_pve_test.go
|
|
│ │ └── p3818_pve_test.go
|
|
│ └── bosch/
|
|
│ ├── flexidome_indoor_5100i_ir_test.go (existing)
|
|
│ ├── flexidome_panoramic_5100i_test.go
|
|
│ └── flexidome_starlight_8000i_test.go
|
|
├── compliance/
|
|
│ ├── stream_uri_test.go
|
|
│ ├── imaging_test.go
|
|
│ └── profile_test.go
|
|
├── benchmarks/
|
|
│ └── response_time_test.go
|
|
└── edge_cases/
|
|
├── incomplete_profiles_test.go
|
|
└── error_handling_test.go
|
|
```
|
|
|
|
---
|
|
|
|
## Implementation Insights
|
|
|
|
### RTSP Tunnel Parameters (Bosch)
|
|
|
|
Bosch uses a proprietary `rtsp_tunnel` endpoint with various parameters:
|
|
|
|
- **p**: Profile index (0-15)
|
|
- **line**: Video source line
|
|
- 1 = Full image circle
|
|
- 2 = Dewarped view mode
|
|
- 3 = Electronic PTZ
|
|
- **inst**: Stream instance (1-4, corresponds to bitrate tiers)
|
|
- **h26x**: Codec selection
|
|
- 0 = JPEG
|
|
- 4 = H.264
|
|
- **vcd**: Video coding
|
|
- 2 = Metadata stream
|
|
- **von**: Video on (0/1)
|
|
- **aon**: Audio on (0/1)
|
|
- **aud**: Audio stream identifier
|
|
- **JpegCam**: Camera number for snapshots
|
|
|
|
### AXIS URL Parameters
|
|
|
|
- **profile**: Profile token
|
|
- **sessiontimeout**: Session timeout in seconds
|
|
- **streamtype**: unicast or multicast
|
|
- **resolution**: Snapshot resolution (WxH)
|
|
- **compression**: JPEG compression quality (0-100, lower = better)
|
|
|
|
### REOLINK CGI API
|
|
|
|
Uses proprietary CGI commands:
|
|
- `cmd=onvifSnapPic`: Get ONVIF-compliant snapshot
|
|
- `channel=0`: Camera channel
|
|
|
|
---
|
|
|
|
## Security Considerations
|
|
|
|
### Authentication
|
|
All cameras require HTTP Digest Authentication for ONVIF requests.
|
|
|
|
### TLS Support
|
|
|
|
| Camera | TLS 1.1 | TLS 1.2 | Notes |
|
|
|--------|---------|---------|-------|
|
|
| REOLINK E1 Zoom | ✗ | ✗ | HTTP only |
|
|
| AXIS Q3819-PVE | ✓ | ✓ | Full TLS support |
|
|
| AXIS P3818-PVE | ✓ | ✓ | Full TLS support |
|
|
| Bosch Panoramic 5100i | ✗ | ✓ | TLS 1.2 only |
|
|
| Bosch Starlight 8000i | ✓ | ✓ | Full TLS support |
|
|
|
|
**Recommendation**: AXIS cameras provide the strongest security posture with IP filtering, access policy config, and TLS support.
|
|
|
|
### WS-Security
|
|
All cameras support WS-Security UsernameToken with digest authentication, as evidenced by successful ONVIF communication.
|
|
|
|
---
|
|
|
|
## Compatibility Matrix
|
|
|
|
### ONVIF Profile Compliance
|
|
|
|
Based on feature analysis, likely ONVIF profile compliance:
|
|
|
|
| Camera | Profile S | Profile T | Profile G | Profile M |
|
|
|--------|-----------|-----------|-----------|-----------|
|
|
| REOLINK E1 Zoom | ✓ | ✓ (PTZ) | ✗ | ✗ |
|
|
| AXIS Q3819-PVE | ✓ | ✗ | ✓ (Analytics) | ✓ (Metadata) |
|
|
| AXIS P3818-PVE | ✓ | ✗ | ✓ (Analytics) | ✓ (Metadata) |
|
|
| Bosch Panoramic 5100i | ✓ | ✓ (ePTZ) | ✓ (Analytics) | ✓ (Metadata) |
|
|
| Bosch Starlight 8000i | ✓ | ✗ | ✗ | Partial |
|
|
|
|
**Profiles**:
|
|
- **S**: Streaming (basic video)
|
|
- **T**: PTZ control
|
|
- **G**: Video analytics
|
|
- **M**: Metadata streaming
|
|
|
|
---
|
|
|
|
## Conclusions
|
|
|
|
### Best Practices Discovered
|
|
|
|
1. **Profile Enumeration**: Always check VideoEncoderConfiguration before calling GetStreamURI
|
|
2. **Error Handling**: Bosch cameras may return IncompleteConfiguration for metadata profiles
|
|
3. **Response Times**: Expect 5-800ms for GetProfiles depending on camera complexity
|
|
4. **URL Patterns**: Cannot assume consistent RTSP URL format across manufacturers
|
|
5. **Imaging Defaults**: Manufacturers use different scales (0-255 vs 0-100 vs 0-128)
|
|
|
|
### Client Library Improvements Needed
|
|
|
|
1. **URL Parser**: Helper to parse and validate different RTSP URL formats
|
|
2. **Profile Filter**: Method to filter profiles by capability (video, audio, metadata)
|
|
3. **Retry Logic**: Handle transient errors and timeouts
|
|
4. **TLS Support**: Enable HTTPS for cameras supporting TLS
|
|
5. **Batch Operations**: Parallel GetStreamURI calls for cameras with many profiles
|
|
|
|
### Test Coverage Recommendations
|
|
|
|
Based on this analysis, create test files covering:
|
|
|
|
1. ✅ Bosch FLEXIDOME indoor 5100i IR (already exists)
|
|
2. 🔲 REOLINK E1 Zoom (PTZ, dual stream)
|
|
3. 🔲 AXIS Q3819-PVE (ultra-wide, analytics)
|
|
4. 🔲 AXIS P3818-PVE (panoramic, analytics)
|
|
5. 🔲 Bosch FLEXIDOME panoramic 5100i (16 profiles, dewarping)
|
|
6. 🔲 Bosch FLEXIDOME IP starlight 8000i (low-light, I/O)
|
|
|
|
### Interoperability Score
|
|
|
|
Based on ONVIF compliance, feature richness, and ease of integration:
|
|
|
|
| Camera | Score | Rationale |
|
|
|--------|-------|-----------|
|
|
| AXIS P3818-PVE | 9.5/10 | Excellent compliance, fast, feature-rich |
|
|
| AXIS Q3819-PVE | 9.5/10 | Same as P3818, ultra-wide resolution |
|
|
| Bosch Starlight 8000i | 8.0/10 | Good compliance, moderate features |
|
|
| Bosch Panoramic 5100i | 7.5/10 | Complex profile structure, some errors |
|
|
| REOLINK E1 Zoom | 7.0/10 | Basic features, slower responses, limited imaging |
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. **Create manufacturer-specific test files** for each camera model
|
|
2. **Implement helper functions** for common patterns (URL parsing, profile filtering)
|
|
3. **Add benchmark tests** to track performance regression
|
|
4. **Document manufacturer quirks** in code comments
|
|
5. **Create CI/CD pipeline** to test against real cameras (when available)
|
|
6. **Expand coverage** for PTZ operations on REOLINK
|
|
7. **Test analytics** on AXIS cameras
|
|
8. **Validate TLS connections** on supported cameras
|
|
|
|
---
|
|
|
|
## Appendix: Raw Data Summary
|
|
|
|
### REOLINK E1 Zoom
|
|
- Profiles: 2
|
|
- Stream URIs: 2/2 successful
|
|
- Snapshot URIs: 2/2 successful
|
|
- Video Encoders: 2/2 successful
|
|
- Imaging Settings: 1/1 successful
|
|
- PTZ Status: 2/2 successful (both IDLE)
|
|
- PTZ Presets: 0
|
|
- Total Errors: 0
|
|
|
|
### AXIS Q3819-PVE
|
|
- Profiles: 2
|
|
- Stream URIs: 2/2 successful
|
|
- Snapshot URIs: 2/2 successful
|
|
- Video Encoders: 2/2 successful
|
|
- Imaging Settings: 1/1 successful
|
|
- Total Errors: 0
|
|
|
|
### AXIS P3818-PVE
|
|
- Profiles: 2
|
|
- Stream URIs: 2/2 successful
|
|
- Snapshot URIs: 2/2 successful
|
|
- Video Encoders: 2/2 successful
|
|
- Imaging Settings: 1/1 successful
|
|
- Total Errors: 0
|
|
|
|
### Bosch FLEXIDOME panoramic 5100i
|
|
- Profiles: 16
|
|
- Stream URIs: 13/16 successful (3 IncompleteConfiguration errors)
|
|
- Snapshot URIs: 16/16 successful
|
|
- Video Encoders: 9/9 successful (only tested valid profiles)
|
|
- Imaging Settings: 1/1 successful
|
|
- Total Errors: 3 (expected for incomplete profiles)
|
|
|
|
### Bosch FLEXIDOME IP starlight 8000i
|
|
- Profiles: 3
|
|
- Stream URIs: 3/3 successful
|
|
- Snapshot URIs: 3/3 successful
|
|
- Video Encoders: 3/3 successful
|
|
- Imaging Settings: 1/1 successful
|
|
- Total Errors: 0
|
|
|
|
---
|
|
|
|
**End of Analysis Report**
|