<?xml version="1.0"?>
<?xml-stylesheet href="docbook.xsl" type="text/xsl" ?>
<book xmlns="http://docbook.org/ns/docbook" version="5.0">
  <info>
    <title>ONVIF Core Specification</title>
    <titleabbrev>ONVIF Core Spec</titleabbrev>
    <releaseinfo>25.12</releaseinfo>
    <author>
      <orgname>ONVIF™</orgname>
      <uri>www.onvif.org</uri>
    </author>
    <pubdate>December, 2025</pubdate>
    <mediaobject>
      <imageobject>
        <imagedata fileref="media/logo.png" contentwidth="60mm"/>
      </imageobject>
    </mediaobject>
    <copyright>
      <year>2008-2025</year>
      <holder>ONVIF™ All rights reserved.</holder>
    </copyright>
    <legalnotice>
      <para>Recipients of this document may copy, distribute, publish, or display this document so
        long as this copyright notice, license and disclaimer are retained with all copies of the
        document. No license is granted to modify this document.</para>
      <para>THIS DOCUMENT IS PROVIDED "AS IS," AND THE CORPORATION AND ITS MEMBERS AND THEIR
        AFFILIATES, MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
        LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
        NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THIS DOCUMENT ARE SUITABLE FOR ANY PURPOSE;
        OR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS,
        TRADEMARKS OR OTHER RIGHTS.</para>
      <para>IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FOR ANY
        DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR
        RELATING TO ANY USE OR DISTRIBUTION OF THIS DOCUMENT, WHETHER OR NOT (1) THE CORPORATION,
        MEMBERS OR THEIR AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR (2)
        SUCH DAMAGES WERE REASONABLY FORESEEABLE, AND ARISING OUT OF OR RELATING TO ANY USE OR
        DISTRIBUTION OF THIS DOCUMENT.  THE FOREGOING DISCLAIMER AND LIMITATION ON LIABILITY DO NOT
        APPLY TO, INVALIDATE, OR LIMIT REPRESENTATIONS AND WARRANTIES MADE BY THE MEMBERS AND THEIR
        RESPECTIVE AFFILIATES TO THE CORPORATION AND OTHER MEMBERS IN CERTAIN WRITTEN POLICIES OF
        THE CORPORATION.</para>
    </legalnotice>
    <revhistory>
      <revision>
        <revnumber>2.1</revnumber>
        <date>Jul-2011</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <revremark>Separated non Core services. Change Request 52, 56, 57, 58, 61, 64, 69, 88, 154,
          200, 224, 235, 243, 244, 245, 246, 248, 253</revremark>
      </revision>
      <revision>
        <revnumber>2.1.1</revnumber>
        <date>Jan-2012</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <revremark>Change Request 242, 263, 280, 286, 329, 335, 362, 433, 501, 512, 535, 536, 540,
          555 - 562, 564, 569, 581, 587</revremark>
      </revision>
      <revision>
        <revnumber>2.2</revnumber>
        <date>April-2012</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <revremark>Add Device and Service Monitoring Events. Change Request 620</revremark>
      </revision>
      <revision>
        <revnumber>2.2.1</revnumber>
        <date>Dec-2012</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Change Request 693, 707, 746, 751, 783, 785, 798, 824, 854, 843, 860, 720, 756,
          874</revremark>
      </revision>
      <revision>
        <revnumber>2.3</revnumber>
        <date>May-2013</date>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Event service extension (Seek, Persistent notification storage) Change Request
          898, 693, 844, 793, 928, 859, 876, 887, 950, 989, 1025, 1032, 873</revremark>
      </revision>
      <revision>
        <revnumber>2.4</revnumber>
        <date>Aug-2013</date>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Change Request 1055, 1056, 1057, 1089, 1143</revremark>
      </revision>
      <revision>
        <revnumber>2.4.1</revnumber>
        <date>Dec-2013</date>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Change Request 1185, 1213, 1216</revremark>
      </revision>
      <revision>
        <revnumber>2.4.2</revnumber>
        <date>May-2014</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Change Request 1325, 1238, 1244, 1409, 1290,1300, 1303, 1241, 1308, 1309, 1359,
          1372, 1375, 1374, 1299, 1301, 1302, 1371, 1373</revremark>
      </revision>
      <revision>
        <revnumber>2.5</revnumber>
        <date>Jul-2014</date>
        <author>
          <personname>Hasan Timucin Ozdemir</personname>
        </author>
        <revremark>Added 4.5.8 Storage configuration Added 8.7 Storage Configuration (includes
          additional configuration interface operations) Added Table 98: Device service specific
          fault codes (additional fault codes due to new storage configuration interfaces) Added
          8.8.7 Asynchronous Operation Status (an event for reporting the progress of an
          asynchronous operation to the monitoring clients) Added optional FileProgressStatus
          element to event description Added StorageConfiguration capability in
          GetServiceCapabilities Change Request 1502, 1430, 1467, 1471, 1478, 1482, 1483, 1488,
          1490, 1491, 1515, 1539 Change Request 1502, 1430, 1467, 1471, 1478, 1482, 1483, 1488,
          1490, 1491, 1515, 1539</revremark>
      </revision>
      <revision>
        <revnumber>2.6</revnumber>
        <date>Jun-2015</date>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Change Request 1581, 1582, 1585, 1586, 1587, 1588, 1662, 1661, 1663,
          1666</revremark>
      </revision>
      <revision>
        <revnumber>2.6.1</revnumber>
        <date>Dec-2015</date>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 1672, 1677, 1721, 1729</revremark>
      </revision>
      <revision>
        <revnumber>16.06</revnumber>
        <date>Jun-2016</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 1743, 1760, 1761, 1762, 1773, 1782, 1841, 1842</revremark>
      </revision>
      <revision>
        <revnumber>16.12</revnumber>
        <date>Dec-2016</date>
        <author>
          <personname>Ottavio Campana</personname>
        </author>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Added Geo Location in , - Change Request 1641, 1777, 1876, 1883, 1952</revremark>
      </revision>
      <revision>
        <revnumber>17.06</revnumber>
        <date>Jun-2017</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <author>
          <personname>Enrico Campana</personname>
        </author>
        <revremark>Change Request 2025, 2026, 2033, 2056, 2065, 2102, 2108, 2142 Add GeoLocation
          event</revremark>
      </revision>
      <revision>
        <revnumber>17.12</revnumber>
        <date>Dec-2017</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 2024</revremark>
      </revision>
      <revision>
        <revnumber>18.06</revnumber>
        <date>Jun-2018</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 2205, 2226, 2237, 2251, 2267, 2312</revremark>
      </revision>
      <revision>
        <revnumber>18.12</revnumber>
        <date>Dec-2018</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 2382</revremark>
      </revision>
      <revision>
        <revnumber>19.06</revnumber>
        <date>Jun-2019</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 2453</revremark>
      </revision>
      <revision>
        <revnumber>19.12</revnumber>
        <date>Dec-2019</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change Request 2581, 2629</revremark>
      </revision>
      <revision>
        <revnumber>20.06</revnumber>
        <date>Jun-2020</date>
        <author>
          <personname>Michio Hirai</personname>
        </author>
        <revremark>Change Request 2558</revremark>
      </revision>
      <revision>
        <revnumber>20.06</revnumber>
        <date>Jun-2020</date>
        <author>
          <personname>Fredrik Svensson</personname>
        </author>
        <revremark>Add section on Event Broker</revremark>
      </revision>
      <revision>
        <revnumber>20.12</revnumber>
        <date>Dec-2020</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <revremark>Update layout and consolidate framework section. Add options for network
          configuration and user management support.</revremark>
      </revision>
      <revision>
        <revnumber>21.06</revnumber>
        <date>Jun-2021</date>
        <author>
          <personname>Hans Busch</personname>
        </author>
        <revremark>Add various capabilities. Update MQTT ABNF definition.</revremark>
      </revision>
      <revision>
        <revnumber>21.12</revnumber>
        <date>Dec-2021</date>
        <author>
          <personname>Davide Cristanelli</personname>
        </author>
        <revremark>Add security policy configuration APIs.</revremark>
      </revision>
      <revision>
        <revnumber>22.06</revnumber>
        <date>Jun-2022</date>
        <author>
          <personname>Fredrik Svensson, Michael Adam, Sergey Bogdanov, Sriram Bhetanabottla</personname>
        </author>
        <revremark>Restructure MQTT topic and payload sections. Include metadata filter. Add Addon capability. Rename sections to show real name of service command.</revremark>
      </revision>
      <revision>
        <revnumber>22.12</revnumber>
        <date>Dec-2022</date>
        <author>
          <personname>Venkateswara Rao, Hans Busch</personname>
        </author>
        <revremark>HTTP Digest Authentication - SHA 256 support as per [RFC 7616]. Clarify behavior in case no hostname has been assigned. Unify analytics and core attribute and value handling.</revremark>
      </revision>
      <revision>
        <revnumber>23.06</revnumber>
        <date>Jun-2023</date>
        <author>
          <personname>Felix Schuetz</personname>
        </author>
        <revremark>Extend storage configuration for object store.</revremark>
      </revision>
      <revision>
        <revnumber>23.12</revnumber>
        <date>Dec-2023</date>
        <author>
          <personname>Ottavio Campana, Fredrik Svensson</personname>
        </author>
        <revremark>Add support for JSON Web Tokens</revremark>
      </revision>
      <revision>
        <revnumber>24.12</revnumber>
        <date>Dec-2024</date>
        <author>
          <personname>Sriram Bhetanabottla</personname>
        </author>
        <revremark>Improve description of certificate verification policy and correct specification references.</revremark>
      </revision>
      <revision>
        <revnumber>25.06</revnumber>
        <date>Jun-2025</date>
        <author>
          <personname>Jean-François Lévesque, Sriram Bhetanabottla, Jose Melancon</personname>
        </author>
        <revremark>Add storage configuration renewal. Remove deprecated mirror url. Remove renew in pullpoint subscription.</revremark>
      </revision>
      <revision>
        <revnumber>25.12</revnumber>
        <date>Dec-2025</date>
        <author>
          <personname>Ottavio Campana, Tomasz Zajac</personname>
        </author>
        <revremark>Add support for user roles and cloud firmware upgrade. Fix mapping of namespaces
          in MQTT topics.</revremark>
      </revision>
    </revhistory>
  </info>
  <preface>
    <title>Contributors</title>
    <para>Version 1</para>
    <informaltable>
      <tgroup cols="4">
        <colspec colname="c1" colwidth="25*"/>
        <colspec colname="c2" colwidth="25*"/>
        <colspec colname="newCol3" colwidth="25*"/>
        <colspec colname="newCol4" colwidth="25*"/>
        <tbody valign="top">
          <row>
            <entry>Christian Gehrmann (Ed.)></entry>
            <entry>Axis Communications AB</entry>
            <entry>Alexander Neubeck</entry>
            <entry>Bosch Security Systems</entry>
          </row>
          <row>
            <entry>Mikael Ranbro</entry>
            <entry>Axis Communications AB</entry>
            <entry>Susanne Kinza</entry>
            <entry>Bosch Security Systems</entry>
          </row>
          <row>
            <entry>Johan Nyström</entry>
            <entry>Axis Communications AB</entry>
            <entry>Markus Wierny</entry>
            <entry>Bosch Security Systems</entry>
          </row>
          <row>
            <entry>Ulf Olsson</entry>
            <entry>Axis Communications AB</entry>
            <entry>Rainer Bauereiss</entry>
            <entry>Bosch Security Systems</entry>
          </row>
          <row>
            <entry>Göran Haraldsson</entry>
            <entry>Axis Communications AB</entry>
            <entry>Masashi Tonomura</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Daniel Elvin</entry>
            <entry>Axis Communications AB</entry>
            <entry>Norio Ishibashi</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Hans Olsen</entry>
            <entry>Axis Communications AB</entry>
            <entry>Yoichi Kasahara</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Martin Rasmusson</entry>
            <entry>Axis Communications AB</entry>
            <entry>Yoshiyuki Kunito</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Stefan Andersson (co Ed.)</entry>
            <entry>Axis Communications AB</entry>
            <entry/>
            <entry/>
          </row>
        </tbody>
      </tgroup>
    </informaltable>
    <para>Version 2</para>
    <informaltable>
      <tgroup cols="4">
        <colspec colname="c1" colwidth="25*"/>
        <colspec colname="c2" colwidth="25*"/>
        <colspec colname="newCol3" colwidth="25*"/>
        <colspec colname="newCol4" colwidth="25*"/>
        <tbody valign="top">
          <row>
            <entry>Stefan Andersson</entry>
            <entry>Axis Communications AB</entry>
            <entry> Toshihiro Shimizu  </entry>
            <entry>Panasonic</entry>
          </row>
          <row>
            <entry>Christian Gehrmann</entry>
            <entry>Axis Communications AB</entry>
            <entry> Manabu Nakamura </entry>
            <entry>Panasonic</entry>
          </row>
          <row>
            <entry>Willy Sagefalk</entry>
            <entry>Axis Communications AB</entry>
            <entry>Hasan Timucin Ozdemir</entry>
            <entry>Panasonic</entry>
          </row>
          <row>
            <entry>Mikael Ranbro</entry>
            <entry>Axis Communications AB</entry>
            <entry>Hiroaki Ootake</entry>
            <entry>Panasonic</entry>
          </row>
          <row>
            <entry>Ted Hartzell</entry>
            <entry>Axis Communications AB</entry>
            <entry>Young Hoon </entry>
            <entry>ITX</entry>
          </row>
          <row>
            <entry>Rainer Bauereiss</entry>
            <entry>Bosch Security Systems</entry>
            <entry>Sekrai Hong</entry>
            <entry>Samsung</entry>
          </row>
          <row>
            <entry>Hans Busch (Ed.)</entry>
            <entry>Bosch Security Systems</entry>
            <entry>Gero Bäse</entry>
            <entry>Siemens</entry>
          </row>
          <row>
            <entry>Susanne Kinza (co Ed.)</entry>
            <entry>Bosch Security Systems</entry>
            <entry>Michio Hirai</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Dieu Thanh Nguyen</entry>
            <entry>Bosch Security Systems</entry>
            <entry>Akihiro Hokimoto</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Antonie van Woerdekom</entry>
            <entry>Bosch Security Systems</entry>
            <entry>Masashi Tonomura</entry>
            <entry>Sony Corporation</entry>
          </row>
          <row>
            <entry>Shinichi Hatae</entry>
            <entry>Canon Inc</entry>
            <entry/>
            <entry/>
          </row>
          <row>
            <entry>Takahiro Iwasaki</entry>
            <entry>Canon Inc</entry>
            <entry/>
            <entry/>
          </row>
          <row>
            <entry>Takeshi Asahi</entry>
            <entry>Hitachi Ltd</entry>
            <entry/>
            <entry/>
          </row>
          <row>
            <entry>Colin Caughie</entry>
            <entry>IndigoVision Ltd</entry>
            <entry/>
            <entry/>
          </row>
          <row>
            <entry>Heather Logan</entry>
            <entry>IndigoVision Ltd</entry>
            <entry/>
            <entry/>
          </row>
        </tbody>
      </tgroup>
    </informaltable>
  </preface>
  <preface>
    <title>INTRODUCTION</title>
    <para>The goal of this specification is to provide the common base for a fully interoperable
      network implementation comprised of products from different network vendors. This standard
      describes the network model, software interfaces, software data types and data exchange
      patterns. The standard reuses existing relevant standards where available, and introduces new
      specifications only where necessary.</para>
    <para>This is the ONVIF core specification. It is accompanied by a set of computer readable interface definitions:</para>
    <itemizedlist>
      <listitem>
        <para>ONVIF Schema [ONVIF Schema]</para>
      </listitem>
      <listitem>
        <para>ONVIF Device Service WSDL [ONVIF DM WSDL]</para>
      </listitem>
      <listitem>
        <para>ONVIF Event Service WSDL [ONVIF Event WSDL]</para>
      </listitem>
      <listitem>
        <para>ONVIF Topic Namespace XML [ONVIF Topic Namespace]</para>
      </listitem>
    </itemizedlist>
    <para>The purpose of this document is to define the ONVIF specification framework, and is divided into the following sections: </para>
    <para>Specification Overview: Gives an overview of the different specification parts and how they are related to each other.</para>
    <para>Web Services Frame Work: Offers a brief introduction to Web Services and the Web Services basis for the ONVIF specifications.</para>
    <para>IP Configuration: Defines the ONVIF network IP configuration requirements.</para>
    <para>Device Discovery: Describes how devices are discovered in local and remote networks.</para>
    <para>Device Management: Defines the configuration of basics like network and security related settings.</para>
    <para>Event Handling: Defines how to subscribe to and receive notifications (events) from a device.</para>
    <para>Security Section: Defines the message level security requirements on ONVIF compliant implementations.</para>
  </preface>
  <chapter>
    <title>Scope</title>
    <para>This specification defines procedures for communication between network clients and devices. This new set of specifications makes it possible to build e.g. network video systems with devices and receivers from different manufacturers using common and well defined interfaces. The functions defined in this specification covers discovery, device management and event framework. </para>
    <para>Supplementary dedicated services as e.g. media configuration, real-time streaming of audio and video, Pan, Tilt and Zoom (PTZ) control, video analytics as well as control, search and replay of recordings are defined in separate documents. </para>
    <para>The management and control interfaces defined in this standard are described as Web Services. This standard also contains full XML schema and Web Service Description Language (WSDL) definitions. </para>
    <para>In order to offer full plug-and-play interoperability, the standard defines procedures for device discovery. The device discovery mechanisms in the standard are based on the WS-Discovery specification with extensions. </para>
  </chapter>
  <chapter>
    <title>Normative references</title>
    <para>IEEE 1003.1, The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://pubs.opengroup.org/onlinepubs/009695399/"></link>&gt;</para>
    <para>RFC 2131, Dynamic Host Configuration Protocol</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2131.txt"></link>&gt;</para>
    <para>RFC 2136, Dynamic Updates in the Domain Name System (DNS UPDATE)</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2136.txt"></link>&gt;</para>
    <para>RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2616.txt"></link>&gt;</para>
    <para>RFC 2617, HTTP Authentication: Basic and Digest Access Authentication</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2617.txt"></link>&gt;</para>
    <para>RFC 7616, HTTP Digest Access Authentication</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc7616.txt"></link>&gt;</para>
    <para>RFC 3315, Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc3315.txt"></link>&gt;</para>
    <para>RFC 3548, The Base16, Base32, and Base64 Data Encodings</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc3548.txt"></link>&gt;</para>
    <para>RFC 3927, Dynamic Configuration of IPv4 Link-Local Addresses</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc3927.txt"></link>&gt;</para>
    <para>RFC 3986, Uniform Resource Identifier (URI): Generic Syntax</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc3986.txt"></link>&gt;</para>
    <para>RFC 4122, A Universally Unique IDentifier (UUID) URN Namespace</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc4122.txt"></link>&gt;</para>
    <para>RFC 4702, The Dynamic Host Configuration Protocol (DHCP) Client Fully Qualified Domain Name (FQDN) Option</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc4702.txt"></link>&gt;</para>
    <para>RFC 4861, Neighbor Discovery for IP version 6 (IPv6)</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc4861.txt"></link>&gt;</para>
    <para>RFC 4862, IPv6 Stateless Address Auto configuration</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc4862.txt"></link>&gt;</para>
    <para>RFC 6750,  The OAuth 2.0 Authorization Framework: Bearer Token Usage</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc6750.txt"/>&gt;</para>
    <para>RFC 7519, JSON Web Token (JWT)</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc7519.txt"/>&gt;</para>
    <para>W3C SOAP Message Transmission Optimization Mechanism,</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/soap12-mtom/"></link>&gt;</para>
    <para>W3C SOAP 1.2, Part 1, <emphasis>Messaging Framework</emphasis></para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/soap12-part1/"/>&gt;</para>
    <para>W3C SOAP Version 1.2 Part 2: Adjuncts (Second Edition)</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/2007/REC-soap12-part2-20070427/"></link>&gt;</para>
    <para>W3C Web Services Addressing 1.0 – Core</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/ws-addr-core/"/>&gt;</para>
    <para>WS-I  Basic Profile Version 2.0</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ws-i.org/Profiles/BasicProfile-2.0-2010-11-09.html"/>&gt;</para>
    <para>OASIS Web Services Base Notification 1.3</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docs.oasis-open.org/wsn/wsn-ws_base_notification-1.3-spec-os.pdf"></link>&gt;</para>
    <para>XMLSOAP, Web Services Dynamic Discovery (WS-Discovery)”, J. Beatty et al., April 2005.</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf"></link>&gt;</para>
        <para>OASIS Web Services Security: SOAP Message Security 1.1 (WS-Security 2004)</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.oasis-open.org/committees/download.php/16790/wss-v1.1-spec-os-SOAPMessageSecurity.pdf"></link>&gt;</para>
    <para>OASIS Web Services Topics 1.3</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docs.oasis-open.org/wsn/wsn-ws_topics-1.3-spec-os.pdf"></link>&gt;</para>
    <para>OASIS Web Services Security UsernameToken Profile 1.0</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf"></link>&gt;</para>
    <para>W3C Web Services Description Language (WSDL) 1.1</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/wsdl"></link>&gt;</para>
    <para>W3C XML Schema Definition Language (XSD) 1.1 Part 1: Structures</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/xmlschema11-1/"></link>&gt;</para>
    <para>W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/xmlschema11-2/"></link>&gt;</para>
    <para>W3C XML-binary Optimized Packaging</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/2005/REC-xop10-20050125/"></link>&gt;</para>
    <para>W3C XML Path Language (XPath) Version 1.0</para>
    <para role="reference">&lt;​<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.w3.org/TR/1999/REC-xpath-19991116"></link>&gt;</para>
    <para>IEEE 802.11, Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://standards.ieee.org/getieee802/download/802.11-2007.pdf"></link>&gt;</para>
    <para>WGS1984, National Geospatial Intelligence Agency: DoD World Geodetic System 1984  </para>
    <para role="reference">&lt; <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://earth-info.nga.mil/GandG/publications/tr8350.2/tr8350_2.html"></link>&gt;</para>
    <para>JSON-LD 1.1 A JSON-based Serialization for Linked Data</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://json-ld.org/spec/latest/json-ld/"></link>&gt;</para>
  </chapter>
  <chapter>
    <title>Terms and Definitions</title>
    <section>
      <title>Definitions</title>
      <informaltable>
        <tgroup cols="2">
          <colspec colname="c1" colwidth="24*" />
          <colspec colname="c2" colwidth="76*" />
          <tbody valign="top">
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">Ad-hoc network</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>A set of IEEE802.11 stations that have successfully joined in a common network, see [IEEE 802.11-2007].</para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">Basic Service Set</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>Often used as a vernacular term for an independent basic service set, as defined in [IEEE 802.11-2007].</para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">Capability</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>The capability commands allows a client to ask for the services provided by a device.</para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">GPS</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>Global Positioning System</para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">PullPoint</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>Resource for pulling messages. By pulling messages, notifications are not blocked by firewalls. </para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">Service Set ID</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>The identity of an [IEEE 802.11-2007] wireless network.</para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">WGS</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>World Geodetic System 1984, the coordinate system used by the global positioning system.</para>
              </entry>
            </row>
            <row>
              <entry align="left">
                <para>
                  <emphasis role="bold">Wi-Fi Protected Access</emphasis>
                </para>
              </entry>
              <entry align="left">
                <para>A certification program created by the Wi-Fi Alliance to indicate compliance with the security protocol covered by the program.</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </informaltable>
    </section>
    <section>
      <title>Abbreviations</title>
      <informaltable>
        <tgroup cols="2">
          <colspec colname="c1" colwidth="24*" />
          <colspec colname="c2" colwidth="76*" />
          <tbody valign="top">
            <row>
              <entry valign="middle">
                <para>API</para>
              </entry>
              <entry valign="middle">
                <para>Application Programming Interface</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>ASCII</para>
              </entry>
              <entry valign="middle">
                <para>American Standard Code for Information Interchange</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>ASN</para>
              </entry>
              <entry valign="middle">
                <para>Abstract Syntax Notation</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>BSSID</para>
              </entry>
              <entry valign="middle">
                <para>Basic Service Set Identification</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>CDMI</para>
              </entry>
              <entry valign="middle">
                <para>Cloud Data Management Interface</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>CCMP</para>
              </entry>
              <entry valign="middle">
                <para>Counter mode with Cipher-block chaining Message authentication code Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>DAS</para>
              </entry>
              <entry valign="middle">
                <para>Direct Attached Storage</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>DER</para>
              </entry>
              <entry valign="middle">
                <para>Distinguished Encoding Rules</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>DHCP</para>
              </entry>
              <entry valign="middle">
                <para>Dynamic Host Configuration Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>DM</para>
              </entry>
              <entry valign="middle">
                <para>Device Management</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>DNS</para>
              </entry>
              <entry valign="middle">
                <para>Domain Name Server</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>FIPS</para>
              </entry>
              <entry valign="middle">
                <para>Federal Information Processing Standard</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>GW</para>
              </entry>
              <entry valign="middle">
                <para>Gateway</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>HTTP</para>
              </entry>
              <entry valign="middle">
                <para>Hypertext Transfer Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>HTTPS</para>
              </entry>
              <entry valign="middle">
                <para>Hypertext Transfer Protocol over Secure Socket Layer</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>IO, I/O</para>
              </entry>
              <entry valign="middle">
                <para>Input/Output</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>IP</para>
              </entry>
              <entry valign="middle">
                <para>Internet Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>IPv4</para>
              </entry>
              <entry valign="middle">
                <para>Internet Protocol Version 4</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>IPv6</para>
              </entry>
              <entry valign="middle">
                <para>Internet Protocol Version 6</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">JWT</entry>
              <entry valign="middle">JSON Web Token</entry>
            </row>
            <row>
              <entry valign="middle">
                <para>LAN</para>
              </entry>
              <entry valign="middle">
                <para>Local Area Network</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>MCS</para>
              </entry>
              <entry valign="middle">
                <para>Manufacturer Cloud Service</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>MTOM</para>
              </entry>
              <entry valign="middle">
                <para>Message Transmission Optimization Mechanism</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>NAS</para>
              </entry>
              <entry valign="middle">
                <para>Network Attached Storage</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>NAT</para>
              </entry>
              <entry valign="middle">
                <para>Network Address Translation</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>NFC</para>
              </entry>
              <entry valign="middle">
                <para>Near Field Communication</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>NTP</para>
              </entry>
              <entry valign="middle">
                <para>Network Time Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>OASIS</para>
              </entry>
              <entry valign="middle">
                <para>Organization for the Advancement of Structured Information Standards</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">OCS</entry>
              <entry valign="middle">Operational Cloud Service</entry>
            </row>
            <row>
              <entry valign="middle">
                <para>POSIX</para>
              </entry>
              <entry valign="middle">
                <para>Portable Operating System Interface</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>PTZ</para>
              </entry>
              <entry valign="middle">
                <para>Pan/Tilt/Zoom</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>REL</para>
              </entry>
              <entry valign="middle">
                <para>Rights Expression Language</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>RSA</para>
              </entry>
              <entry valign="middle">
                <para>Rivest ,Sharmir and Adleman</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>SAML</para>
              </entry>
              <entry valign="middle">
                <para>Security Assertion Markup Language </para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>SOAP</para>
              </entry>
              <entry valign="middle">
                <para>Simple Object Access Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>SSID</para>
              </entry>
              <entry valign="middle">
                <para>Service Set ID</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>TCP</para>
              </entry>
              <entry valign="middle">
                <para>Transmission Control Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>TLS</para>
              </entry>
              <entry valign="middle">
                <para>Transport Layer Security</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>TKIP</para>
              </entry>
              <entry valign="middle">
                <para>Temporal Key Integrity Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>TTL</para>
              </entry>
              <entry valign="middle">
                <para>Time To Live</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>UDDI</para>
              </entry>
              <entry valign="middle">
                <para>Universal Description, Discovery and  Integration</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>UDP</para>
              </entry>
              <entry valign="middle">
                <para>User Datagram Protocol</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>URI</para>
              </entry>
              <entry valign="middle">
                <para>Uniform Resource Identifier</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>URN</para>
              </entry>
              <entry valign="middle">
                <para>Uniform Resource Name</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>USB</para>
              </entry>
              <entry valign="middle">
                <para>Universal Serial Bus</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>UTC</para>
              </entry>
              <entry valign="middle">
                <para>Coordinated Universal Time</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>UTF</para>
              </entry>
              <entry valign="middle">
                <para>Unicode Transformation Format</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>UUID</para>
              </entry>
              <entry valign="middle">
                <para>Universally Unique Identifier </para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>WDR</para>
              </entry>
              <entry valign="middle">
                <para>Wide Dynamic Range</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>WPA</para>
              </entry>
              <entry valign="middle">
                <para>Wi-Fi Protected Access</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>WS</para>
              </entry>
              <entry valign="middle">
                <para>Web Services</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>WSDL</para>
              </entry>
              <entry valign="middle">
                <para>Web Services Description Language</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>WS-I</para>
              </entry>
              <entry valign="middle">
                <para>Web Services Interoperability</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>XML</para>
              </entry>
              <entry valign="middle">
                <para>eXtensible Markup Language</para>
              </entry>
            </row>
            <row>
              <entry valign="middle">
                <para>XPath</para>
              </entry>
              <entry valign="middle">
                <para>XML Path Language</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </informaltable>
    </section>
  </chapter>
  <chapter xml:id="_Toc241999839">
    <title>Overview</title>
    <para>This specification originated from network video use cases covering both local and wide area network scenarios and has been extended to cover generic IP device use cases. The specification defines a core set of interface functions for configuration and operation of network devices by defining their server side interfaces. </para>
    <para>This standard covers device discovery, device configuration as well as an event framework.</para>
    <para>All services share a common XML schema and all data types are provided in [ONVIF Schema].  The different services are defined in the respective sections and service WSDL documents.</para>
    <section>
      <title>Web Services </title>
      <para>The term Web Services is the name of a standardized method of integrating applications using open, platform independent Web Services standards such as XML, SOAP 1.2 [Part 1] 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. </para>
      <para>This framework is built upon Web Services standards. All configuration services defined in the standard are expressed as Web Services operations and defined in WSDL with HTTP as the underlying transport mechanism.</para>
      <figure xml:id="_Ref211940201">
        <title>Web Services based development principles</title>
        <mediaobject>
          <imageobject>
            <imagedata fileref="media/Core/image2.jpeg" contentwidth="165.79mm" />
          </imageobject>
        </mediaobject>
      </figure>
      <para>
        <xref linkend="_Ref211940201" /> gives an overview of the basic principles for development based on Web Services. The service provider (device) implements the ONVIF service or services. The service is described using the XML-based WSDL. Then, the WSDL is used as the basis for the service requester (client) implementation/integration. Client-side integration is simplified through the use of WSDL compiler tools that generate platform specific code that can be used by the client side developer to integrate the Web Service into an application.</para>
      <para>The Web Service provider and requester communicate using the SOAP message exchange protocol. SOAP is a lightweight, XML-based messaging protocol used to encode the information in a Web Service request and in a response message before sending them over a network. SOAP messages are independent of any operating system or protocol and may be transported using a variety of Internet protocols. This ONVIF standard defines conformant transport protocols for the SOAP messages for the described Web Services.</para>
      <para>The Web Service overview section introduces into the general ONVIF service structure, the command definition syntax in the specification, error handling principles and the adopted Web Service security mechanisms.  </para>
      <para>To ensure interoperability, all ONVIF services follow the Web Services Interoperability Organization (WS-I) basic profile 2.0 recommendations and use the document/literal wrapped pattern.</para>
    </section>
    <section>
      <title>IP configuration</title>
      <para>The IP configuration section defines the IP configuration compliance requirements and recommendations. IP configuration includes:</para>
      <itemizedlist>
        <listitem>
          <para>IP network communication capability</para>
        </listitem>
        <listitem>
          <para>Static IP configuration</para>
        </listitem>
        <listitem>
          <para>Dynamic IP configuration</para>
        </listitem>
      </itemizedlist>
    </section>
    <section>
      <title>Device discovery</title>
      <para>The configuration interfaces defined in this standard are Web Services interfaces that are based on the WS-Discovery standard. This use of this standard makes it possible to reuse a suitable existing Web Service discovery framework, instead of requiring a completely new service or service addressing definition. </para>
      <para>This standard introduces a specific discovery behaviour suitable for e.g. video surveillance purposes. For example, a fully interoperable discovery requires a well defined service definition and a service searching criteria. The specification covers device type and scopes definitions in order to achieve this. </para>
      <para>A successful discovery provides the device service address. Once a client has the device service address it can receive detailed device information through the device service, see section  <xref linkend="_Toc251333295" /> below.</para>
    </section>
    <section>
      <title>Profiles and Addons</title>
      <para>Device functionality can be grouped to so called profiles and addons. Profiles and addons themselves are defined in separate specifications.  Addons complement profiles, and you must declare support for one or more profiles to use an addon.</para>
      <para>For each profile or addon, a number of services and functions are mandatory which are defined in the respective specifications.</para>
    </section>
    <section xml:id="_Toc251333295">
      <title>Device management</title>
      <para>Device management functions are handled through the device service. The device service is the entry point to all other services provided by a device. WSDL for the device service is provided in in the Device Management WSDL file. The device management interfaces consist of these subcategories:</para>
      <itemizedlist>
        <listitem>
          <para>Capabilities</para>
        </listitem>
        <listitem>
          <para>Network</para>
        </listitem>
        <listitem>
          <para>System</para>
        </listitem>
        <listitem>
          <para>Security</para>
        </listitem>
      </itemizedlist>
      <section>
        <title>Capabilities</title>
        <para>The capability commands allow a client to ask for the services provided by a device and to determine which general and vendor specific services are offered by the device. The capabilities are structured per service. This document defines the capability exchange for the device and the event service. For the other services refer to the respective service specification:</para>
        <itemizedlist>
          <listitem>
            <para>Device</para>
            <itemizedlist>
              <listitem>
                <para>Network</para>
              </listitem>
              <listitem>
                <para>System</para>
              </listitem>
              <listitem>
                <para>Security</para>
              </listitem>
            </itemizedlist>
          </listitem>
          <listitem>
            <para>Event</para>
          </listitem>
        </itemizedlist>
        <para>The capabilities for the different categories indicate those commands and parameter settings that are available for the particular service or service subcategory.</para>
      </section>
      <section>
        <title>Network</title>
        <para>The following set of network commands allows standardized management of functions:</para>
        <itemizedlist>
          <listitem>
            <para>Get and set hostname.</para>
          </listitem>
          <listitem>
            <para>Get and set DNS configurations.</para>
          </listitem>
          <listitem>
            <para>Get and set NTP configurations.</para>
          </listitem>
          <listitem>
            <para>Get and set dynamic DNS.</para>
          </listitem>
          <listitem>
            <para>Get and set network interface configurations.</para>
          </listitem>
          <listitem>
            <para>Enable/disable and list network protocols.</para>
          </listitem>
          <listitem>
            <para>Get and set default gateway.</para>
          </listitem>
          <listitem>
            <para>Get and set zero configuration.</para>
          </listitem>
          <listitem>
            <para>Get, set, add and delete IP address filter.</para>
          </listitem>
          <listitem>
            <para>Wireless network interface configuration</para>
          </listitem>
        </itemizedlist>
      </section>
      <section>
        <title>System</title>
        <para>The system commands are used to manage the following device system settings:</para>
        <itemizedlist>
          <listitem>
            <para>Get device information.</para>
          </listitem>
          <listitem>
            <para>Make system backups.</para>
          </listitem>
          <listitem>
            <para>Get and set system date and time.</para>
          </listitem>
          <listitem>
            <para>Factory default reset.</para>
          </listitem>
          <listitem>
            <para>Upgrade firmware.</para>
          </listitem>
          <listitem>
            <para>Get system log.</para>
          </listitem>
          <listitem>
            <para>Get device diagnostics data (support information).</para>
          </listitem>
          <listitem>
            <para>Reboot.</para>
          </listitem>
          <listitem>
            <para>Get and set device discovery parameters.</para>
          </listitem>
          <listitem>
            <para>Get supported addons.</para>
          </listitem>
        </itemizedlist>
      </section>
      <section>
        <title>Retrieval of System Information</title>
        <para>System Information, such as system logs, vendor-specific support information and configuration backup images, may be retrieved using either MTOM or HTTP.</para>
        <para>The MTOM method is supported by the GetSystemLog, GetSystemSupportInformation and GetSystemBackup commands. The HTTP method is supported by the GetSystemUris command; this retrieves URIs from which the files may be downloaded using an HTTP GET operation.</para>
      </section>
      <section>
        <title>Firmware Upgrade</title>
        <para>Two mechanisms are provided for upgrading the firmware on a device. The first is a two
          stage process; first the client sends the StartFirmwareUpgrade command to instruct the
          device to prepare for upgrade, then it sends the firmware image using HTTP POST.</para>
        <para>The HTTP method is designed for resource-limited devices that may not be capable of receiving a new firmware image in its normal operating state.</para>
        <para>The second method applies to cloud connected devices and involves an interaction
          between the Operational Cloud Service (OCS), the Manufacturer Cloud Service (MCS) and the
          device, in order to trigger the firmware upgrade. For the complete description of the
          roles of the cloud clients, please refer to the Cloud Integration Specification.</para>
      </section>
      <section>
        <title>System Restore</title>
        <para>The System Restore capability allows a device’s configuration to be restored from a backup image. Again two mechanisms are provided. The first uses the RestoreSystem command to send the backup image using MTOM. The second uses the StartSystemRestore command followed by an HTTP POST operation to send the backup image.</para>
      </section>
      <section>
        <title>Security</title>
        <para>The following security operations are used to manage the device security configurations:</para>
        <itemizedlist>
          <listitem>
            <para>Get and set access security policy.</para>
          </listitem>
          <listitem>
            <para>Handle user credentials and settings.</para>
          </listitem>
        </itemizedlist>
        <para>For further security related aspects refer to the ONVIF Security Service Specification.</para>
      </section>
      <section>
        <title>Storage configuration</title>
        <para>Storage configuration data contains the configuration data related to storage (DAS, NAS, CDMI). For example, CDMI client configuration data contains the server address and user credential information for a CDMI server. An ONVIF Device can connect to CDMI Server via standard CDMI protocol, for example, to store and read device configuration data, archive alarm video, export video, etc. operations.  </para>
      </section>
    </section>
    <section>
      <title>Event handling</title>
      <para>Event handling is based on the OASIS WS-BaseNotification and WS-Topics specifications. These specifications allow the reuse of a rich notification framework without the need to redefine event handling principles, basic formats and communication patterns.</para>
      <para>Firewall traversal, according to WS-BaseNotification, is handled through a <emphasis>PullPoint </emphasis>notification pattern. This pattern, however, does not allow real-time notification. Hence, this specification defines an alternative <emphasis>PullPoint</emphasis> communication pattern and service interface. The <emphasis>PullPoint</emphasis> pattern allows a client residing behind a firewall to receive real-time notifications while utilizing the WS-BaseNotification framework.</para>
      <para>A fully standardized event requires standardized notifications. However, the notification topics will, to a large extent, depend on the application needs. This specification defines a set of basic notification topics.</para>
      <para>WSDL for the event service including extensions is provided in the Event WSDL file. </para>
    </section>
    <section>
      <title>Geo Location</title>
      <para>Interface to describes the location of the device and its entities. A two level approach allows to model both outdoor and indoor situations. See <xref linkend="_Ref443461147" /> for the orientation of the axis. The position on earth is defined via the angles lon and lat in degrees as well as the hight in meter.The model is coined ENU for (East, North, Up). The mapping of the coordinate system is defined by [WGS1984] and the base for GPS.</para>
      <figure xml:id="_Ref443461147">
        <title>Location on earth<footnote xml:id="__FN1__"><para>Source: https://en.wikipedia.org/wiki/Axes_conventions.</para></footnote></title>
        <mediaobject>
          <imageobject>
            <imagedata fileref="media/Core/image3.png" contentwidth="70.60mm" />
          </imageobject>
        </mediaobject>
      </figure>
      <para>The range for longitude is between -180 and +180 degrees, while the range for the latitude is between -90 and +90 degrees. The range for elevation is un unbounded signed value, to deal not only with points above the sea level, but also under the world ellipsoid, such as points under water or points in depressions.</para>
      <para>
        <xref linkend="_Ref443461630" /> describes the three orientation angles called roll, pitch and yaw.</para>
      <figure xml:id="_Ref443461630">
        <title>Orientation on earth surface<footnote xml:id="__FN2__"><para>Source: By Qniemiec, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=10893168</para></footnote></title>
        <mediaobject>
          <imageobject>
            <imagedata fileref="media/Core/image4.png" contentwidth="79.59mm" />
          </imageobject>
        </mediaobject>
      </figure>
      <para>The second level is defined by a three dimensional rectangular coordinate system. The vector x,y,z describes the offset in meter and the three angles roll (ϕ), pitch (θ) and yaw (ψ) describe an additional orientation.</para>
      <para>The range for roll, pitch and yaw is between -180 and +180 degrees.</para>
      <para>Installers and implementers can utilize this approach by either defining the six geo parameters for outdoor installations or the six local parameters for indoor systems. But also a combined approach may be applied e.g. on board of ships where the geo component defines the position of the vehicle while the local component defines the offset of the devices inside the vehicle.</para>
      <para>It is worth noticing that orientation is only modified by invoking SetGeoLocation. Invoking any other function, such as for example SetHomePosition, will not alter the device orientation values.</para>
    </section>
  </chapter>
  <chapter>
    <title>Web Services framework</title>
    <para>All management and configuration commands are based on Web Services.</para>
    <para>For the purpose of this standard:</para>
    <itemizedlist>
      <listitem>
        <para>The device is a service provider.</para>
      </listitem>
      <listitem>
        <para>The client is a service requester.</para>
      </listitem>
    </itemizedlist>
    <para>A typical ONVIF network system does have multiple clients that handle device configuration and device management operations for numerous devices. Additionally a device providing services may also act as a client. </para>
    <para>Web Services also require a common way to discover service providers. This discovery is achieved using the Universal Discovery, Description and Integration Registry (UDDI) specifications [UDDI API ver2], [UDDI Data Structure ver2]. The UDDI specifications utilize service brokers for service discovery. This specification targets devices while the UDDI model is <emphasis>not </emphasis>device oriented. Consequently, UDDI and service brokers are <emphasis>outside the scope </emphasis>of this specification. </para>
    <para>According to this specification, devices (service providers) are discovered using WS-Discovery [WS-Discovery] based techniques. The service discovery principles are described in section <xref linkend="_Ref199745942" />. </para>
    <para>Web Services allow developers the freedom to define services and message exchanges, which may cause interoperability problems. The Web Services interoperability organization (WS-I) develops standard profiles and guidelines to create interoperable Web Services. The devices and the clients shall follow the guidelines in the WS-I Basic Profile 2.0 [WS-I BP 2.0], except for Requirement R2729 (ONVIF defines some shared response wrapper names) and Requirement R2801 (ONVIF references XML Schema 1.1 rather than XML Schema 1.0).</para>
    <section xml:id="_Ref204754239">
      <title>Services overview</title>
      <section>
        <title>General</title>
        <para>An ONVIF compliant device shall support a number of Web Services which are defined in this and related specifications. </para>
        <para>The device management service is the entry point for all other services of the device
          and therefore also the target service for the ONVIF defined WS-Discovery behaviour, see
          chapter <xref linkend="_Ref199745942"/> or the target for accessing device over Uplink
          connection.</para>
        <para>The entry point for the device management service is fixed to:</para>
        <programlisting><![CDATA[/onvif/device_service
]]></programlisting>
      </section>
      <section>
        <title>Services requirements</title>
        <para>An ONVIF compliant device shall provide the device management and event service.</para>
        <para>If an ONVIF compliant device supports a certain service, the device shall respond to all commands defined in the corresponding service WSDL. If the specific command is not required for that service and the device does not support the command, the device should respond to a request with the error codes:</para>
        <para>env:Receiver,</para>
        <para>ter:ActionNotSupported,</para>
        <para>see <xref linkend="_Toc208658689" /> for the definitions of the error codes.</para>
      </section>
    </section>
    <section>
      <title>WSDL overview</title>
      <para>“WSDL is an XML format for describing network services as a set of endpoints operating on messages containing either document-oriented or procedure-oriented information. The operations and messages are described abstractly, and then bound to a concrete network protocol and message format to define an endpoint. Related concrete endpoints are combined into abstract endpoints (services). WSDL is extensible to allow description of endpoints and their messages regardless of what message formats or network protocols are used to communicate” [WSDL1.1].</para>
      <para>This specification follows the WSDL 1.1 specification and uses the document/literal wrapped pattern. </para>
      <para>A WSDL document consists of the following sections:</para>
      <itemizedlist>
        <listitem>
          <para>types – Definition of data types using XML schema definitions.</para>
        </listitem>
        <listitem>
          <para>message – Definition of the content of input and output messages.</para>
        </listitem>
        <listitem>
          <para>operation – Definition of how input and output messages are associated with a logical operation.</para>
        </listitem>
        <listitem>
          <para>portType – Groups a set of operations together.</para>
        </listitem>
        <listitem>
          <para>binding – Specification of which protocols that are used for message exchange for a particular portType.</para>
        </listitem>
      </itemizedlist>
      <para>Note that neither the port and service definitions are used since the ONVIF interface is not bound to a concrete server instance.</para>
      <para>Since the release of WSDL 1.1 the underlying XML schema reference has undergone two major revisions. This specification defines that the relaxation of the Unique Particle Attribution rule of XML Schema 1.1 may be used for schema extensibility.</para>
    </section>
    <section>
      <title> Namespaces</title>
      <para>Prefix and namespaces used in this standard are listed in <xref linkend="_defNS"/>. These prefixes are not part of the standard and an implementation can use any prefix.</para>
      <table xml:id="_defNS">
        <title>Defined namespaces in this specification</title>
        <tgroup cols="3">
          <colspec colname="c1" colwidth="10*" />
          <colspec colname="c2" colwidth="50*" />
          <colspec colname="c3" colwidth="40*" />
          <thead>
            <row>
              <entry>
                <para>Prefix</para>
              </entry>
              <entry>
                <para>Namespace URI</para>
              </entry>
              <entry>
                <para>Description</para>
              </entry>
            </row>
          </thead>
          <tbody valign="top">
            <row>
              <entry>
                <para>tt</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/schema</para>
              </entry>
              <entry>
                <para>XML schema descriptions in this specification.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>tds</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/device/wsdl</para>
              </entry>
              <entry>
                <para>The namespace for the WSDL device service.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>trt</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/media/wsdl</para>
              </entry>
              <entry>
                <para>The namespace for the WSDL media service.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>tev</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/events/wsdl</para>
              </entry>
              <entry>
                <para>The namespace for the WSDL event service.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>ter</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/error</para>
              </entry>
              <entry>
                <para>The namespace for ONVIF defined faults.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>dn</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/network/wsdl</para>
              </entry>
              <entry>
                <para>The namespace used for the <emphasis>remote</emphasis> device discovery service in this specification.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>tns1</para>
              </entry>
              <entry>
                <para>http://www.onvif.org/ver10/topics</para>
              </entry>
              <entry>
                <para>The namespace for the ONVIF topic namespace</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </table>
      <para>The namespaces listed in <xref linkend="_refNS"/> are referenced by this standard.</para>
      <table xml:id="_refNS">
        <title>Referenced namespaces (with prefix)</title>
        <tgroup cols="3">
          <colspec colname="c1" colwidth="11*" />
          <colspec colname="c2" colwidth="51*" />
          <colspec colname="c3" colwidth="38*" />
          <thead>
            <row>
              <entry>
                <para>Prefix</para>
              </entry>
              <entry>
                <para>Namespace URI</para>
              </entry>
              <entry>
                <para>Description</para>
              </entry>
            </row>
          </thead>
          <tbody valign="top">
            <row>
              <entry>
                <para>wsdl</para>
              </entry>
              <entry>
                <para>http://schemas.xmlsoap.org/wsdl/</para>
              </entry>
              <entry>
                <para>WSDL namespace for WSDL framework.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>wsoap12</para>
              </entry>
              <entry>
                <para>http://schemas.xmlsoap.org/wsdl/soap12/</para>
              </entry>
              <entry>
                <para>WSDL namespace for WSDL SOAP 1.2 binding.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>http </para>
              </entry>
              <entry>
                <para>http://schemas.xmlsoap.org/wsdl/http/</para>
              </entry>
              <entry>
                <para>WSDL namespace for WSDL HTTP GET &amp; POST binding.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>soapenc  </para>
              </entry>
              <entry>
                <para>http://www.w3.org/2003/05/soap-encoding</para>
              </entry>
              <entry>
                <para>Encoding namespace as defined by SOAP 1.2 [SOAP 1.2, Part 2]</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>soapenv </para>
              </entry>
              <entry>
                <para>http://www.w3.org/2003/05/soap-envelope</para>
              </entry>
              <entry>
                <para>Envelope namespace as defined by SOAP 1.2 [SOAP 1.2, Part 1]</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>xs </para>
              </entry>
              <entry>
                <para>http://www.w3.org/2001/XMLSchema</para>
              </entry>
              <entry>
                <para>Instance namespace as defined by XS [XML-Schema, Part1] and [XML-Schema, Part 2]</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>xsi</para>
              </entry>
              <entry>
                <para>http://www.w3.org/2001/XMLSchema-instance</para>
              </entry>
              <entry>
                <para>XML schema instance namespace.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>d</para>
              </entry>
              <entry>
                <para>http://schemas.xmlsoap.org/ws/2005/04/discovery</para>
              </entry>
              <entry>
                <para>Device discovery namespace as defined by [WS-Discovery]. </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>wsadis</para>
              </entry>
              <entry>
                <para>http://schemas.xmlsoap.org/ws/2004/08/addressing</para>
              </entry>
              <entry>
                <para>Device addressing namespace referred in WS-Discovery [WS-Discovery].</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>wsa</para>
              </entry>
              <entry>
                <para>http://www.w3.org/2005/08/addressing</para>
              </entry>
              <entry>
                <para>Device addressing namespace as defined by [WS-Addressing].</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>wstop</para>
              </entry>
              <entry>
                <para>http://docs.oasis-open.org/wsn/t-1</para>
              </entry>
              <entry>
                <para>Schema namespace of the [WS-Topics] specification.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>wsnt</para>
              </entry>
              <entry>
                <para>http://docs.oasis-open.org/wsn/b-2</para>
              </entry>
              <entry>
                <para>Schema namespace of the [WS-BaseNotification] specification.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>xop</para>
              </entry>
              <entry>
                <para>http://www.w3.org/2004/08/xop/include</para>
              </entry>
              <entry>
                <para>XML-binary Optimized Packaging namespace as defined by [XOP]</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </table>
      <para>In addition this standard refers without prefix to the namespaces listed in <xref linkend="_refNS2"/>.</para>
      <table xml:id="_refNS2">
        <title>Referenced namespaces (without prefix)</title>
        <tgroup cols="2">
          <colspec colname="c1" colwidth="71*" />
          <colspec colname="c2" colwidth="29*" />
          <thead>
            <row>
              <entry>
                <para>Namespace URI</para>
              </entry>
              <entry>
                <para>Description</para>
              </entry>
            </row>
          </thead>
          <tbody valign="top">
            <row>
              <entry>
                <para>http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete</para>
              </entry>
              <entry>
                <para>Topic expression dialect defined for topic expressions.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet</para>
              </entry>
              <entry>
                <para>The ONVIF dialect for the topic expressions.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter</para>
              </entry>
              <entry>
                <para>The ONVIF filter dialect used for message content filtering. </para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </section>
    <section>
      <title>Types</title>
      <para>Data types are defined using XML schema descriptions Part1 and Part 2. Numerous data
        types defined in this specification are included in [ONVIF Schema] and can be downloaded
        from:</para>
      <itemizedlist>
        <listitem>
          <para>http://www.onvif.org/onvif/ver10/schema/onvif.xsd</para>
        </listitem>
      </itemizedlist>
      <para>Services should define locally used data types in the types section of the wsdl file.</para>
    </section>
    <section>
      <title>Operations</title>
      <para>Operations are defined within the WSDL portType declaration. An operation typically
        uses the request-response pattern. The service provider receives a request message and
        sends a corresponding response message.</para>
      <para>Both request and response message may have zero or more parameters. Parameters may be
        marked as optional which maps to an XML minOccurs='0' attribute. Additionally parameters
        may have multiple occurrence.</para>
      <para>If a request message which modifies the state of the device includes the definition of an optional element, and the optional element is not present in the request message, the device should treat the contents of that element as if it contains the current state value. Specific operations may override this treatment of optional elements, in which case the behaviour is specified in the operation's description.</para>
      <para>For each command well defined fault codes should be listed. Additionally any command
        may generate generic faults as defined by <xref linkend="_Ref213789053"/>. </para>
      <para>The Access_Class_Name defines the access class of the operation. The access class characterizes the impact of the operation, see <xref linkend="AccessClasses"/></para>
    </section>
    <section>
      <title>Port Types and Messages</title>
      <para>The operations of a service are grouped in one or more port types. A port type is a
        named set of abstract operations referencing the abstract messages involved. </para>
      <para>
        The message definitions map messages to parameter types.
        A message definition shall have exactly one parameter type reference as defined by WS-I basic profile [WS-I BP 2.0] named “parameters”.
      </para>
    </section>
    <section>
      <title>Binding</title>
      <para>A binding defines concrete protocol and transport data format specification for a particular port type. There may be any number of bindings for a given port type. </para>
      <para>“Port_type” is a previously defined type and “Binding” is a character string starting with an upper case letter that defines the name of the binding.</para>
      <para>Binding definitions for an ONVIF compliant device according to this specification shall follow the requirements in [WS-I BP 2.0]. This implies that the WSDL SOAP 1.2 bindings shall be used.</para>
      <para>The SOAP binding can have different styles. An ONVIF compliant device shall use the style ‘document’ specified at the operation level.</para>
      <para>The bindings are defined in the WSDL specifications for respective services.</para>
    </section>
    <section>
      <title>Error handling</title>
      <para>As with any other protocol, errors can occur during communications, protocol or message processing.</para>
      <para>The specification classifies error handling into the following categories:</para>
      <itemizedlist>
        <listitem>
          <para>Protocol Errors</para>
        </listitem>
        <listitem>
          <para>SOAP Errors</para>
        </listitem>
        <listitem>
          <para>Application Errors</para>
        </listitem>
      </itemizedlist>
      <section>
        <title>Protocol errors</title>
        <para>
          <emphasis>Protocol Errors</emphasis> are the result of an incorrectly formed protocol message, which could contain illegal header values, or be received when not expected or experience a socket timeout. To indicate and interpret protocol errors, HTTP and RTSP protocols have defined a set of standard status codes [e.g., 1xx, 2xx, 3xx, 4xx, 5xx]. According to this standard, devices and clients shall use appropriate RTSP and HTTP protocol defined status codes for error reporting and when received handle accordingly. </para>
      </section>
      <section xml:id="_Toc208658689">
        <title>SOAP errors</title>
        <section>
          <title>General</title>
          <para>
            <emphasis>SOAP</emphasis>
            <emphasis>Errors</emphasis> are generated as a result of Web Services operation errors or during SOAP message processing. All such SOAP errors shall be reported and handled through SOAP fault messages. The SOAP specification provides a well defined common framework to handle errors through SOAP fault.</para>
          <para>A SOAP fault message is a normal SOAP message with a single well-known element inside the body (soapenv:Fault). To understand the error in more detail, SOAP has defined SOAP fault message structure with various components in it.</para>
          <itemizedlist>
            <listitem>
              <para>Fault code</para>
            </listitem>
            <listitem>
              <para>Subcode</para>
            </listitem>
            <listitem>
              <para>Reason</para>
            </listitem>
            <listitem>
              <para>Node and Role</para>
            </listitem>
            <listitem>
              <para>Fault Details</para>
            </listitem>
          </itemizedlist>
          <para>
            <emphasis role="bold">
              <emphasis>Subcode</emphasis>
            </emphasis> and <emphasis role="bold"><emphasis>Fault</emphasis></emphasis><emphasis role="bold"><emphasis>Detail</emphasis></emphasis> elements information items are intended for carrying application specific error information.</para>
          <para>The ONVIF specifications use a separate name space for specific faults (see <xref linkend="_Ref213152256" />):</para>
          <para>ter =  “http://www.onvif.org/ver10/error”.</para>
          <para>SOAP fault messages for different Web Services are defined as part of the different Web Services definitions. Server and client shall use SOAP 1.2 fault message handling as specified in this specification and shall follow the WS-I Basic Profile 2.0 fault handling recommendations.</para>
          <para>The following example is an error message (SOAP 1.2 fault message over HTTP). The values in italics are placeholders for actual values.</para>
          <programlisting><![CDATA[HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: bytes in body
CONTENT-TYPE: application/soap+xml; charset=”utf-8”
DATE: when response was generated
<?xml version=”1.0” ?>
  <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
    xmlns:ter="http://www.onvif.org/ver10/error"
    xmlns:xs="http://www.w3.org/2000/10/XMLSchema">
    <soapenv:Body>
      <soapenv:Fault>
        <soapenv:Code>
          <soapenv:Value>fault code </soapenv:Value>
          <soapenv:Subcode>
            <soapenv:Value>ter:fault subcode</soapenv:Value>
            <soapenv:Subcode>
              <soapenv:Value>ter:fault subcode</soapenv:Value>
            </soapenv:Subcode>
          </soapenv:Subcode>
        </soapenv:Code>
        <soapenv:Reason>
          <soapenv:Text xml:lang="en">fault reason</soapenv:Text>
        </soapenv:Reason>
        <soapenv:Node>http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver</soapenv:Node>
        <soapenv:Role>http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver</soapenv:Role>
        <soapenv:Detail>
          <soapenv:Text>fault detail</soapenv:Text>
        </soapenv:Detail>
      </soapenv:Fault>
    </soapenv:Body>
  </soapenv:Envelope>
]]></programlisting>
          <para>The following table summarizes the general SOAP fault codes (fault codes are defined in SOAP version 1.2 Part 1: Messaging Framework). Server and client may define additional fault subcodes for use by applications.</para>
          <para>We distinguish between generic faults and specific faults. Any command can generate a generic fault. Specific faults are related to a specific command or set of commands. Specific faults that apply to a particular command are defined in the command definition table.</para>
          <para>In the tables below, the Fault Code, Subcode and Fault Reason are normative values. The description column is added for information.</para>
        </section>
        <section xml:id="_Ref213789053">
          <title>Generic faults</title>
          <para><xref linkend="_Ref213642349"/> lists the generic fault codes and, if applicable, subcodes. All server and client implementations shall handle all the faults listed below. Any web service command may return one or several of the generic faults.</para>
          <para>The faults listed without <emphasis>subcode</emphasis> do not have any <emphasis>subcode</emphasis> value.</para>
          <table xml:id="_Ref213642349">
            <title>Generic faults</title>
            <tgroup cols="4">
              <colspec colname="c1" colwidth="18*" />
              <colspec colname="c2" colwidth="27*" />
              <colspec colname="c3" colwidth="21*" />
              <colspec colname="c4" colwidth="34*" />
              <thead>
                <row>
                  <entry>
                    <para>Fault Code</para>
                  </entry>
                  <entry>
                    <para>Subcode</para>
                  </entry>
                  <entry>
                    <para>Fault Reason</para>
                  </entry>
                  <entry>
                    <para>Description</para>
                  </entry>
                </row>
              </thead>
              <tbody valign="top">
                <row>
                  <entry namest="c1" nameend="c2">
                    <para>env:VersionMismatch</para>
                  </entry>
                  <entry>
                    <para>SOAP version mismatch</para>
                  </entry>
                  <entry>
                    <para>The device found an invalid element information item instead of the expected <emphasis>Envelope</emphasis> element information item.</para>
                  </entry>
                </row>
                <row>
                  <entry namest="c1" nameend="c2">
                    <para>env:MustUnderstand</para>
                  </entry>
                  <entry>
                    <para>SOAP header blocks not understood</para>
                  </entry>
                  <entry>
                    <para>One or more mandatory SOAP header blocks were not understood.</para>
                  </entry>
                </row>
                <row>
                  <entry namest="c1" nameend="c2">
                    <para>env:DataEncodingUnknown</para>
                  </entry>
                  <entry>
                    <para>Unsupported SOAP data encoding</para>
                  </entry>
                  <entry>
                    <para>SOAP header block or SOAP body child element information item is scoped with data encoding that is not supported by the device.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:WellFormed</para>
                  </entry>
                  <entry>
                    <para>Well-formed Error</para>
                  </entry>
                  <entry>
                    <para>XML Well-formed violation occurred.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:TagMismatch</para>
                  </entry>
                  <entry>
                    <para>Tag Mismatch</para>
                  </entry>
                  <entry>
                    <para>There was a tag name or namespace mismatch.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:Tag</para>
                  </entry>
                  <entry>
                    <para>No Tag</para>
                  </entry>
                  <entry>
                    <para>XML element tag was missing.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:Namespace</para>
                  </entry>
                  <entry>
                    <para>Namespace Error</para>
                  </entry>
                  <entry>
                    <para>SOAP Namespace error occurred.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:MissingAttr</para>
                  </entry>
                  <entry>
                    <para>Required Attribute not present</para>
                  </entry>
                  <entry>
                    <para>There was a missing required attribute.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:ProhibAttr</para>
                  </entry>
                  <entry>
                    <para>Prohibited Attribute</para>
                  </entry>
                  <entry>
                    <para>A prohibited attribute was present.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:InvalidArgs</para>
                  </entry>
                  <entry>
                    <para>Invalid Args</para>
                  </entry>
                  <entry>
                    <para>An error due to any of the following: </para>
                    <itemizedlist>
                      <listitem>
                        <para>missing argument</para>
                      </listitem>
                      <listitem>
                        <para>too many arguments</para>
                      </listitem>
                      <listitem>
                        <para>arguments are of the wrong data type. </para>
                      </listitem>
                    </itemizedlist>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:InvalidArgVal</para>
                  </entry>
                  <entry>
                    <para>Argument Value Invalid</para>
                  </entry>
                  <entry>
                    <para>The argument value is invalid.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:UnknownAction</para>
                  </entry>
                  <entry>
                    <para>Unknown Action</para>
                  </entry>
                  <entry>
                    <para>An unknown action is specified.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:OperationProhibited</para>
                  </entry>
                  <entry>
                    <para>Operation not Permitted</para>
                  </entry>
                  <entry>
                    <para>The requested operation is not permitted by the device.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Sender</para>
                  </entry>
                  <entry>
                    <para>ter:NotAuthorized</para>
                  </entry>
                  <entry>
                    <para>Sender not Authorized</para>
                  </entry>
                  <entry>
                    <para>The action requested requires authorization and the sender is not authorized.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Receiver</para>
                  </entry>
                  <entry>
                    <para>ter:ActionNotSupported</para>
                  </entry>
                  <entry>
                    <para>Optional Action Not Implemented</para>
                  </entry>
                  <entry>
                    <para>The requested action is optional and is not implemented by the device.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Receiver</para>
                  </entry>
                  <entry>
                    <para>ter:Action</para>
                  </entry>
                  <entry>
                    <para>Action Failed</para>
                  </entry>
                  <entry>
                    <para>The requested SOAP action failed.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Receiver</para>
                  </entry>
                  <entry>
                    <para>ter:OutofMemory</para>
                  </entry>
                  <entry>
                    <para>Out of Memory</para>
                  </entry>
                  <entry>
                    <para>The device does not have sufficient memory to complete the action.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>env:Receiver</para>
                  </entry>
                  <entry>
                    <para>ter:CriticalError</para>
                  </entry>
                  <entry>
                    <para>Critical Error</para>
                  </entry>
                  <entry>
                    <para>The device has encountered an error condition which it cannot recover by itself and needs reset or power cycle.</para>
                  </entry>
                </row>
              </tbody>
            </tgroup>
          </table>
        </section>
        <section xml:id="_Ref213152256">
          <title>Specific faults</title>
          <para>Specific faults apply only to a specific command or set of commands. The specific faults are declared as part of the service definitions.</para>
        </section>
        <section>
          <title>HTTP errors</title>
          <para>If the server waits for the start of the inbound message and no SOAP message is received, the server shall not generate a SOAP fault and instead sends an HTTP error response. </para>
          <table>
            <title>HTTP errors</title>
            <tgroup cols="3">
              <colspec colname="c1" colwidth="49*" />
              <colspec colname="c2" colwidth="13*" />
              <colspec colname="c3" colwidth="37*" />
              <thead>
                <row>
                  <entry>
                    <para>HTTP Error</para>
                  </entry>
                  <entry>
                    <para>HTTP Error Code</para>
                  </entry>
                  <entry>
                    <para>HTTP Reason</para>
                  </entry>
                </row>
              </thead>
              <tbody valign="top">
                <row>
                  <entry>
                    <para>Malformed Request</para>
                  </entry>
                  <entry>
                    <para>400</para>
                  </entry>
                  <entry>
                    <para>Bad Request</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>Requires Authorization</para>
                  </entry>
                  <entry>
                    <para>401</para>
                  </entry>
                  <entry>
                    <para>Unauthorized</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HTTP Method is neither POST or GET</para>
                  </entry>
                  <entry>
                    <para>405</para>
                  </entry>
                  <entry>
                    <para>Method Not Allowed</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>Unsupported message encapsulation method</para>
                  </entry>
                  <entry>
                    <para>415</para>
                  </entry>
                  <entry>
                    <para>Unsupported media</para>
                  </entry>
                </row>
              </tbody>
            </tgroup>
          </table>
          <para>A server should avoid reporting internal errors as this can expose security weaknesses that can be misused.</para>
        </section>
        <section>
          <title>SCTP errors</title>
          <para>If the server waits for the start of the inbound message and no SOAP message is received, the server shall not generate a SOAP fault and not send any error response. </para>
        </section>
      </section>
    </section>
    <section xml:id="_Ref208379139">
      <title>Security</title>
      <section>
        <title>Authentication over HTTP and HTTPS</title>
        <para>The services defined in this standard, whenever consumed overt HTTP and HTTPS, shall be protected using digest authentication according to [RFC 2617] with the following exceptions.</para>
        <itemizedlist>
          <listitem>
            <para>Legacy devices supporting [WS-UsernameToken] and</para>
          </listitem>
          <listitem>
            <para>TLS client authorization and</para>
          </listitem>
          <listitem>
            <para>Devices supporting JWT client authorization based on [RFC 6750], only over
              HTTPS.</para>
          </listitem>
        </itemizedlist>
        <para>If server supports both digest authentication as specified in [RFC 2617] and the user name token profile as specified in WS-Security the following behavior shall be adapted: a web service request can be authenticated on the HTTP level via digest authentication [RFC 2617] or on the web service level via the WS-Security (WSS) framework. If a client does not supply authentication credentials along with a web service request, the server shall assume that the client intends to use digest authentication [RFC 2617], if required. Hence, if a client does not provide authentication credentials when requesting a service that requires authentication, it will receive an HTTP 401 error according to [RFC 2617]. Note that this behaviour on the server’s side differs from the case of supporting only username token profile, which requires for this case an HTTP 400 error on the HTTP level and a SOAP:Fault env:Sender ter:NotAuthorized error on the WS level.</para>
        <para>A client should not simultaneously supply authentication credentials on both the HTTP level and the WS level. If a server receives a web service request that contains authentication credentials on both the HTTP level and the WS level, it shall first validate the credentials provided on the HTTP layer. If this validation was successful, the server shall finally validate the authentication credentials provided on the WS layer.</para>
        <para><xref linkend="AuthenticationFlow"/> summarizes the authentication of a web service request by a server over HTTP and HTTPS.</para>
        <figure xml:id="AuthenticationFlow">
          <title>Authentication of a WS request by a server over HTTP and HTTPS</title>
          <mediaobject>
            <imageobject>
              <imagedata fileref="media/Core/image5.svg" contentwidth="200mm" />
            </imageobject>
          </mediaobject>
        </figure>
      	<para>Both digest authentication and WS-Security provide only a rudimentary level of security. In a system where security is important, it is recommended to always configure the device for TLS-based access (see Security Service). Digest authentication or WS-Security messages can be combined with TLS security for a client and server authentication. A protected transport level of security will provide an acceptable level of security in many systems.</para>
        <para>JWT client authorization should only be used over TLS secured connections, in order to
          protect bearer tokens against replay attacks.</para>
        <para>An ONVIF compliant device should authenticate an RTSP request at the RTSP level. If HTTP is used to tunnel the RTSP request the device shall not authenticate on the HTTP level.</para>
        <para>When authenticating RTSP or HTTP methods, an ONVIF compliant device shall use digest authentication [RFC 2617] or JWT-based authorization. The credentials shall be managed with the GetUsers, CreateUsers, DeleteUsers and SetUser methods. If the device also supports WS-Security, the same set of credentials shall be used.</para>
      </section>
      <section>
        <title>Authentication over SCTP</title>
        <para>The services defined in this standard, whenever consumed overt SCTP, shall be protected using digest authentication according to [WS-BinarySecurityToken].</para>
        <para>Since HTTP headers are not present when consuming the services over SCTP, upon authentication failure the device shall return only the a SOAP:Fault env:Sender ter:NotAuthorized error on the WS level.</para>
        <para><xref linkend="AuthenticationFlowSCTP" /> summarizes the authentication of a web service request by a server over SCTP.</para>
        <figure xml:id="AuthenticationFlowSCTP">
          <title>Authentication of a WS request by a server over SCTP</title>
          <mediaobject>
            <imageobject>
              <imagedata fileref="media/Core/image7.png" contentwidth="100mm" />
            </imageobject>
          </mediaobject>
        </figure>
        <para>WS-Security BinarySecurityToken does not provide security. It is recommended to always configure the device for TLS-based access (see Security Service). A protected transport level of security will provide an acceptable level of security in many systems. WS-Security BinarySecurityToken should never be used without TLS.</para>
      </section>
	  <section>
        <title>SHA-256 Support in HTTP and RTSP digest authentication</title>
        <para>To support the SHA-256 hashing algorithm in HTTP and RTSP digest authentication, an ONVIF compliant device and client should follow [RFC 7616].</para>
        <para>The below table explains the default and optional parameters for ONVIF compliant devices:</para>
	  <table>
            <title>Device authentication Behavior</title>
            <tgroup cols="3">
              <colspec colname="c1" colwidth="49*" />
              <colspec colname="c2" colwidth="13*" />
              <colspec colname="c3" colwidth="37*" />
              <thead>
                <row>
                  <entry>
                    <para>Default Behavior</para>
                  </entry>
                  <entry>
                    <para>Default Hashing Algorithm Used</para>
                  </entry>
                  <entry>
                    <para>Optional(In Digest authentication)</para>
                  </entry>
                </row>
              </thead>
              <tbody valign="top">
                <row>
                  <entry>
                    <para>An ONVIF compliant device and client should follow [RFC 2617] digest authentication.</para>
                  </entry>
                  <entry>
                    <para>MD5</para>
                  </entry>
                  <entry>
                    <para>Support of SHA-256 hashing algorithm is optional for both ONVIF device and client.</para>
                  </entry>
                </row>                
              </tbody>
            </tgroup>
          </table>
		<para>Client can check the supported hashing algorithms in “HashingAlgorithms” field under “SecurityCapabilities” section of capabilities response. If this field is absent or empty by default only “MD5” is applicable.</para>		
	 	<section>
        <title>SetHashingAlgorithm</title>
        <para>How to set HashingAlgorithm for an ONVIF Device/Client</para>
		<para>•	ONVIF client should use SetHashingAlgorithm API to modify the current hashing algorithm of a device.</para>
		<para>•	SetHashingAlgorithm API sets the hashing algorithm(s) to be used in HTTP and RTSP Digest Authentication.</para>
		<para>Note: ONVIF devices that follows [RFC 7616] will support this operation</para>
		<para>Post changing the Hashing Algorithm:</para>        
        <para>1.After changing the hashing algorithm of an ONVIF device, the device should use the new hashing algorithm in the digest challenge for the upcoming HTTP and RTSP request.</para>
		<para>Below request needs to be posted:</para>
		<variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Algorithm [tds:StringList]</para>
              <para role="text">Hashing algorithm(s) used in HTTP and RTSP Digest Authentication</para>              
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:Argument Value Invalid</para>
              <para role="text">The requested hashing algorithm(s) is invalid.</para>            
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
	  <section>
	  <title>Get Device Hashing Algorithm</title>               
          <para>Follow the below workflow to get the latest device Hashing Algorithm:</para>
		  <para>1. The ONVIF client should send an HTTP or RTSP requests without an Authorization header.</para>
		  <para>2. The device responds with an HTTP or RTSP 401 message, that includes a challenge for each digest algorithm currently it was set, in its order of preference.</para>
		  <para>Note: There is no ONVIF API to get the current hashing algorithm of a device, ONVIF clients should depend on HTTP or RTSP digest challenge response.</para>
      <para>See differing example responses below for the given HTTP request:</para>
      <programlisting><![CDATA[POST /onvif/device_service HTTP/1.1
Host: 10.XX.XX.XX
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl"/>
</s:Body></s:Envelope>]]></programlisting>             
      <para>Response from a device if the hashing algorithm is set to MD5, SHA-256:</para>
      <programlisting><![CDATA[HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest algorithm=MD5, realm="Silvan_http_digest", qop="auth", 
nonce="62d82aa9ca59e3a04cd1", opaque="5b6ea228"
WWW-Authenticate: Digest algorithm=SHA-256, realm="Silvan_http_digest", qop="auth", 
nonce="62d82aa9ca59e3a04cd1", opaque="5b6ea228"
X-Frame-Options: SAMEORIGIN]]></programlisting>
      <para>Response from a device if the hashing algorithm is set to SHA-256:</para>
      <programlisting><![CDATA[HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest algorithm=SHA-256, realm="Silvan_http_digest", qop="auth", 
nonce="62d82aa9ca59e3a04cd1", opaque="5b6ea228"
X-Frame-Options: SAMEORIGIN]]></programlisting>
      <para>Response from a device if the hashing algorithm is set to MD5:</para>
      <programlisting><![CDATA[HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest algorithm=MD5, realm="Silvan_http_digest", qop="auth", 
nonce="62d82aa9ca59e3a04cd1", opaque="5b6ea228"
X-Frame-Options: SAMEORIGIN]]></programlisting>
      </section>	 
	  </section>	  
      <section>
        <title>User-based access control</title>
        <section>
          <title>General</title>
          <para>The authorization framework described in Sect. 5.12 allows for authentication of service requests. Once a service request is authenticated, the device shall decide based on its access policy whether the requestor is authorized to receive the service.</para>
          <para>A device may support the definition of a custom access policy by the device user through the get and set access policy operations defined in Section 8.4.</para>
        </section>
        <section xml:id="_Ref306200377">
          <title>User Levels</title>
          <para>Each user is associated exactly one of the following user levels:</para>
          <orderedlist>
            <listitem>
              <para>Administrator</para>
            </listitem>
            <listitem>
              <para>Operator</para>
            </listitem>
            <listitem>
              <para>User</para>
            </listitem>
            <listitem>
              <para>Extended</para>
            </listitem>
            <listitem>
              <para>Anonymous</para>
            </listitem>
          </orderedlist>
          <para>For users with the Extended user level, a device will authenticate requests as for other
            user levels, but authorization will depend on the information configured in the
            corresponding <emphasis>Extension</emphasis> field of the corresponding
              <emphasis>User</emphasis> element.</para>
          <para>Unauthenticated users are placed into the anonymous category and a device shall not allow users to be added to the anonymous user level category. </para>
        </section>
        <section xml:id="AccessClasses">
          <title>Access classes for service requests</title>
          <para>The service requests are classified into access classes based to their impact. The following access classes are defined:</para>
          <itemizedlist>
            <listitem>
              <para>PRE_AUTH The service shall not require user authentication. Example: GetEndpointReference</para>
            </listitem>
            <listitem>
              <para>READ_SYSTEM The service reads system configuration information from the device. Example: GetNetworkInterfaces</para>
            </listitem>
            <listitem>
              <para>READ_SYSTEM_SENSITIVE The service reads sensitive (but not really confidential) system configuration information from the device.</para>
            </listitem>
            <listitem>
              <para>READ_SYSTEM_SECRET The service reads confidential system configuration information from the device. Example: GetSystemLog</para>
            </listitem>
            <listitem>
              <para>WRITE_SYSTEM The service causes changes to the system configuration of the device. Example: SetNetworkDefaultGateway</para>
            </listitem>
            <listitem>
              <para>UNRECOVERABLE The service causes unrecoverable changes to the system configuration of the device. Example: SetSystemFactoryDefault</para>
            </listitem>
            <listitem>
              <para>READ_MEDIA The service reads data related to recorded media. Example: GetRecordings</para>
            </listitem>
            <listitem>
              <para>ACTUATE The service affects the runtime behaviour of the system. Example: CreateRecordingJob</para>
            </listitem>
          </itemizedlist>
          <para>
            <xref linkend="_Ref292468385" /> defines for each access class which user levels are allowed access. A user of level c shall be granted access to a service request associated to access class r if and only if an "X" is present in the cell at column c and row r.
          </para>
          <table xml:id="_Ref292468385">
            <title>Default Access Policy Definition</title>
            <tgroup cols="5">
              <colspec colname="c1" colwidth="35*" />
              <colspec colname="c2" colwidth="18*" />
              <colspec colname="c3" colwidth="16*" />
              <colspec colname="c4" colwidth="16*" />
              <colspec colname="c5" colwidth="16*" />
              <tbody valign="top">
                <row>
                  <entry />
                  <entry align="center">
                    <para>Administrator</para>
                  </entry>
                  <entry align="center">
                    <para>Operator</para>
                  </entry>
                  <entry align="center">
                    <para>User</para>
                  </entry>
                  <entry align="center">
                    <para>Anonymous</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>PRE_AUTH</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>READ_SYSTEM</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                </row>
                <row>
                  <entry>
                    <para>READ_SYSTEM_SENSITIVE</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                  <entry align="center" />
                </row>
                <row>
                  <entry>
                    <para>READ_SYSTEM_SECRET</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                  <entry align="center" />
                  <entry align="center" />
                </row>
                <row>
                  <entry>
                    <para>WRITE_SYSTEM</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                  <entry align="center" />
                  <entry align="center" />
                </row>
                <row>
                  <entry>
                    <para>UNRECOVERABLE</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                  <entry align="center" />
                  <entry align="center" />
                </row>
                <row>
                  <entry>
                    <para>READ_MEDIA</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                </row>
                <row>
                  <entry>
                    <para>ACTUATE</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center">
                    <para>X</para>
                  </entry>
                  <entry align="center" />
                  <entry align="center" />
                </row>
              </tbody>
            </tgroup>
          </table>
        </section>
        <section>
          <title>Default Access Policy</title>
          <para>By default, the device should enforce the following default access policy, which gives an acceptable level of security in many systems.</para>
          <para>The default access policy builds upon the access classes that are associated to the services and grants access rights in the following way. A user of level c shall be granted access to a service associated to access class r if and only if an "X" is present in the cell at column c and row r in <xref linkend="_Ref292468385" />.</para>
          <para>A device that signals support for the Default Access Policy via the respective capability shall support at least one user of each user level Administrator, Operator and User.</para>
        </section>
        <section>
          <title>User roles</title>
          <para>To have finer control of invokable functions, extended users levels may be
            associated to one or more roles, see <xref linkend="_Ref443486820"/>.</para>
          <para>Devices supporting user roles shall predefine the following non editable
            roles:</para>
          <itemizedlist>
            <listitem>
              <para><emphasis>onvif:Administrator</emphasis> : the predefined role corresponding to
                the Administrator user level. Users with Administrator user level and extended users
                with onvif:Administrator role shall be functionally equivalent.</para>
            </listitem>
            <listitem>
              <para><emphasis>onvif:Operator</emphasis> : the predefined role corresponding to the
                Operator user level. Users with Operator user level and extended users with
                onvif:Operator role shall be functionally equivalent.</para>
            </listitem>
            <listitem>
              <para><emphasis>onvif:User</emphasis> : the predefined role corresponding to the User
                user level. Users with User user level and extended users with onvif:User role shall
                be functionally equivalent.</para>
            </listitem>
          </itemizedlist>
          <para>The usage of the <emphasis>onvif:</emphasis> prefix for new roles is reserved and
            shall not be used to create custom user roles. Roles with the
              <emphasis>onvif:</emphasis> prefix are fixed and cannot be edited.</para>
          <para>The name of custom user roles shall not include spaces.</para>
          <para>Unlike user levels, more than one role may be associated with an Extended User. As
            an example, in this way it is possibile to define a new set of credentials with
            onvif:User and PTZControl roles, to give a user the possibility of accessing a camera
            and to only control the PTZ, without altering any other state of the device, such as
            I/Os.</para>
        </section>
      </section>
      <section>
        <title>Username token profile</title>
        <para>A client shall use both nonce and timestamps as defined in [WS-UsernameToken]. The server shall reject any Username Token not using both <emphasis>nonce</emphasis> and creation <emphasis>timestamps</emphasis>.</para>
        <para>This specification defines a set of commands for managing the user credentials, see <xref linkend="_Ref474427788" />. These commands allow associating users with the different user levels defined in <xref linkend="_Ref306200377" />.</para>
      </section>
    </section>
    <section>
      <title>String representation</title>
      <para>The following sub-paragraphs are valid for all ONVIF services.</para>
      <section>
        <title>Character Set</title>
        <para>A device shall support the UTF-8 character set and it may support other character sets. If a client sends a request using UTF-8, the device shall always reply using the UTF-8 character set.</para>
      </section>
      <section>
        <title>Allowed characters in strings</title>
        <para>A device shall not have any restriction regarding legal characters in string that aren’t explicitly stated in this and other ONVIF specifications.</para>
      </section>
    </section>
  </chapter>
  <chapter xml:id="_Ref389211687">
    <title>IP configuration</title>
    <para>The device and client communicate over an open or closed IP network. This standard does not place any general restrictions or requirements on the network type. It shall be possible, however, to establish communication links between the entities according to the architectural framework specified in <xref linkend="_Toc241999839" />. Device IP configuration includes parameters such as IP addresses and a default gateway.</para>
    <para>An ONVIF compliant device shall have at least one network interface that gives it IP network connectivity. Similarly, the client shall have at least one network interface that gives IP connectivity and allows data communication between the device and the client.</para>
    <para>Both device and client shall support IPv4 based network communication. The device and client should support IPv6 based network communication.</para>
    <para>It shall be possible to make static IP configuration on the device using a network or local configuration interface.</para>
    <para>An ONVIF compliant device should support dynamic IP configuration of link-local addresses according to [RFC 3927]. A device that supports IPv6 shall support stateless IP configuration according to [RFC 4862] and neighbour discovery according to [RFC 4861].</para>
    <para>The device shall support dynamic IP configuration according to [RFC 2131]. A device that supports IPv6 shall support stateful IP configuration via DHCPv6 according to [RFC3315] if signaled via the corresponding capability. </para>
    <para>The device may support any additional IP configuration mechanism.</para>
    <para>Network configuration of a device shall be provided via the ONVIF device management service as specified in section <xref linkend="_Toc278964059" /> and may additionally be provided through local interfaces. The latter  is outside the scope of this specification. </para>
    <para>The default device configuration shall have both DHCP and dynamic link-local (stateless) address configuration enabled. Even if the device is configured through a static address configuration it should have the link-local address default enabled. </para>
    <para>When a device is connected to an IPv4 network, address assignment priorities (link local versus routable address) should be done as recommended in [RFC 3927]. </para>
    <para>Note that the network interface should set up an explicit IPv4 route for multicast traffic to ensure that WS-Discovery is successful, whether a default route is present or not. In a linux environment, this can be done with a command line like:</para>
    <para>/sbin/route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0</para>
    <para>Further details regarding how the IP connectivity is achieved are <emphasis>outside </emphasis>the scope of this standard.</para>
  </chapter>
  <chapter xml:id="_Ref199745942">
    <title>Device discovery</title>
    <section>
      <title>General</title>
      <para>A client may search for available devices using the dynamic Web Services discovery
        protocol [WS-Discovery].</para>
      <para>A device compliant with this specification shall implement the Target Service role as
        specified in [WS-Discovery] unless it signals DiscoveryNotSupported via its capabilities.</para>
      <para> [WS-Discovery] describes the Universally Unique Identifier (UUID): URI format recommendation for endpoint references in Section 2.6, but this specification overrides this recommendation. Instead, the Uniform Resource Name: Universally Unique Identifier (URN:UUID) format is used [RFC 4122] (see Section <xref linkend="_Ref204503939" />).</para>
    </section>
    <section xml:id="_Toc204774611">
      <title>Modes of operation</title>
      <para>A device supporting discovery shall be able to operate in two modes:</para>
      <itemizedlist>
        <listitem>
          <para>Discoverable</para>
        </listitem>
        <listitem>
          <para>Non-discoverable</para>
        </listitem>
      </itemizedlist>
      <para>A device in discoverable mode sends multicast Hello messages once connected to the network or sends its Status changes according to [WS-Discovery]. In addition it always listens for Probe and Resolve messages and sends responses accordingly. A device in non-discoverable shall not listen to [WS-Discovery] messages or send such messages. </para>
      <para>The devices <emphasis>default </emphasis>behaviour shall be the discoverable mode. In order to thwart denial-of-service attacks, it shall be possible to set a device into non-discoverable mode through the operation defined in <xref linkend="_Toc213907675" />.</para>
    </section>
    <section>
      <title>Discovery definitions</title>
      <section xml:id="_Ref204503939">
        <title>Endpoint reference</title>
        <para>A device or an endpoint that takes the client role should use a URN:UUID [RFC 4122] as the address property of its endpoint reference.</para>
        <para>The device or an endpoint that takes the client role shall use a stable, globally unique identifier that is constant across network interfaces as part of its endpoint reference property. The combination of an wsadis:Address and wsadis:ReferenceProperties provide a stable and globally-unique identifier.</para>
      </section>
      <section xml:id="_Ref200273614">
        <title>Hello</title>
        <section>
          <title>Types</title>
          <para>An ONVIF compliant device shall include the device management service port type, i.e. tds:Device, in the <literal>&lt;d:Types&gt;</literal> declaration.</para>
          <para>The following example shows how the type is encoded in the SOAP Hello body:</para>
          <para>
            <literal>&lt;d:Types&gt;tds:Device&lt;/d:Types&gt;</literal>.</para>
          <para>The Hello message may include additional types.</para>
        </section>
        <section>
          <title>Scopes</title>
          <section>
            <title>General</title>
            <para>An ONVIF compliant device shall include the scope <literal>&lt;d:Scopes&gt;</literal> attribute with the scopes of the device in the Hello message. </para>
            <para>The device scope is set by using [RFC 3986] URIs. This specification defines scope attributes as follows:</para>
            <para>The scheme attribute:onvif</para>
            <para>The authority attribute:www.onvif.org</para>
            <para>This implies that all ONVIF defined scope URIs have the following format:</para>
            <programlisting><![CDATA[onvif://www.onvif.org/<path>
]]></programlisting>
            <para>A device may have other scope URIs.  These URIs are not restricted to ONVIF defined scopes.</para>
            <para>
              <xref linkend="TableScopeParameters" /> defines a set of scope parameters. Apart from these standardized parameters, it shall be possible to set any scope parameter as defined by the device owner. Scope parameters can be listed and set through the commands defined in Section <xref linkend="_Ref266885799" />.  </para>
            <table xml:id="TableScopeParameters">
              <title>Scope parameters</title>
              <tgroup cols="3">
                <colspec colname="c1" colwidth="13*" />
                <colspec colname="c2" colwidth="27*" />
                <colspec colname="c3" colwidth="60*" />
                <thead>
                  <row>
                    <entry>
                      <para>Category</para>
                    </entry>
                    <entry>
                      <para>Defined values</para>
                    </entry>
                    <entry>
                      <para>Description</para>
                    </entry>
                  </row>
                </thead>
                <tbody valign="top">
                  <row>
                    <entry>
                      <para>Profile</para>
                    </entry>
                    <entry>
                      <para>Any character string.</para>
                    </entry>
                    <entry>
                      <para>Value that indicates the profile supported by the device. The defined values are outside of the scope of this document and are defined in the profile specifications.</para>
                    </entry>
                  </row>
                  <row>
                    <entry>
                      <para>Location</para>
                    </entry>
                    <entry>
                      <para>Any character string or path value.</para>
                    </entry>
                    <entry>
                      <para>The location defines the physical location of the device. The location value might be any string describing the physical location of the device.</para>
                    </entry>
                  </row>
                  <row>
                    <entry>
                      <para>Hardware</para>
                    </entry>
                    <entry>
                      <para>Any character string or path value.</para>
                    </entry>
                    <entry>
                      <para>A string or path value describing the hardware of the device. A device shall include at least one hardware entry into its scope list. </para>
                    </entry>
                  </row>
                  <row>
                    <entry>
                      <para>Name</para>
                    </entry>
                    <entry>
                      <para>Any character string or path value.</para>
                    </entry>
                    <entry>
                      <para>The searchable name of the device. A device shall include at least one name entry into its scope list.</para>
                    </entry>
                  </row>
                  <row>
                    <entry>
                      <para>MacAddress</para>
                    </entry>
                    <entry>
                      <para>Any character string.</para>
                    </entry>
                    <entry>
                      <para>MacAddress of the network interface.</para>
                    </entry>
                  </row>
                  <row>
                    <entry>
                      <para>SerialNumber</para>
                    </entry>
                    <entry>
                      <para>Any character string (alphanumeric).</para>
                    </entry>
                    <entry>
                      <para>Unique serial number of the device.</para>
                    </entry>
                  </row>
                </tbody>
              </tgroup>
            </table>
            <para>A device shall include at least one fixed entry (defined by the device vendor) of the profile, hardware and name categories respectively in the scopes list. A device may include any other additional scope attributes in the scopes list.</para>
            <para>A device might include <emphasis>an arbitrary </emphasis>number of scopes in its scope list. This implies that one unit might for example define <emphasis>several different </emphasis>location scopes. A probe is matched against <emphasis>all </emphasis>scopes in the list. </para>
          </section>
          <section>
            <title>Example</title>
            <para>The following example illustrates the usage of the scope value. This is <emphasis>just an example, </emphasis>and not at all an indication of what type of scope parameter to be part of a device configuration. In this example we assume that the device is configured with the following scopes:</para>
            <programlisting><![CDATA[onvif://www.onvif.org/Profile/Streaming
onvif://www.onvif.org/hardware/D1-566
onvif://www.onvif.org/location/country/china
onvif://www.onvif.org/location/city/bejing
onvif://www.onvif.org/location/building/headquarter
onvif://www.onvif.org/location/floor/R5
onvif://www.onvif.org/name/ARV-453
]]></programlisting>
            <para>A client that probes for the device with scope <literal>onvif://www.onvif.org </literal>will get a match. Similarly, a probe for the device with scope:</para>
            <programlisting><![CDATA[onvif://www.onvif.org/location/country/china
]]></programlisting>
            <para>will give a match. A probe with:</para>
            <programlisting><![CDATA[onvif://www.onvif.org/hardware/D1
]]></programlisting>
            <para>
              <literal>
              </literal>will <emphasis>not </emphasis>give a match.</para>
          </section>
        </section>
        <section>
          <title>Addresses</title>
          <para>A device shall include the &lt;d:XAddrs&gt; element with the address(es) for the device service in the Hello message. A URI shall be provided for each protocol (http, https) and externally available IP address. </para>
          <para>The device should provide a port 80 device service entry in order to allow firewall traversal.</para>
          <para>The IP addressing configuration principles for a device are defined in <xref linkend="_Ref389211687" />.</para>
        </section>
      </section>
      <section>
        <title>Probe and Probe Match</title>
        <para>For the device probe match types, scopes and addresses definitions, see <xref linkend="_Ref200273614" /> Hello.</para>
        <para>An ONVIF compliant device shall at least support the <literal>http://schemas.xmlsoap.org/ws/2005/04/discovery/rfc3986</literal> scope matching rule. This scope matching definitions differs slightly from the definition in [WS-Discovery] as [RFC 2396] is replaced by [RFC 3986].</para>
        <para>A device shall include the <literal>&lt;d:XAddrs&gt;</literal> element with the addresses for the device service in a matching probe match message. The <literal>&lt;d:XAddrs&gt;</literal> element will in most cases only contain one address to the device management service as defined in <xref linkend="_Ref204754239" />.</para>
      </section>
      <section xml:id="_Toc204774617">
        <title>Resolve and Resolve Match</title>
        <para>This specification requires end point address information to be included into Hello and Probe Match messages. In most cases, there is no need for the resolve and resolve match exchange. To be compatible with the [WS-Discovery] specification, however, a device should implement the resolve match response.</para>
      </section>
      <section xml:id="_Toc204774618">
        <title>Bye</title>
        <para>A device should send a one-way Bye message when it prepares to leave a network as described in WS-Discovery.</para>
      </section>
      <section>
        <title>SOAP Fault Messages</title>
        <para>If an error exists with the multicast packet, the device and client should silently discard and ignore the request. Sending an error response is not recommended due to the possibility of packet storms if many devices send an error response to the same request. For completeness, unicast packet error handling is described below.</para>
        <para>If a device receives a unicast Probe message and it does not support the matching rule, then the device may choose not to send a Probe Match, and instead generate a SOAP fault bound to SOAP 1.2 as follows:</para>
        <para>
          <emphasis role="bold">[action]</emphasis>
          <literal>http://schemas.xmlsoap.org/ws/2005/04/discovery/fault</literal>
        </para>
        <para>
          <emphasis role="bold">[Code]</emphasis>
          <literal>s12:Sender</literal>
        </para>
        <para>
          <emphasis role="bold">[Subcode]</emphasis>
          <literal>d:MatchingRuleNotSupported</literal>
        </para>
        <para>
          <emphasis role="bold">[Reason]</emphasis>
          <literal>E.g., the matching rule specified is not supported</literal>
        </para>
        <para>
          <emphasis role="bold">[Detail]</emphasis>
          <literal>&lt;d: SupportedMatchingRules&gt;</literal>
        </para>
        <programlisting><![CDATA[List of xs:anyURI
</d: SupportedMatchingRules>
]]></programlisting>
      </section>
    </section>
  </chapter>
  <chapter>
    <title>Device management</title>
    <para>The Device Service is divided into five different categories: capabilities, network, system, I/O and security commands. This set of commands can be used to get information about the device capabilities and configurations or to set device configurations. An ONVIF compliant device shall support the device management service as specified in [ONVIF DM WSDL]. A basic set of operations are required for the device management service, other operations are recommended or optional to support. The detailed requirements are listed under the command descriptions. </para>
    <section>
      <title>Capabilities</title>
      <section>
        <title>GetWsdlUrl</title>
        <para>This method allows to provide a URL where product specific WSDL and schema definitions can be retrieved. This method has been deprecated with version 20.12.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">WsdlUrl [xs:anyURI]</para>
              <para role="text">The requested URL.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">PRE_AUTH</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907637">
        <title>Capability exchange</title>
        <section>
          <title>General</title>
          <para>Any endpoint can ask for the capabilities of a device using the capability exchange request response operation. The capability list includes references to the addresses (XAddr) of the service implementing the interface operations in the category. </para>
        </section>
        <section>
          <title>GetServices</title>
          <para>Returns a collection of the devices services and possibly their available capabilities. The returned capability response message is untyped to allow future addition of services, service revisions and service capabilities. All returned service capabilities shall be structured by different namespaces which are supported by a device.</para>
          <para>A device shall implement this method if any of the ONVIF compliant services implements the GetServiceCapabilities. For making sure about the structure of GetServices response with capabilities, please refer to <xref linkend="title_xch_2yd_rmb" />.</para>
          <para>The version in GetServicesResponse shall contain the specification version number of the corresponding service that is implemented by a device.</para>
          <para>For the returned XAddr a device shall match the scheme and IP part of the one used in the GetServices request. Note that if device is behind a NAT that device may return the local address and not the external address used by the client.</para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">IncludeCapability [boolean]</para>
                <para role="text">The message contains a request for all services in the device and possibly the capabilities for each service. If the Boolean IncludeCapability is set, then the response shall include the services capabilities.
