eadd0d74f7
- CONTRIBUTING.md: Updated title and git clone URL - .github/CONTRIBUTING.md: Updated title, paths, and references - QUICKSTART.md: Updated intro - BUILDING.md: Updated title - docs/ARCHITECTURE.md: Updated title and descriptions - docs/PROJECT_SUMMARY.md: Updated title, description, and structure - docs/IMPLEMENTATION_SUMMARY.md: Updated docker example - server/README.md: Updated cd command and link text - cmd/onvif-diagnostics/README.md: Updated cd command Note: Kept 'go-onvif' as manufacturer identifier in code (server/types.go, cmd/onvif-server/main.go) and in code comments (examples/) for descriptive purposes.
366 lines
9.8 KiB
Markdown
366 lines
9.8 KiB
Markdown
# ONVIF Camera Diagnostic Utility
|
||
|
||
A comprehensive diagnostic tool for collecting detailed information from ONVIF cameras. This utility helps analyze camera capabilities, troubleshoot issues, and generate reports for creating camera-specific tests.
|
||
|
||
## Features
|
||
|
||
✅ **Comprehensive Testing** - Tests all major ONVIF operations:
|
||
- Device information and capabilities
|
||
- Media profiles and streaming
|
||
- Video encoder configurations
|
||
- Imaging settings
|
||
- PTZ status and presets (if available)
|
||
- System date/time
|
||
|
||
✅ **Detailed Reporting** - Generates JSON reports with:
|
||
- All successful operations with response data
|
||
- Failed operations with error details
|
||
- Response times for performance analysis
|
||
- Structured data ready for test generation
|
||
|
||
✅ **Easy to Use** - Simple command-line interface with minimal requirements
|
||
|
||
✅ **XML Debugging** - For detailed debugging, see the companion `onvif-xml-capture` utility that captures raw SOAP XML
|
||
|
||
✅ **Helpful for**:
|
||
- Creating camera-specific integration tests
|
||
- Troubleshooting ONVIF compatibility issues
|
||
- Analyzing camera capabilities
|
||
- Debugging connection problems
|
||
- Documenting camera configurations
|
||
|
||
## Installation
|
||
|
||
### Option 1: Build from source
|
||
```bash
|
||
cd /path/to/onvif-go
|
||
go build -o onvif-diagnostics ./cmd/onvif-diagnostics/
|
||
```
|
||
|
||
### Option 2: Install globally
|
||
```bash
|
||
go install ./cmd/onvif-diagnostics
|
||
```
|
||
|
||
## Usage
|
||
|
||
### Basic Usage
|
||
```bash
|
||
./onvif-diagnostics \
|
||
-endpoint "http://192.168.1.201/onvif/device_service" \
|
||
-username "service" \
|
||
-password "Service.1234"
|
||
```
|
||
|
||
### With XML Capture (for debugging)
|
||
```bash
|
||
./onvif-diagnostics \
|
||
-endpoint "http://192.168.1.201/onvif/device_service" \
|
||
-username "service" \
|
||
-password "Service.1234" \
|
||
-capture-xml \
|
||
-verbose
|
||
```
|
||
|
||
This creates two files:
|
||
- `Manufacturer_Model_Firmware_timestamp.json` - Diagnostic report
|
||
- `Manufacturer_Model_Firmware_xmlcapture_timestamp.tar.gz` - Raw SOAP XML archive
|
||
|
||
### Verbose Output
|
||
```bash
|
||
./onvif-diagnostics \
|
||
-endpoint "http://192.168.1.201/onvif/device_service" \
|
||
-username "service" \
|
||
-password "Service.1234" \
|
||
-verbose
|
||
```
|
||
|
||
### Capture Raw SOAP XML
|
||
```bash
|
||
./onvif-diagnostics \
|
||
-endpoint "http://192.168.1.201/onvif/device_service" \
|
||
-username "service" \
|
||
-password "Service.1234" \
|
||
-capture-xml
|
||
```
|
||
|
||
Enables XML traffic capture and creates a compressed tar.gz archive containing all SOAP request/response pairs. Useful for debugging XML parsing issues or analyzing camera behavior.
|
||
|
||
The archive contains:
|
||
- `capture_001_GetDeviceInformation.json` - Request/response metadata with operation name
|
||
- `capture_001_GetDeviceInformation_request.xml` - Formatted SOAP request
|
||
- `capture_001_GetDeviceInformation_response.xml` - Formatted SOAP response
|
||
- `capture_002_GetSystemDateAndTime.json` - Next operation metadata
|
||
- ... (one set per SOAP operation, named by operation type)
|
||
|
||
Each file is named with the SOAP operation (e.g., GetDeviceInformation, GetProfiles) for easy identification.
|
||
|
||
Extract the archive:
|
||
```bash
|
||
tar -xzf camera-logs/Camera_Model_xmlcapture_timestamp.tar.gz
|
||
```
|
||
|
||
### Custom Output Directory
|
||
```bash
|
||
./onvif-diagnostics \
|
||
-endpoint "http://192.168.1.201/onvif/device_service" \
|
||
-username "service" \
|
||
-password "Service.1234" \
|
||
-output ./my-camera-reports
|
||
```
|
||
|
||
### All Options
|
||
```
|
||
Usage of ./onvif-diagnostics:
|
||
-endpoint string
|
||
ONVIF device endpoint (e.g., http://192.168.1.201/onvif/device_service)
|
||
-username string
|
||
ONVIF username
|
||
-password string
|
||
ONVIF password
|
||
-output string
|
||
Output directory for logs (default "./camera-logs")
|
||
-timeout int
|
||
Request timeout in seconds (default 30)
|
||
-verbose
|
||
Verbose output
|
||
-include-raw
|
||
Include raw SOAP responses (increases file size)
|
||
```
|
||
|
||
## Example Output
|
||
|
||
```
|
||
ONVIF Camera Diagnostic Utility v1.0.0
|
||
========================================
|
||
|
||
Starting diagnostic collection...
|
||
|
||
→ 1. Getting device information...
|
||
✓ Manufacturer: Bosch, Model: FLEXIDOME indoor 5100i IR
|
||
→ 2. Getting system date and time...
|
||
✓ Retrieved
|
||
→ 3. Getting capabilities...
|
||
✓ Services: Device, Media, Imaging, Events, Analytics
|
||
→ 4. Discovering service endpoints...
|
||
✓ Service endpoints discovered
|
||
→ 5. Getting media profiles...
|
||
✓ Found 4 profile(s)
|
||
→ 6. Getting stream URIs for all profiles...
|
||
✓ Retrieved 4/4 stream URIs
|
||
→ 7. Getting snapshot URIs for all profiles...
|
||
✓ Retrieved 4/4 snapshot URIs
|
||
→ 8. Getting video encoder configurations...
|
||
✓ Retrieved 4/4 video encoder configs
|
||
→ 9. Getting imaging settings...
|
||
✓ Retrieved 1/1 imaging settings
|
||
→ 10. Getting PTZ status...
|
||
ℹ No PTZ configurations found
|
||
→ 11. Getting PTZ presets...
|
||
ℹ No PTZ configurations found
|
||
→ Saving diagnostic report...
|
||
|
||
========================================
|
||
✓ Diagnostic collection complete!
|
||
Report saved to: camera-logs/Bosch_FLEXIDOME_indoor_5100i_IR_8.71.0066_20251107-193656.json
|
||
Total errors: 0
|
||
|
||
Device: Bosch FLEXIDOME indoor 5100i IR
|
||
Firmware: 8.71.0066
|
||
Profiles: 4
|
||
|
||
Please share this file for analysis and test creation.
|
||
========================================
|
||
```
|
||
|
||
## Report Structure
|
||
|
||
The generated JSON report includes:
|
||
|
||
```json
|
||
{
|
||
"timestamp": "2025-11-07T19:36:56Z",
|
||
"utility_version": "1.0.0",
|
||
"connection_info": {
|
||
"endpoint": "http://192.168.1.201/onvif/device_service",
|
||
"username": "service",
|
||
"test_date": "2025-11-07"
|
||
},
|
||
"device_info": {
|
||
"success": true,
|
||
"data": {
|
||
"manufacturer": "Bosch",
|
||
"model": "FLEXIDOME indoor 5100i IR",
|
||
"firmware_version": "8.71.0066",
|
||
"serial_number": "404754734001050102",
|
||
"hardware_id": "F000B543"
|
||
},
|
||
"response_time": "21.5ms"
|
||
},
|
||
"profiles": {
|
||
"success": true,
|
||
"count": 4,
|
||
"data": [ /* profile details */ ]
|
||
},
|
||
"stream_uris": [ /* stream URI results for each profile */ ],
|
||
"errors": [ /* any errors encountered */ ]
|
||
}
|
||
```
|
||
|
||
## Use Cases
|
||
|
||
### 1. Creating Camera-Specific Tests
|
||
Run the diagnostic on your camera and share the JSON file. The report contains all the information needed to create comprehensive integration tests.
|
||
|
||
### 2. Troubleshooting Connection Issues
|
||
If your camera isn't working, run diagnostics to see exactly which operations fail and what error messages are returned.
|
||
|
||
### 3. Comparing Cameras
|
||
Run diagnostics on multiple cameras to compare capabilities, response times, and compatibility.
|
||
|
||
### 4. Documentation
|
||
Generate detailed reports of camera configurations for documentation purposes.
|
||
|
||
## Interpreting Results
|
||
|
||
### Success Indicators
|
||
- ✓ Green checkmarks indicate successful operations
|
||
- Response times help identify performance issues
|
||
- High success rates indicate good compatibility
|
||
|
||
### Error Indicators
|
||
- ✗ Red X marks indicate failed operations
|
||
- ℹ Info symbols indicate optional features not available
|
||
- Check the `errors` array in JSON for detailed error messages
|
||
|
||
### Common Issues
|
||
|
||
**All operations fail:**
|
||
- Check network connectivity
|
||
- Verify endpoint URL is correct
|
||
- Ensure camera is powered on
|
||
|
||
**Authentication errors:**
|
||
- Verify username and password
|
||
- Check user permissions on camera
|
||
|
||
**Some profiles fail:**
|
||
- Camera may have different capabilities per profile
|
||
- Some operations may not be supported by all profiles
|
||
|
||
**Timeout errors:**
|
||
- Increase timeout with `-timeout 60`
|
||
- Check network latency
|
||
- Verify camera is responding
|
||
|
||
## Sharing Reports
|
||
|
||
When sharing diagnostic reports:
|
||
|
||
1. **Anonymize if needed** - The report includes:
|
||
- IP addresses (in endpoint)
|
||
- Usernames (not passwords)
|
||
- Serial numbers
|
||
|
||
2. **What to share**:
|
||
- The complete JSON file
|
||
- Any console output showing errors
|
||
- Camera model and firmware version
|
||
|
||
3. **Where to share**:
|
||
- GitHub Issues
|
||
- Email for analysis
|
||
- Pull request descriptions
|
||
|
||
## Advanced Usage
|
||
|
||
### Batch Testing Multiple Cameras
|
||
Create a script to test multiple cameras:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
cameras=(
|
||
"192.168.1.201:service:password1"
|
||
"192.168.1.202:admin:password2"
|
||
"192.168.1.203:user:password3"
|
||
)
|
||
|
||
for camera in "${cameras[@]}"; do
|
||
IFS=':' read -r ip user pass <<< "$camera"
|
||
echo "Testing camera at $ip..."
|
||
./onvif-diagnostics \
|
||
-endpoint "http://$ip/onvif/device_service" \
|
||
-username "$user" \
|
||
-password "$pass"
|
||
done
|
||
```
|
||
|
||
### Automated Testing
|
||
Include in CI/CD pipelines:
|
||
|
||
```yaml
|
||
- name: Run ONVIF Diagnostics
|
||
run: |
|
||
./onvif-diagnostics \
|
||
-endpoint "${{ secrets.CAMERA_ENDPOINT }}" \
|
||
-username "${{ secrets.CAMERA_USERNAME }}" \
|
||
-password "${{ secrets.CAMERA_PASSWORD }}" \
|
||
-output ./reports
|
||
|
||
- name: Upload Diagnostic Reports
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: camera-diagnostics
|
||
path: ./reports/
|
||
```
|
||
|
||
## Development
|
||
|
||
### Adding New Tests
|
||
|
||
To add new diagnostic tests, edit `cmd/onvif-diagnostics/main.go`:
|
||
|
||
1. Create a new test function following the pattern:
|
||
```go
|
||
func testNewOperation(ctx context.Context, client *onvif.Client, report *CameraReport) *NewOperationResult {
|
||
// Implementation
|
||
}
|
||
```
|
||
|
||
2. Add result struct to store data
|
||
3. Call the test in main()
|
||
4. Update report structure
|
||
|
||
### Building for Different Platforms
|
||
|
||
```bash
|
||
# Linux
|
||
GOOS=linux GOARCH=amd64 go build -o onvif-diagnostics-linux ./cmd/onvif-diagnostics/
|
||
|
||
# Windows
|
||
GOOS=windows GOARCH=amd64 go build -o onvif-diagnostics.exe ./cmd/onvif-diagnostics/
|
||
|
||
# macOS ARM
|
||
GOOS=darwin GOARCH=arm64 go build -o onvif-diagnostics-mac-arm ./cmd/onvif-diagnostics/
|
||
```
|
||
|
||
## License
|
||
|
||
Same as parent project.
|
||
|
||
## Support
|
||
|
||
For issues or questions:
|
||
1. Run diagnostics with `-verbose` flag
|
||
2. Share the generated JSON report
|
||
3. **For XML parsing issues**: Use `onvif-xml-capture` utility to capture raw SOAP XML
|
||
4. Open a GitHub issue with the report attached
|
||
|
||
## Related Tools
|
||
|
||
- **onvif-xml-capture** - Captures raw SOAP XML requests/responses for detailed debugging
|
||
- Location: `cmd/onvif-xml-capture/`
|
||
- Use when: Diagnostic report shows errors and you need to see raw XML
|
||
- See: `XML_DEBUGGING_SOLUTION.md` for complete guide
|
||
|