Onvif Camera Device Service Specifications
This Onvif Camera Device Service is developed to control/communicate ONVIF-compliant cameras accessible via http in an EdgeX deployment
Table of Contents
Device ONVIF API Specifications
The latest version v3.1 of the device service API specifications can be found
here.
ONVIF Device Service Protocol Properties
ONVIF Protocol
All properties in the Onvif
protocol field are defined by internal device information and some user defined information.
Property |
Description |
EdgeX Value Type |
Address |
The IP address of the camera. |
String |
Port |
The internet port of the camera. |
String |
EndpointRefAddress |
A GUID used to indentify the camera endpoint. |
String |
DeviceStatus |
The discovery and authentication status of the camera. |
String |
UpWithAuth |
The device can execute commands requiring credentials. |
|
UpWithoutAuth |
The device can only execute commands that do not require credentials. Usually this means the camera's credentials have not been registered with the service yet, or have been changed. |
|
Reachable |
The device can be discovered but no commands can be received. |
|
Unreachable |
The device cannot be seen by service at all. Typically, this means that there is a connection issue either physically or with the network. |
|
LastSeen |
The time that the device was last seen on the network. |
String |
MACAddress |
The MAC address of the camera. |
String |
FriendlyName |
The user defined name for the camera. |
String |
Manufacturer |
The manufacturer of the camera. |
String |
Model |
The model description of the camera. |
String |
FirmwareVersion |
The firmware version of the camera. Format will vary by manufacturer and model. |
String |
SerialNumber |
The serial number of the camera. |
String |
HardwareId |
The hardware ID of the camera. |
String |
All properties in the CustomMetadata
protocol field are user defined. It can hold multiple different entries. For more information, see here
Property |
Description |
EdgeX Value Type |
UserDefined |
User defined. |
String |
ONVIF Features
The device service supports the onvif features listed in the following table:
Note
The functions in the bold text are mandatory for Onvif protocol.
Custom Features
The device service also include custom function to enhance the usage for the EdgeX user.
Feature |
Service |
Function |
EdgeX Value Type |
Description |
System Function |
EdgeX |
RebootNeeded |
Bool |
Read only. Used to indicate the camera should reboot to apply the configuration change |
System Function |
EdgeX |
CameraEvent |
Bool |
A device resource which is used to send the async event to north bound |
System Function |
EdgeX |
SubscribeCameraEvent |
Bool |
Create a subscription to subscribe the event from the camera |
System Function |
EdgeX |
UnsubscribeCameraEvent |
Bool |
Unsubscribe all subscription from the camera |
Media |
EdgeX |
GetSnapshot |
Binary |
Get Snapshot from the snapshot uri |
Custom Metadata |
EdgeX |
CustomMetadata |
Object |
Read and write custom metadata to the camera entry in EdgeX |
Custom Metadata |
EdgeX |
DeleteCustomMetadata |
Object |
Delete custom metadata fields from the camera entry in EdgeX |
How does the device service work?
The Onvif camera uses Web Services standards such as XML, SOAP 1.2 and WSDL1.1 over an IP network.
- XML is used as the data description syntax
- SOAP is used for message transfer
- and WSDL is used for describing the services.
The spec can refer to ONVIF-Core-Specification.
For example, we can send a SOAP request to the Onvif camera as below:
curl --request POST 'http://192.168.12.128:2020/onvif/service' \
--header 'Content-Type: application/soap+xml' \
--data-raw '<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope" xmlns:soap-enc="http://www.w3.org/2003/05/soap-encoding" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:onvif="http://www.onvif.org/ver10/schema" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" >
<soap-env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<UsernameToken>
<Username>myUsername</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">+HKcvc+LCGClVwuros1sJuXepQY=</Password>
<Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">w490bn6rlib33d5rb8t6ulnqlmz9h43m</Nonce>
<Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2021-10-21T03:43:21.02075Z</Created>
</UsernameToken>
</Security>
</soap-env:Header>
<soap-env:Body>
<trt:GetStreamUri>
<trt:ProfileToken>profile_1</trt:ProfileToken>
</trt:GetStreamUri>
</soap-env:Body>
</soap-env:Envelope>'
And the response should be like the following XML data:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa5="http://www.w3.org/2005/08/addressing"
xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2"
xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:tns1="http://www.onvif.org/ver10/topics"
xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl"
xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"
xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl">
<SOAP-ENV:Header></SOAP-ENV:Header>
<SOAP-ENV:Body>
<trt:GetStreamUriResponse>
<trt:MediaUri>
<tt:Uri>rtsp://192.168.12.128:554/stream1</tt:Uri>
<tt:InvalidAfterConnect>false</tt:InvalidAfterConnect>
<tt:InvalidAfterReboot>false</tt:InvalidAfterReboot>
<tt:Timeout>PT0H0M2S</tt:Timeout>
</trt:MediaUri>
</trt:GetStreamUriResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Since the SOAP message is an HTTP call, the device service can just do the transformation between REST(JSON) and SOAP(XML).
For the concept of implementation:
- The device service accepts the REST request from the client, then transforms the request to SOAP format and forward it to the Onvif camera.
- Once the device service receives the response from the Onvif camera, the device service will transform the SOAP response to REST format for the client.
- Onvif Web Service
- Onvif Function ┌────────────────────┐
│ │
┌──────────────┐ - Input Parameter │ Device Service │ ┌─────────────────┐
│ │ │ │ │ │
│ │ REST request │ │ SOAP request │ │
│ Client ──┼────────────────────┼──► Transform ────┼───────────────┼──► Onvif Camera │
│ │ │ to SOAP request │ │ │
│ │ │ │ │ │
└──────────────┘ └────────────────────┘ └─────────────────┘
┌────────────────────┐
│ │
┌──────────────┐ │ Device Service │ ┌─────────────────┐
│ │ │ │ │ │
│ │ REST response │ │ SOAP response │ │
│ Client ◄─┼────────────────────┼─── Transform ◄──┼───────────────┼── Onvif Camera │
│ │ │ to REST response │ │ │
│ │ │ │ │ │
└──────────────┘ └────────────────────┘ └─────────────────┘
Warning
Both REST and SOAP commands over the network can be subject to attacks while in transit. Please take all necessary precautions to protect network traffic.
Tested Onvif Cameras
The following table shows the Onvif functions tested for various Onvif cameras:
- '✔' means the function works for the specified camera.
- '❌' means the function does not work or is not implemented by the specified camera.
- 'ⓘ' means there is additional details available. Click it to read more.
- Empty cells means the function has not yet been tested.
Camera Documentation
Use these links to access maufacturer documentation
User Authentication
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Core |
WS-UsernameToken |
✔ |
✔ |
✔ |
✔ |
✔ |
|
HTTP Digest |
✔ |
❌ |
✔ |
❌ |
❌ |
Capabilities
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Device |
GetCapabilities |
|
✔ |
|
|
❌ |
|
GetServiceCapabilities |
|
✔ |
|
|
❌ |
Media |
GetServiceCapabilities |
|
✔ |
|
|
✔ |
PTZ |
GetServiceCapabilities |
|
✔ |
|
|
✔ |
Imaging |
GetServiceCapabilities |
|
❌ |
|
|
✔ |
Event |
GetServiceCapabilities |
|
✔ |
|
|
✔ |
Auto Discovery
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Core |
WS-Discovery |
✔ |
✔ |
✔ |
✔ |
✔ |
Device |
GetDiscoveryMode |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetDiscoveryMode |
✔ |
✔ |
✔ |
✔ |
✔ |
|
GetScopes |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetScopes |
✔ |
✔ |
✔ |
✔ |
❌ |
|
AddScopes |
✔ |
❌ |
✔ |
✔ |
✔ |
|
RemoveScopes |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetEndpointReference |
|
❌ |
✔ |
|
❌ |
Network Configuration
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Device |
GetHostname |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetHostname |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetDNS |
✔ |
❌ |
✔ |
✔ |
✔ |
|
SetDNS |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetNetworkInterfaces |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetNetworkInterfaces |
✔ |
❌ |
✔ |
✔ |
❌ |
|
GetNetworkProtocols |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetNetworkProtocols |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetNetworkDefaultGateway |
✔ |
❌ |
✔ |
✔ |
✔ |
|
SetNetworkDefaultGateway |
✔ |
❌ |
✔ |
✔ |
✔ |
System Function
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Device |
GetDeviceInformation |
✔ |
✔ |
✔ |
✔ |
✔ |
|
GetSystemDateAndTime |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetSystemDateAndTime |
✔ |
✔ ⓘ |
✔ |
✔ |
✔ |
|
SetSystemFactoryDefault |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SystemReboot |
✔ |
✔ |
✔ |
✔ |
✔ |
User Handling
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Device |
GetUsers |
✔ |
❌ ⓘ |
✔ |
✔ |
✔ |
|
CreateUsers |
✔ |
❌ ⓘ |
✔ |
✔ |
✔ |
|
DeleteUsers |
✔ |
❌ ⓘ |
✔ |
✔ |
✔ |
|
SetUser |
✔ |
❌ ⓘ |
✔ |
✔ |
✔ |
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Media |
GetMetadataConfigurations |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetMetadataConfiguration |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetCompatibleMetadataConfigurations |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetMetadataConfigurationOptions |
✔ |
❌ |
✔ |
✔ |
✔ |
|
AddMetadataConfiguration |
✔ |
❌ |
✔ |
✔ |
✔ |
|
RemoveMetadataConfiguration |
✔ |
❌ |
✔ |
✔ |
✔ |
|
SetMetadataConfiguration |
✔ |
❌ |
✔ |
✔ |
✔ |
Video Streaming
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Media |
GetProfiles |
✔ |
✔ |
✔ |
✔ |
✔ |
|
GetStreamUri |
✔ |
✔ |
✔ |
✔ |
✔ |
VideoEncoder Config
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Media |
GetVideoEncoderConfigurations |
|
|
|
|
|
|
GetVideoEncoderConfiguration |
✔ |
✔ |
✔ |
✔ |
✔ |
|
SetVideoEncoderConfiguration |
✔ |
❌ |
✔ |
✔ |
✔ |
|
GetVideoEncoderConfigurationOptions |
✔ |
✔ |
✔ |
✔ |
✔ |
PTZ Node
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
PTZ |
GetNodes |
❌ |
✔ |
❌ |
❌ |
✔ |
|
GetNode |
❌ |
✔ |
❌ |
❌ |
✔ |
PTZ Configuration
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
PTZ |
GetConfigurations |
❌ |
✔ |
❌ |
❌ |
✔ |
|
GetConfiguration |
❌ |
✔ |
❌ |
❌ |
✔ |
|
GetConfigurationOptions |
❌ |
✔ |
❌ |
❌ |
✔ |
|
SetConfiguration |
❌ |
❌ |
❌ |
❌ |
✔ |
Media |
AddPTZConfiguration |
❌ |
❌ |
❌ |
❌ |
✔ |
Media |
RemovePTZConfiguration |
❌ |
❌ |
❌ |
❌ |
✔ |
PTZ Actuation
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
PTZ |
AbsoluteMove |
❌ |
✔ |
❌ |
❌ |
✔ |
|
RelativeMove |
❌ |
✔ |
❌ |
❌ |
✔ |
|
ContinuousMove |
❌ |
✔ |
❌ |
❌ |
✔ |
|
Stop |
❌ |
✔ |
❌ |
❌ |
✔ |
|
GetStatus |
❌ |
✔ |
❌ |
❌ |
✔ |
PTZ Preset
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
PTZ |
SetPreset |
❌ |
✔ |
❌ |
❌ |
✔ |
|
GetPresets |
❌ |
✔ |
❌ |
❌ |
✔ |
|
GotoPreset |
❌ |
✔ |
❌ |
❌ |
✔ |
|
RemovePreset |
❌ |
✔ |
❌ |
❌ |
✔ |
PTZ Home Position
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
PTZ |
GotoHomePosition |
❌ |
❌ |
❌ |
❌ |
✔ |
|
SetHomePosition |
❌ |
❌ |
❌ |
❌ |
✔ |
PTZ Auxiliary Operations
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
PTZ |
SendAuxiliaryCommand |
❌ |
❌ |
❌ |
❌ |
❌ |
Event Handling
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Event |
Notify |
✔ |
❌ |
✔ |
❌ |
|
|
Subscribe |
✔ |
❌ |
✔ |
❌ |
|
|
Renew |
❌ |
❌ |
✔ |
❌ |
|
|
Unsubscribe |
✔ |
❌ |
✔ |
❌ |
|
|
CreatePullPointSubscription |
✔ |
❌ |
✔ |
❌ |
|
|
PullMessages |
✔ |
❌ |
✔ |
❌ |
|
|
TopicFilter |
✔ |
❌ |
✔ |
❌ |
|
|
MessageContentFilter |
❌ |
❌ |
❌ |
❌ |
|
|
GetEventProperties |
|
✔ |
|
|
|
Analytics Profile Configuration
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Media2 |
GetProfiles |
❌ |
❌ |
✔ |
❌ |
✔ |
|
GetAnalyticsConfigurations |
❌ |
❌ |
✔ |
❌ |
✔ |
|
AddConfiguration |
❌ |
❌ |
✔ |
❌ |
❌ |
|
RemoveConfiguration |
❌ |
❌ |
✔ |
❌ |
❌ |
Analytics Module Configuration
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Analytics |
GetSupportedAnalyticsModules |
❌ |
❌ |
✔ |
❌ |
❌ |
|
GetAnalyticsModules |
❌ |
❌ |
✔ |
❌ |
❌ |
|
CreateAnalyticsModules |
❌ |
❌ |
❌ |
❌ |
❌ |
|
DeleteAnalyticsModules |
❌ |
❌ |
❌ |
❌ |
❌ |
|
GetAnalyticsModuleOptions |
❌ |
❌ |
✔ |
❌ |
❌ |
|
ModifyAnalyticsModules |
❌ |
❌ |
✔ |
❌ |
❌ |
Rule Configuration
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
Analytics |
GetSupportedRules |
❌ |
❌ |
✔ |
❌ |
❌ |
|
GetRules |
❌ |
❌ |
✔ |
❌ |
❌ |
|
CreateRules |
❌ |
❌ |
✔ |
❌ |
❌ |
|
DeleteRules |
❌ |
❌ |
✔ |
❌ |
❌ |
|
GetRuleOptions |
❌ |
❌ |
✔ |
❌ |
❌ |
|
ModifyRules |
❌ |
❌ |
✔ |
❌ |
❌ |
Custom EdgeX
Onvif Web Service |
Onvif Function |
Hikvision DFI6256TE |
Tapo C200 |
BOSCH DINION IP starlight 6000 HD |
GeoVision GV-BX8700 |
Hikvision DS-2DE2A404IW-DE3 |
EdgeX |
GetSnapshot |
✔ |
❌ |
✔ ⓘ |
❌ |
✔ |