</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">tds:Service [1][unbounded]</para>
                <para role="text">The capability response message contains the requested information about the services. 
</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="text">No command specific faults defined.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">PRE_AUTH</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </section>
        <section xml:id="_Ref468447902">
          <title>GetServiceCapabilities</title>
          <para>This command returns the capabilities of the device service. The service shall implement this method if the device supports the GetServices method.</para>
          <para>
            <xref linkend="title_bbj_pzd_rmb" /> describes how to interpret the indicated capabilities. </para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="text">This is an empty message.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">Capabilities [tds:DeviceServiceCapabilities]</para>
                <para role="text">The capability response message contains the requested device capabilities using a hierarchical XML capability structure. 
</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="text">No command specific faults defined.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">PRE_AUTH</para>
              </listitem>
            </varlistentry>
          </variablelist>
          <table xml:id="title_bbj_pzd_rmb">
            <title>The capabilities in the GetServiceCapabilities
              command</title>
            <tgroup cols="3">
              <colspec colname="c1" colwidth="31*" />
              <colspec colname="c2" colwidth="33*" />
              <colspec colname="c3" colwidth="36*" />
              <thead>
                <row>
                  <entry>
                    <para>Category</para>
                  </entry>
                  <entry>
                    <para>Capability</para>
                  </entry>
                  <entry>
                    <para>Description</para>
                  </entry>
                </row>
              </thead>
              <tbody valign="top">
                <row>
                  <entry morerows="8">
                    <para>Network</para>
                  </entry>
                  <entry>
                    <para>IPFilter</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports IP filtering control using the commands in Section <xref linkend="_Toc213907655" />, <xref linkend="_Toc213907656" />, <xref linkend="_Toc213907657" /> and <xref linkend="_Toc213907658" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>ZeroConfiguration</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports zero configuration according to the commands in Section <xref linkend="_Toc213907653" /> and Section <xref linkend="_Toc213907654" />. </para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>IPVersion6</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports IP version 6.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>DynDNS</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports Dynamic DNS configuration according to Section <xref linkend="_Toc213907645" />and Section <xref linkend="_Toc214944184" /> .</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>Dot11Configuration</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports IEEE802.11 configuration as specified in Section <xref linkend="_Toc213907659" /></para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HostnameFromDHCP</para>
                  </entry>
                  <entry>
                    <para>Indicates whether retrieval of hostname from DHCP is supported by the device.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>NTP</para>
                  </entry>
                  <entry>
                    <para>Indicates the maximum number of supported NTP servers by the devices SetNTP command.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>Dot1XConfigurations</para>
                  </entry>
                  <entry>
                    <para>Indicates the maximum number of Dot1X configurations supported by the device (deprecated).</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>DHCPv6</para>
                  </entry>
                  <entry>
                    <para>Indicates support for Stateful IPv6 DHCP.</para>
                  </entry>
                </row>
                <row>
                  <entry morerows="18">
                    <para>System</para>
                  </entry>
                  <entry>
                    <para>DiscoveryResolve</para>
                  </entry>
                  <entry>
                    <para>Indication if the device responses to resolve requests as described in Section <xref linkend="_Toc204774617" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>DiscoveryBye</para>
                  </entry>
                  <entry>
                    <para>Indication if the device sends bye messages as described in Section <xref linkend="_Toc204774618" /></para>
                  </entry>
                </row>
                <row>
                  <entry>DiscoveryNotSupported</entry>
                  <entry>Indicates that the device does not support network discovery.</entry>
                </row>
                <row>
                  <entry>
                    <para>RemoteDiscovery</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports remote discovery support.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>SystemBackup</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports system backup and restore as specified in Section <xref linkend="_Ref276040129" /> and Section <xref linkend="_Toc213907663" /></para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>FirmwareUpgrade</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports firmware upgrade using
                      UpgradeSystemFirmware (deprecated).</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>CloudFirmwareUpgrade</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports cloud firmware upgrade as specified in
                      Section <xref linkend="_Ref276040029"/>.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>SystemLogging</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports system log retrieval as specified in Section <xref linkend="_Ref482093370" />. </para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HttpSystemBackup</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports system backup and restore using HTTP GET and POST.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HttpFirmwareUpgrade</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports firmware upgrade using HTTP POST.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HTTPSystemLogging</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports retrieval of system log using HTTP Get, see section <xref linkend="_Toc213907661" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HTTPSupportInformation</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports retrieval of support information using HTTP Get, see section <xref linkend="_Toc213907661" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>StorageConfiguration</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports storage configuration interfaces as specified in Section <xref linkend="_Toc260402083" /> Storage Configuration.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>GeoLocationEntities</para>
                  </entry>
                  <entry>
                    <para>Indicates the number of geo location entities supported. See section <xref linkend="_Toc214944223" /> and <xref linkend="_Toc213907677" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>AutoGeo</para>
                  </entry>
                  <entry>
                    <para>Indicates the support for automatic retrieval of geo location. See section <xref linkend="_Toc214944223" /> and <xref linkend="_Toc213907677" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>StorageTypesSupported</para>
                  </entry>
                  <entry>
                    <para>Enumerates the supported StorageTypes.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>NetworkConfigNotSupported</para>
                  </entry>
                  <entry><para>Indicates no support for network configuration.</para></entry>
                </row>
                <row>
                  <entry>UserConfigNotSupported</entry>
                  <entry>Indicates no support for user configuration.</entry>
                </row>
                <row>
                  <entry>
                    <para>Addons</para>
                  </entry>
                  <entry>
                    <para>Indicates support for ONVIF Addons. Strings for each specific addon can be found in its respective specification document.</para>
                  </entry>
                </row>
                <row>
                  <entry morerows="17">
                    <para>Security</para>
                  </entry>
                  <entry>
                    <para>AccessPolicyConfig</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports retrieving and loading device access control policy according to Section <xref linkend="_Toc213907681" /> and Section <xref linkend="_Toc213907682" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>DefaultAccessPolicy</para>
                  </entry>
                  <entry>
                    <para>Indicates if the device supports the default access policies as defined in <xref linkend="_Ref306200377" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>UsernameToken</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports WS-Security UsernameToken authentication as defined in [WS-UsernameToken]. </para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HttpDigest</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the HTTP digest authentication. </para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>X.509Token</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the WS-Security X.509 token [WS-X.509Token].</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>SAMLToken</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the WS-Security SAML token [WS-SAMLToken].</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>KerberosToken</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the WS-Security Kerberos token [WS-KerberosToken].</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>RELToken</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the WS-Security REL token [WS-RELToken].</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>Dot1X	</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports IEEE 802.1X port-based network authentication (deprecated)</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>SupportedEAPMethod</para>
                  </entry>
                  <entry>
                    <para>List of supported EAP Method types. The numbers correspond to the IANA [EAP-Registry].</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>RemoteUserHandling</para>
                  </entry>
                  <entry>
                    <para>Indication if device supports remote user handling and the corresponding methods defined in section <xref linkend="_Toc251861725" /> and <xref linkend="_Ref247076107" />.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>MaxUsers</para>
                  </entry>
                  <entry>
                    <para>The maximum number of users that the device supports</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>MaxUserNameLength</para>
                  </entry>
                  <entry>
                    <para>Maximum number of characters supported for the username by CreateUsers.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>MaxPasswordLength</para>
                  </entry>
                  <entry>
                    <para>Maximum number of characters supported for the password by CreateUsers and SetUser.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>SecurityPolicies</para>
                  </entry>
                  <entry>
                    <para>Indicates which security policies are supported. As described in section <xref linkend="_Ref1614781086"/> and <xref linkend="_Ref1614781087"/>, options are: ModifyPassword, PasswordComplexity, AuthFailureWarnings</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>MaxPasswordHistory</para>
                  </entry>
                  <entry>
                    <para>Maximum number of passwords that the device can remember for each user. If the device does not support the password history this attribute should be zero or not present</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>HashingAlgorithms</para>
                  </entry>
                  <entry>
                    <para>Indicates which hashing algorithms are supported as part of HTTP and RTSP digest authentication.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>MaxUserRoles</para>
                  </entry>
                  <entry>
                    <para>Whenever set to an integer greater than zero, it signals that the device
                      supports user roles, as described in section <xref linkend="_Ref443486820"/>.
                      It indicates the maximum number of editable user roles, including the three
                      predefined roles <emphasis>onvif:Administrator</emphasis>,
                        <emphasis>onvif:Operator</emphasis> and
                      <emphasis>onvif:User</emphasis>.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>Misc</para>
                  </entry>
                  <entry>
                    <para>AuxiliaryCommands</para>
                  </entry>
                  <entry>
                    <para>List of commands supported by SendAuxiliaryCommand</para>
                  </entry>
                </row>
              </tbody>
            </tgroup>
          </table>
        </section>
        <section>
          <title>GetCapabilities</title>
          <para>This method provides a backward compatible interface for the base capabilities. Refer to GetServices for a full set of capabilities.</para>
          <para>Annex A describes how to interpret the indicated capability. Apart from the addresses, the capabilities only reflect optional functions in this specification.</para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">Category - optional, unbounded [tt:CapabilityCategory]</para>
                <para role="text">This message contains a request for device capabilities. The client can either ask for all capabilities or just the capabilities for a particular service category. If no Category is specified the device SHALL return all capabilities.
