Skip to content

Test with Postman

This instruction introduce how to test with the Post REST client tool.

Test ONVIF API

Before using device-onvif-camera, the user can verify the camera's functionality via ONVIF APIs, we provide the following collections for testing: - Capabilities - Auto Discovery - Network Configuration - System Function - User Handling - Metadata Configuration - Video Streaming - Video Encoder Configuration - PTZ - Event Handling - Analytics

Import the Postman collections

Download and import the following JSON files into Postman REST client tool:
- onvif_camera_without_edgex_postman_collection.json
- onvif_camera_without_edgex_postman_environment.json

Set Up the Authentication for ONVIF security

Replace the following onvif environment variable on the Postman REST client. - WS_USERNAME - The username for a certified user - WS_NONCE - A random, unique number generated by a client - WS_UTC_TIME - The UtcTime when the request is made. - WS_PASSWORD_DIGEST - a digest that is calculated according to an algorithm defined in the specification for WS-UsernameToken: Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )

How to generate the PasswordDigest?

According to the ONVIF spec and programmer guide, the client needs to provide the password digest for WS-UsernameToken. For example, we can generate the password digest in golang:

package main

import (
    "crypto/sha1"
    "encoding/base64"
    "fmt"
)

func main() {
    nonce := "abcd"
    password := "Password1!"
    created := "2022-06-06T12:26:37.769698Z"
    passwordDigest := generatePasswordDigest(nonce, created, password)

    fmt.Println("Nonce:", nonce)
    fmt.Println("Created:", created)
    fmt.Println("PasswordDigest:", passwordDigest)
}

//Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )
func generatePasswordDigest(Nonce string, Created string, Password string) string {
    sDec, _ := base64.StdEncoding.DecodeString(Nonce)
    hasher := sha1.New()
    hasher.Write([]byte(string(sDec) + Created + Password))
    return base64.StdEncoding.EncodeToString(hasher.Sum(nil))
}
The runnable code: https://go.dev/play/p/ZnE2nZYorg9

Set Up the API Endpoint

Generally, the device web service endpoint is http:/${address}:${port}/onvif/device_service, then we can use GetCapabilities ONVIF function to query other web service's endpoint:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope ...>
    <env:Body>
        <tds:GetCapabilitiesResponse>
            <tds:Capabilities>
                <tt:Device>
                    <tt:XAddr>http://192.168.12.123/onvif/device_service</tt:XAddr>
                    ...
                </tt:Device>
                <tt:Events>
                    <tt:XAddr>http://192.168.12.123/onvif/Events</tt:XAddr>
                    ...
                </tt:Events>
                ...
        </tds:GetCapabilitiesResponse>
    </env:Body>
</env:Envelope>

And we should replace the following onvif environment variable on the Postman REST client. - DEVICE_ENDPOINT - device web service endpoint - MEDIA_ENDPOINT - media web service endpoint - EVENT_ENDPOINT - event web service endpoint - PTZ_ENDPOINT - ptz web service endpoint

Then we can execute other ONVIF function via Postman REST client tool.

Test device-onvif-camera API

After adding the device according to the Getting Started Guide, then we can import the following Postman collections for testing the APIs:
- onvif_camera_with_edgex_postman_collection.json
- onvif_camera_with_edgex_postman_environment.json