</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">Capabilities [tt:Capabilities]</para>
                <para role="text">The capability response message contains the requested device capabilities using a hierarchical XML capability structure. 
</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param">env:Receiver - ter:ActionNotSupported - ter:NoSuchService</para>
                <para role="text">The requested WSDL service category is not supported by the device.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">PRE_AUTH</para>
              </listitem>
            </varlistentry>
          </variablelist>
          <para>For the list of capabilities refer to Annex A.</para>
        </section>
      </section>
    </section>
    <section xml:id="_Toc278964059">
      <title>Network</title>
	  <para> A device shall support the commands defined in this section unless the NetworkConfigNotSupported capability is signalled as 'True' confirming it doesn’t support network configuration. </para>
      <section>
        <title>GetHostname</title>
        <para>This operation is used by an endpoint to get the hostname from a device. The device shall return its hostname configurations through the GetHostname command. 
          The device shall return an empty string if no hostname has been assigned.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">FromDHCP [xs:boolean]</para>
              <para role="text">Signals whether the hostname is obtained via DHCP</para>
              <para role="param">Name [xs:token]</para>
              <para role="text">The host name. In case of DHCP the host name has been obtained from the DHCP server.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">PRE_AUTH</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetHostname</title>
        <para>This operation sets the hostname on a device. It shall be possible to set the device hostname configurations through the SetHostname command. Attention: a call to SetDNS may result in overriding a previously set hostname.</para>
        <para>A device shall accept strings formated according to [RFC 1123] section 2.1 or alternatively to [RFC 952], other string shall be considered as invalid strings.</para>
        <para>A device shall try to retrieve the name via DHCP when the HostnameFromDHCP capability is set and an empty name string is provided. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Name [xs:token]</para>
              <para role="text">The host name.If Name is an empty string hostname should be retrieved from DHCP, otherwise the specified Name shall be used.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidHostname</para>
              <para role="text">The requested hostname cannot be accepted by the device.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetHostnameFromDHCP</title>
        <para>This operation controls whether the hostname shall be retrieved from DHCP. </para>
        <para>A device shall support this command if support is signalled via the HostnameFromDHCP capability. Depending on the device implementation the change may only become effective after a device reboot. A device shall accept the command independent whether it is currently using DHCP to retrieve its IPv4 address or not. Note that the device is not required to retrieve its hostname via DHCP while the device is not using DHCP for retrieving its IP address. In the latter case the device may fall back to the statically set hostname.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">FromDHCP [xs:boolean]</para>
              <para role="text">This message contains:
•	“FromDHCP”: True if the hostname shall be obtained via DHCP.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">RebootNeeded [xs:boolean]</para>
              <para role="text">An indication if a reboot is needed in  case of changes in the hostname settings.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetDNS</title>
        <para>This operation gets the DNS settings from a device. The device shall return its DNS configurations through the GetDNS command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">FromDHCP [xs:boolean]</para>
              <para role="text">True if the DNS servers are obtained via DHCP.</para>
              <para role="param">SearchDomain - optional, unbounded [xs:token]</para>
              <para role="text">The domain(s) to search if the hostname is not fully qualified.</para>
              <para role="param">DNSFromDHCP - optional, unbounded [tt:IPAddress]</para>
              <para role="text"> A list of DNS servers obtained via DHCP in case FromDHCP is equal to true. This means that the resolved
                addresses in the field DNSFromDHCP are coming from DHCP and describes the configuration status.</para>
              <para role="param">DNSManual - optional, unbounded [tt:IPAddress]</para>
              <para role="text">A list of manually given DNS servers.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetDNS</title>
        <para>This operation sets the DNS settings on a device. It shall be possible to set the device DNS configurations through the SetDNS command. </para>
        <para>It is valid to set the FromDHCP flag while the device is not using DHCP to retrieve its IPv4 address.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">FromDHCP [xs:boolean]</para>
              <para role="text">True if the DNS servers are obtained via DHCP</para>
              <para role="param">SearchDomain - optional, unbounded [xs:token]</para>
              <para role="text">The domain(s) to search if the hostname is not fully qualified.</para>
              <para role="param">DNSManual - optional, unbounded [tt:IPAddress]</para>
              <para role="text">A list of manually given DNS servers.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetNTP</title>
        <para>This operation gets the NTP settings from a device. If the device supports NTP, it shall be possible to get the NTP server settings through the GetNTP command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">FromDHCP [xs:boolean]</para>
              <para role="text">True if the NTP servers are obtained via DHCP.</para>
              <para role="param">NTPFromDHCP - optional [tt:NetworkHost]</para>
              <para role="text">A list of NTP servers obtained via DHCP in case FromDHCP is equal to true. This means that the NTP server addresses in the field NTPFromDHCP are coming from DHCP and describes the current configuration status.</para>
              <para role="param">NTPManual - optional [tt:NetworkHost]</para>
              <para role="text">A list of manually given NTP servers.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetNTP</title>
        <para>This operation sets the NTP settings on a device. If support for NTP is signalled via the NTP capability, it shall be possible to set the NTP server settings through the SetNTP command.</para>
        <para>A device shall accept string formated according to [RFC 1123] section 2.1, other string shall be considered as invalid strings. It is valid to set the FromDHCP flag while the device is not using DHCP to retrieve its IPv4 address.</para>
        <para>Changes to the NTP server list shall not affect the clock mode DateTimeType. Use SetSystemDateAndTime to activate NTP operation.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">FromDHCP [xs:boolean]</para>
              <para role="text">True if the NTP servers are obtained via DHCP.</para>
              <para role="param">NTPManual - optional, unbounded [tt:NetworkHost]</para>
              <para role="text">A list of manually given NTP servers when they not are obtained via DHCP.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidDnsName</para>
              <para role="text">The suggested NTP  server name is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:TimeSyncedToNtp</para>
              <para role="text">Current DateTimeType requires an NTP server.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907645">
        <title>GetDynamicDNS</title>
        <para>This operation gets the dynamic DNS settings from a device. If the device supports dynamic DNS as specified in [RFC 2136] and [RFC 4702], it shall be possible to get the type, name and TTL through the GetDynamicDNS command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Type [tt:DynamicDNSType]</para>
              <para role="text">The type of update. There are three possible types: the device desires no update (NoUpdate), the device wants the DHCP server to update (ServerUpdates) and the device does the update itself (ClientUpdates).</para>
              <para role="param">Name - optional [tt:DNSName]</para>
              <para role="text">The DNS name in case of the device does the update.</para>
              <para role="param">TTL - optional [xs:duration]</para>
              <para role="text">Time to live.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc214944184">
        <title>SetDynamicDNS</title>
        <para>This operation sets the dynamic DNS settings on a device. If the device supports dynamic DNS as specified in [RFC 2136] and [RFC 4702], it shall be possible to set the type, name and TTL through the SetDynamicDNS command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Type [tt:DynamicDNSType]</para>
              <para role="text">The type of update. There are three possible types: the device desires no update (NoUpdate), the device wants the DHCP server to update (ServerUpdates) and the device does the update itself (ClientUpdates).</para>
              <para role="param">Name - optional [tt:DNSName] xs:duration TTL [0][1]</para>
              <para role="text">The DNS name in case of the device does the update.</para>
              <para role="param">TTL - optional [xs:duration]</para>
              <para role="text">Time to live.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetNetworkInterfaces</title>
        <para>This operation gets the network interface configuration from a device. The device shall support return of network interface configuration settings as defined by the NetworkInterface type through the GetNetworkInterfaces command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">NetworkInterfaces - optional, unbounded [tt:NetworkInterface]</para>
              <para role="text">This message contains an array of device network interfaces.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetNetworkInterfaces</title>
        <para>This operation sets the network interface configuration on a device. The device shall support network configuration of supported network interfaces through the SetNetworkInterfaces command.</para>
        <para>If a device responds with RebootNeeded set to false, the device can be reached via the new IP address without further action. A client should be aware that a device may not be responsive for a short period of time until it signals availability at the new address via the discovery Hello messages as defined in <xref linkend="_Ref200273614" />.</para>
        <para>If a device responds with RebootNeeded set to true, it will be further available under its previous IP address. The settings will only be activated when the device is rebooted via the SystemReboot command.</para>
        <para>For interoperability with a client unaware of the IEEE 802.11 extension a device shall retain its IEEE 802.11 configuration if the IEEE 802.11 configuration element isn’t present in the request.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">InterfaceToken [tt:ReferenceToken]</para>
              <para role="text">The token of the network interface to operate on.</para>
              <para role="param">NetworkInterface [tt:NetworkInterfaceSetConfiguration]</para>
              <para role="text">The configuration to be applied to the network interface.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">RebootNeeded [xs:boolean]</para>
              <para role="text">An indication if a reboot is needed in case of changes in the network settings.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidNetworkInterface</para>
              <para role="text">The supplied network interface token does not exist.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidMtuValue</para>
              <para role="text">The MTU value is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidInterfaceSpeed</para>
              <para role="text">The suggested speed is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidInterfaceType</para>
              <para role="text">The suggested network interface type is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
              <para role="param">env:Receiver - ter:ActionNotSupported - ter:InvalidDot11</para>
              <para role="text">IEEE 802.11 Configuration is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidSecurityMode</para>
              <para role="text">The selected security mode is not supported. </para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidStationMode</para>
              <para role="text">The selected station mode is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:MissingDot11</para>
              <para role="text">IEEE 802.11 value is missing in the security configuration.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:MissingPSK</para>
              <para role="text">PSK value is missing in security configuration.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:MissingDot1X</para>
              <para role="text">IEEE 802.1X value in security configuration is missing or none existing.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:IncompatibleDot1X</para>
              <para role="text">IEEE 802.1X value in security configuration is incompatible with the network interface. </para>
              <para role="param">env:Receiver - ter:ActionNotSupported - ter:InvalidDHCPv6</para>
              <para role="text">The requested stateful DHCPv6 mode is not supported.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetNetworkProtocols</title>
        <para>This operation gets defined network protocols from a device. The device shall support the GetNetworkProtocols command returning configured network protocols.</para>
        <para>This message returns an array of defined protocols supported by the device. There are three protocols defined, HTTP, HTTPS and RTSP. 
          For each protocol the parameters Port and Enable/Disable can be retrieved.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">NetworkProtocols - optional, unbounded [tt:NetworkProtocol]</para>
              <para role="text">Port</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetNetworkProtocols</title>
        <para>This operation configures defined network protocols on a device. The device shall support configuration of defined network protocols through the SetNetworkProtocols command.</para>
        <para>This message configures one or more defined network protocols supported by the device. There are currently three protocols defined, HTTP, HTTPS and RTSP. 
          For each protocol the parameters Port and Enable/Disable can be configured.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">NetworkProtocols - unbounded [tt:NetworkProtocol]</para>
              <para role="text">Port</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:ServiceNotSupported</para>
              <para role="text">The supplied network service is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:PortAlreadyInUse</para>
              <para role="text">The selected port is already in use.</para>
              <para role="param">env:Receiver - ter:ActionNotSupported - ter:EnablingTlsFailed</para>
              <para role="text">The device doesn't support TLS or TLS is not configured appropriately.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetNetworkDefaultGateway</title>
        <para>This operation gets the default gateway settings from a device. The device shall support the GetNetworkDefaultGateway command returning manually configured default gateway <emphasis>address(es)</emphasis>.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">IPv4Address - optional, unbounded [tt:IPv4Address]</para>
              <para role="text">The default IPv4 gateway address(es).</para>
              <para role="param">IPv6Address - optional, unbounded [tt:IPv6Address]</para>
              <para role="text">The default IPv6 gateway address(es).</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetNetworkDefaultGateway</title>
        <para>This operation sets the default gateway settings on a device. The device shall support configuration of default gateway through the SetNetworkDefaultGateway command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">IPv4Address - optional, unbounded [tt:IPv4Address]</para>
              <para role="text">The default IPv4 gateway address(es).</para>
              <para role="param">IPv6Address - optional, unbounded [tt:IPv6Address]</para>
              <para role="text">The default IPv6 gateway address(es).</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidGatewayAddress</para>
              <para role="text">The supplied gateway address was invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907653">
        <title>GetZeroConfiguration</title>
        <para>This operation gets the zero-configuration from a device. If the device supports dynamic IP configuration according to [RFC 3927], it shall support the return of IPv4 zero configuration address and status through the GetZeroConfiguration command</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">InterfaceToken [tt:ReferenceToken]</para>
              <para role="text">The token of the network interface</para>
              <para role="param">Enabled [xs:boolean]</para>
              <para role="text">If zero configuration is enabled or not.</para>
              <para role="param">Address - optional, unbounded [tt:IPv4Addresses]</para>
              <para role="text">The IPv4 zero configuration address(es).</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907654">
        <title>SetZeroConfiguration</title>
        <para>This operation sets the zero-configuration on the device. If the device supports dynamic IP configuration according to [RFC 3927], it shall support the configuration of IPv4 zero configuration address and status through the SetZeroConfiguration command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">InterfaceToken [tt:ReferenceToken]</para>
              <para role="text">The token of the network interface to operate on.</para>
              <para role="param">Enabled [xs:boolean]</para>
              <para role="text">If zero configuration is enabled or not.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidNetworkInterface</para>
              <para role="text">The supplied network interface token does not exists</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907655">
        <title>GetIPAddressFilter</title>
        <para>This operation gets the IP address filter settings from a device. If the device supports device access control based on IP filtering rules (denied or accepted ranges of IP addresses), the device shall support the GetIPAddressFilter command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Type [tt:IPAddressFilterType]</para>
              <para role="text">Sets if the filter should deny or allow access.</para>
              <para role="param">IPv4Address - optional, unbounded [tt:PrefixedIPv4Address]</para>
              <para role="text">The IPv4 filter address(es)</para>
              <para role="param">IPv6Address - optional, unbounded [tt:PrefixedIPv6Address]</para>
              <para role="text">The IPv6 filter address(es)</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907656">
        <title>SetIPAddressFilter</title>
        <para>This operation sets the IP address filter settings on a device. If the device supports device access control based on IP filtering rules (denied or accepted ranges of IP addresses), the device shall support configuration of IP filtering rules through the SetIPAddressFilter command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Type [tt:IPAddressFilterType]</para>
              <para role="text">Sets if the filter should deny or allow access.</para>
              <para role="param">IPv4Address - optional, unbounded [tt:PrefixedIPv4Address]</para>
              <para role="text">The IPv4 filter address(es)</para>
              <para role="param">IPv6Address - optional, unbounded [tt:PrefixedIPv6Address]</para>
              <para role="text">The IPv6 filter address(es)</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907657">
        <title>AddIPAddressFilter</title>
        <para>This operation adds an IP filter address to a device. If the device supports device access control based on IP filtering rules (denied or accepted ranges of IP addresses), the device shall support adding of IP filtering addresses through the AddIPAddressFilter command.</para>
        <para>The value of the Type field shall be ignored by the device. Use SetIPAddressFilter to set the type.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Type [tt:IPAddressFilterType]</para>
              <para role="text">Type”: Sets if the filter should deny or allow access.</para>
              <para role="param">IPv4Address - optional, unbounded [tt:PrefixedIPv4Address]</para>
              <para role="text">The IPv4 filter address(es)</para>
              <para role="param">IPv6Address - optional, unbounded [tt:PrefixedIPv6Address]</para>
              <para role="text">The IPv6 filter address(es)</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:IPFilterListIsFull</para>
              <para role="text">It is not possible to add more IP filters since the IP filter list is full.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907658">
        <title>RemoveIPAddressFilter</title>
        <para>This operation deletes an IP filter address from a device. If the device supports device access control based on IP filtering rules (denied or accepted ranges of IP addresses), the device shall support deletion of IP filtering addresses through the RemoveIPAddressFilter command.</para>
        <para>The value of the Type field shall be ignored by the device.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Type [tt:IPAddressFilterType]</para>
              <para role="text">Value of this field is ignored in this command.</para>
              <para role="param">IPv4Address - optional, unbounded [tt:PrefixedIPv4Address]</para>
              <para role="text">The IPv4 filter address(es)</para>
              <para role="param">IPv6Address - optional, unbounded [tt:PrefixedIPv6Address]</para>
              <para role="text">The IPv6 filter address(es)</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv6Address</para>
              <para role="text">The suggested IPv6 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidIPv4Address</para>
              <para role="text">The suggested IPv4 address is invalid.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoIPv6Address</para>
              <para role="text">The IPv6 address to be removed does not exist.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoIPv4Address</para>
              <para role="text">The IPv4 address to be removed does not exist.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907659">
        <title>IEEE 802.11 configuration</title>
        <para>Requirements in this section and subsections are only valid for a device that signals IEEE 802.11 support via its Network Dot11Configuration capability. in this section and subsections the term “the device” is used to indicate a device with IEEE 802.11 support.</para>
        <para>The device shall support IEEE 802.11 configuration and shall as a response to the GetNetworkInterfaces method return ieee80211 (71) as the IANA-IfTypes for the 802.11 interface(s).</para>
        <para>A device shall not return any link element in the GetNetworkInterfaces reply and it shall ignore any Link element in the SetNetworkInterfaces request.</para>
        <para>The device should support that each IEEE 802.11 network interface can have more than one alternative IEEE 802.11 configurations attached to it. </para>
        <para>IEEE 802.11 configuration is supported through an optional IEEE 802.11 configuration element in the get and set network configuration element. The following information is handled:</para>
        <itemizedlist>
          <listitem>
            <para>SSID</para>
          </listitem>
          <listitem>
            <para>Station mode</para>
          </listitem>
          <listitem>
            <para>Multiple wireless network configuration</para>
          </listitem>
          <listitem>
            <para>Security configuration </para>
          </listitem>
        </itemizedlist>
        <para>The following operations are used to help manage the wireless configuration:</para>
        <itemizedlist>
          <listitem>
            <para>Get IEEE802.11 capabilities</para>
          </listitem>
          <listitem>
            <para>Get IEEE802.11 status</para>
          </listitem>
          <listitem>
            <para>Scan available IEEE802.11 networks</para>
          </listitem>
        </itemizedlist>
        <section>
          <title>SSID</title>
          <para>The device shall support configuration of the SSID.</para>
        </section>
        <section>
          <title>Station Mode</title>
          <para>The device shall support the infrastructure station mode.</para>
          <para>The device may support the ad-hoc network station mode. The actual configuration needed for ad-hoc network station mode, including manual configuration of the channel number, is outside the scope of this specification; But to allow for devices that support ad-hoc network station modes, the specification allows for selecting (and reporting) this mode.</para>
        </section>
        <section>
          <title>Multiple wireless network configuration</title>
          <para>Each IEEE 802.11 configuration shall be identified with an alias (identifier). The alias shall be unique within a network interface configuration. The client shall supply the alias in the SetNetworkInterfaces request. If the client wants to update an existing wireless configuration the same alias shall be used. A wireless configuration, including the alias, shall only exist while it’s part of a network interface configuration.</para>
          <para>For the device to be able to prioritize between multiple alternative IEEE802.11 configurations an optional priority value can be used, a higher value means a higher priority. If several wireless configurations have the same priority value the order between those configurations is undefined.</para>
          <para>The actual algorithm used by the device to enable an IEEE 802.11 network from the prioritized list of IEEE 802.11 configurations is outside the scope of this specification.</para>
        </section>
        <section>
          <title>Security configuration</title>
          <para>The security configuration contains the chosen security mode and the configuration needed for that mode. The following security modes are supported:</para>
          <itemizedlist>
            <listitem>
              <para>None</para>
            </listitem>
            <listitem>
              <para>PSK (Pre Shared Key)	(WPA- and WPA2-Personal)</para>
            </listitem>
            <listitem>
              <para>IEEE 802.1X-2004 (WPA- and WPA2-Enterpise)</para>
            </listitem>
          </itemizedlist>
          <para>Configuration of WEP security mode is outside the scope of this speciation but to allow for devices that support WEP security mode this specification allows for selecting (and reporting) this mode.</para>
          <para>For data confidentiality and integrity the device shall, in accordance with the [IEEE 802.11-2007] specification, support the CCMP algorithm and the device may support the TKIP algorithm.</para>
          <para>The algorithm can either be manually (CCMP, TKIP) or automatically (Any) selected. In manual selected mode the same algorithm shall be used for both the pairwise and group cipher. To be able to support other algorithms an “Extended” value is available.</para>
          <para>The device shall support both the manually and the automatically selected mode.</para>
          <section>
            <title>None mode</title>
            <para>The device shall support the “None” security mode.</para>
          </section>
          <section>
            <title>PSK mode</title>
            <para>The device shall support the PSK security mode.</para>
            <para>To minimize the risk for compromising the PSK the device should not transmit any PSK to a client, furthermore it shall not return the PSK in a response to a GetNetworkInterfaces operation call.</para>
            <para>For adding a wireless configuration with the PSK security mode the following rules applies:</para>
            <itemizedlist>
              <listitem>
                <para>A client shall include a PSK value in the SetNetworkInterfaces request</para>
              </listitem>
              <listitem>
                <para>The device shall check so that a PSK value was supplied, if not the device shall return an error.</para>
              </listitem>
            </itemizedlist>
            <para>For updating wireless configuration with the PSK security mode the following rules applies:</para>
            <itemizedlist>
              <listitem>
                <para>If the client wants to retain the PSK value it should not include the PSK value in the SetNetworkInterfaces request</para>
              </listitem>
              <listitem>
                <para>The device receiving a SetNetworkInterfaces request without a PSK value shall retain its PSK value</para>
              </listitem>
            </itemizedlist>
            <para>The [IEEE 802.11-2007] standard states that the PSK should be distributed to the STA with some out-of-band method. In ONVIF the security policy shall make sure that the PSK is</para>
          </section>
        </section>
        <section>
          <title>GetDot11Capabilities</title>
          <para>This operation returns the IEEE802.11 capabilities, see <xref linkend="_Ref247058935" />. The device shall support this operation.</para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="text">This is an empty message.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">Capabilities [tt:Dot11Capabilities]</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param">env:Receiver - ter:ActionNotSupported - ter:InvalidDot11</para>
                <para role="text">IEEE 802.11 configuration is not supported.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">READ_SYSTEM</para>
              </listitem>
            </varlistentry>
          </variablelist>
          <table xml:id="_Ref247058935">
            <title>IEEE802.11 capabilities</title>
            <tgroup cols="2">
              <colspec colname="c1" colwidth="30*" />
              <colspec colname="c2" colwidth="70*" />
              <thead>
                <row>
                  <entry>
                    <para>Capability</para>
                  </entry>
                  <entry>
                    <para>Description</para>
                  </entry>
                </row>
              </thead>
              <tbody valign="top">
                <row>
                  <entry>
                    <para>TKIP</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the TKIP algorithm.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>ScanAvailableNetworks</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the ScanAvailableIEEE802.11Networks operation.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>MultipleConfiguration </para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports multiple alternative IEEE 802.11 configurations.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>AdHocStationMode</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the Ad-Hoc station mode.</para>
                  </entry>
                </row>
                <row>
                  <entry>
                    <para>WEP</para>
                  </entry>
                  <entry>
                    <para>Indication if the device supports the WEP security mode.</para>
                  </entry>
                </row>
              </tbody>
            </tgroup>
          </table>
        </section>
        <section>
          <title>GetDot11Status</title>
          <para>This operation returns the status of a wireless network interface. The device shall support this command. The following status can be returned:</para>
          <itemizedlist>
            <listitem>
              <para>SSID (shall)</para>
            </listitem>
            <listitem>
              <para>BSSID (should)</para>
            </listitem>
            <listitem>
              <para>Pair cipher (should)</para>
            </listitem>
            <listitem>
              <para>Group cipher (should)</para>
            </listitem>
            <listitem>
              <para>Signal strength (should)</para>
            </listitem>
            <listitem>
              <para>Alias of active wireless configuration (shall)</para>
            </listitem>
          </itemizedlist>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">InterfaceToken [tt:ReferenceToken]</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">Status [tt:Dot11Status]</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param">env:Receiver - ter:ActionNotSupported - ter:InvalidDot11</para>
                <para role="text">IEEE 802.11 configuration is not supported.</para>
                <para role="param">env:Sender - ter:InvalidArgVal - ter:NotDot11</para>
                <para role="text">The interface is not an IEEE 802.11 interface.</para>
                <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidNetworkInterface</para>
                <para role="text">The supplied network interface token does not exist.</para>
                <para role="param">env:Receiver - ter:Action - ter:NotConnectedDot11</para>
                <para role="text">IEEE 802.11 network is not connected.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">READ_SYSTEM</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </section>
        <section>
          <title>ScanAvailableDot11Networks</title>
          <para>This operation returns a lists of the wireless networks in range of the device. A device should support this operation. The following status can be returned for each network:</para>
          <itemizedlist>
            <listitem>
              <para>SSID (shall)</para>
            </listitem>
            <listitem>
              <para>BSSID (should)</para>
            </listitem>
            <listitem>
              <para>Authentication and key management suite(s) (should)</para>
            </listitem>
            <listitem>
              <para>Pair cipher(s) (should)</para>
            </listitem>
            <listitem>
              <para>Group cipher(s) (should)</para>
            </listitem>
            <listitem>
              <para>Signal strength (should)</para>
            </listitem>
          </itemizedlist>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">InterfaceToken [tt:ReferenceToken]</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">Networks - optional, unbounded [tt:Dot11AvailableNetworks]</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param">env:Receiver - ter:ActionNotSupported - ter:InvalidDot11</para>
                <para role="text">IEEE 802.11 configuration is not supported.</para>
                <para role="param">env:Sender - ter:InvalidArgVal - ter:NotDot11</para>
                <para role="text">The interface is not an IEEE 802.11 interface. </para>
                <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidNetworkInterface</para>
                <para role="text">The supplied network interface token does not exist.</para>
                <para role="param">env;Receiver - ter:ActionNotSupported - ter:NotScanAvailable</para>
                <para role="text">ScanAvailableDot11Networks is not supported.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">READ_SYSTEM</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </section>
      </section>
    </section>
    <section xml:id="_Ref266885799">
      <title>System</title>
      <section>
        <title>GetDeviceInformation</title>
        <para>This operation gets device information, such as manufacturer, model and firmware version from a device. The device shall support the return of device information through the GetDeviceInformation command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Manufacturer [xs:string]</para>
              <para role="param">Model [xs:string]</para>
              <para role="param">FirmwareVersion [xs:string]</para>
              <para role="param">SerialNumber [xs:string]</para>
              <para role="param">HardwareId [xs:string]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907661">
        <title>GetSystemUris</title>
        <para>This operation is used to retrieve URIs from which system information may be downloaded using HTTP. URIs may be returned for the following system information:</para>
        <para>System Logs. Multiple system logs may be returned, of different types. The exact format of the system logs is outside the scope of this specification.</para>
        <para>Support Information. This consists of arbitrary device diagnostics information from a device. The exact format of the diagnostic information is outside the scope of this specification.</para>
        <para>System Backup. The received file is a backup file that can be used to restore the current device configuration at a later date. The exact format of the backup configuration file is outside the scope of this specification.</para>
        <para>If the device allows retrieval of system logs, support information or system backup data, it should make them available via HTTP GET. If it does, it shall support the GetSystemUris command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">SystemLogUris - optional [tt:SystemLogUriList]</para>
              <para role="text">This message contains the URIs from which the various system information components may be downloaded.
</para>
              <para role="param">SupportInfoUri - optional [xs:anyURI]</para>
              <para role="param">SystemBackupUri - optional [xs:anyURI]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Ref276040129">
        <title>GetSystemBackup</title>
        <para>This interface has been deprecated. A device shall implement this command if the capability SystemBackup  is signaled. For a replacement method see section <xref linkend="_Toc213907661" /> and <xref linkend="_Toc213907663" />.</para>
        <para>This operation retrieves system backup configuration file(s) from a device. The backup is returned with reference to a name and mime-type together with binary data. The format of the backup configuration data is vendor specific. It is expected that after completion of the restore operation the device is working on the same configuration as that of the time the configuration was backed up. Note that the configuration of static IP addresses may differ.</para>
        <para>Device vendors may put restrictions on the functionality to be restored. The detailed behavior is outside the scope of this specification.</para>
        <para>The backup configuration file(s) are transmitted through MTOM [MTOM].</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">BackupFiles - unbounded [tt:BackupFile]</para>
              <para role="text">The get system backup response message contains the system backup configuration files(s).
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>RestoreSystem</title>
        <para>This interface has been deprecated. A device shall implement this command if the capability SystemBackup  is signaled. For a replacement method see section <xref linkend="_Toc213907661" /> and <xref linkend="_Toc213907663" />.</para>
        <para>This operation restores the system backup configuration files(s) previously retrieved from a device. The exact format of the backup configuration file(s) is <emphasis>outside the scope </emphasis>of this standard. If the command is supported, it shall accept backup files returned by the GetSystemBackup command.</para>
        <para>The back up configuration file(s) are transmitted through MTOM [MTOM].</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">BackupFiles - unbounded [tt:BackupFile]</para>
              <para role="text">This message contains the system backup file(s).
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidBackupFile</para>
              <para role="text">The backup file(s) are invalid.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">UNRECOVERABLE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907663">
        <title>StartSystemRestore</title>
        <para>This operation initiates a system restore from backed up configuration data using the HTTP POST mechanism. The response to the command includes an HTTP URL to which the backup file may be uploaded. The actual restore takes place as soon as the HTTP POST operation has completed. Devices should support system restore through the StartSystemRestore command. The exact format of the backup configuration data is outside the scope of this specification.</para>
        <para>System restore over HTTP may be achieved using the following steps:</para>
        <orderedlist>
          <listitem>
            <para>Client calls StartSystemRestore.</para>
          </listitem>
          <listitem>
            <para>Device service responds with upload URI.</para>
          </listitem>
          <listitem>
            <para>Client transmits the configuration data to the upload URI using HTTP POST.</para>
          </listitem>
          <listitem>
            <para>Server applies the uploaded configuration, then reboots if necessary.</para>
          </listitem>
        </orderedlist>
        <para>If the system restore fails because the uploaded file was invalid, the HTTP POST response shall be “415 Unsupported Media Type”. If the system restore fails due to an error at the device, the HTTP POST response shall be “500 Internal Server Error”.</para>
        <para>The value of the Content-Type header in the HTTP POST request shall be “application/octet-stream”.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">UploadUri [xs:anyURI]</para>
              <para role="text">A URL to which the system configuration file may be uploaded.</para>
              <para role="param">ExpectedDownTime - optional [xs:duration]</para>
              <para role="text">An optional duration that indicates how long the device expects to be unavailable after the upload is complete.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No command-specific faults.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">UNRECOVERABLE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetSystemDateAndTime</title>
        <para>This operation gets the device system date and time. The device shall support the return of the daylight saving setting and of the manual system date and time (if applicable) or indication of NTP time (if applicable) through the GetSystemDateAndTime command.</para>
        <para>A device shall provide the UTCDateTime information although the item is marked as optional to ensure backward compatibility.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">DateTimeType [tt:SetDateTimeType]</para>
              <para role="text">If the system time and date are set manually or by NTP</para>
              <para role="param">DayLightSavings [xs:boolean]</para>
              <para role="text">“DaylightSavings”: Daylight savings on or off</para>
              <para role="param">TimeZone - optional [tt:TimeZone]</para>
              <para role="text">The time zone as it is defined in POSIX 1003.1 section 8.3</para>
              <para role="param">UTCDateTime - optional [tt:DateTime]</para>
              <para role="text">The time and date in UTC.</para>
              <para role="param">LocalDateTime - optional [tt:DateTime]</para>
              <para role="text">The local time and date of the device</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">PRE_AUTH</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetSystemDateAndTime</title>
        <para>This operation sets the device system date and time. The device shall support the configuration of the daylight saving setting and of the manual system date and time (if applicable) or indication of NTP time (if applicable) through the SetSystemDateAndTime command. A device shall consider a Timezone which is not formed according to the rules of [IEEE 1003.1] section 8.3 as invalid.</para>
        <para>The DayLightSavings flag should be set to true to activate any DST settings of the TimeZone string. Clear the DayLightSavings flag if the DST portion of the TimeZone settings should be ignored.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">DateTimeType [tt:SetDateTimeType]</para>
              <para role="text">If the system time and date are set manually or by NTP</para>
              <para role="param">DayLightSavings [xs:boolean]</para>
              <para role="text">“DaylightSavings”: Automatically adjust Daylight savings if defined in TimeZone.</para>
              <para role="param">TimeZone - optional [tt:TimeZone]</para>
              <para role="text">The time zone is defined in POSIX 1003.1 section 8.3</para>
              <para role="param">UTCDateTime - optional [tt:DateTime]</para>
              <para role="text">The time and date in UTC. If DateTimeType is NTP, UTCDateTime has no meaning.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidTimeZone</para>
              <para role="text">An invalid time zone was specified.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidDateTime</para>
              <para role="text">An invalid date or time was specified.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NtpServerUndefined</para>
              <para role="text">Cannot switch DateTimeType to NTP because no NTP server is defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetSystemFactoryDefault</title>
        <para>This operation reloads parameters of a device to their factory default values. The device shall support hard and soft factory default through the SetSystemFactoryDefault command.</para> 
        <variablelist>
          <varlistentry>
            <term>Hard</term>
            <listitem><para>All parameters are set to their factory default value.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>Soft</term>
            <listitem><para>The meaning of soft factory default is device product-specific and vendor-specific. The effect of a soft factory default operation is not fully defined. However, it shall be guaranteed that after a soft reset the device is reachable on the same IP address as used before the reset. This means that basic network settings like IP address, subnet and gateway or DHCP settings are kept unchanged by the soft reset.</para></listitem>
          </varlistentry>
        </variablelist>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">FactoryDefault [tt:FactoryDefaultType]</para>
              <para role="text">Mode Hard or Soft.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">UNRECOVERABLE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>StartFirmwareUpgrade</title>
        <para>This operation initiates a firmware upgrade using the HTTP POST mechanism. The response to the command includes an HTTP URL to which the upgrade file may be uploaded. The actual upgrade takes place as soon as the HTTP POST operation has completed. The device should support firmware upgrade through the StartFirmwareUpgrade command. The exact format of the firmware data is outside the scope of this specification.</para>
        <para>Firmware upgrade over HTTP may be achieved using the following steps:</para>
        <orderedlist>
          <listitem>
            <para>Client calls StartFirmwareUpgrade.</para>
          </listitem>
          <listitem>
            <para>Device service responds with upload URI and optional delay value.</para>
          </listitem>
          <listitem>
            <para>Client waits for delay duration if specified by server.</para>
          </listitem>
          <listitem>
            <para>Client transmits the firmware image to the upload URI using HTTP POST.</para>
          </listitem>
          <listitem>
            <para>Server reprograms itself using the uploaded image, then reboots.</para>
          </listitem>
        </orderedlist>
        <para>If the firmware upgrade fails because the upgrade file was invalid, the HTTP POST response shall be “415 Unsupported Media Type”. If the firmware upgrade fails due to an error at the device, the HTTP POST response shall be “500 Internal Server Error”.</para>
        <para>The value of the Content-Type header in the HTTP POST request shall be “application/octet-stream”.</para>
        <para>After applying a firmware upgrade the device shall keep the basic network configuration like IP address, subnet mask and gateway or DHCP settings unchanged. Additionally a firmware upgrade shall not change user credentials.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">UploadUri [xs:anyURI]</para>
              <para role="text">A URL to which the firmware file may be uploaded.</para>
              <para role="param">UploadDelay [xs:duration]</para>
              <para role="text">An optional delay; the client shall wait for this amount of time before initiating the firmware upload.</para>
              <para role="param">ExpectedDownTime [xs:duration]</para>
              <para role="text">A duration that indicates how long the device expects to be unavailable after the firmware upload is complete.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No command-specific faults.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">UNRECOVERABLE</para>
            </listitem>
          </varlistentry>
        </variablelist>
        <para xml:id="_Ref276040029">In case it is not possible to provide exact figures for either UploadDelay or ExpectedDownTime, the device shall provide best-effort estimates.</para>
      </section>
      <section>
        <title>UpgradeFirmware</title>
        <para>This operation initiates a firmware upgrade using between the device and the MCS,
          without further actions from the client.</para>
        <para>Cloud firmware upgrade  may be achieved using the following steps:</para>
        <orderedlist>
          <listitem>
            <para>Client retrieves the list of available firmware versions from the MCS.</para>
          </listitem>
          <listitem>
            <para>Client calls StartCloudFirmwareUpgrade, selecting the desired FW version.</para>
          </listitem>
          <listitem>
            <para>Device service responds with a downtime value.</para>
          </listitem>
          <listitem>
            <para>Device and MCS perform the firmware upgrade procedure without further interaction
              from the Client</para>
          </listitem>
          <listitem>
            <para>Device notifies the Client of the result by emitting the appropriate
              CloudFirmwareUpgrade event</para>
          </listitem>
        </orderedlist>
        <para>After applying a firmware upgrade the device shall keep the basic network
          configuration like IP address, subnet mask and gateway or DHCP settings, as well as all
          the parameters of the Uplink and Security service unchanged, so that it can connect to the
          cloud. Additionally a firmware upgrade shall not change user credentials.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">Version [xs:string]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">ExpectedDownTime [xs:duration]</para>
              <para role="text">A duration that indicates how long the device expects to be unavailable after the firmware upload is complete.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No command-specific faults.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">UNRECOVERABLE</para>
            </listitem>
          </varlistentry>
        </variablelist>
        <para xml:id="_Ref276040030">In case it is not possible to provide exact figures for
          ExpectedDownTime, the device shall provide best-effort estimates.</para>
      </section>
      <section xml:id="_Ref482093370">
        <title>GetSystemLog</title>
        <para>This operation gets a system log from a device. The device should support system log information retrieval through the GetSystemLog command. The exact format of the system logs is <emphasis>outside the scope </emphasis>of this standard.</para>
        <para>The system log information is transmitted through MTOM [MTOM] or as a string.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">LogType [tt:SystemLogType]</para>
              <para role="text">System (the system log) or Access (the client access log)</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Binary - optional [tt:AttachmentData]</para>
              <para role="text">Binary encoded response.</para>
              <para role="param">String - optional [xs:string]</para>
              <para role="text">UTF-8 encoded information.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgs - ter:AccesslogUnavailable</para>
              <para role="text">There is no access log information available</para>
              <para role="param">env:Sender - ter:InvalidArgs - ter:SystemlogUnavailable</para>
              <para role="text">There is no system log information available</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetSystemSupportInformation</title>
        <para>This operation gets arbitrary device diagnostics information from a device. The device may support retrieval of diagnostics information through the GetSystemSupportInformation command. The exact format of the diagnostic information is <emphasis>outside the scope </emphasis>of this standard.</para>
        <para>The diagnostics information is transmitted as an attachment through MTOM [MTOM] or as string.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">BinaryFormat - optional [tt:AttachmentData]</para>
              <para role="text">The message contains the support information. The device can choose if it wants to return the support information as binary data or as a common string.
</para>
              <para role="param">StringFormat - optional [xs:string]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgs - ter:SupportInformation- - Unavailable</para>
              <para role="text">There is no support information available.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SystemReboot</title>
        <para>This operation reboots a device. Before the device reboots the response message shall be sent. The device shall support reboot through the SystemReboot command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Message xs:string</para>
              <para>This message contains a “Message” string allowing the device to report back a message to the client as for an example “Rebooting in x seconds.”</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults!</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">UNRECOVERABLE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetScopes</title>
        <para>This operation <emphasis>requests</emphasis> the scope parameters of a device. The scope parameters are used in the device discovery to match a probe message, see Section <xref linkend="_Ref199745942" />. The Scope parameters are of two different types:</para>
        <itemizedlist>
          <listitem>
            <para>Fixed</para>
          </listitem>
          <listitem>
            <para>Configurable</para>
          </listitem>
        </itemizedlist>
        <para>Fixed scope parameters are permanent device characteristics and cannot be removed through the device management interface. The scope type is indicated in the scope list returned in the get scope parameters response. A device shall support retrieval of discovery scope parameters through the GetScopes command. As some scope parameters are mandatory, the device shall return a non-empty scope list in the response.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Scopes - unbounded [tt:Scope]</para>
              <para role="text">The scope response message contains a list of URIs defining the device scopes. See also Section  for the ONVIF scope definitions.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:Action - ter:EmptyScope</para>
              <para role="text">Scope list is empty.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetScopes</title>
        <para>This operation <emphasis>sets</emphasis> the scope parameters of a device. The scope parameters are used in the device discovery to match a probe message, see Section <xref linkend="_Ref199745942" />.</para>
        <para>This operation <emphasis>replaces </emphasis>all existing configurable scope parameters (not fixed parameters). If this shall be avoided, one should use the scope add command instead. The device shall support configuration of discovery scope parameters through the SetScopes command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Scopes - unbounded [Xs:anyURI]</para>
              <para role="text">The set scope contains a list of URIs defining the device scope. See also Section . 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:Action - ter:TooManyScopes</para>
              <para role="text">The requested scope list exceeds the supported number of scopes.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>AddScopes</title>
        <para>This operation <emphasis>adds</emphasis> new configurable scope parameters to a device. The scope parameters are used in the device discovery to match a probe message, see Section <xref linkend="_Ref199745942" />. The device shall support addition of discovery scope parameters through the AddScopes command. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">xs:anyURI:ScopeItem [1][unbounded]</para>
              <para role="text">The add scope contains a list of URIs to be added to the existing configurable scope list. See also Section .. 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:Action - ter:TooManyScopes</para>
              <para role="text">The requested scope list exceeds the supported number of scopes.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>RemoveScopes</title>
        <para>This operation <emphasis>deletes</emphasis> scope-configurable scope parameters from a device. The scope parameters are used in the device discovery to match a probe message, see Section <xref linkend="_Ref199745942" />. The device shall support deletion of discovery scope parameters through the RemoveScopes command.</para>
        <para>Note that the response message always will match the request or an error will be returned. The use of the response is for that reason deprecated.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">ScopeItem - unbounded [xs:anyURI]</para>
              <para role="text">The remove scope contains a list of URIs that should be removed from the device scope.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">ScopeItem - optional, unbounded [xs:anyURI]</para>
              <para role="text">The scope response message contains a list of URIs that has been Removed from the device scope. 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:OperationProhibited - ter:FixedScope</para>
              <para role="text">Trying to Remove fixed scope parameter, command rejected.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoScope</para>
              <para role="text">Trying to Remove scope which does not exist.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetDiscoveryMode</title>
        <para>This operation gets the discovery mode of a device. See Section <xref linkend="_Toc204774611" /> for the definition of the different device discovery modes. The device shall support retrieval of the discovery mode setting through the GetDiscoveryMode command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">DiscoveryMode [tt:DiscoveryMode]</para>
              <para role="text">This message contains the current discovery mode setting, i.e. discoverable or non-discoverable.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907675">
        <title>SetDiscoveryMode</title>
        <para>This operation sets the discovery mode operation of a device. See Section <xref
            linkend="_Toc204774611"/> for the definition of the different device discovery modes. A
          device shall support configuration of the discovery mode setting through the
          SetDiscoveryMode command unless it signals DiscoveryNotSupported via its capabilities.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">DiscoveryMode [tt:DiscoveryMode]</para>
              <para role="text">This message contains the requested discovery mode setting, i.e. discoverable or non-discoverable.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc214944223">
        <title>GetGeoLocation</title>
        <para>This operation gets the geo location information of a device. A device that signals support for GeoLocation via the capability GeoLocationEntities shall support the retrieval of geo location information via this command.</para>
        <para>The command shall return all location information. Each location entity consists of the following set of optional fields:</para>
        <variablelist>
          <varlistentry>
            <term>GeoPosition</term>
            <listitem><para>lon,lat according to [WGS1984] and altitude in meters.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>GeoOrientation</term>
            <listitem><para>roll, pitch and yaw angles in degree.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>LocalOffset</term>
            <listitem><para>indoor position in meters</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>LocalOrientation</term>
            <listitem><para>indoor orientation angles for pan, tilt and roll in degree.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>Entity</term>
            <listitem><para>Attribute specifying whether the values above define the location of the device, a VideoSource or other entity.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>Token</term>
            <listitem><para>Optional attribute referencing the individual entity.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>Fixed</term>
            <listitem><para>Attribute signaling that the entity cannot be deleted. </para></listitem>
          </varlistentry>
          <varlistentry>
            <term>GeoSource</term>
            <listitem><para>Optional external reference that provides the geo location.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term>AutoGeo</term>
            <listitem><para>The Geo location information is retrieved internally e.g. by a GPS receiver. </para></listitem>
          </varlistentry>
        </variablelist>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Location - optional, unbounded [tt:LocationEntity]</para>
              <para role="text">This message contains all geo location information stored in the device.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907677">
        <title>SetGeoLocation</title>
        <para>This operation allows to modify one or more geo location entries. A device that signals support for GeoLocation via the GeoLocationEntities capabiliy shall support modifying geo location information via this command. </para>
        <para>The method allows to update one or more entries at once. The method shall modify only those entries that are referenced by the request arguments. A device shall create a new entry in case the combination of type and token does not yet exist. A device shall remove any of the location and orientations components in case they are not passed in the request.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Location - unbounded [tt:LocationEntity]</para>
              <para role="text">This message contains one or more geo location entries to be stored.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:Action - ter:TooManyEntries</para>
              <para role="text">The requested geo location list exceeds the supported number of entries.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoAutoGeo</para>
              <para role="text">The device does not support automatic retrieval of geo information.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
        <para>If the AutoGeo attribute is set to true and the device is signaling support for <emphasis role="bold">Location</emphasis> in the AutoGeo capability then the device shall ignore the GeoLocation information provided in the request. If the AutoGeo attribute is set to true and the device is signaling support for <emphasis role="bold">Heading</emphasis> in the AutoGeo capability then the device shall ignore the GeoOrientation.yaw information provided in the request. If the AutoGeo attribute is set to true and the device is signaling support for <emphasis role="bold">Leveling</emphasis> in the AutoGeo capability then the device shall ignore the GeoOrientation.roll and GeoOrientation.pitch information provided in the request. Beyond this a device shall return in a subsequent GetGeoLocation command all entity elements as passed to SetGeoLocation.</para>
        <para>A device signaling support AutoGeo via the AutoGeo capability shall support the attribute.</para>
      </section>
      <section xml:id="_Toc443466320">
        <title>DeleteGeoLocation</title>
        <para>This operation allows to remove one or more geo location entries. A device that signals support for GeoLocation via its capabilities shall support the remove of geo location information via this command.</para>
        <para>A device shall delete an entity based on the passed fields type and token.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Entity - unbounded [tt:LocationEntity]</para>
              <para role="text">This message contains one or more geo location entries to be removed.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoConfig</para>
              <para role="text">The requested entry does not exist.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:Fixed</para>
              <para role="text">Cannot delete a fixed entity.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
    </section>
    <section xml:id="_Ref474427788">
      <title>Security</title>
      <para>This section contains a set of security management operations. Such operations are sensitive to network attacks and shall be protected using appropriate authorization levels in order not to compromise the device.</para>
      <section xml:id="_Toc213907681">
        <title>Get access policy</title>
        <para>Access to different services and sub-sets of services should be subject to access control. Section <xref linkend="_Ref208379139" /> gives the prerequisite for end-point authentication. Authorization decisions can then be taken using an <emphasis>access security policy. </emphasis>This standard does not mandate any particular policy description format or security policy but this is up to the device manufacturer or system provider to choose policy and policy description format of choice. However, an access policy (in arbitrary format) can be requested using this command. If the device supports access policy settings, then the device shall support this command. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">PolicyFile [tt:BinaryData]</para>
              <para role="text">This message contains the requested policy file.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:Action - ter:EmptyPolicy</para>
              <para role="text">The device policy file does not exist or it is empty.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907682">
        <title>Set access policy</title>
        <para>This command sets the device access security policy (for more details on the access security policy see the Get command, Section <xref linkend="_Toc213907681" />). If the device supports access policy settings based on WS-Security authentication, then the device shall support this command. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">PolicyFile [tt:BinaryData]</para>
              <para role="text">This message contains the policy file to set.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgs - ter:PolicyFormat</para>
              <para role="text">The requested policy cannot be set due to unknown policy format.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Get users</title>
        <para>This operation lists the registered users and along with their user levels. A device shall support this command unless support signalled via the UserConfigNotSupported capability is ‘True’. The device shall support retrieval of registered device users through the GetUsers command.</para>
        <para>Furthermore a device shall not return the credentials (password) in the reply.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">User - optional, unbounded [tt:User]</para>
              <para role="text">List of users and corresponding credentials. Each entry includes user name and level. Note, that the password shall not be included.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Create users</title>
        <para>This operation creates new device users and corresponding credentials on a device for authentication, see Section <xref linkend="_Ref208379139" /> for details.  A device shall support this command unless support is signalled via the UserConfigNotSupported capability is ‘True’. The device shall support creation of device users and their credentials for authentication through the CreateUsers command as long as the number of existing users does not exceed the capability value MaxUsers. Either all users are created successfully or a fault message shall be returned without creating any user.</para>
        <para>ONVIF compliant devices are recommended to support password length of at least 28 bytes.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">User - unbounded [tt:User]</para>
              <para role="text">User information for users to be created including name, level and password.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:OperationProhibited - ter:UsernameClash</para>
              <para role="text">Username already exists.</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:PasswordTooLong</para>
              <para role="text">The password is too long</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:UsernameTooLong</para>
              <para role="text">The username is too long</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:Password</para>
              <para role="text">Too weak password.</para>
              <para role="param">env:Receiver - ter:Action - ter:TooManyUsers</para>
              <para role="text">Maximum number of supported users exceeded.</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:AnonymousNotAllowed</para>
              <para role="text">User level anonymous is not allowed.</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:UsernameTooShort</para>
              <para role="text">The username is too short</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Delete users</title>
        <para>This operation deletes users on a device.  A device shall support this command unless support signalled via the UserConfigNotSupported capability is ‘True’. The device shall support deletion of device users and their credentials for authentication through the DeleteUsers command. A device may have one or more fixed users that cannot be deleted to ensure access to the unit. Either all users are deleted successfully or a fault message shall be returned and no users be deleted.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Username - unbounded [xs:string]</para>
              <para role="text">This message contains the name of the user or users to be deleted.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:UsernameMissing</para>
              <para role="text">Username not recognized.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:FixedUser</para>
              <para role="text">Username may not be deleted</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Ref1614781086">
        <title>SetUser</title>
        <para>This operation updates the settings for one or several users on a device for authentication, see Sect. <xref linkend="_Ref208379139" /> for details. The device shall support update of device users and their credentials through the SetUser command.  A device shall support this command unless support signalled via the UserConfigNotSupported capability is ‘True’. Either all change requests are processed successfully or a fault message shall be returned and no change requests be processed.</para>
        <para>In case the optional password value is omitted the device will consider to clear the password. If the device can not accept the password of zero length, the fault message of "ter:PasswordTooWeak" will be returned.</para>
        <para>If the device signals support for "ModifyPassword" in the SecurityPolicies capability, an authorized user shall be entitled to change his own password independently of the default access policy. In this case a device shall ignore the UserLevel field for any client not fulfilling access class WRITE_SYSTEM.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">User - unbounded [tt:User]</para>
              <para role="text">User information for users to be updated including name, level and password.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:UsernameMissing</para>
              <para role="text">Username not recognized.</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:PasswordTooLong</para>
              <para role="text">The password is too long</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:PasswordTooWeak</para>
              <para role="text">Too weak password.</para>
              <para role="param">env:Sender - ter:OperationProhibited - ter:AnonymousNotAllowed</para>
              <para role="text">User level anonymous is not allowed.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:FixedUser</para>
              <para role="text">Password or User level may not be changed.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc251861725">
        <title>GetRemoteUser</title>
        <para>This operation returns the configured remote user (if any). A device that signals support for remote user handling via the Security Capability RemoteUserHandling shall support this operation. The user is only valid for the WS-UserToken profile or as an HTTP / RTSP user.</para>
        <para>Password derivation is outside of the scope of this specification.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">RemoteUser - optional [tt:RemoteUser]</para>
              <para role="text">Optional information regarding remote user. </para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:ActionNotSupported - ter:NotRemoteUser</para>
              <para role="text">Remote User handling is not supported</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Ref247076107">
        <title>SetRemoteUser</title>
        <para>This operation sets the remote user. A device that signals support for remote user handling via the Security Capability RemoteUserHandling shall support this operation. Password derivation is outside of the scope of this specification.</para>
        <para>To remove the remote user SetRemoteUser should be called without the <emphasis role="bold">RemoteUser</emphasis> parameter.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">RemoteUser - optional [tt:RemoteUser]</para>
              <para role="text">Name, password information.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:ActionNotSupported - ter:NotRemoteUser</para>
              <para role="text">Remote User handling not supported</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Get endpoint reference</title>
        <para>A client can ask for the device service endpoint reference address property that can be used to derive the password equivalent for remote user operation. The device should support the GetEndpointReference command returning the address property of the device service endpoint reference.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">GUID [xs:string]</para>
              <para role="text">The requested URL.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">PRE_AUTH</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Ref443486820">
        <title>User roles</title>
        <para>A device that signals support for user roles handling via the Security Capability
          MaxUserRoles shall support these operations.</para>
        <section>
          <title>Get user roles</title>
          <para>This operation returns the user roles configured in the device, including the
            pre-defined onvif ones <emphasis>onvif:Administrator</emphasis>,
              <emphasis>onvif:Operator</emphasis> and <emphasis>onvif:User</emphasis> corresponding
            to the Administrator, Operator and User levels. For the predefined roles, the functions
            list is empty because it is implicetly derived the device access policy. Whenever the
            name of a user role is passed in the request, information only about that level is
            returned.</para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">Name - optional [xs:string]</para>
                <para role="text">If a value is defined for Name, then only the information for the
                  user role matching that name is returned.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="param">UserRoles - optional unbounded [tt:UserRole]</para>
                <para role="text">Information about one or more user roles. </para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidUserRole</para>
                <para role="text">The specified user role does not exist.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">READ_SYSTEM</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </section>
        <section>
          <title>Set user role</title>
          <para>This operation configures a user role in the device. If the name passed in the
            UserRole argument already exists in the device, its configuration will be overwritten.
            Otherwise, a new role will be created.</para>
          <para>A client is expected to use the capabilities of the device to request only functions
            that are implemented in the device. In case a client requests an unknown or not
            implemented function, the device must return an error.</para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">UserRole - [tt:UserRole]</para>
                <para role="text">The user role to be created or overwritten.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="text">This is an empty message.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param>">env:Receiver - ter:Action - ter:TooManyUserRoles</para>
                <para role="text">Maximum number of supported user roles exceeded.</para>
                <para role="param>">env:Receiver - ter:Action - ter:FunctionNotImplemented</para>
                <para role="text">One or more requested functions are not implemented in the
                  device.</para>
                <para role="param">env:Sender - ter:OperationProhibited  - ter:OnvifPrefix</para>
                <para role="text">The client cannot create or edit roles starting with the onvif:
                  prefix.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">WRITE_SYSTEM</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </section>
        <section>
          <title>Delete user role</title>
          <para>This operation deletes a user role in the device. </para>
          <variablelist role="op">
            <varlistentry>
              <term>request</term>
              <listitem>
                <para role="param">Name - [xs:string]</para>
                <para role="text">The user role that has to be deleted.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>response</term>
              <listitem>
                <para role="text">This is an empty message.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>faults</term>
              <listitem>
                <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidUserRole</para>
                <para role="text">The specified user role does not exist.</para>
                <para role="param">env:Sender - ter:OperationProhibited - ter:OnvifPrefix</para>
                <para role="text">The client delete roles starting with the onvif: prefix.</para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>access class</term>
              <listitem>
                <para role="access">WRITE_SYSTEM</para>
              </listitem>
            </varlistentry>
          </variablelist>
        </section>
      </section>
    </section>
    <section xml:id="_Ref1614781087">
      <title>Security Policies</title>
      <para>This section describes a set of commands that can be used by the administrators to enforce some security policies. 
      If the device supports any of these policies, it can be signaled through the capabilities described in section <xref linkend="_Ref468447902"/>
      The operations for the configuration of the following policies are described:</para>
        <itemizedlist>
          <listitem>
            <para>Password complexity: a configurable set of rules that a password must respect in order to increase its strength.
	    These rules are summarized as follows:</para>
            <para><emphasis>Minimum length:</emphasis> this rule can be used to prevent the use of passwords that are too short.</para>
            <para><emphasis>Number, uppercase, special characters:</emphasis> all this rules can be used to impose non-trivial passwords.</para>
            <para><emphasis>Block username Occurrence:</emphasis> this rule prevents using the username in the password, to avoid passwords that are easily predictable.</para>
            <para><emphasis>Policy Configuration Lock:</emphasis> this is a lock to prevent changes in the security policies once they are set. If this lock is active, the policies are reset only through a device hard reset.</para>
          </listitem>
          <listitem>
            <para>Password history: the device prevents the reuse of a recently used password.</para>
          </listitem>
          <listitem>
            <para>Authentication Failure Warning: the device monitors the number of authentication failures in a period of time to detect intrusion attempts performed by an attacker.</para>
            <para>If the number of failed attempts in the MonitorPeriod is greater than MaxAuthFailures the device will emit the following event:</para>
          </listitem>
        </itemizedlist>
            <programlisting><![CDATA[Topic: tns1:Device/SecurityPolicy/AuthFailed
<tt:MessageDescription>
  <tt:Source>
    <tt:SimpleItemDescription Name="NetworkInterface" Type="tt:ReferenceToken"/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription minOccurs=”0” Name="SourceIPv4" Type="tt:IPv4Address"/>
    <tt:SimpleItemDescription minOccurs=”0” Name="SourceIPv6" Type="tt:IPv6Address"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      <section>
        <title>GetPasswordComplexityOptions</title>
        <para>If a device signals support for "PasswordComplexity" in the SecurityPolicies capability, it shall support this operation to retrieve all the available parameters and their valid ranges for the Password Complexity configuration.</para>
        <para>If any of the optional parameters is not specified, the corresponding rule is not supported.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">MinLenRange - optional [tt:IntRange]</para>
              <para role="text">Range for "MinLen" rule [1, MaxPasswordLength]</para>
              <para role="param">UppercaseRange - optional [tt:IntRange]</para>
              <para role="text">Range for "Uppercase" rule [0, MaxPasswordLength]</para>
              <para role="param">NumberRange - optional [tt:IntRange]</para>
              <para role="text">Range for "Number" rule [0, MaxPasswordLength]</para>
              <para role="param">SpecialCharsRange - optional [tt:IntRange]</para>
              <para role="text">Range for "SpecialChars" rule [0, MaxPasswordLength]</para>
              <para role="param">BlockUsernameOccurrenceSupported [xs:boolean]</para>
              <para role="text">Signals if the device supports the "Block Username Occurrence" rule</para>
              <para role="param">PolicyConfigurationLockSupported [xs:boolean]</para>
              <para role="text">Signals if the devices supports the locking of the security policy configuration</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>

      <section>
        <title>GetPasswordComplexityConfiguration</title>
        <para>If a device signals support for "PasswordComplexity" in the SecurityPolicies capability, it shall support this operation to get the current password complexity configuration settings.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">MinLen - optional [xs:integer]</para>
              <para role="text">Minimum password length</para>
              <para role="param">Uppercase - optional [xs:integer]</para>
              <para role="text">Minimum number of uppercase characters</para>
              <para role="param">Number - optional [xs:integer]</para>
              <para role="text">Minimum number of numeric characters</para>
              <para role="param">SpecialChars - optional [xs:integer]</para>
              <para role="text">Minimum number of non-alphanumeric characters</para>
              <para role="param">BlockUsernameOccurrence - optional [xs:boolean]</para>
              <para role="text">Blocks the use of the username in the password</para>
              <para role="param">PolicyConfigurationLocked - optional [xs:boolean]</para>
              <para role="text">Prevents future updates of the configuration until the next factory default</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      
      <section>
        <title>SetPasswordComplexityConfiguration</title>
        <para>If a device signals support for "PasswordComplexity" in the SecurityPolicies capability, it shall support this operation to set the password policy configuration. If LockPasswordPolicy is supported and is set to true, the current configuration will be locked and will be unlocked only via factory default reset.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">MinLen - optional [xs:integer]</para>
              <para role="text">Minimum password length</para>
              <para role="param">Uppercase - optional [xs:integer]</para>
              <para role="text">Minimum number of uppercase characters</para>
              <para role="param">Number - optional [xs:integer]</para>
              <para role="text">Minimum number of numeric characters</para>
              <para role="param">SpecialChars - optional [xs:integer]</para>
              <para role="text">Minimum number of non-alphanumeric characters</para>
              <para role="param">BlockUsernameOccurrence - optional [xs:boolean]</para>
              <para role="text">Blocks the use of the username in the password</para>
              <para role="param">PolicyConfigurationLocked - optional [xs:boolean]</para>
              <para role="text">Prevents future updates of the configuration until the next factory default</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:Argument Value Invalid</para>
              <para role="text">The requested configuration is not allowed</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
        
      <section>
        <title>GetPasswordHistoryConfiguration</title>
        <para>If the capability MaxPasswordHistory is signaled and is greater than zero, the device shall support this operation to get the current password history settings.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Enabled [xs:boolean]</para>
              <para role="text">If true the password history is enabled</para>
              <para role="param">Length [xs:integer]</para>
              <para role="text">The length of the password history, [1, MaxPasswordHistory]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      
      <section>
        <title>SetPasswordHistoryConfiguration</title>
        <para>If the capability MaxPasswordHistory is signaled and is greater than zero, the device shall support this operation to set the password history configuration.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Enabled [xs:boolean]</para>
              <para role="text">Used to enable/disable the password history</para>
              <para role="param">Length [xs:integer]</para>
              <para role="text">The length of the password history, [1, MaxPasswordHistory]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:Argument Value Invalid</para>
              <para role="text">The requested configuration is not allowed</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      
      <section>
        <title>GetAuthFailureWarningOptions</title>
        <para>If a device signals support for "AuthFailureWarnings" in the SecurityPolicies capability, it shall support this operation to retrieve all the available parameters and their valid ranges.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">MonitorPeriodRange [tt:IntRange]</para>
              <para role="text">Range for "MonitorPeriod", expressed in seconds</para>
              <para role="param">AuthFailureRange [tt:IntRange]</para>
              <para role="text">Range for "MaxAuthFailures", number of allowed authentication failures</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetAuthFailureWarningConfiguration</title>
        <para>If a device signals support for "AuthFailureWarnings" in the SecurityPolicies capability, it  
        shall support this operation to get the current authentication failure warning settings.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Enabled [xs:boolean]</para>
              <para role="text">Indicates if the authentication failure warning is enabled or disabled</para>
              <para role="param">MonitorPeriod [xs:integer]</para>
              <para role="text">The amount of seconds that will be monitored after the first authentication failure</para>
              <para role="param">MaxAuthFailures [xs:integer]</para>
              <para role="text">Maximum number allowed of authentication failures before reporting the intrusion attempt</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      
      <section>
        <title>SetAuthFailureWarningConfiguration</title>
        <para>If a device signals support for "AuthFailureWarnings" in the SecurityPolicies capability, it 
        shall support this operation to set the authentication failure warning configuration.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Enabled [xs:boolean]</para>
              <para role="text">Used to enable/disable the authentication failure warning</para>
              <para role="param">MonitorPeriod [xs:integer]</para>
              <para role="text">The amount of seconds that will be monitored after the first authentication failure</para>
              <para role="param">MaxAuthFailures [xs:integer]</para>
              <para role="text">Maximum number allowed of authentication failures before reporting the intrusion attempt</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:Argument Value Invalid</para>
              <para role="text">The requested configuration is not allowed</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      
    </section>
    <section>
      <title>Input/Output (I/O)</title>
      <para>The commands in this section are kept for backward compatibility purposes. For a more extensive IO interface please refer to the ONVIF Device IO Specification.</para>
      <para>The Input/Output (I/O) commands are used to control the state or observe the status of the I/O ports. If the device has I/O ports, then it shall support the I/O commands.</para>
      <section>
        <title>GetRelayOutputs</title>
        <para>This operation gets a list of all available relay outputs and their settings.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">RelayOutputs - optional, unbounded [tt:RelayOutput]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">No command specific faults defined.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetRelayOutputSettings</title>
        <para>This operation sets the settings of a relay output.</para>
        <para>The relay can work in two relay modes:</para>
        <itemizedlist>
          <listitem>
            <para>Bistable – After setting the state, the relay remains in this state.</para>
          </listitem>
          <listitem>
            <para>Monostable – After setting the state, the relay returns to its idle state after the specified time.</para>
          </listitem>
        </itemizedlist>
        <para>The physical idle state of a relay output can be configured by setting the IdleState to ‘open’ or ‘closed’ (inversion of the relay behaviour). </para>
        <para>Idle State ‘open’ means that the relay is open when the relay state is set to ‘inactive’ through the trigger command (see Section <xref linkend="_Toc213907698" />) and closed when the state is set to ‘active’ through the same command.</para>
        <para>Idle State ‘closed’ means that the relay is closed when the relay state is set to ‘inactive’ through the trigger command (see Section <xref linkend="_Toc213907698" />) and open when the state is set to ‘active’ through the same command.</para>
        <para>The Duration parameter of the Properties field “DelayTime” describes the time after which the relay returns to its idle state if it is in monostable mode. If the relay is set to bistable mode the value of the parameter shall be ignored.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">RelayOutputToken [tt:ReferenceToken]</para>
              <para role="text">Token reference to the requested relay output.</para>
              <para role="param">RelayOutputSettings [tt:RelayOutputSettings]</para>
              <para role="text">The settings of the relay.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:RelayToken</para>
              <para role="text">Unknown relay token reference.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:ModeError</para>
              <para role="text">Monostable delay time not valid</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Toc213907698">
        <title>SetRelayOutputState</title>
        <para>This operation triggers a relay output<footnote xml:id="__FN3__"><para>There is no GetRelayState command; the current logical state of the relay output is transmitted via notification and their properties.</para></footnote>.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">RelayOutputToken [tt:ReferenceToken]</para>
              <para role="text">Token reference to the requested relay output.</para>
              <para role="param">LogicalState [RelayLogicalState]</para>
              <para role="text">Trigger request, i.e., active or inactive.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:RelayToken</para>
              <para role="text">Unknown relay token reference.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
    </section>
    <section>
      <title>SendAuxiliaryCommand</title>
      <para>This section describes operations to manage auxiliary commands supported by a device, such as controlling an Infrared (IR) lamp, a heater or a wiper or a thermometer that is connected to the device.</para>
      <para>The commands supported by the device is reported in the AuxiliaryCommands attribute returned by the capabilities commands, see section <xref linkend="_Toc213907637" />. The command transmitted by using this command should match one of the commands supported by the device. If for example the capability command response lists only irlampon command, then the SendAuxiliaryCommand argument will be <emphasis>irlampon</emphasis>, which may indicate turning the connected IR lamp on.</para>
      <para>Although the name of the auxiliary commands can be freely defined, commands starting with the prefix tt: are reserved to define frequently used commands and these reserved commands shall all share the "tt:command|parameter" syntax. </para>
      <itemizedlist>
        <listitem>
          <para>tt:Wiper|On – Request to start the wiper.</para>
        </listitem>
        <listitem>
          <para>tt:Wiper|Off – Request to stop the wiper.</para>
        </listitem>
        <listitem>
          <para>tt:Washer|On – Request to start the washer.</para>
        </listitem>
        <listitem>
          <para>tt:Washer|Off – Request to stop the washer.</para>
        </listitem>
        <listitem>
          <para>tt:WashingProcedure|On – Request to start the washing procedure.</para>
        </listitem>
        <listitem>
          <para>tt:WashingProcedure|Off – Request to stop the washing procedure.</para>
        </listitem>
        <listitem>
          <para>tt:IRLamp|On – Request to turn ON an IR illuminator attached to the unit.</para>
        </listitem>
        <listitem>
          <para>tt:IRLamp|Off – Request to turn OFF an IR illuminator attached to the unit.</para>
        </listitem>
        <listitem>
          <para>tt:IRLamp|Auto – Request to configure an IR illuminator attached to the unit so that it automatically turns ON and OFF.</para>
        </listitem>
      </itemizedlist>
      <para>A device that indicates auxiliary service capability shall support this command.</para>
      <variablelist role="op">
        <varlistentry>
          <term>request</term>
          <listitem>
            <para role="param">AuxiliaryCommand [tt:AuxiliaryData]</para>
            <para role="text">This message contains the auxiliary command. 
</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>response</term>
          <listitem>
            <para role="param">AuxiliaryCommandResponse - optional [tt:AuxiliaryData]</para>
            <para role="text">The response contains the auxiliary response.
</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>faults</term>
          <listitem>
            <para role="param">env:Sender - ter:InvalidArgVal - ter:AuxiliaryDataNotSupported</para>
            <para role="text">The requested AuxiliaryCommand is not supported.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>access class</term>
          <listitem>
            <para role="access">ACTUATE</para>
          </listitem>
        </varlistentry>
      </variablelist>
    </section>
    <section xml:id="_Toc260402083">
      <title>Storage Configuration</title>
      <para>
        The following operations allows a client to configure the storage configuration data of a device.
      </para>
      <section>
        <title>Authentication</title>
        <para>
          Depending on the <literal>type</literal> provided in the <literal>StorageConfiguration</literal>, the device shall interpret fields in a special way:
        </para>
        <para>
          <variablelist>
            <varlistentry>
              <term>ObjectStorageS3</term>
              <listitem>
                <para>
                  The device shall use the contents of <literal>StorageUri</literal> as the base endpoint of the bucket.
                  This URI shall include the bucket name, either as a subdomain or in its path, depending on the format supported by the object storage.
                </para>
                <para>
                  The device shall use the contents of <literal>UserName</literal> as the access key ID for authenticating requests.
                </para>
                <para> 
                  The device shall use the contents of <literal>Password</literal> as the
                  secret access key for authenticating requests. </para>
                <para>
                  If required by S3 service provider, the device shall use the contents of <literal>Token</literal> as the STS token for authorizing requests.
                </para>
                <para>
                  The device shall use the contents of <literal>Region</literal> as the region for authenticating requests.
                  If <literal>Region</literal> is not configured, the device shall use <literal>us-east-1</literal> as the region.
                </para>
              </listitem>
            </varlistentry>
            <varlistentry>
              <term>ObjectStorageAzure</term>
              <listitem>
                <para>
                  The device shall use the contents of <literal>StorageUri</literal> as the base URI of the container.
                  This URI shall include the account and container name.
                </para>
                <para>
                  The device shall ignore the contents of <literal>UserName</literal>.
                </para>
                <para>
                  The device shall use the contents of <literal>Password</literal> as the shared access signature for authenticating requests.
                </para>
              </listitem>
            </varlistentry>
          </variablelist>
        </para>
      </section>
      <section>
        <title>Configuration Renewal</title>
        <para> The configuration allows for a renewal endpoint to be set.</para>
        <para>
          The device shall do a GET request to the configured <literal>RenewalEndpoint</literal> with the access token retrieved from the configured 
          <literal>AuthorizationServer</literal>. The endpoint shall respond with a JSON payload with the following structure:
          <programlisting><![CDATA[{
    "region": "string" | null,
    "storageUri": "string" | null,
    "user": {
        "username": "string" | null,
        "password": "string" | null,
        "token": "string" | null
    },
    "expiresAt": "<ISO 8601 date-time>"
}]]></programlisting>
          Any null value in the response shall clear the corresponding optional parameter in the configuration used by the device.
        </para>
        <para> When the device receives a configuration with the
            <literal>ConfigurationRenewal</literal> set, it shall immediately contact the renewal
          endpoint to get up-to-date renewal configuration payload including credentials. The device
          may use the current credentials available in the configuration in the meantime to avoid
          service disruption. </para>
        <para> The device shall ensure to renew the configuration including credentials before the
          expiration provided by the <literal>expiresAt</literal> field. If the renewal endpoint
          fails to provide a valid response, the device shall continue to use the existing
          configuration and retry later using an exponential backoff strategy. </para>
      </section>
      <section>
        <title>GetStorageConfigurations</title>
        <para>This operation lists all existing storage configurations. A device indicating storage configuration capability shall support the listing of existing storage configurations through the GetStorageConfigurations command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">StorageConfigurations - optional, unbounded [tt:StorageConfiguration]</para>
              <para role="text">This message contains a list of existing storage configurations. If a device has no storage configuration, then the message shall return an empty list.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">No specific fault codes.</para>
              <para role="text">
              </para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>CreateStorageConfiguration</title>
        <para>This operation creates a new storage configuration. The configuration data shall be created in the device and shall be persistent (remains after a device reboots). A device indicating storage configuration capability shall support the creation of storage configurations as long as the number of existing storage configurations does not exceed the value of MaxStorageConfigurations capability.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">StorageConfigurationData [tt:StorageConfigurationData]</para>
              <para role="text">The request message specifies which configuration data shall be created 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">StorageConfigurationToken [tt:ReferenceToken]</para>
              <para role="text">This message contains unique token for the newly created Storage Configuration data 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:OperationProhibited - ter:MaxStorageConfigurations</para>
              <para role="text">The maximum number of supported storage configurations has been reached. </para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetStorageConfiguration</title>
        <para>This operation retrieves the Storage configuration when the storage configuration
          token is known. A device indicating storage configuration capability shall support
          retrieval of specific storage configuration through the GetStorageConfiguration command.
          Furthermore a device shall not return the credentials (password or access token) in the
          reply.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">StorageConfigurationToken [tt:ReferenceToken]</para>
              <para role="text">This message contains the token of the requested storage configuration.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">StorageConfiguration [tt:StorageConfiguration]</para>
              <para role="text">The message contains the requested storage configuration matching with the given token.
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoConfig</para>
              <para role="text">The requested storage configuration does not exist. </para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetStorageConfiguration</title>
        <para>This operation modifies an existing storage configuration. A device indicating storage configuration capability shall support the modification of storage configuration through the SetStorageConfiguration command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">StorageConfiguration [tt:StorageConfiguration]</para>
              <para role="text">This message contains the modified storage configuration. 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoConfig</para>
              <para role="text">The requested storage configuration does not exist.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:ConfigModify</para>
              <para role="text">The configuration parameters are not possible to set.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteStorageConfiguration</title>
        <para>This operation deletes a storage configuration. This change shall always be persistent. A device indicating storage configuration capability shall support the deletion of a storage configuration through the DeleteStorageConfiguration command.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">StorageConfigurationToken [tt:ReferenceToken]</para>
              <para role="text">This message contains an storage configuration token that indicates which storage configuration shall be deleted 
</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:NoConfig</para>
              <para role="text">The requested storage configuration does not exist.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
    </section>
    <section>
      <title>MonitoringEvents</title>
      <section>
        <title>Processor Usage</title>
        <para>If a device supports monitoring of processing unit usage, it should provide the processing unit usage monitoring event to inform a client about its current processing unit usage in percent. The value shall be the usage average over a time interval. It is recommended to use a time interval of five seconds to avoid flooding the event queue with excessive processing unit usage events.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/ProcessorUsage
<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name=”Token” Type=”tt:ReferenceToken”/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name="Value" Type="xs:float"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Link Status</title>
        <para>If a device supports monitoring of the Link Status, it should provide the Link Status monitoring event to inform a client about its current Link Status.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/LinkStatus
<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name="Token" Type="tt:ReferenceToken"/>
  </tt:Source>
  <tt:Data>
    <tt:ElementItemDescription Name="Link" Type="tt:NetworkInterfaceConnectionSetting"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Upload Status</title>
        <para>If a device supports monitoring of its upload firmware (upload of firmware or system information) it should provide the status in percent of an ongoing update using the Upload Status event</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/UploadStatus
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:float"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Operating Time</title>
        <para>The set of events defined in this section relates to operating time. A device supporting operation time events should provide the following events. A device shall report times specified in the following events as UTC using the 'Z' indicator.</para>
        <para>The following event should be generated with true value when the operating time limit is reached.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/OperatingTime/DefinedLimitReached
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when the devices MTBF default limit has been reached.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/OperatingTime/MeanTimeBetweenFailuresDefaultLimitReached
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when the devices MTBF operation limit has been reached.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/OperatingTime/MeanTimeBetweenFailuresOperationLimitReached
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies when the device has been reset to factory settings the last time.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/OperatingTime/LastReset
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:dateTime"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies when the device was last booted.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/OperatingTime/LastReboot
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:dateTime"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies when the device clock has been synchronized the last time either via an NTP message or via a SetSystemDateAndTime call.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/OperatingTime/LastClockSynchronization
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:dateTime"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies the last maintenance activity on the device. </para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/Maintenance/Last
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:dateTime"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies the next maintenance activity on the device. </para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/Maintenance/NextScheduled
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:dateTime"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies the when the last backup of the device configuration has been retrieved.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/Backup/Last
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:dateTime"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when the area of operation the device is certified for is not adhered to caused by outside influences.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/AreaOfOperation/OutsideCertifiedArea
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when the area of operation the device is configured for is not adhered to caused by outside influences.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/AreaOfOperation/OutsideConfiguredArea
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>A device shall report the time of 1970-01-01T00:00:00Z when notifying the Initialized state of a property event that has never occurred. This applies e.g. to LastReset, LastClockSynchronization and Backup/Last.</para>
      </section>
      <section>
        <title>Environmental Conditions</title>
        <para>If measurements of environmental conditions are supported a device should provide the following events.</para>
        <para>The following event specifies the relative humidity in percent. It is recommended to use a time interval of sixty seconds or a 1% change to avoid flooding the event queue with excessive relative humidity events. An event shall be sent if either the interval or percent change occurs.</para>
        <para>The following event specifies the relative humidity in percent.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/EnvironmentalConditions/RelativeHumidity
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:float"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event specifies the operating temperature of the device in degree Celsius. It is recommended to use a time interval of sixty seconds or a 5% change to avoid flooding the event queue with excessive temperature change events. An event shall be sent if either the interval or percent change occurs.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/EnvironmentalConditions/Temperature
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Status" Type="xs:float"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Battery capacity</title>
        <para>If measurements of the battery level are supported a device should provide the data using the BatteryCapacity event. It is recommended to use a 2% change to avoid flooding the event queue with excessive battery capacity change events.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/BatteryCapacity
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="PercentageRemainingCapacity"  	Type="xs:float"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Asynchronous Operation Status</title>
        <para>An asynchronous operation can emit its progress with the following event.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/AsynchronousOperationStatus
<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name="Token" Type="tt:ReferenceToken"/>
    <tt:SimpleItemDescription Name="OperationName" Type="xs:string"/>
    <tt:SimpleItemDescription Name="ServiceName" Type="xs:string"/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name="Progress" Type="xs:float"/> <!– [0.0,1.0] -- >
    <tt:ElementItemDescription Name="FileProgressStatus"
                               Type="tt:ArrayOfFileProgress"/> <!– optional -- >
    <tt:ElementItemDescription Name="Error" Type="soapenv:Fault"/> <!– optional -- >
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The Token field refers to the operation unique token value that is returned by an asynchronous operation in its response message. An asynchronous operation using this event shall generate a unique token for each invocation. The OperationName field indicates the name of asynchronous operation. The ServiceName field indicates the name of service in which the asynchronous operation is defined. The combination of service name and operation name uniquely identifies the particular operation. The Progress field reports the completion percentage of an asynchronous operation. The value range of Progress field is [0.0,1.0] where 1.0 indicates the completion of an asynchronous operation. The Error field reports errors during the execution of an asynchronous operation.</para>
      </section>
      <section>
        <title>Device Management</title>
        <para>The following topics signal important device status information:</para>
        <programlisting><![CDATA[tns1:Device/OperationMode/ShutdownInitiated
tns1:Device/OperationMode/UploadInitiated
]]></programlisting>
      </section>
      <section>
        <title>Liquid level</title>
        <para>If measurements of the level of the liquid inside a washer tank are supported, a device should signal whether the level is under the warning threshold using the LowLiquid event.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/Washer/LiquidLow
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="IsLow" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Mechanial failure</title>
        <para>The following event should be generated with true value when a cooling fan fails.</para>
        <programlisting><![CDATA[Topic: tns1:Device/HardwareFailure/FanFailure
<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name="Token" Type="tt:ReferenceToken "/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name="Failed" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when a power supply fails.</para>
        <programlisting><![CDATA[Topic: tns1:Device/HardwareFailure/PowerSupplyFailure
<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name="Token" Type="tt:ReferenceToken "/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name="Failed" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when a mass storage device fails.</para>
        <programlisting><![CDATA[Topic: tns1:Device/HardwareFailure/StorageFailure
<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name="Token" Type="tt:ReferenceToken "/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name="Failed" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>The following event should be generated with true value when the device reaches a temperature outside the normal range of operation, and should be generated with false value when the device returns to normal temperature range.</para>
        <programlisting><![CDATA[Topic: tns1:Device/HardwareFailure/TemperatureCritical
<tt:MessageDescription IsProperty="true">
  <tt:Data>
    <tt:SimpleItemDescription Name="Critical" Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Geo Location</title>
        <para>If a device supports monitoring of geo location, it should provide the geo location monitoring 
          event to inform a client about its current location in geo-referenced coordinates. It is
        recommended to use reasonable time interval to avoid flooding the event queue with
        excessive processing unit usage events.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/GeoLocation
Event description:
<tt:MessageDescription IsProperty="true“>
  <tt:source>
    <tt:SimpleItemDescription Name="Token" Type="tt:ReferenceToken"/>
  </tt:source>
  <tt:Data>
    <tt:ElementItemDescription Name="CurrentLocation" Type=“tt:GeoLocation"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
      <section>
        <title>Cloud Firmware Upgrade</title>
        <para>If a device supports cloud firmware upgrade, it should provide the cloud firmware
          upgrade event, to inform a client of the result of the procedure.</para>
        <para>The source of the event shall be the same UUID returned in GetEndpointReference,
          Success indicates whether the procedure was successful or not, while Information is a
          string available for providing additional information to the client.</para>
        <programlisting><![CDATA[Topic: tns1:Monitoring/CloudFirmwareUpgrade/Completed
Event description:
<tt:MessageDescription IsProperty="true“>
  <tt:source>
    <tt:SimpleItemDescription Name="UUID" Type="xs:string"/>
  </tt:source>
  <tt:Data>
    <tt:ElementItemDescription Name="Success" Type=“xs:boolean"/>
    <tt:ElementItemDescription Name="Information" Type=“xs:string"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
    </section>
  </chapter>
  <chapter>
    <title>Event handling</title>
    <para>An event is an action or occurrence detected by a device that a client can subscribe to. Events are handled through the event service. This specification defines event handling based on the [WS-BaseNotification] and [WS-Topics] specifications. It extends the event notion to allow clients to track object properties (such as digital input and motion alarm properties) through events. Properties are defined in section <xref linkend="_Ref507651613" />.</para>
    <para>The description of event payload and their filtering within subscriptions is discussed in section <xref linkend="_Ref210092255" />. Section <xref linkend="_Ref210461718" /> describes how a synchronization point can be requested by clients using one of the three notification interfaces. Section <xref linkend="_Toc210473943" /> describes the integration of Topics and section <xref linkend="_Ref422263408" /> discusses the handling of faults.</para>
    <para>Section <xref linkend="_Toc213144733" /> demonstrates the usage of the Real-Time Pull-Point Notification Interface including Message Filtering and Topic Set. Examples for the basic notification interface can be found in the corresponding [WS-BaseNotification] specification.</para>
    <para>Both device and client shall support [WS-Addressing] for event services.</para>
    <section>
      <title>Real-time Pull-Point Notification Interface</title>
      <para>This section introduces the Real-time Pull-Point Notification Interface. This interface provides a firewall friendly notification interface that enables real-time polling and initiates all client communications.</para>
      <para>This interface is used in the following way: </para>
      <orderedlist>
        <listitem>
          <para>The client asks the device for a pull point with the CreatePullPointSubscriptionRequest message. </para>
        </listitem>
        <listitem>
          <para>The device evaluates the subscription request and returns either a CreatePullPointSubscriptionResponse or one of the Fault codes. </para>
        </listitem>
        <listitem>
          <para>If the subscription is accepted, the response contains a WS-EndpointReference to the instantiated pull point. This WS-Endpoint provides a PullMessages operation, which is used by the client to retrieve Notifications. Additionally it provides the Unsubscribe operation of the Base Subscription Manager Interface. The sequence diagram of the interaction is shown in <xref linkend="_Ref213223488" />. </para>
        </listitem>
      </orderedlist>
      <figure xml:id="_Ref213223488">
        <title>Sequence diagram for the Real-time Pull-Point Notification Interface</title>
        <mediaobject>
          <imageobject>
            <imagedata fileref="media/Core/pp-seq.svg" contentwidth="120mm" />
          </imageobject>
        </mediaobject>
      </figure>
      <orderedlist continuation="continues">
        <listitem>
          <para>The device immediately responds with notifications that have been aggregated on behalf of the client. If there are no aggregated notifications, the device waits to respond until either a notification is produced for the client or the specified Timeout has exceeded. In any case, the response will contain, at most, the number of notifications specified by the MessageLimit parameter. The client can poll the notifications in real-time when it starts a new PullMessagesRequest immediately after each PullMessagesResponse.</para>
        </listitem>
      </orderedlist>
      <para>For a device implementation it is important to support multiple pull points (including multiple pullpoints per client) in order to allow precise event generation. If a device would only support one subscription at a time a client would need to subscribe without any scope restriction, because changing of event subscription is not possible. Hence this would require the device to serve all available events for which the device would have to activate all subsystems that generate events. This may cause unnecessary load by e.g. activating multiple motion detectors and similar without need. Additionally the traffic produced by all these events may cause a substantial network load.</para>
      <para>If the device supports persistent notification storage, see <xref linkend="_Toc384114228" />, the WS-Endpoint also provides a Seek operation. This operation allows to reposition the pull pointer into the past. With the Seek operation it is also possible to reverse the pull direction. There is also a BeginOfBuffer event, as defined in <xref linkend="_Ref356949268" />, that signals the start of the buffer.</para>
      <para>An ONVIF compliant device shall implement the Real Time Pull-Point Notification Interface.</para>
      <section>
        <title>Create pull point subscription</title>
        <para>An ONVIF compliant device shall provide the CreatePullPointSubscription command. If no Filter element is specified the pullpoint shall notify all occurring events to the client. </para>
        <para>By default the pull point keep alive is controlled via the PullMessages operation. In this case, after a PullMessages response is returned, the subscription should be active for at least the timeout specified in the PullMessages request.</para>
        <para>A device shall support an absolute time value specified in utc as well as a relative time value for the InitialTerminationTime parameter. A device shall respond both parameters CurrentTime and TerminationTime as utc using the 'Z' indicator.</para>
        <para>The following optional subscription policy elements are defined in tev:SubscriptionPolicy:</para>
        <itemizedlist>
          <listitem>
            <para>
              <emphasis role="bold">tev:ChangedOnly</emphasis> A pullpoint should not provide Initialized nor Deleted events for Properties.</para>
          </listitem>
        </itemizedlist>
        <para>Both request and response message contain the same elements as the SubscriptionRequest and Response of [WS-BaseNotification] without the ConsumerReference.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Filter - optional [wsnt:FilterType]</para>
              <para role="text">Optional filtering for e.g. topics.</para>
              <para role="param">InitialTerminationTime - optional [wsnt:AbsoluteOrRelativeTimeType]</para>
              <para role="text">Initial termination time.</para>
              <para role="param">SubscriptionPolicy - optional [xs:any]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">SubscriptionReference [wsa:EndpointReferenceType]</para>
              <para role="text">Endpoint reference of the subscription to be used for pulling the messages.</para>
              <para role="param">CurrentTime [xs:dateTime]</para>
              <para role="text">Current time of the server for synchronization purposes.</para>
              <para role="param">TerminationTime [xs:dateTime]</para>
              <para role="text">Date time when the PullPoint will be shut down without further pull requests.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">The same faults as for Subscription Request of the [WS-BaseNotification] are used.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Pull messages</title>
        <para>The device shall provide the following PullMessages command for all SubscriptionManager endpoints returned by the CreatePullPointSubscription command.</para>
        <para>The device shall support a Timeout of at least one minute. The device shall not respond with a PullMessagesFaultResponse when the MessageLimit is greater than the device supports. Instead, the device shall return up to the supported messages in the response.</para>
        <para>The response behavior shall be one of three types:</para>
        <itemizedlist>
          <listitem>
            <para>If there are one or more messages waiting (i.e., aggregated) when the request arrives, the device shall immediately respond with the waiting messages, up to the MessageLimit. The device shall not discard unsent messages, but shall await the next PullMessages request to send remaining messages.</para>
          </listitem>
          <listitem>
            <para>If there are no messages waiting, and the device generates a message (or multiple simultaneous messages) prior to reaching the Timeout, the device shall immediately respond with the generated messages, up to the MessageLimit. The device shall not wait for additional messages before returning the response.</para>
          </listitem>
          <listitem>
            <para>If there are no messages waiting, and the device does not generate any message prior to reaching the Timeout, the device shall respond with zero messages. The device shall not return a response with zero messages prior to reaching the Timeout.</para>
          </listitem>
        </itemizedlist>
        <para>A device shall respond both parameters CurrentTime and TerminationTime as utc using the 'Z' indicator.</para>
        <para>After a seek operation the device shall return the messages in strict message utc time order. Note that this requirement is not applicable to standard realtime message delivery where the delivery order may be affected by device internal computations.</para>
        <para>A device should return an error (UnableToGetMessagesFault) when receiving a PullMessages request for a subscription where a blocking PullMessage request already exists.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Timeout [xs:duration]</para>
              <para role="text">Maximum time to block until this method returns.</para>
              <para role="param">MessageLimit [xs:int]</para>
              <para role="text">Upper limit for the number of messages to return at once. A server implementation may decide to return less messages.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">CurrentTime [xs:dateTime]</para>
              <para role="text">The date and time when the messages have been delivered by the web server to the client.</para>
              <para role="param">TerminationTime [xs:dateTime]</para>
              <para role="text">Date time when the PullPoint will be shut down without further pull requests.</para>
              <para role="param">NotificationMessage - optional, unbounded [wsnt:NotificationMessageHolderType]</para>
              <para role="text">List of messages. This list shall be empty in case of a timeout.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>PullMessagesFaultResponse</term>
            <listitem>
              <para role="param">MaxTimeout [xs:duration]</para>
              <para role="text">Only when the Timeout exceeds the upper limit supported by the device. Not sent when the MessageLimit is exceeded. The Fault Message shall contain the upper limits for both parameters.</para>
              <para role="param">MaxMessageLimit [xs:int]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No specific fault codes.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Renew</title>
        <para>An ONVIF compliant device shall support this command if it signals support for [WS-Base Notification] via the MaxNotificationProducers capability.</para>
        <para>The command shall at least support a Timeout of one minute. A device shall respond both parameters CurrentTime and TerminationTime as utc using the 'Z' indicator.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">TerminationTime [wsnt:AbsoluteOrRelativeTimeType]</para>
              <para role="text">The new relative or absolute termination time.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">CurrentTime [xs:dateTime]</para>
              <para role="text">The current server time.</para>
              <para role="param">TerminationTime [xs:dateTime]</para>
              <para role="text">The updated TerminationTime for the SubscriptionManager.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>ResourceUnknownFaultResponse</term>
            <listitem>
              <para role="param">Timestamp [xs:dateTime]</para>
              <para role="text">The pull point reference is invalid</para>
              <para role="param">Originator - optional [wsa:EndpointReferenceType]</para>
              <para role="param">ErrorCode - optional [xs:any]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>UnacceptableTerminationTimeFaultResponse</term>
            <listitem>
              <para role="param">Timestamp [xs:dateTime]</para>
              <para role="text">The Timeout exceeds the upper limit supported by the device. </para>
              <para role="param">Originator - optional [wsa:EndpointReferenceType]</para>
              <para role="param">ErrorCode - optional [xs:any]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No specific fault codes.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Unsubscribe</title>
        <para>The device shall provide the following Unsubscribe command for all SubscriptionManager endpoints returned by the CreatePullPointSubscription command. The command is defined in section 6.1.2 of [<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docs.oasis-open.org/wsn/wsn-ws_base_notification-1.3-spec-os.pdf">OASIS Web Services Base Notification 1.3</link>].</para>
        <para>This command shall terminate the lifetime of a pull point. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>ResourceUnknownFaultResponse</term>
            <listitem>
              <para role="param">Timestamp [xs:dateTime]</para>
              <para role="text">The pull point reference is invalid</para>
              <para role="param">Originator - optional [wsa:EndpointReferenceType]</para>
              <para role="param">ErrorCode - optional [xs:any]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No specific fault codes.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section xml:id="_Ref422262879">
        <title>Seek</title>
        <para>A device supporting persistent notification storage as defined in section <xref linkend="_Toc384114228" /> shall provide the following Seek command for all SubscriptionManager endpoints returned by the CreatePullPointSubscription command.</para>
        <para>On a Seek a pullpoint shall abort any event delivery including any initial states of properties. Furthermore the pullpoint should flush events not already queued for transmission from the transmit queue.</para>
        <para>After a Seek request a pullpoint shall ignore the behavior described in section 9.6 for properties.</para>
        <para>A device shall only set the subscription in reverse pull mode if the Reverse argument is present and set to “true”.</para>
        <para>The UtcTime argument of the Seek request shall be matched against the UtcTime attribute of the notifications in the persistent notification storage.</para>
        <para>When Seek is used in the forward mode a device shall position the pull pointer to include all NotificationMessages in the persistent storage with a UtcTime attribute greater than or equal to the Seek argument.</para>
        <para>When Seek is used in reverse mode a device shall position the pull pointer to include all NotificationMessages in the in the persistent storage with a UtcTime attribute less than or equal to the Seek argument.</para>
        <para>A device shall not provide information of the initial generate property state as response to a call to the Seek method.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">UtcTime [xs:datetime]</para>
              <para role="text">This message shall be addressed to a PullPoint in order to readjust the pull position:</para>
              <para role="param">Reverse - optional [xs:bool]</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param" />
              <para role="text">No specific fault codes.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Pull Point Lifecycle</title>
        <para>
          <xref linkend="_Ref213223488" /> depicts the basic operation of a pull point. This chapter states the requirements on the pull point lifecycle. </para>
        <para>A device shall create a new pull point on each CreatePullPointSubscription command as long as the number of instantiated pull points does not exceed the capability MaxPullPoints. Each pull point shall have a unique endpoint reference to which the client can direct its consecutive operations on the pull point.</para>
        <para>A pull point shall exist until either its termination time has elapsed or the client has requested its disposal via an Unsubscribe request. There are no requirements regarding persistency of a pull point across a power cycle of a device.</para>
      </section>
      <section xml:id="_Toc384114228">
        <title>Persistent notification storage</title>
        <para>To ensure that no notifications are lost by a client a device may store its notifications. The stored notifications can at any time be retrieved by a client. The device shall indicate if its support persistent notification storage with the PersistentNotificationStorage capability. See section <xref linkend="_Toc213144732" />.</para>
        <para>This specification defines that the interface to the persistent storage allows linear access via the originating message event time. This holds also for events that are delivered out of order in the live streaming case due to e.g. computational delay. </para>
        <para>The details of what notification and how and where those notifications actually are stored are outside the scope of this specification. Removal policy of stored notifications to get room for new ones is also out of scope.</para>
      </section>
    </section>
    <section xml:id="_Ref214002841">
      <title>Notification Streaming Interface</title>
      <para>This section defines the transmission of events via RTP streaming packets. For details regarding the configuration see section “Metadata Configuration“ of the ONVIF Media Service Specification.</para>
      <para>The following requirements apply if a devices supports transmission of events via RTP streaming packets:</para>
      <itemizedlist>
        <listitem>
          <para>The events shall be encoded as wsnt:NotificationMessage as defined in [WS-BaseNotification] to transport the Message Payload, the Topic and the ProducerReference.</para>
        </listitem>
        <listitem>
          <para>Multiple instances of the wsnt:NotificationMessage elements can be placed within a metadata document.</para>
        </listitem>
        <listitem>
          <para>Since there is no explicit SubscriptionReference with streaming notifications, the wsnt:NotificationMessage shall not contain the SubscriptionReference element.</para>
        </listitem>
      </itemizedlist>
    </section>
    <section>
      <title>Basic Notification Interface</title>
      <para>Section <xref linkend="_Ref212945952" /> briefly introduces the Basic Notification Interface of the [WS-BaseNotification] specification. Section <xref linkend="_Toc214944387" /> summarizes the mandatory and the optional interfaces of the [WS-BaseNotification] specification. Please refer for a full documentation of the Basic Notification Interface to the [WS-BaseNotification] specification.</para>
      <section xml:id="_Ref212945952">
        <title>Introduction</title>
        <para>The following logical entities participate in the notification pattern:</para>
        <para>Client: implements the NotificationConsumer interface.</para>
        <para>Event Service: implements the NotificationProducer interface.</para>
        <para>Subscription Manager: implements the BaseSubscriptionManager interface.</para>
        <para>The Event Service and the Subscription Manager should be instantiated on a device.</para>
        <para>Typical messages exchanged between the entities are shown in the sequence diagram in <xref linkend="_Ref213223463" />. First, the client establishes a connection to the Event Service. The client can then subscribe for certain notifications by sending a SubscriptionRequest. If the Event Service accepts the Subscription, it dynamically instantiates a SubscriptionManager representing the Subscription. The Event Service shall return the WS-Endpoint-Address of the SubscriptionManager in the SubscriptionResponse. </para>
        <para>In order to transmit notifications matching the Subscription, another connection is established from the Event Service to the client. Via this connection, the Event Service sends a one-way Notify message to the NotificationConsumer interface of the client. Corresponding notifications can be sent at any time by the Event Service to the client, while the Subscription is active.</para>
        <para>To control the Subscription, the client directly addresses the SubscriptionManager returned in the SubscriptionResponse. In the SubscriptionRequest the client can specify a termination time. The SubscriptionManager is automatically destroyed when the termination time is reached. RenewRequests can be initiated by the client in order to postpone the termination time. The client can also explicitly terminate the SubscriptionManager by sending an UnsubscribeRequest. After a successful Unsubscription, the SubscriptionManager no longer exists.</para>
        <para>The interaction between EventService and SubscriptionManager is not further specified by the [WS-BaseNotification] and is up to the implementation of the device.</para>
        <figure xml:id="_Ref213223463">
          <title>Sequence diagram for the Base Notification Interface</title>
          <mediaobject>
            <imageobject>
              <imagedata fileref="media/Core/bn-seq.svg" contentwidth="120mm" />
            </imageobject>
          </mediaobject>
        </figure>
      </section>
      <section xml:id="_Toc214944387">
        <title>Requirements</title>
        <para>This section details those interfaces of the [WS-BaseNotification] that a device shall provide.</para>
        <para>An ONVIF compliant device shall support the NotificationProducer Interface of the [WS-BaseNotification] if the capability MaxNotificationProducers is non-zero. The device shall support TopicExpression filters with the dialects described in <xref linkend="_Ref210199558" />. The support for MessageContent filters is signalled via the GetEventProperties method. If the device does not accept the InitialTerminationTime of a subscription, it shall provide a valid InitialTerminationTime within the Fault Message. The device shall be able to provide notifications using the Notify wrapper of the [WS-BaseNotification] specification. The SubscriptionPolicy <literal>wsnt:UseRaw</literal> is optional for the device. Although the [WS-BaseNotification] has CurrentTime and TerminationTime as optional elements in a SubscribeResponse and RenewResponse, an ONVIF compliant device shall list them in both SubscribeResponses and RenewResponse. The device may respond to any GetCurrentMessage request with a Fault message indicating that no current message is available on the requested topic.</para>
        <para>An ONVIF compliant device shall implement the Base Subscription Manager Interface of the [WS-BaseNotification] specification consisting of the Renew and Unsubscribe operations. The Pausable Subscription Manager Interface is optional. The implementation of Subscriptions as WS-Resources is optional.</para>
        <para>An ONVIF compliant device shall support time values in request parameters that are given in utc with the 'Z' indicator and respond all time values as utc including the 'Z' indicator.</para>
      </section>
    </section>
    <section xml:id="_Ref210092255">
      <title>Event Notifications</title>
      <para>A notification answers the following questions:</para>
      <itemizedlist>
        <listitem>
          <para>When did it happen?</para>
        </listitem>
        <listitem>
          <para>Who produced the event?</para>
        </listitem>
        <listitem>
          <para>What happened?</para>
        </listitem>
      </itemizedlist>
      <para>The “when” question is answered by adding a time attribute to the Message element of the NotificationMessage. An ONVIF compliant device shall include the time attribute to the Message element.</para>
      <para>The “who” question is split into two parts. One part is the WS-Endpoint which identifies the device or a service within the device where the notification has been produced. Therefore, the WS-Endpoint should be specified within the ProducerReference Element of the NotificationMessage. The second part is the identification of the component within the WS-Endpoint, which is responsible for the production of the notification. <phrase>Depending on the component, either a single parameter, multiple parameters, or none may be needed to uniquely identify the component.</phrase> These parameters are placed as Items within the Source element of the Message container.</para>
      <para>The “what” question is answered in two steps. First, the Topic element of the NotificationMessage is used to categorize the Event. Second, items are added to the Data element of the Message container in order to describe the details of the Event. </para>
      <para>ONVIF uses the NotificationMessage type from [WS-BaseNotification] to hold one or more notification messages of type tt:Message:</para>
      <programlisting><![CDATA[<xs:complexType name="NotificationMessageHolderType" >
  <xs:sequence>
    <xs:element ref="wsnt:SubscriptionReference" minOccurs="0" />
    <xs:element ref="wsnt:Topic" minOccurs="0" />
    <xs:element ref="wsnt:ProducerReference" minOccurs="0" />
    <xs:element name="Message">
      <xs:complexType>
        <xs:sequence>
          <tt:element name="Message" type="tt:Message" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
]]></programlisting>
      <para>Section <xref linkend="_Ref500243703" /> gives a detailed formatting of the Message payload, and Section <xref linkend="_Toc214003093" /> introduces a description language for the Message payload. Section <xref linkend="_Ref210029758" /> defines the grammar used in a subscription to filter notifications by their Message content.	</para>
      <section xml:id="_Ref500243703">
        <title>Notification Message Format</title>
        <para>The main information elements of a notification message are:</para>
        <itemizedlist>
          <listitem>
            <para>UtcTime represents the time when the event described by the message occurred.</para>
          </listitem>
          <listitem>
            <para>Topic and Source items uniquely identify the source of an event</para>
          </listitem>
          <listitem>
            <para>Data contains one or more values describing the event </para>
          </listitem>
          <listitem>
            <para>An optional Key item may extend the Source identifier</para>
          </listitem>
        </itemizedlist>
        <para>Source, Data and Key are structured as item lists. Each can hold an arbitrary number of items of type SimpleItem or ElementItem. Each Item has a name and a value. In the case of an ElementItem, the value is expressed by one XML element within the ElementItem element. In the case of a SimpleItem, the value shall be specified by the value attribute. The name of all Items shall be unique within all Items contained in any group of this Message.</para>
        <para>ElementItem should not be used in the Source and Key elements.</para>
        <para>Vendor specific extensions shall express the SimpleItem and ElementItem Name attribute as QName. This avoids potential name clashes between Vendor specific extensions and future ONVIF extensions.</para>
        <para>It is recommended to use SimpleItems instead of ElementItems whenever applicable, since SimpleItems ease the integration of Messages into a generic client. The exact type information of both Simple and ElementItems can be extracted from the TopicSet (see section <xref linkend="_Toc210473943" />), where each topic can be augmented by a description of the message payload.</para>
        <para>The subsequent example demonstrates the different parts of the notification:</para>
        <programlisting><![CDATA[<wsnt:NotificationMessage>
  ...
  <wsnt:Topic Dialect="...Concrete">
    tns1:PTZController/PTZPreset/Reached
  </wsnt:Topic>
  <wsnt:Message>
    <tt:Message UtcTime="...">
      <tt:Source>
        <tt:SimpleItem Name="PTZConfigurationToken" Value="PTZConfig1"/>
      </tt:Source>
      <tt:Data>
        <tt:SimpleItem Name="PresetToken" Value="Preset5"/>
        <tt:SimpleItem Name="PresetName"  Value="ParkingLot"/>
      </tt:Data>
    </tt:Message>
  </wsnt:Message>
</wsnt:NotificationMessage>
]]></programlisting>
        <para>The Item “PTZConfigurationToken” uniquely identifies the component, which is responsible for the detection of the Event. In this example, the component is a PTZ Node referenced by the PTZ Configuration “PTZConfig1”. The event <literal>tns1:PTZController/PTZPreset/Reached</literal> indicates that the PTZ unit has arrived at a preset. <phrase>The data block contains information about the preset that has been reached. The</phrase> Preset is identified by a PresetToken “Preset5” which is named “PresetName”.</para>
      </section>
      <section xml:id="_Ref507651613">
        <title>Property Events</title>
        <para>This specification introduces the notion of a property event which allows observation of state changes of properties. As with other events a property is uniquely identified by its Topic and Source. The state of a property is reflected by the values of its Data items.</para>
        <para>Each property has an individual lifecycle in a subscription as shown in </para>
        <para>Figure 7<phrase>.</phrase></para>
        <figure>
          <title>Property event state chart</title>
          <mediaobject>
            <imageobject>
              <imagedata fileref="media/Core/image6.jpeg" contentwidth="69.01mm" />
            </imageobject>
          </mediaobject>
        </figure>
        <para>When a client subscribes to a topic representing certain properties, the device shall provide notifications informing the client of all objects with the requested property, which are alive at the time of the subscription. After all existing objects have been reported the device shall send notifications when a property has changed, is deleted or a new one created. <phrase>A client </phrase>may<phrase> also request the values of all currently alive properties the client has subscribed to at any time by asking for a synchronization point (see section </phrase><xref linkend="_Ref210461718" /><phrase>).</phrase></para>
        <para>A notification message of a property event shall include the PropertyOperation attribute. The operation mode “Initialized” shall be used to inform a client about the creation of a property. The operation mode “Initialized” shall also be used when a synchronization point has been requested.</para>
        <para>The property interface is defined in this standard in order to group all property related events together and to present uniformly to clients. It is recommended to use the property interface wherever applicable. Section <xref linkend="_Ref210092255" /> explains the structure of events and properties in detail.</para>
        <section xml:id="_Ref508970098">
          <title>Property Example</title>
          <para>The following video analytics example demonstrates the dynamic behaviour of properties: The rule engine interface of the video analytics detector can define fields. Such a detector field is described by a polygon in the image plane. For each object in the scene, the rule engine determines which objects are within the polygon. A client can access this information by subscribing to the corresponding ObjectsInside property of the detector field. Each time an object appears in the scene, a new ObjectsInside property is created. The client is informed by a corresponding “property created” notification indicating if the object appeared inside or outside the polygon. Each time an object enters or leaves the polygon, a “property changed” notification is produced indicating that the ObjectsInside property for this object has changed. When an object leaves the scene, the corresponding ObjectsInside property is deleted and the client is informed via a “property deleted” notification.</para>
          <para>The example in this section demonstrates the application of Key Items. The rule engine can contain FieldDetector rules. These rules define an ObjectsInside property for each object in the scene. When a new object appears outside of such a Field, the following notification is produced:</para>
          <programlisting><![CDATA[<wsnt:NotificationMessage>
  ...
  <wsnt:Topic Dialect="...Concrete">
    tns1:RuleEngine/FieldDetector/ObjectsInside
  </wsnt:Topic>
  <wsnt:Message>
    <tt:Message UtcTime="..." PropertyOperation="Initialized">
      <tt:Source>
        <tt:SimpleItem Name="VideoSourceConfigurationToken"    Value="1"/>
        <tt:SimpleItem Name="VideoAnalyticsConfigurationToken" Value="1"/>
        <tt:SimpleItem Name="Rule"              Value="myImportantField"/>
      </tt:Source>
      <tt:Key>
        <tt:SimpleItem Name="ObjectId"                         Value="5"/>
      </tt:Key>
      <tt:Data>
        <tt:SimpleItem Name="IsInside"                     Value="false"/>
      </tt:Data>
    </tt:Message>
  </wsnt:Message>
</wsnt:NotificationMessage>
]]></programlisting>
          <para>The Source Items describe the Rule which produced the notification. When multiple objects are in the scene, each of these objects has its own ObjectsInside property. Therefore, the Object ID is used as an additional Key Item in order to make the property unique. The IsInside Item is a Boolean value indicating whether the object is inside or outside of the Field.</para>
          <para>When the object enters the Field, the rule produces a “property changed” message and resembles the following:</para>
          <programlisting><![CDATA[<wsnt:NotificationMessage>
  ...
  <wsnt:Topic Dialect="...Concrete">
    tns1:RuleEngine/FieldDetector/ObjectsInside
  </wsnt:Topic>
  <wsnt:Message>
    <tt:Message UtcTime="..." PropertyOperation="Changed">
      <tt:Source>
        <tt:SimpleItem Name="VideoSourceConfigurationToken"    Value="1"/>
        <tt:SimpleItem Name="VideoAnalyticsConfigurationToken" Value="1"/>
        <tt:SimpleItem Name="Rule"              Value="myImportantField"/>
      </tt:Source>
      <tt:Key>
        <tt:SimpleItem Name="ObjectId"                         Value="5"/>
      </tt:Key>
      <tt:Data>
        <tt:SimpleItem Name="IsInside"                      Value="true"/>
      </tt:Data>
    </tt:Message>
  </wsnt:Message>
</wsnt:NotificationMessage>
]]></programlisting>
          <para>Finally, when the object leaves the scene, a “property deleted” message is produced:</para>
          <programlisting><![CDATA[<wsnt:NotificationMessage>
  ...
  <wsnt:Topic Dialect="...Concrete">
    tns1:RuleEngine/FieldDetector/ObjectsInside
  </wsnt:Topic>
  <wsnt:Message>
    <tt:Message UtcTime="..." PropertyOperation="Deleted">
      <tt:Source>
        <tt:SimpleItem Name="VideoSourceConfigurationToken"    Value="1"/>
        <tt:SimpleItem Name="VideoAnalyticsConfigurationToken" Value="1"/>
        <tt:SimpleItem Name="Rule"              Value="myImportantField"/>
      </tt:Source>
      <tt:Key>
        <tt:SimpleItem Name="ObjectId"                         Value="5"/>
      </tt:Key>
    </tt:Message>
  </wsnt:Message>
</wsnt:NotificationMessage>
]]></programlisting>
          <para>In this case, the Data item can be omitted because the object and its corresponding property no longer exists.</para>
        </section>
      </section>
      <section xml:id="_Toc214003093">
        <title>Message Description Language</title>
        <para>The structure of the Message payload was introduced in the previous section. The structure contains three groups: Source, Key, and Data. Each group contains a set of Simple and ElementItems. For each topic, a device can describe which Item will be part of a notification produced by this topic using a message description language. The following description language describes the mandatory message items<footnote xml:id="__FN4__"><para>Please note that the schema is included here for <emphasis>information only. </emphasis>[ONVIF Schema] contains the normative schema definition.</para></footnote>:</para>
        <programlisting><![CDATA[<xs:complexType name="MessageDescription">
  <xs:sequence>
    <xs:element name="Source" type="tt:ItemListDescription"
      minOccurs="0"/>
    <xs:element name="Key" type="tt:ItemListDescription" minOccurs="0"/>
    <xs:element name="Data" type="tt:ItemListDescription" minOccurs="0"/>
    ...
  </xs:sequence>
  <xs:attribute name="IsProperty" type="xs:boolean"/>
</xs:complexType>
<xs:complexType name="ItemListDescription">
  <xs:sequence>
    <xs:element name="SimpleItemDescription"
      minOccurs="0" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="Type" type="xs:QName" use="required"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="ElementItemDescription"
      minOccurs="0" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="Type" type="xs:QName" use="required"/>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
]]></programlisting>
        <para>The Name attribute of an Item shall be unique within all Items independent from the group (Source, Key, Data) they are coming from. The IsProperty attribute shall be set to true when the described Message relates to a property. If the Message, however, does not relate to a property, the Key group shall not be present. The Type attribute of a SimpleItemDescriptor shall use simple type defined in XML schema (built in simple types), ONVIF schemas, or vendor schemas. Similarly, the Type attribute of an ElementItemDescriptor shall match a global element declaration of an XML schema. </para>
        <para>The Message Description Language does not mandate the order of the Items in each of the categories Source, Key and Data. Additionally Items documented as optional by an ONVIF Event definition are not required to be present to in a message. This applies also to optional Items that are described in the related MessageDescription.</para>
        <para>The location of all schema files used to describe Message payloads are listed in the GetEventPropertiesResponse message in Section <xref linkend="_Ref212958632" />.</para>
        <section>
          <title>Message Description Example</title>
          <para>The following code is an example of a Message Description corresponding to the Property example of Section <xref linkend="_Ref508970098" />:</para>
          <programlisting><![CDATA[<tt:MessageDescription IsProperty="true">
  <tt:Source>
    <tt:SimpleItemDescription Name="VideoSourceConfigurationToken"
      Type="tt:ReferenceToken"/>
    <tt:SimpleItemDescriptionD Name="VideoAnalyticsConfigurationToken"
      Type="tt:ReferenceToken"/>
    <tt:SimpleItemDescription Name="Rule"
      Type="xs:string"/>
  </tt:Source>
  <tt:Key>
    <tt:SimpleItemDescription Name="ObjectId"
      Type="xs:integer"/>
  </tt:Key>
  <tt:Data>
    <tt:SimpleItemDescription Name="IsInside"
      Type="xs:boolean"/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        </section>
      </section>
      <section xml:id="_Ref210029758">
        <title>Message Content Filter</title>
        <para>In the Subscription request, a client can filter notifications by TopicExpression (see Section <xref linkend="_Ref210199558" />) and by MessageContent. For the latter, the [WS-BaseNotification] proposes the XPath 1.0 dialect. Due to the specific Message structure required by this specification, the specification requires a subset of the XPath 1.0 syntax. The corresponding dialect can be referenced with the following URI:</para>
        <programlisting><![CDATA[Dialect=http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter
]]></programlisting>
        <para>Precedence and associativity: </para>
        <para>The 'and' operation has higher precedence than the 'or' operation. Both 'and' and 'or' operations are left associative.</para>
        <para>The precedence and associativity of 'and' and 'or' operations in the following grammar definition are identical to XPath 1.0 specifications.</para>
        <para>The structure of the Expressions is as follows:</para>
        <para>[1] Expression ::= BoolExpr | Expression ‘and’ Expression 		| Expression ‘or’ Expression | ‘(‘ Expression ‘)’ | ‘not’ ‘(‘ Expression ‘)’</para>
        <para>[2] BoolExpr ::= ‘boolean’ ‘(‘ PathExpr ‘)’</para>
        <para>[3] PathExpr ::= [‘//’Prefix?’SimpleItem‘ | ’//’Prefix?’ElementItem‘ ] NodeTest</para>
        <para>[4] Prefix::= NamespacePrefix’:’ | ‘’</para>
        <para>[5] NodeTest ::= ‘[‘ AttrExpr ‘]’</para>
        <para>[6] AttrExpr ::= AttrComp | AttrExpr ‘and’ AttrExpr | AttrExpr ‘or‘ AttrExpr | ‘(‘ AttrExpr ‘)‘ 		| ‘not’ ‘(‘ AttrExpr ‘)‘</para>
        <para>[7] AttrComp ::= Attribute ‘=’ ‘”’ String ‘”’</para>
        <para>[8] Attribute ::= ‘@Name’ | ‘@Value’</para>
        <para>This grammar allows testing the presence of Simple or ElementItems independent of the group they belong to (Source, Key or Data). Furthermore, the Value of SimpleItems can be checked. The SimpleItem and ElementItem Prefix namespace shall correspond to “http://www.onvif.org/ver10/schema.</para>
        <para>Finally, arbitrary boolean combinations of these tests are possible. The following expressions can be formulated:</para>
        <para>Return only notifications which contain a reference to VideoSourceConfiguration “1”  </para>
        <programlisting>boolean(//tt:SimpleItem[@Name=”VideoSourceConfigurationToken” and @Value=”1”])</programlisting>
        <para>Return only notifications which do not contain a reference to a VideoAnalyticsConfiguration</para>
        <programlisting>not( boolean(//tt:SimpleItem[@Name=”VideoAnalyticsConfigurationToken”] ) )</programlisting>
        <para>Return only notifications which do relate to VideoAnalyticsConfiguration “2” running on VideoSourceConfiguration “1”</para>
        <programlisting>boolean(//tt:SimpleItem[@Name=”VideoAnalyticsConfigurationToken” and @Value=”2”] ) 
  and boolean(//tt:SimpleItem[@Name=”VideoSourceConfigurationToken” and @Value=”1”] )</programlisting>
        <para>Return only notifications which are related to VideoSourceConfiguration “1” but are not related to VideoAnalyticsConfigurations</para>  
        <programlisting>boolean(//tt:SimpleItem[@Name=”VideoSourceConfigurationToken” and @Value=”1”] )
  and not(boolean(//tt:SimpleItem[@Name=”VideoAnalyticsConfigurationToken”] ))</programlisting>
        <para>Return only notifications when objects enter or appear in “myImportantField”  </para>
        <programlisting>boolean(//tt:SimpleItem[@Name=”IsInside” and @Value=”true”] ) and 
  boolean(//tt:SimpleItem[@Name=”Rule” and @Value=”myImportantField”] )</programlisting>
      </section>
    </section>
    <section xml:id="_Ref210461718">
      <title>SetSynchronizationPoint</title>
      <para>Note that section <xref linkend="_Ref422262879" /> defines rules for devices supporting persistent notification storage that override the behavior defined in this section.</para>
      <para>Properties, introduced in section <xref linkend="_Ref214002841" />, inform a client about property creation, changes and deletion in a uniform way. When a client wants to synchronize its properties with the properties of the device, it can request a synchronization point which repeats the current status of all properties to which a client has subscribed. The PropertyOperation of all produced notifications is set to “Initialized” (see Section <xref linkend="_Ref210092255" />). The Synchronization Point is requested directly from the SubscriptionManager which was returned in either the SubscriptionResponse or in the CreatePullPointSubscriptionResponse. The property update is transmitted via the notification transportation of the notification interface. The following operation shall be provided by all Subscription Manager Endpoints:</para>
      <variablelist role="op">
        <varlistentry>
          <term>request</term>
          <listitem>
            <para role="text">This is an empty message.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>response</term>
          <listitem>
            <para role="text">This is an empty message.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>faults</term>
          <listitem>
            <para role="text">No command specific faults defined.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>access class</term>
          <listitem>
            <para role="access">READ_MEDIA</para>
          </listitem>
        </varlistentry>
      </variablelist>
      <para>When a client uses the notification streaming interface, the client should use the SetSynchronizationPoint operation defined in the ONVIF Media Service Specification.</para>
    </section>
    <section xml:id="_Toc210473943">
      <title>Topic Structure</title>
      <para>This standard extends the Topic framework defined in the [WS-Topics] specification.</para>
      <para>Section <xref linkend="_Ref210199005" /> describes the ONVIF Topic Namespace. Section <xref linkend="_Ref210036144" /> incorporates the Message Description Language defined in section <xref linkend="_Toc214003093" /> into the TopicSet structure, furthermore section <xref linkend="_Ref212958632" /> defines an interface that allows a client to get this information. A Topic Expression Dialects to be supported by a device is defined in section <xref linkend="_Ref210199558" />.</para>
      <para>Concrete event definitions are specified in the Events sections of the service specifications.</para>
      <section xml:id="_Ref210199005">
        <title>ONVIF Topic Namespace</title>
        <para>The [WS-Topics] specification distinguishes between the definition of a Topic Tree belonging to a certain Topic Namespace and the Topic Set supported by a certain Web Service. This distinction allows vendors to refer to a common Topic Namespace while only using a portion of the defined Topics. </para>
        <para>If the Topic Tree of an existing Topic Namespace covers only a subset of the topics available by a device, the Topic Tree can be grown by defining a new Topic Namespace. A new Topic Namespace is defined by appending a new topic to an existing  Topic Namespace as described in the [WS-Topics] specification.</para>
        <para>All notifications referring to topics in the ONVIF topic namespace shall use the Message Format as described in Section <xref linkend="_Ref507651613" />.</para>
      </section>
      <section xml:id="_Ref210036144">
        <title>Topic Type Information</title>
        <para>A device shall add a MessageDescription element, of type MessageDescriptionType defined in Section ‎<xref linkend="_Toc214003093" />, below all elements representing topics in the topic set supported by the device. Furthermore a device shall, in accordance with the notification specification, identify all elements representing topics in the topic set by including the wstop:topic attribute with value "true".</para>
        <para>The following example demonstrates how Topics of a TopicSet are augmented with Message Descriptions:</para>
        <programlisting><![CDATA[<wstop:TopicSet xmlns=””>
  <tns1:RuleEngine>
    <LineDetector>
      <Crossed wstop:topic="true">
        <tt:MessageDescription>
          <tt:Source>
            <tt:SimpleItemDescription Name="VideoSourceConfigurationToken"
              Type="tt:ReferenceToken"/>
            <tt:SimpleItemDescription Name="VideoAnalyticsConfigurationToken"
              Type="tt:ReferenceToken"/>
            <tt:SimpleItemDescription Name="Rule" Type="xs:string"/>
          </tt:Source>
          <tt:Data>
            <tt:SimpleItemDescription Name="ObjectId" Type="xs:integer"/>
          </tt:Data>
        </tt:MessageDescription>
      </ Crossed>
    </LineDetector>
    <FieldDetector>
      <ObjectsInside wstop:topic="true">
        <tt:MessageDescription IsProperty="true">
          <tt:Source>
            <tt:SimpleItemDescription Name="VideoSourceConfigurationToken"
              Type="tt:ReferenceToken"/>
            <tt:SimpleItemDescription Name="VideoAnalyticsConfigurationToken"
              Type="tt:ReferenceToken"/>
            <tt:SimpleItemDescription Name="Rule" Type="xs:string"/>
          </tt:Source>
          <tt:Key>
            <tt:SimpleItemDescription Name="ObjectId" Type="xs:integer"/>
          </tt:Key>
          <tt:Data>
            <tt:SimpleItemDescription Name="IsInside" Type="xs:boolean"/>
          </tt:Data>
        </tt:MessageDescription>
      </ObjectsInside>
    </FieldDetector>
  </tns1:RuleEngine>
</wstop:TopicSet>
]]></programlisting>
        <para>NOTE xmlns="" is included in the example to make sure that there is no default namespace in scope for any of the descendents of the TopicSet element, see the [WS-Topics] specification for more information.</para>
      </section>
      <section xml:id="_Ref210199558">
        <title>Topic Filter</title>
        <para>An ONVIF compliant device shall support the Concrete Topic Expressions defined in the [WS-Topics] specification. This specification defines the identification of a specific Topic within Topic Trees. The following Dialect shall be specified when a Concrete Topic Expression is used as TopicExpression of a Subscription Filter:</para>
        <programlisting><![CDATA[http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete
]]></programlisting>
        <para>The following Topic Expression syntax shall be supported by a device. </para>
        <para>The syntax extends the Concrete Topic Expressions by an “or” operation and topic subtree matching string. This extended syntax allows selection of an arbitrary TopicSet within a single Subscription. The grammar is described in the same way as the Topic Expressions of the [WS-Topics 1.3] specification:</para>
        <para>[3] TopicExpression ::= TopicPath (‘|’ TopicPath)*</para>
        <para>[4] TopicPath ::= RootTopic ChildTopicExpression* <emphasis role="underline"><emphasis>('//.’)?</emphasis></emphasis></para>
        <para>[5] RootTopic ::= QName</para>
        <para>If a namespace prefix is included in the RootTopic, it shall correspond to a valid Topic Namespace definition and the local name shall correspond to the name of a root Topic defined in that namespace.</para>
        <para>[6] ChildTopicExpression ::= ‘/’ ChildTopicName </para>
        <para>[7] ChildTopicName ::= QName | NCName</para>
        <para>The NCName or local part of the QName shall correspond to the name of a Topic within the descendant path from the RootTopic, where each forward slash denotes another level of child Topic elements in the path.</para>
        <para>In order to reference this TopicExpression Dialect, the following URI shall be used:</para>
        <programlisting><![CDATA[Dialect=http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet
]]></programlisting>
        <para>If the TopicExpression ends with the characters “//.” this indicates that the TopicExpression</para>
        <para> matches a Topic sub-tree. For example:</para>
        <programlisting> “tns1:RuleEngine/FieldDetector//.”</programlisting>
        <para>This identifies the sub-tree consisting of tns1:RuleEngine/FieldDetector and all its descendents.</para>
        <para>The following examples demonstrate the usage of the ConcreteSet topicExpression:</para>
        <para>Look for notifications which have the VideoAnalytics topic as parent topic:</para>
        <programlisting><![CDATA[<wsnt:TopicExpression Dialect ="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
tns1:VideoAnalytics//.
</wsnt:TopicExpression>
]]></programlisting>
        <para>Look for notifications which have the VideoAnalytics topic or the RuleEngine as parent topic:  </para>
        <programlisting><![CDATA[<wsnt:TopicExpression Dialect ="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
tns1:VideoAnalytics//.|tns1:RuleEngine//.
</wsnt:TopicExpression>
]]></programlisting>
        <para>Look for notifications produced by either a LineDetector or a FieldDetector:</para>
        <programlisting><![CDATA[<wsnt:TopicExpression Dialect ="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
tns1:RuleEngine/FieldDetector//.|tns1:RuleEngine/LineDetector//.
</wsnt:TopicExpression>
]]></programlisting>
      </section>
    </section>
    <section xml:id="_Ref212958632">
      <title>Get event properties</title>
      <para>An ONVIF compliant device shall implement this method to report supported event topics
        and provide information about the FilterDialects and schema files.</para>
      <para>Note, that configuration dependent events may not always be reported via this interface,
        e.g. refer to GetSupportedRules specification regarding analytics event definitions.</para>
      <variablelist role="op">
        <varlistentry>
          <term>request</term>
          <listitem>
            <para role="text">This is an empty message.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>response</term>
          <listitem>
            <para role="param">TopicNamespaceLocation - unbounded [xs:anyURI]</para>
            <para role="text">List of topic namespaces supported.</para>
            <para role="param">FixedTopicSet [xs:boolean]</para>
            <para role="text">True when topicset is fixed for all times.</para>
            <para role="param">TopicSet [wstop:TopicSetType]</para>
            <para role="text">Set of topics supported.</para>
            <para role="param">TopicExpressionDialect - unbounded [xs:anyURI]</para>
            <para role="text">Defines the XPath expression syntax supported for matching topic expressions. </para>
            <para role="param">MessageContentFilterDialect - unbounded [xs:anyURI]</para>
            <para role="text">Defines the XPath function set supported for message content filtering.</para>
            <para role="param">ProducerPropertiesFilterDialect - optional, unbounded [xs:anyURI]</para>
            <para role="text">Optional ProducerPropertiesDialects. Refer to Web Services Base Notification 1.3 (WS-BaseNotification) for advanced filtering.</para>
            <para role="param">MessageContentSchemaLocation - unbounded [xs:anyURI]</para>
            <para role="text">The Message Content Description Language allows referencing of vendor-specific types.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>faults</term>
          <listitem>
            <para role="text">No command specific faults defined.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>access class</term>
          <listitem>
            <para role="access">READ_MEDIA</para>
          </listitem>
        </varlistentry>
      </variablelist>
      <para>An ONVIF compliant device shall respond and declare if its TopicSet is fixed or not, which Topics are provided, and which Dialects are supported.</para>
      <para>The following TopicExpressionDialects are mandatory for an ONVIF compliant device (see Section <xref linkend="_Ref210199558" />):</para>
      <programlisting><![CDATA[http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete
http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet
]]></programlisting>
      <para>A device that does not support any MessageContentFilterDialect shall return a single empty url.</para>
      <para>This specification does not require the support of any ProducerPropertiesDialect by a device.</para>
      <para>The Message Content Description Language, introduced in Section <xref linkend="_Toc214003093" />, allows referencing of vendor-specific types. In order to ease the interpretation of types, the response element MessageContentSchemaLocation shall list all URI locations to schema files needed to understand vendor specific types.</para>
    </section>
    <section xml:id="_Toc213144732">
      <title>Capabilities</title>
      <para>The capabilities reflect optional functions and functionality of a service. The information is static and does not change during device operation. The following capabilities are available:</para>
      <variablelist>
        <varlistentry>
          <term>WSSubscriptionPolicySupport</term>
          <listitem><para>Indication if the device supports the WS Subscription policy according to Section <xref linkend="_Toc214944387" /></para></listitem>
        </varlistentry>
        <varlistentry>
          <term>WSPausableSubscriptionManagerInterfaceSupport</term>
          <listitem><para>Indication if the device supports the WS Pausable Subscription Manager Interface according to Section <xref linkend="_Toc214944387"/></para></listitem>
        </varlistentry>
        <varlistentry>
          <term>MaxNotificationProducers</term>
          <listitem><para>Maximum number of supported notification producers as defined by WS-BaseNotification.</para></listitem>
        </varlistentry>
        <varlistentry>
          <term>MaxPullPoints</term>
          <listitem><para>Maximum supported number of notification pull points according to Section <xref linkend="_Toc214944387"/></para></listitem>
        </varlistentry>
        <varlistentry>
          <term>PersistenNotificationStorage</term>
          <listitem><para>Indication if the device supports persistent notification storage according to Section <xref linkend="_Toc384114228"/>. </para></listitem>
        </varlistentry>
        <varlistentry>
          <term>EventBrokerProtocols</term>
          <listitem><para>A space separated list of supported event broker protocols as defined by the datatype tev:EventBrokerProtocol.</para></listitem>
        </varlistentry>
        <varlistentry>
          <term>MaxEventBrokers</term>
          <listitem><para> Maximum number of event broker configurations that can be added to the device.</para></listitem>
        </varlistentry>
		<varlistentry>
          <term>MetadataOverMQTT</term>
          <listitem><para> Indicates that metadata streaming over MQTT is supported.</para></listitem>
        </varlistentry>
      </variablelist>
      <variablelist role="op">
        <varlistentry>
          <term>request</term>
          <listitem>
            <para role="text">This is an empty message.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>response</term>
          <listitem>
            <para role="param">Capabilities [tev:Capabilities]</para>
            <para role="text">The capability response message contains the requested service capabilities using a hierarchical XML capability structure. 
</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>faults</term>
          <listitem>
            <para role="text">No command specific faults defined.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>access class</term>
          <listitem>
            <para role="access">PRE_AUTH</para>
          </listitem>
        </varlistentry>
      </variablelist>
    </section>
    <section xml:id="_Ref422263408">
      <title>SOAP Fault Messages</title>
      <para>If a device encounters a failure while processing [WS-BaseNotification] messages from either a client or Subscription Manager, then the device shall generate a SOAP 1.2 fault message.</para>
      <para>All SOAP 1.2 fault messages shall be generated according to [WS-BaseNotification] and [WS-Topics] specifications with one exception; All faults shall use the following URI for the WS-Addressing [action] Message Addressing Property:</para>
      <programlisting><![CDATA[http://www.w3.org/2005/08/addressing/soap/fault
]]></programlisting>
      <para>Furthermore the error should be sent as a SOAP receiver fault (env:Receiver), i.e. the HTTP error code shall be 500.</para>
    </section>
    <section xml:id="_Toc213144733">
      <title>Notification example</title>
      <para>The following example is a complete communication pattern for notifications. It uses the Real-time Pull-Point Notification Interface to receive notifications.</para>
      <section>
        <title>GetEventPropertiesRequest</title>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl">
    <SOAP-ENV:Header>
      <wsa:Action>
        http://www.onvif.org/ver10/events/wsdl/EventPortType/GetEventPropertiesRequest
      </wsa:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <tet:GetEventProperties>
      </tet:GetEventProperties>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section>
        <title>GetEventPropertiesResponse</title>
        <para>In this example, the device response uses the ONVIF topic namespace. The topic set does not change over time and consists of the single topic <literal>tns1:RuleEngine/LineDetector/Crossed</literal>. The Message associated with this topic contains information about the VideoSourceConfigurationToken, the VideoAnalyticsConfigurationToken and the object which has crossed the line. The device supports two TopicExpressionDialects.</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl"
    xmlns:tns1="http://www.onvif.org/ver10/topics"
    xmlns:tt="http://www.onvif.org/ver10/schema">
    <SOAP-ENV:Header>
      <wsa:Action>
        http://www.onvif.org/ver10/events/wsdl/EventPortType/GetEventPropertiesResponse
      </wsa:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <tet:GetEventPropertiesResponse>
        <tet:TopicNamespaceLocation>
          http://www.onvif.org/onvif/ver10/topics/topicns.xml
        </tet:TopicNamespaceLocation>
        <wsnt:FixedTopicSet>
          true
        </wsnt:FixedTopicSet>
        <wstop:TopicSet xmlns=””>
          <tns1:RuleEngine>
            <LineDetector>
              <Crossed wstop:topic="true">
                <tt:MessageDescription>
                  <tt:Source>
                    <tt:SimpleItemDescription Name="VideoSourceConfigurationToken"
                      Type="tt:ReferenceToken"/>
                    <tt:SimpleItemDescription Name="VideoAnalyticsConfigurationToken"
                      Type="tt:ReferenceToken"/>
                  </tt:Source>
                  <tt:Data>
                    <tt:SimpleItemDescription Name="ObjectId"
                      Type="xs:integer"/>
                  </tt:Data>
                </tt:MessageDescription>
              </Crossed>
            </LineDetector>
          </tns1:RuleEngine>
        </wstop:TopicSet>
        <wsnt:TopicExpressionDialect>
          http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet
        </wsnt:TopicExpressionDialect>
        <wsnt:TopicExpressionDialect>
          http://docs.oasis-open.org/wsnt/t-1/TopicExpression/ConcreteSet
        </wsnt:TopicExpressionDialect>
        <wsnt:MessageContentFilterDialect>
          http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter
        </wsnt:MessageContentFilterDialect>
        <tt:MessageContentSchemaLocation>
          http://www.onvif.org/onvif/ver10/schema/onvif.xsd
        </tt:MessageContentSchemaLocation>
      </tet:GetEventPropertiesResponse>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section>
        <title>CreatePullPointSubscription</title>
        <para>A client can subscribe to specific notifications with the information from the TopicProperties. The following XML example shows the subscription for notifications produced by the Rule Engine of the device. The client reacts only to notifications that reference VideoAnalyticsConfiguration “2” and VideoSourceConfiguration “1”. The Subscription has a timeout of one minute. If the subscription is not explicitly renewed or messages are not pulled regularly, it will be terminated automatically after this time.</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl"
    xmlns:tns1="http://www.onvif.org/ver10/topics">
    <SOAP-ENV:Header>
      <wsa:Action>
        http://www.onvif.org/ver10/events/wsdl/EventPortType/CreatePullPointSubscriptionRequest
      </wsa:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <tet:CreatePullPointSubscription>
        <tet:Filter>
          <wsnt:TopicExpression
            Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
            tns1:RuleEngine//.
          </wsnt:TopicExpression>
          <wsnt:MessageContent 
              Dialect="http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter">
            boolean(//tt:SimpleItem[@Name="VideoAnalyticsConfigurationToken"
            and @Value="2"] ) and
            boolean(//tt:SimpleItem[@Name="VideoSourceConfigurationToken"
            and @Value="1"] )
          </wsnt:MessageContent>
        </tet:Filter>
        <tet:InitialTerminationTime>
          PT1M
        </tet:InitialTerminationTime>
      </tet:CreatePullPointSubscription>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section>
        <title>CreatePullPointSubscriptionResponse</title>
        <para>When the device accepts the Subscription, it returns the <literal>http://160.10.64.10/Subscription?Idx=0</literal> URI which represents the Endpoint of this Subscription. Additionally, the client is informed about the CurrentTime of the device and the TerminationTime of the created Subscription.</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl">
    <SOAP-ENV:Header>
      <wsa:Action>
        http://www.onvif.org/ver10/events/wsdl/EventPortType/CreatePullPointSubscriptionResponse
      </wsa:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <tet:CreatePullPointSubscriptionResponse>
        <tet:SubscriptionReference>
          <wsa:Address>
            http://160.10.64.10/Subscription?Idx=0
          </wsa:Address>
        </tet:SubscriptionReference>
        <wsnt:CurrentTime>
          2008-10-09T13:52:59
        </wsnt:CurrentTime>
        <wsnt:TerminationTime>
          2008-10-09T13:53:59
        </wsnt:TerminationTime>
      </tet:CreatePullPointSubscriptionResponse>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section>
        <title>PullMessagesRequest</title>
        <para>The client sends a PullMessagesRequest to the Endpoint given in the CreatePullPointSubscriptionResponse to get Notifications corresponding to a certain Subscription. The following sample request contains a Timeout of five (5) seconds and limits the total number of messages in the response to two (2).</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl" >
    <SOAP-ENV:Header>
      <wsa:Action>
        http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesRequest
      </wsa:Action>
      <wsa:To>http://160.10.64.10/Subscription?Idx=0</wsa:To>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <tet:PullMessages>
        <tet:Timeout>
          PT5S
        </tet:Timeout>
        <tet:MessageLimit>
          2
        </tet:MessageLimit>
      </tet:PullMessages>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section xml:id="ev_PullMessageResp">
        <title>PullMessagesResponse</title>
        <para>The following PullMessageResponse contains two notifications which match the subscription. The Response informs the client that two objects have crossed lines corresponding to rules “MyImportantFence1” and “MyImportantFence2”.</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl"
    xmlns:tns1="http://www.onvif.org/ver10/topics"
    xmlns:tt="http://www.onvif.org/ver10/schema">
    <SOAP-ENV:Header>
      <wsa:Action>
        http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesResponse
      </wsa:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <tet:PullMessagesResponse>
        <tet:CurrentTime>
          2008-10-10T12:24:58
        </tet:CurrentTime>
        <tet:TerminationTime>
          2008-10-10T12:25:58
        </tet:TerminationTime>
        <wsnt:NotificationMessage>
          <wsnt:Topic Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
            tns1:RuleEngine/LineDetector/Crossed
          </wsnt:Topic>
          <wsnt:Message>
            <tt:Message UtcTime="2008-10-10T12:24:57.321Z">
              <tt:Source>
                <tt:SimpleItem Name="VideoSource" Value="1"/>
                <tt:SimpleItem Name="AnalyticsConfiguration" Value="2"/>
                <tt:SimpleItem Value="MyImportantFence1" Name="Rule"/>
              </tt:Source>
              <tt:Data>
                <tt:SimpleItem Name="ObjectId" Value="15" />
              </tt:Data>
            </tt:Message>
          </wsnt:Message>
        </wsnt:NotificationMessage>
        <wsnt:NotificationMessage>
          <wsnt:Topic Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
            tns1:RuleEngine/LineDetector/Crossed
          </wsnt:Topic>
          <wsnt:Message>
            <tt:Message UtcTime="2008-10-10T12:24:57.789Z">
              <tt:Source>
                <tt:SimpleItem Name="VideoSource" Value="1"/>
                <tt:SimpleItem Name="AnalyticsConfiguration" Value="2"/>
                <tt:SimpleItem Value="MyImportantFence2" Name="Rule"/>
              </tt:Source>
              <tt:Data>
                <tt:SimpleItem Name="ObjectId" Value="19"/>
              </tt:Data>
            </tt:Message>
          </wsnt:Message>
        </wsnt:NotificationMessage>
      </tet:PullMessagesResponse>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section>
        <title>UnsubscribeRequest</title>
        <para>A client has to terminate a subscription explicitly with an UnsubscribeRequest that the device can immediately free resources. The request is directed to the Subscription Endpoint returned in the CreatePullPointSubscriptionResponse.</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" >
    <SOAP-ENV:Header>
      <wsa:Action>
        http://docs.oasis-open.org/wsn/bw-2/SubscriptionManager/UnsubscribeRequest
      </wsa:Action>
      <wsa:To>http://160.10.64.10/Subscription?Idx=0</wsa:To>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <wsnt:Unsubscribe/>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
      <section>
        <title>UnsubscribeResponse</title>
        <para>The Subscription Endpoint is no longer available once the device replies with an UnsubscribeResponse.</para>
        <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" >
    <SOAP-ENV:Header>
      <wsa:Action>
        http://docs.oasis-open.org/wsn/bw-2/SubscriptionManager/UnsubscribeResponse
      </wsa:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <wsnt:UnsubscribeResponse/>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
]]></programlisting>
      </section>
    </section>
    <section>
      <title>Persistent storage event</title>
      <section xml:id="_Ref356949268">
        <title>BeginOfBuffer</title>
        <para>The beginning of buffer event is a logical event that is connected to each subscription that signals that a subscription is reading passed the beginning of the buffer in either direction.</para>
        <para>If a device supports persistent storage notification,  it shall support the beginning of buffer event.</para>
        <para>A device shall signal the beginning of buffer event when a subscription is reading, i.e. PullMessages, passed the beginning of persistent storage buffer either in forward or reverse direction.</para>
        <para>Furthermore when a Seek has been done to before the beginning of buffer a device shall regardless of the direction of reading return the beginning of buffer event.</para>
        <para>A device shall for each Seek operation on a subscription at most send the beginning of buffer event one time.</para>
        <programlisting><![CDATA[Topic: tns1:EventBuffer/Begin
<tt:MessageDescription IsProperty=”false”/>
]]></programlisting>
      </section>
    </section>
    <section>
      <title>Event Broker</title>
      <para>Events can be bridged from an ONVIF device to an MQTT broker. This section describes the event broker configuration interface, how ONVIF topics are mapped to MQTT topics and how the payload is conveyed.</para>
      <para>A device that signals the capability MaxEventBrokers &gt; 0 shall support the AddEventBroker, DeleteEventBroker and GetEventBroker commands.</para>
      <section>
        <title>Data structures</title>
        <section>
          <title>EventBrokerConfig</title>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Address</emphasis>
              </para>
              <para>Event broker address in the format scheme://host:port, where scheme can be "mqtt", "mqtts", "ws" or "wss". The supported schemes shall be returned by the EventBrokerProtocols capability. The Address must be unique.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">TopicPrefix</emphasis>
              </para>
              <para>Prefix that will be prepended to all topics before they are published. This is used to make published topics unique for each device. TopicPrefix is not allowed to be empty.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">UserName</emphasis>
              </para>
              <para>User name for the event broker.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">Password</emphasis>
              </para>
              <para>Password for the event broker. Password shall not be included when returned with GetEventBrokers.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">CertificateID</emphasis>
              </para>
              <para>Optional certificate ID in the key store pointing to a client certificate to be used for authenticating the device at the message broker.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">PublishFilter</emphasis>
              </para>
              <para>Concrete Topic Expression to select specific event topics to publish, see section <xref linkend="_Ref210199558" />. Example TopicExpression: "tns1:VideoAnalytics//.|tns1:RuleEngine//."</para>
			        <para>If PublishFilter is empty, then device shall send all events but not metadata, for e.g. "MyDevice/onvif-ej//." <xref linkend="_Ref210199558" />.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">MetadataFilter</emphasis>
              </para>
              <para>Concrete Topic Expression to select specific metadata topics to publish, see section <xref linkend="_Ref210199558" />. Example TopicExpression: "tns1:VideoAnalytics//. |tns1:AudioAnalytics//. |tns1:PTZ//."</para>
              <para>If MetadataFilter is empty, then device shall send metadata from all active providers, for e.g. "MyDevice/onvif-mj//." <xref linkend="_Ref210199558" />.</para>
            </listitem>            
            <listitem>
              <para>
                <emphasis role="bold">QoS</emphasis>
              </para>
              <para>Quality of service level to use when publishing. This defines the guarantee of delivery for a specific message: 0 = At most once, 1 = At least once, 2 = Exactly once.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">Status</emphasis>
              </para>
              <para>Current connection status (see tev:ConnectionStatus for possible values).</para>
            </listitem>
          </itemizedlist>
        </section>
      </section>
      <section>
        <title>AddEventBroker</title>
        <para>The AddEventBroker command allows an ONVIF client to add an event broker configuration to device to enable ONVIF events to be transferred to an event broker. If an existing event broker configuration already exists with the same Address, the existing configuration shall be modified.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">EventBroker [tev:EventBrokerConfig]</para>
              <para role="text">The event broker definition to be added or modified.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver - ter:Action - ter:TooManyEventBrokers</para>
              <para role="text">The device doesn’t support adding more event broker configurations.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidAddress</para>
              <para role="text">The event broker address is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidProtocol</para>
              <para role="text">The event broker protocol is not supported.</para>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidFilter</para>
              <para role="text">The topic filter was not understood.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteEventBroker</title>
        <para>The DeleteEventBroker allows an ONVIF client to delete an event broker configuration from an ONVIF device.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Address [xs:anyURI]</para>
              <para role="text">The uri of the event broker to be removed.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidAddress</para>
              <para role="text">The event broker address was not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetEventBrokers</title>
        <para>The GetEventBrokers command lets a client retrieve event broker configurations from the device. If Address is specified one event broker configuration shall be returned, if the Address is found, otherwise a fault is returned. If no Address is specified all event broker configurations shall be returned.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Address - optional [xs:anyURI]</para>
              <para role="text">Optional address filter.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">EventBroker - optional, unbounded [tev:EventBrokerConfig]</para>
              <para role="text">List of configured event broker definitions.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender - ter:InvalidArgVal - ter:InvalidAddress</para>
              <para role="text">The event broker address was not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_MEDIA</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>Topic Structure</title>
        <para>Topics are published according to the following structure, expressed as ABNF rules
          according to [RFC 5234]. Note that special characters like, '#' and '+' shall be omitted
          from the topic. For an example, see section <xref linkend="_Ref19678957"/>.</para>
        <para>Topic = TopicPrefix "/" PayloadPrefix "/" LocalTopic [ "/&amp;" Source ]</para>
        <para>Source = SVALUE *("/" SVALUE)</para>
        <para>with<itemizedlist>
            <listitem>
              <para>TopicPrefix - uniquely identifies the producer and is configurable through the
                AddEventBroker command in the Event service. It shall not be empty.</para>
            </listitem>
            <listitem>
              <para>PayloadPrefix - signals in what format the data is published. See <xref
                  xmlns:xlink="http://www.w3.org/1999/xlink" linkend="table_bj3_3wk_frb"/> below for
                possible values.</para>
            </listitem>
            <listitem>
              <para>LocalTopic is the same as the ONVIF topic, but because MQTT does not support
                namespaces, the namespace prefix for ONVIF topics shall be dropped, so that for
                example, "tns1:Device/HardwareFailure/StorageFailure" becomes
                "Device/HardwareFailure/StorageFailure". This means that the default topic namespace
                is ONVIF, i.e. "http://www.onvif.org/ver10/topics". If an event uses another topic
                namespace this should be signalled using the syntax:
                "{namespace-alias}:&lt;topic&gt;". Vendor specific extensions should choose a
                suitable namespace alias to avoid name clashes. As an example, consider the ONVIF
                topic "tns1:Device/HardwareFailure/acme:LensFailure" where
                tns1="http://www.onvif.org/ver10/topics" and acme="http://www.acme.com/topics". This
                should be translated to the MQTT topic
                "Device/HardwareFailure/acme:LensFailure".</para>
            </listitem>
            <listitem>
              <para>SVALUE being the value of the Value attribute of a SimpleItem in the Source part
                of the message. All SimpleItem values shall be listed in the SOURCE sequentially in
                the same order as they are listed in the response to GetEventProperties. These
                values are added to the topic to make it unique so that it can be cached by the
                broker individually. See <xref linkend="_Ref19678957"/> for an example.</para>
            </listitem>
          </itemizedlist></para>
        <table xml:id="table_bj3_3wk_frb">
          <title>Prefix definitions</title>
          <tgroup cols="2">
            <colspec colname="c1" colwidth="15*"/>
            <colspec colname="c2" colwidth="85*"/>
            <thead>
              <row>
                <entry>
                  <para>Prefix</para>
                </entry>
                <entry>
                  <para>Description</para>
                </entry>
              </row>
            </thead>
            <tbody valign="top">
              <row>
                <entry>
                  <para>onvif-ej</para>
                </entry>
                <entry>
                  <para>ONVIF event with JSON payload</para>
                </entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </section>
      <section>
        <title>JSON Event Payload</title>
        <para>This section describes how an ONVIF event is mapped to the JSON data format when published using the "onvif-ej" payload definition. <phrase>Mapping definition from XML to JSON according to [RFC 5234]:</phrase></para>
        <para>MESSAGE = "{" TIMEINFO "," SOURCE ["," DATA ] "}"</para>
        <para>TIMEINFO = DQUOTE "UtcTime" DQUOTE ":" TIMESTAMP </para>
        <para>SOURCE = DQUOTE "Source" DQUOTE ":" "{" *(ITEM) "}"</para>
        <para>DATA = DQUOTE "Data" DQUOTE ":" "{" *(ITEM) "}"</para>
        <para>ITEM = SIMPLEITEM / ELEMENTITEM</para>
        <para>SIMPLEITEM = DQUOTE SNAME DQUOTE ":" DQUOTE SVALUE DQUOTE</para>
        <para>ELEMENTITEM = DQUOTE ENAME DQUOTE ": {" [ TYPE *("," TYPE)] "}"</para>
        <para>TYPE = ATTRIBUTE / SIMPLETYPE / COMPLEXTYPE</para>
        <para>ATTRIBUTE = DQUOTE "@" ANAME DQUOTE ": " DQUOTE AVALUE DQUOTE</para>
        <para>SIMPLETYPE = DQUOTE NAME DQUOTE ": " DQUOTE VALUE DQUOTE</para>
        <para>COMPLEXTYPE = DQUOTE NAME DQUOTE ": {" [TYPE *("," TYPE)] "}"</para>
        <para>with </para>
        <itemizedlist>
          <listitem>
            <para>TIMESTAMP being the double quoted UTC timestamp of the XML Message UtcTime element</para>
          </listitem>
          <listitem>
            <para>SNAME being the value of the Name attribute of the SimpleItem</para>
          </listitem>
          <listitem>
            <para>SVALUE being the value of the Value attribute of the SimpleItem</para>
          </listitem>
          <listitem>
            <para>ENAME being the value of the Name attribute of the ElementItem</para>
          </listitem>
          <listitem>
            <para>ANAME being the name of the attribute of the corresponding XML attribute</para>
          </listitem>
          <listitem>
            <para>AVALUE being the value of the attribute of the corresponding XML attribute</para>
          </listitem>
          <listitem>
            <para>SIMPLETYPE being the XML attribute currently parsed</para>
          </listitem>
          <listitem>
            <para>NAME being the name of the corresponding XML element</para>
          </listitem>
          <listitem>
            <para>VALUE being the value of the corresponding XML element</para>
          </listitem>
        </itemizedlist>
        <para>Note, that quotes may be omitted for integer and floating point values as well as logical states true and false.</para>
        <para>The parser shall parse the elements recursively in the order they are present in the XML representation.</para>
        <para>The output shall be generated according above described rules.</para>
        <section xml:id="_Ref19678957">
          <title>Example</title>
          <para>The XML example response from PullMessages listed in Section <xref
              linkend="ev_PullMessageResp"/> contains two messages which are mapped to the following
            corresponding MQTT topics and JSON payload. In these examples TopicPrefix has been set
            to "MyDevice".</para>
          <para>Topic for the first message:</para>
          <programlisting>MyDevice/onvif-ej/RuleEngine/LineDetector/Crossed/&amp;1/2/MyImportantFence1</programlisting>
          <para>Payload for the first message:</para>
          <programlisting>{
  "UtcTime": "2008-10-10T12:24:57.321Z", 	
  "Source": {
    "VideoSource": "1",
    "AnalyticsConfiguration": "2",
    "Rule": "MyImportantFence1"
  },
  "Data": {
    "ObjectId": "15"
  }
}</programlisting>
          <para>Topic for the second message:</para>
          <programlisting>MyDevice/onvif-ej/RuleEngine/LineDetector/Crossed/&amp;1/2/MyImportantFence2</programlisting>
          <para>Payload for the second message:</para>
          <programlisting>{
  "UtcTime": "2008-10-10T12:24:57.789Z
  "Source": {
    "VideoSource": "1",
    "AnalyticsConfiguration": "2",
    "Rule": "MyImportantFence2"
  },
  "Data": {
    "ObjectId": "19" 	
  }
}</programlisting>
  <para>Third message with the following complex xml data content:</para>
  <programlisting><![CDATA[<tt:ElementItem Name="Segments">
  <tt:Polyline>
    <tt:Point x="0.10" y="0.50"/>
    <tt:Point x="1.0" y="0.50"/>
  </tt:Polyline>
</tt:ElementItem>
]]></programlisting>
          <para>Payload for third message:</para>
          <programlisting>
"UtcTime": "2008-10-10T12:24:57.789Z
  "Source": {
    "VideoSource": "1",
    "Rule": "MyLineInfo"
  },
  "Data": {
    "Segments": {
      "Polyline": {
        "Point": [ { "@x": 0.10, "@y", 0.50}, {"@x": 1.0, "@y": 0.50} ]
      }
    }
  }
}</programlisting>
        </section>
      </section>
      <section>
        <title>Property events</title>
        <para>For property events, the PropertyOperation shall not be included in the message payload.</para>
        <section>
          <title>Retained flag</title>
          <para>For property events, the device shall set the retained flag when sending the messages to the broker.</para>
        </section>
        <section>
          <title>Payload for deleted properties</title>
          <para>For property events, ONVIF compatible devices shall send a notification with PropertyOperation=Deleted when a property is deleted as explained in section <xref linkend="_Ref507651613" />. To achieve same behavior, the device shall send a zero byte payload to the MQTT event broker. This will delete any retained messages in the broker for that specific topic.</para>
        </section>
      </section>
      <section>
        <title>SetSynchronizationPoint behavior</title>
        <para>If a client sends a SetSynchronizationPoint request, property events shall not be republished to the event broker.</para>
      </section>
    </section>
  </chapter>
  <appendix>
    <title>Capability List of GetCapabilities (normative)</title>
    <para>This annex describes a legacy interface to signal capabilities for a certain service or function using the GetCapabilities method. </para>
    <table>
      <title></title>
      <tgroup cols="3">
        <colspec colname="c1" colwidth="31*" />
        <colspec colname="c2" colwidth="33*" />
        <colspec colname="c3" colwidth="36*" />
        <thead>
          <row>
            <entry>
              <para>Category</para>
            </entry>
            <entry>
              <para>Capability</para>
            </entry>
            <entry>
              <para>Description</para>
            </entry>
          </row>
        </thead>
        <tbody valign="top">
          <row>
            <entry morerows="2">
              <para>Analytics</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the analytics service. If this field is empty the device supports analytics but not the rules or module interfaces.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RuleSupport</para>
            </entry>
            <entry>
              <para>Indication if the device supports rules interface and rules syntax as specified in the Video Analytics Service Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>AnalyticsModuleSupport</para>
            </entry>
            <entry>
              <para>Indication if the device supports the scene analytics module interface as specified in the Video Analytics Service Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Device</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the device service.</para>
            </entry>
          </row>
          <row>
            <entry morerows="3">
              <para>Device – Network</para>
            </entry>
            <entry>
              <para>IPFilter</para>
            </entry>
            <entry>
              <para>Indication if the device supports IP filtering control using the commands in Section <xref linkend="_Toc213907655" />, <xref linkend="_Toc213907656" />, <xref linkend="_Toc213907657" /> and <xref linkend="_Toc213907658" />.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>ZeroConfiguration</para>
            </entry>
            <entry>
              <para>Indication if the device supports zero configuration according to the commands in Section <xref linkend="_Toc213907653" /> and Section <xref linkend="_Toc213907654" />. </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>IPVersion6</para>
            </entry>
            <entry>
              <para>Indication if the device supports IP version 6.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>DynDNS</para>
            </entry>
            <entry>
              <para>Indication if the device supports Dynamic DNS configuration according to Section <xref linkend="_Toc213907645" />and Section <xref linkend="_Toc214944184" /> .</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>Dot11Configuration</para>
            </entry>
            <entry>
              <para>Indication if the device supports IEEE802.11 configuration as specified in Section <xref linkend="_Toc213907659" /></para>
            </entry>
          </row>
          <row>
            <entry morerows="10">
              <para>Device – System</para>
            </entry>
            <entry>
              <para>DiscoveryResolve</para>
            </entry>
            <entry>
              <para>Indication if the device responses to resolve requests as described in Section <xref linkend="_Toc204774617" />.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>DiscoveryBye</para>
            </entry>
            <entry>
              <para>Indication if the device sends bye messages as described in Section <xref linkend="_Toc204774618" /></para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RemoteDiscovery</para>
            </entry>
            <entry>
              <para>Indication if the device supports remote discovery support.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>SupportedVersions</para>
            </entry>
            <entry>
              <para>List of the device supported ONVIF specification versions.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>SystemBackup</para>
            </entry>
            <entry>
              <para>Indication if the device supports system backup and restore as specified in Section <xref linkend="_Ref276040129" /> and Section <xref linkend="_Toc213907663" /></para>
            </entry>
          </row>
          <row>
            <entry>
              <para>FirmwareUpgrade</para>
            </entry>
            <entry>
              <para>Indication if the device supports firmware upgrade using UpgradeSystemFirmware
                (deprecated).</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>SystemLogging</para>
            </entry>
            <entry>
              <para>Indication if the device supports system log retrieval as specified in Section <xref linkend="_Ref482093370" />. </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>HttpSystemBackup</para>
            </entry>
            <entry>
              <para>Indication if the device supports system backup and restore using HTTP GET and POST.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>HttpFirmwareUpgrade</para>
            </entry>
            <entry>
              <para>Indication if the device supports firmware upgrade using HTTP POST.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>HTTPSystemLogging</para>
            </entry>
            <entry>
              <para>Indication if the device supports retrieval of system log using HTTP Get, see section 8.3.2.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>HTTPSupportInformation</para>
            </entry>
            <entry>
              <para>Indication if the device supports retrieval of support information using HTTP Get, see section 8.3.2.</para>
            </entry>
          </row>
          <row>
            <entry morerows="2">
              <para>Device – IO</para>
            </entry>
            <entry>
              <para>InputConnectors</para>
            </entry>
            <entry>
              <para>The number of input connectors.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RelayOutputs</para>
            </entry>
            <entry>
              <para>The number of relay outputs.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Auxiliary</para>
            </entry>
            <entry>
              <para>Indication of support for auxiliary service along with list of supported auxiliary commands</para>
            </entry>
          </row>
          <row>
            <entry morerows="12">
              <para>Device – Security</para>
            </entry>
            <entry>
              <para>TLS1.0</para>
            </entry>
            <entry>
              <para>Support of TLS 1.0.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>TLS1.1</para>
            </entry>
            <entry>
              <para>Support of TLS 1.1.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>TLS1.2</para>
            </entry>
            <entry>
              <para>Support of TLS 1.2.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>OnboardKeyGeneration</para>
            </entry>
            <entry>
              <para>Indication if the device supports onboard key generation and creation of self-signed certificates (deprecated).</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>AccessPolicyConfig</para>
            </entry>
            <entry>
              <para>Indication if the device supports retrieving and loading device access control policy according to Section <xref linkend="_Toc213907681" /> and Section <xref linkend="_Toc213907682" />.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>X.509Token</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS-Security X.509 token [WS-X.509Token].</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>SAMLToken</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS-Security SAML token [WS-SAMLToken].</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>KerberosToken</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS-Security Kerberos token [WS-KerberosToken].</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RELToken</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS-Security REL token [WS-RELToken].</para>
            </entry>
          </row>
          <row>
            <entry><para>JsonWebToken</para></entry>
            <entry><para>Indication if the devices supports JWT-based authentication.</para></entry>
          </row>
          <row>
            <entry>
              <para>Dot1X</para>
            </entry>
            <entry>
              <para>Indication if the device supports IEEE 802.1X port-based network authentication (deprecated).</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>SupportedEAPMethod</para>
            </entry>
            <entry>
              <para>List of supported EAP Method types. The numbers correspond to the IANA [EAP-Registry].</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RemoteUserHandling</para>
            </entry>
            <entry>
              <para>Indication if device supports remote user handling and the corresponding methods defined in section <xref linkend="_Toc251861725" /> and <xref linkend="_Ref247076107" />.</para>
            </entry>
          </row>
          <row>
            <entry morerows="3">
              <para>Event</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the event service</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>WSSubscriptionPolicySupport</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS Subscription policy according to Section<xref linkend="_Toc214944387" /></para>
            </entry>
          </row>
          <row>
            <entry>
              <para>WSPullPointSupport</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS Pull Point according to Section <xref linkend="_Toc214944387" /></para>
            </entry>
          </row>
          <row>
            <entry>
              <para>WSPausableSubscription-ManagerInterfaceSupport</para>
            </entry>
            <entry>
              <para>Indication if the device supports the WS Pausable Subscription Manager Interface according to Section<xref linkend="_Toc214944387" /></para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Imaging</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the imaging service</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Media</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the media service.</para>
            </entry>
          </row>
          <row>
            <entry morerows="2">
              <para>Media – streaming</para>
            </entry>
            <entry>
              <para>RTPMulticast</para>
            </entry>
            <entry>
              <para>Indication of support of UDP multicasting as described in the ONVIF Streaming Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RTP_TCP</para>
            </entry>
            <entry>
              <para>Indication if the device supports RTP over TCP, see ONVIF Streaming Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RTP_RTSP_TCP</para>
            </entry>
            <entry>
              <para>Indication if the device supports RTP/RTSP/TCP transport, see ONVIF Streaming Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Media - profile</para>
            </entry>
            <entry>
              <para>MaximumNumberOfProfiles</para>
            </entry>
            <entry>
              <para>The maximum Number of MediaProfiles the device supports.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>PTZ</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the PTZ service.</para>
            </entry>
          </row>
          <row>
            <entry morerows="5">
              <para>Receiver</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the receiver service.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RTP_Multicast</para>
            </entry>
            <entry>
              <para>Indication if the device supports receiving of RTP Multicast.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RTP_TCP</para>
            </entry>
            <entry>
              <para>Indication if the device supports receiving of RTP over TCP.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>RTP_RTSP_TCP</para>
            </entry>
            <entry>
              <para>Indication if the device supports receiving of RTP over RTSP over TCP</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>SupportedReceivers</para>
            </entry>
            <entry>
              <para>The maximum number of receivers the device supports.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>MaximumRTSPURILength</para>
            </entry>
            <entry>
              <para>The maximum length allowed for RTSP URIs.</para>
            </entry>
          </row>
          <row>
            <entry morerows="3">
              <para>Recording</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the recording control service.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>DynamicRecordings</para>
            </entry>
            <entry>
              <para>Indication if the device supports dynamic creation and deletion of recordings, see ONVIF Recording Configuration Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>DynamicTracks</para>
            </entry>
            <entry>
              <para>Indication if the device supports dynamic creation and deletion of tracks, see ONVIF Recording Configuration Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>DeleteData</para>
            </entry>
            <entry>
              <para>Indication if the device supports explicit deletion of data, see ONVIF Recording Configuration Specification.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Search</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the recording search service.</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>MetadataSearch</para>
            </entry>
            <entry>
              <para>Indication if the device supports generic search of recorded metadata as defined in the ONVIF Recording Search Specification..</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Replay</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the replay service.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Analytics Device</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the analytics device service of the device.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Display</para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the display service.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Display - layout</para>
            </entry>
            <entry>
              <para>FixedLayout</para>
            </entry>
            <entry>
              <para>Indication that the SetLayout command supports only predefined layouts..</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>Device IO </para>
            </entry>
            <entry>
              <para>XAddr</para>
            </entry>
            <entry>
              <para>The address to the device IO service.</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>VideoSources</para>
            </entry>
            <entry>
              <para>The number of video inputs</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>VideoOutputs</para>
            </entry>
            <entry>
              <para>The number of video outputs</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>AudioSources</para>
            </entry>
            <entry>
              <para>The number of audio inputs</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>AudioOutputs</para>
            </entry>
            <entry>
              <para>The number of audio outputs</para>
            </entry>
          </row>
          <row>
            <entry/>
            <entry>
              <para>RelayOutputs</para>
            </entry>
            <entry>
              <para>The number of relay outputs.</para>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
  </appendix>
  <appendix>
    <title>Bibliography</title>
    <para>[EAP-Registry] Extensible Authentication Protocol (EAP) Registry</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.iana.org/assignments/eap-numbers/eap-numbers.xml">http://www.iana.org/assignments/eap-numbers/eap-numbers.xml</link>]</para>
    <para>ONVIF Recommendations for Cybersecurity Best Practices for IP-based Physical Security Products</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.onvif.org/profiles/whitepapers/onvif-recommendations-for-cybersecurity-best-practices-for-ip-based-physical-security-products/"/>]</para>
    <para>RFC 2396, <emphasis>Uniform Resource Identifiers (URI): Generic Syntax, T. Berners-Lee et al., August 1998</emphasis> [<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</link>]</para>
    <para>[UDDI API ver2, “UDDI Version 2.04 API Specification UDDI Committee Specification, 19 July 2002”, OASIS standard, 19 July 2002></para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://uddi.org/pubs/ProgrammersAPI-V2.04-Published-20020719.pdf"/>]</para>
    <para>[UDDI Data Structure ver2]	“UDDI Version 2.03 Data Structure Reference UDDI Committee Specification”, OASIS standard, 19 July 2002.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://uddi.org/pubs/DataStructure-V2.03-Published-20020719.pdf"/>]></para>
    <para>[WS-KerberosToken]	“Web Services Security Kerberos Token Profile 1.1”, OASIS Standard, ,1 February 2006.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.oasis-open.org/committees/download.php/16788/wss-v1.1-spec-os-KerberosTokenProfile.pdf"/>]</para>
    <para>[WS-SAMLToken]	“Web Services Security: SAML Token Profile 1.1”, OASIS Standard, 1 February 2006.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.oasis-open.org/committees/download.php/16768/wss-v1.1-spec-os-SAMLTokenProfile.pdf"/>]</para>
    <para>[WS-X.509Token]	“Web Services Security X.509 Certificate Token Profile 1.1”, OASIS Standard,1 February 2006.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.oasis-open.org/committees/download.php/16785/wss-v1.1-spec-os-x509TokenProfile.pdf"/>]</para>
    <para>[WS-RELToken]	“Web Services Security Rights Expression Language (REL) Token Profile 1.1”,  OASIS Standard, 1 February 2006</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.oasis-open.org/committees/download.php/16687/oasis-wss-rel-token-profile-1.1.pdf"/>]</para>
    <para>[WS-BinarySecurityToken] “Basic Security Profile Version 1.1 Committee Specification 01”,
      OASIS Standard, 22 October 2004</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://docs.oasis-open.org/ws-brsp/BasicSecurityProfile/v1.1/cs01/BasicSecurityProfile-v1.1-cs01.pdf"/>]</para>
    <para>[X.680]	ITU-T Recommendation X.680 (1997) | ISO/IEC 8824-1:1998, Information</para>
    <para>Technology - Abstract Syntax Notation One (ASN.1): Specification of Basic</para>
    <para>Notation.</para>
    <para>[X.681]	ITU-T Recommendation X.681 (1997) | ISO/IEC 8824-2:1998, Information</para>
    <para>Technology - Abstract Syntax Notation One (ASN.1): Information Object</para>
    <para>Specification.</para>
    <para>[X.682]	ITU-T Recommendation X.682 (1997) | ISO/IEC 8824-3:1998, Information</para>
    <para>Technology - Abstract Syntax Notation One (ASN.1): Constraint Specification.</para>
    <para>[X.683]	ITU-T Recommendation X.683 (1997) | ISO/IEC 8824-4:1998, Information</para>
    <para>Technology - Abstract Syntax Notation One (ASN.1): Parameterization of ASN.1</para>
    <para>Specifications.</para>
    <para>[X.690]	ITU-T Recommendation X.690 (1997) | ISO/IEC 8825-1:1998, Information</para>
    <para>Technology - ASN.1 Encoding Rules: Specification of Basic Encoding Rules</para>
    <para>(BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules</para>
    <para>(DER).</para>
    <para> [ONVIF DM WSDL] ONVIF Device Management Service WSDL, ver 2.1<emphasis>, </emphasis>2011.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl"/>]</para>
    <para>[ONVIF Event WSDL] ONVIF Event Service WSDL, ver 2.1, 2011.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/event/wsdl/event.wsdl"/>]</para>
    <para> [ONVIF DP WSDL] ONVIF Remote Discovery Proxy Services WSDL, ver 2.0, 2010.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl"/>]</para>
    <para>[ONVIF Schema] ONVIF Schema, ver 2.0, 2010.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/onvif/ver10/schema/onvif.xsd"/>]</para>
    <para>[ONVIF Topic Namespace] ONVIF Topic Namespace XML, ver 2.0, 2010.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/topics/topicns.xml"/>]</para>
    <para>[ONVIF Security] ONVIF Security Specification</para>
    <para>[ONVIF Analytics] ONVIF Analytics Service Specification</para>
    <para>WS-I, Basic Profile Version 2.0 – Working Group Draft, C. Ferris (Ed), A. Karmarkar (Ed) and  P. Yendluri (Ed), October 2007.</para>
    <para role="reference">[<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ws-i.org/Profiles/BasicProfile-2_0(WGD).html"/></para>
  </appendix>
  <appendix xml:id="title_xch_2yd_rmb">
    <title>Example for GetServices Response with capabilities</title>
    <para>The following is an example response for GetServices : </para>
    <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" 
  xmlns: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:xop="http://www.w3.org/2004/08/xop/include" 
  xmlns:tds="http://www.onvif.org/ver10/device/wsdl" 
  xmlns:tt="http://www.onvif.org/ver10/schema">
  <env:Header>
  </env:Header>
  <env:Body>
    <tds:GetServicesResponse>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/device/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.0.10/onvif/device_service</tds:XAddr>
        <tds:Capabilities>
          <tds:Capabilities>
            <tds:Network IPFilter="false" ZeroConfiguration="true" 
              IPVersion6="false" DynDNS="false" Dot11Configuration="false" 
              HostnameFromDHCP="false" NTP="0" />
            <tds:Security TLS1.0="false" TLS1.1="false" TLS1.2="false" 
              OnboardKeyGeneration="false" AccessPolicyConfig="false" 
              DefaultAccessPolicy="false" Dot1X="false" 
              X.509Token="false" SAMLToken="false" KerberosToken="false" 
              HttpDigest="false" RELToken="false" />
            <tds:System DiscoveryResolve="true" DiscoveryBye="true" 
              HttpFirmwareUpgrade="true"HttpSystemLogging="false" />
            <tds:Misc AuxiliaryCommands="" />
          </tds:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>2</tt:Major>
          <tt:Minor>20</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/media/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.0.10/onvif</tds:XAddr>
        <tds:Capabilities>
          <trt:Capabilities xmlns:trt="http://www.onvif.org/ver10/media/wsdl" 
            SnapshotUri="true" Rotation="false">
            <trt:ProfileCapabilities MaximumNumberOfProfiles="10" />
            <trt:StreamingCapabilities RTPMulticast="true" RTP_TCP="false" 
              RTP_RTSP_TCP="true" NonAggregateControl="true" />
          </trt:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>2</tt:Major>
          <tt:Minor>20</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver20/ptz/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.0.10/onvif</tds:XAddr>
        <tds:Capabilities>
          <tptz:Capabilities xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" 
            EFlip="false" Reverse="false" />
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>2</tt:Major>
          <tt:Minor>20</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/events/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.0.10/onvif</tds:XAddr>
        <tds:Capabilities>
          <tev:Capabilities xmlns:tev="http://www.onvif.org/ver10/events/wsdl" 
            WSSubscriptionPolicySupport="false" WSPullPointSupport="false" />
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>2</tt:Major>
          <tt:Minor>20</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver20/imaging/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.0.10/onvif</tds:XAddr>
        <tds:Capabilities>
          <timg:Capabilities xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" 
            ImageStabilization="false" />
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>2</tt:Major>
          <tt:Minor>20</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/deviceIO/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.0.10/onvif</tds:XAddr>
        <tds:Capabilities>
          <tmd:Capabilities xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" 
            VideoSources="1" VideoOutputs="0" AudioSources="1" AudioOutputs="1" 
            RelayOutputs="0" SerialPorts="0" DigitalInputs="0" />
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>2</tt:Major>
          <tt:Minor>20</tt:Minor>
        </tds:Version>
      </tds:Service>
    </tds:GetServicesResponse>
  </env:Body>
</env:Envelope>
]]></programlisting>
    <para>Note that capabilities can be omitted if a device does not support the capability or new capability is defined after the device implementation.</para>
  </appendix>
  <appendix>
    <title>Deprecated Interfaces</title>
    <section>
      <title>Remote Discovery Proxy</title>
      <para>The definition and interfaces for the Remote Discovery Proxy have been deprecated with release 2.6.1. The following interfaces have been removed from the specification:</para>
      <itemizedlist>
        <listitem>
          <para>Get remote discovery mode</para>
        </listitem>
        <listitem>
          <para>Set remote discovery mode</para>
        </listitem>
        <listitem>
          <para>Get remote DP addresses</para>
        </listitem>
        <listitem>
          <para>Set remote DP addresses</para>
        </listitem>
      </itemizedlist>
      <para> The definitions are available via the link <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/specs/core/ONVIF-Core-Specification-v260.pdf">http://www.onvif.org/specs/core/ONVIF-Core-Specification-v260.pdf</link>.</para>
    </section>
    <section>
      <title>Security</title>
      <para>The definition and interfaces for the Security have been deprecated with release 16.12. The following interfaces have been removed from the specification: The Security part was handed over to Security Service. </para>
      <itemizedlist>
        <listitem>
          <para>Create IEEE 802.1X configuration</para>
        </listitem>
        <listitem>
          <para>Set IEEE 802.1X configuration</para>
        </listitem>
        <listitem>
          <para>Get IEEE 802.1X configuration</para>
        </listitem>
        <listitem>
          <para>Get IEEE 802.1X configurations</para>
        </listitem>
        <listitem>
          <para>Delete IEEE 802.1X configuration</para>
        </listitem>
        <listitem>
          <para>Create self-signed certificate</para>
        </listitem>
        <listitem>
          <para>Get certificates</para>
        </listitem>
        <listitem>
          <para>Get CA certificates</para>
        </listitem>
        <listitem>
          <para>Get certificate status</para>
        </listitem>
        <listitem>
          <para>Set certificate status</para>
        </listitem>
        <listitem>
          <para>Get certificate request</para>
        </listitem>
        <listitem>
          <para>Get client certificate status</para>
        </listitem>
        <listitem>
          <para>Set client certificate status</para>
        </listitem>
        <listitem>
          <para>Load device certificate</para>
        </listitem>
        <listitem>
          <para>Load device certificates in conjunction with its private key</para>
        </listitem>
        <listitem>
          <para>Get certificate information</para>
        </listitem>
        <listitem>
          <para>Load CA certificates</para>
        </listitem>
        <listitem>
          <para>Delete certificate</para>
        </listitem>
      </itemizedlist>
      <para>The following GetServiceCapabilities have been deprecated:</para>
      <itemizedlist>
        <listitem>
          <para>TLS1.0</para>
        </listitem>
        <listitem>
          <para>TLS1.1</para>
        </listitem>
        <listitem>
          <para>TLS1.2</para>
        </listitem>
        <listitem>
          <para>OnboardKeyGeneration</para>
        </listitem>
      </itemizedlist>
      <para> The definitions are available via the link <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/specs/core/ONVIF-Core-Specification-v1606.pdf">http://www.onvif.org/specs/core/ONVIF-Core-Specification-v1606.pdf</link>.</para>
    </section>
    <section>
      <title>System</title>
      <para>The definition and interfaces for MTOM firmware upgrade have been deprecated with release 25.06. The following interfaces have been removed from the specification:</para>
      <itemizedlist>
        <listitem>
          <para>UpgradeSystemFirmware</para>
        </listitem>
      </itemizedlist>
    </section>
  </appendix>
  <appendix>
    <title>JSON payload format</title>
      <section>
        <title>XML to JSON conversion guidance</title>
        <para>Instead of creating a full fledged schema for XML to JSON conversion, <xref
          linkend="xmlToJson"/> provides a set of generic rules to express ONVIF XML in JSON format
        as defined by RFC 7159.</para>

        <table xml:id="xmlToJson">
          <title>ONVIF XML to JSON conversion</title>

          <tgroup cols="3">
            <thead>
              <row>
                <entry align="center"><para>ONVIF XML Element</para></entry>

                <entry align="center"><para>ONVIF JSON
                Representation</para></entry>

                <entry align="center"><para>Description</para></entry>
              </row>
            </thead>

            <tbody>
              <row>
                <entry><para>&lt;xmltag/&gt;</para></entry>

                <entry><para>“xmltag”: null</para></entry>

                <entry><para>Null tag</para></entry>
              </row>

              <row>
                <entry><para>&lt;xmltag&gt;text&lt;/xmltag&gt;</para></entry>

                <entry><para>“xmltag”: "text"</para></entry>

                <entry><para>Simple tag with value</para></entry>
              </row>

              <row>
                <entry><para>&lt; xmltag name="value" /&gt;</para></entry>

                <entry><para>“xmltag”:{"@name": "value"}</para></entry>

                <entry><para>Tag with attribute</para></entry>
              </row>

              <row>
                <entry><para>&lt;xmltag name="value"&gt;text&lt;/
                xmltag&gt;</para></entry>

                <entry><para>“xmltag”: { "@name": "value", "#text": "text"
                }</para></entry>

                <entry><para>Tag with attribute and value</para></entry>
              </row>

              <row>
                <entry><para>&lt;xmltag&gt; &lt;tag1&gt;text&lt;/tag1&gt;
                &lt;tag2&gt;text&lt;/tag2&gt; &lt;/xmltag</para></entry>

                <entry><para>“xmltag”: { "tag1": "text", "tag2": "text"
                }</para></entry>

                <entry><para>Tag with multiple child tags</para></entry>
              </row>

              <row>
                <entry><para>&lt;xmltag&gt; &lt;tag1&gt;text&lt;/tag1&gt;
                &lt;tag1&gt;text&lt;/tag1&gt; &lt;/ xmltag&gt;</para></entry>

                <entry><para>“xmltag”: { "tag1": ["text", "text"]
                }</para></entry>

                <entry><para>Tag with multiple child tags of same type
                (similar to maxOccurs &gt; 1)</para></entry>
              </row>
            </tbody>
          </tgroup>
        </table>

        <para>All extension elements and attributes shall be included within
        the same parent JSON object.</para>
        <para>Note, that quotes may be omitted for integer and floating point values as well as logical states true and false.</para>
        <para>Namespace prefixes for ONVIF defined namespaces shall be
        dropped, i.e. elements and attributes that belong to the following
        namespaces:</para>

        <itemizedlist>
          <listitem>
            <para>http://www.onvif.org/ver10/schema</para>
          </listitem>

          <listitem>
            <para>http://www.onvif.org/ver20/analytics/humanface</para>
          </listitem>

          <listitem>
            <para>http://www.onvif.org/ver20/analytics/humanbody</para>
          </listitem>

          <listitem>
            <para>http://www.onvif.org/ver20/analytics/radiometry</para>
          </listitem>
        </itemizedlist>

        <para>XML elements and attributes that belong to a different namespace shall have their
        names prepended with their corresponding namespace prefix joined by a ':' while defining the
        namespace in the "context" object as per JSON-LD specification. See specifically the
        acme:ColorName as part of JSON metadata example in ONVIF Analytics Service specification for
        better understanding.</para>
      </section>
  </appendix>
  <appendix role="revhistory">
    <title>Revision History</title>
    <para/>
  </appendix>
</book>
