<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.1 (Ruby 3.0.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY I-D.shahzad-scim-device-model SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.shahzad-scim-device-model.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC9114 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9114.xml">
]>


<rfc ipr="trust200902" docName="draft-brinckman-nipc-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="NIPC">An Application Layer Interface for Non-IP device control (NIPC)</title>

    <author initials="B." surname="Brinckman" fullname="Bart Brinckman">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <city>Brussels</city>
          <country>Belgium</country>
        </postal>
        <email>bbrinckm@cisco.com</email>
      </address>
    </author>
    <author initials="R." surname="Mohan" fullname="Rohit Mohan">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <code>95134</code>
          <country>USA</country>
        </postal>
        <email>rohitmo@cisco.com</email>
      </address>
    </author>
    <author initials="B." surname="Sanford" fullname="Braeden Sanford">
      <organization>Philips</organization>
      <address>
        <postal>
          <city>Cambridge</city>
          <country>USA</country>
        </postal>
        <email>braeden.sanford@philips.com</email>
      </address>
    </author>

    <date year="2024" month="April" day="21"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 54?>

<t>This memo specifies RESTful application layer interface for gateways 
providing operations against non-IP devices. The described interface is
extensible. This memo initially describes Bluetooth Low Energy and 
Zigbee as they are the most commonly deployed.</t>



    </abstract>



  </front>

  <middle>


<?line 61?>

<section anchor="introduction"><name>Introduction</name>

<t>Use cases in building management, healthcare, workplaces, manufacturing,
logistics and hospitality have introduced low-power devices into these 
environments. These devices typically do not support IP-based 
interfaces, hence there is a need for gateway functions to allow these
devices to communicate with the applications that manage them.</t>

<figure title="Gateway for non-IP Devices" anchor="gw"><artwork><![CDATA[
                                                               
    +-------------+              +---------+              +--------+
    | Application |<------------>| Gateway |<------------>| Non-IP |                     
    |    app      |   IP-based   |         |    Non-IP    | Device |
    +-------------+   Operation  +---------+   Operation  +--------+                 

]]></artwork></figure>

<t>In abscence of a standard describing how applications communicate with 
such non-IP devices, vertically integrated infrastructure prolifilates
and applications have bespoke integrations with that infrastructure for 
every use case. The Application interfaces are non-standard. This 
stunts the eco-system growth. At the same time, wireless access points 
have been deployed nearly everywhere, many of which have soft or 
separate radios that can transmit and receive different frame types,
such as <xref target="BLE53"/> and <xref target="Zigbee22"/>.  To avoid the need for parallel
infrastructure and bespoke application integration, a standardized 
gateway function is necessary.</t>

<t>The gateway provides at a minimum the following functions:</t>

<t><list style="symbols">
  <t>authentication and authorization of application clients that
will access devices</t>
  <t>the ability to onboard devices that are intended to be deployed 
within the use case</t>
  <t>maintenance of an inventory of onboarded devices that are intended to
access and be accessed by the deployment and applications.</t>
  <t>interfaces that allow for bi-directional communication to non-IP
devices</t>
  <t>one or more channels to process requests, responses, and asymmetric
communciations with the non-IP radio resources (Access Points) 
in the system.</t>
</list></t>

<t>Combined with a provisioning interface such as
<xref target="I-D.shahzad-scim-device-model"/>, this specification supports
these aspects, specifically focusing on providing bi-directional 
communication with non-IP devices.</t>

<figure title="Basic Architecture" anchor="arch"><artwork><![CDATA[
                            +-----------------------------------+
                            |                                   |
    +-----------+   Request |  +---------+                      |
    | onboarding|------------->|  SCIM   |                      |
    |    app    |<-------------| Server  |                      |
    +-----------+  Ctrl Endpt  +---------+                      |
                            |                                   |
    +-----------+           |  +------------+  +-------+  +--+  |
    |  Control  |>...REST...|.>|            |..|  AP   |..|D |  |
    |     &     |           |  |   Gateway  |  +-------+  +--+  |
    | Telemetry |<...MQTT...|.<|            |                   |
    |    Apps   |           |  +------------+                   |
    +-----------+           |                                   |
                            |       Network Deployment          |
                            +-----------------------------------+

]]></artwork></figure>

<t><xref target="arch"/> shows us the application layer gateway (ALG), an access
point (AP), and a device (D) in the enterprise environment.  The role
of the ALG is to provide a application gateway to non-IP devices
connecting into one or more AP. Applications implementing this memo can
leverage RESTful interfaces to communicate with these devices and 
subscribe to streaming data or broadcasts levering MQTT.</t>

<t>The flow of operations are as follows:</t>

<t><list style="numbers">
  <t>The operator of the network deployment authorizes application(s) to
perform operations on the Gateway. This happens out of band and may
be accomplished by means of exchanging tokens or public keys. 
Authorization can be role-based:<br />
a. Authorize an onboarding application against a SCIM endpoint
supported by the gateway.<br />
b. Provision and authorize applications that may control devices.<br />
c. Provision and authorize applications that may receive telemetry.</t>
  <t>The authorized application can now provision one or more devices on
the gateway leveraging SCIM.</t>
</list></t>

<t>Steps 1 and 2 are not within the scope of this specification, but are
provided for context.</t>

<t><list style="numbers">
  <t>The authorized application can perform RESTful calls to the gateway
in order to establish bi-directional communication to one or more
devices. Optionally, set up a publish/subcribe topic to receive
streaming data from a device (telemetry interface).</t>
  <t>Optionally, an application can receive streaming data on a pub/sub 
topic configured by the control interface (telemetry interface).</t>
</list></t>

<t>Step 3 and 4 are the subject of this memo.</t>

<t>This specification is organized into three sections:</t>

<t><list style="symbols">
  <t>Basic non-IP control functions described in narrative.</t>
  <t>Extensibility of the interfaces.</t>
  <t>A specification that can be mapped to a publication/subscribe
interface, such as MQTT.</t>
  <t>Examples of use cases leveraging both BLE and Zigbee-based devices.</t>
  <t>OpenAPI definitions for the control interface and Protobuf definitions 
for the streaming data interface</t>
</list></t>

<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP
14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>

</section>
</section>
<section anchor="non-ip-control-functions"><name>Non-IP Control Functions</name>

<t>This section will describe a standardized protocol-agnostic interface 
that allows the application to establish bi-directional communication 
with a non-IP device, such as a BLE or Zigbee device. The interface 
will be supported on a gateway as show in <xref target="arch"/>.</t>

<section anchor="approach"><name>Approach</name>

<t>In non-IP protocols such as BLE or Zigbee, a number of basic operations
are defined that are similar across protocols. Examples of 
this are read and write data. Devices may choose to implement all of the
operations or a subset. For example in BLE a device may choose to 
implement a binding, but could also allow connection without a binding. 
In this memo we have therefore defined a control interface that exposes
these basic operations with a communications protocol-agnostic schema,
with protocol specific extensions to transmit and receive 
attributes that are specific to the communications protocol supported 
by the device. This enables extensions  to integrate new
non-ip communications protocols, without the need to update the base
schema.</t>

<figure title="Extensible Schema" anchor="schema"><artwork><![CDATA[
    ID
     - device/group attributes
        |
        |> BLE
        |     - BLE attributes
        |
        |> Zigbee
              - Zigbee attributes

]]></artwork></figure>

<t>As shown in <xref target="schema"/>, the control interface addresses device and group
objects as IDs, hence the requirement to declare a device to the gateway
before addressing a NIPC operation to the device. This is done by 
means of SCIM. A NIPC operation can either be performed against a 
device-id or a group-id. The gateway will leverage information from the 
SCIM object to execute a specific NIPC operation. For example, keying 
material found in the SCIM object may be required to connect to a
device. Please refer to <xref target="I-D.shahzad-scim-device-model"/> for more 
information on SCIM device objects.</t>

<t>Apart from enabling bi-directional communication with non-ip devices,
NIPC also allows an application to register pub/sub topics in order to
support a programmable data streaming interface.</t>

<section anchor="common-base-schema"><name>Common base schema</name>

<t>As described, most operations are executed against a device or a group.
Control operations refer to either of these as "Object" with an ID as an
identifier. The common schema for Object is defined as follows:</t>

<texttable title="Definition of an Object" anchor="objectdef">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>id</c>
      <c>T</c>
      <c>uuid</c>
      <c>12345678-1234-5678-1234-56789abcdef4</c>
      <c>type</c>
      <c>T</c>
      <c>enum</c>
      <c>device</c>
      <c>technology</c>
      <c>F</c>
      <c>enum</c>
      <c>ble</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>id is the id returned in the response when registering a device 
against a SCIM server.</t>
  <t>type is either "group" or "device".</t>
  <t>technology is the radio technology extension(s) supported by the 
device, in this memo either "ble" or "zigbee".</t>
</list></t>

</section>
<section anchor="protocol-extensions"><name>Protocol extensions</name>

<t>An object can support one or more communications protocols. These 
attributes must be described in a protocol object, for example a "ble"
or a "zigbee" object.</t>

<texttable title="Protocol extensions" anchor="protext">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>ble</c>
      <c>T</c>
      <c>object</c>
      <c>an object with BLE-specific attributes</c>
      <c>zigbee</c>
      <c>T</c>
      <c>object</c>
      <c>an object with Zigbee-specific attributes</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>"ble" is an object containing attributes that are specific to the BLE
protocol.</t>
  <t>"zigbee" is an object containing attributes that are specific to the
Zigbee protocol.</t>
  <t>Other protocol extensions can be added</t>
</list></t>

</section>
<section anchor="response"><name>Response</name>

<t>As most operations have a common base schema, so do responses. As 
mandatory, a status is returned, optionally also device id and request 
id.</t>

<t>Success response:</t>

<texttable title="Success response" anchor="success">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>status</c>
      <c>T</c>
      <c>enum</c>
      <c>SUCCESS</c>
      <c>id</c>
      <c>F</c>
      <c>uuid</c>
      <c>12345678-1234-5678-1234-56789abcdef4</c>
      <c>requestID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
</texttable>

<t>Failure response:</t>

<texttable title="Failure response" anchor="failure">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>status</c>
      <c>T</c>
      <c>enum</c>
      <c>SUCCESS</c>
      <c>errorCode</c>
      <c>T</c>
      <c>int</c>
      <c>12</c>
      <c>reason</c>
      <c>T</c>
      <c>string</c>
      <c>"Not Found"</c>
      <c>requestID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>status is the status of the request, either "SUCCESS" or "FAILURE". 
In case of failure an error code and reason are added</t>
  <t>id is the id the operation was executed against, found in the request</t>
  <t>requestID is a correlation ID that can be used for end-to-end 
tracing.</t>
  <t>errorCode is a numerical value representing the error</t>
  <t>reason is a human readable explanation of why the error occurred</t>
</list></t>

</section>
<section anchor="categories-of-operations-supported"><name>Categories of operations supported</name>

<t>The common operations are categorized in common categories that describe 
high level sets of functionalities. Each of the NIPC operations belong 
to a category. The categories are:</t>

<t><list style="symbols">
  <t>/connectivity: Allows an application to establish connectivity with
a device (if so required by the technology)</t>
  <t>/data: Allows applications to exchange data with a device</t>
  <t>/registrations: Allows an application to make registrations in the 
network, for example to register a pub/sub topic</t>
  <t>/extensions: This is a category of operations that leverage basic 
connectivity, data or registration operations, but are optimized for
application usage, allowing applications to perform functions with a
reduced number of round-trips. An example of this is the the bulk
operation, allowing to send multiple operations is one operation. 
This category also allows for further extensions based on the basic 
operations.</t>
</list></t>

</section>
<section anchor="connecting-to-the-non-ip-control-interface"><name>Connecting to the Non-IP Control Interface</name>

<t>NIPC makes use of RESTful HTTP<xref target="RFC9114"/>.  The connection endpoint is
provided out of band, most likely through the SCIM devices model 
extension, in which an authorized application can be registered for a
SCIM object. Similarly authentication of the interface can be specified
using that SCIM interface. It may be based on a device certificate or 
an authorization token.</t>

</section>
</section>
<section anchor="connectivity"><name>Connectivity</name>

<t>/connectivity</t>

<t>Connectivity elements are elements that allow operations that establish
or tear down associations &amp; connectivity with devices. They also allow
discovery of services that can be accessed during the connection.</t>

<section anchor="binding"><name>Binding</name>

<t>/connectivity/binding</t>

<t>The binding element allows an application to request a binding or 
association to a device.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Create binding: POST</t>
  <t>Return active bindings: GET</t>
  <t>Delete binding: DELETE</t>
</list></t>

<section anchor="create-a-binding"><name>Create a Binding</name>

<t>Method: POST /connectivity/binding</t>

<t>Description: Creates a binding with a device</t>

<t>Parameters: None</t>

<t>Request Body: an Object as defined in <xref target="objectdef"/></t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="return-active-bindings"><name>Return active bindings</name>

<t>Method: GET /connectivity/binding</t>

<t>Description: Returns one or more bindings, based on ids provided in
parameters (none = return all)</t>

<t>Parameters: 
One of following options:
 - None: return all bindings this application made
 - single id: return binding for this id
 - comma separated ids: return bindings for multiple ids</t>

<t>Response: An Array of bindings with contents as  shown in
<xref target="bindingresponse"/> below or <xref target="failure"/> for failed responses.</t>

<texttable title="Binding response" anchor="bindingresponse">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>status</c>
      <c>T</c>
      <c>enum</c>
      <c>SUCCESS</c>
      <c>requestID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
      <c>bindings</c>
      <c>T</c>
      <c>array</c>
      <c>Array of BLE or Zigbee ids</c>
</texttable>

</section>
<section anchor="delete-a-binding"><name>Delete a binding</name>

<t>Method: DELETE /connectivity/binding</t>

<t>Description: Delete one or more bindings, based on ids provided in
parameters</t>

<t>Parameters: 
One of following options:
 - None: delete all bindings this application made
 - single id: delete binding for this id
 - comma separated ids: delete bindings for multiple ids</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
<section anchor="binding-by-id"><name>Binding by id</name>

<t>/connectivity/binding//id/{id}</t>

<t>The binding by id element allows an application to request a binding or 
association to a device by id, which provides a simpler interface than 
standard binding element, but pertains to a single device only.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Create binding by id: POST</t>
  <t>Return active binding by id: GET</t>
  <t>Delete binding by id: DELETE</t>
</list></t>

<section anchor="create-a-binding-by-id"><name>Create a Binding by id</name>

<t>Method: POST /connectivity/binding/id/{id}</t>

<t>Description: Creates a binding by id</t>

<t>Parameters: id</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="return-active-binding-by-id"><name>Return active binding by id</name>

<t>Method: GET /connectivity/binding//id/{id}</t>

<t>Description: Returns a binding by id 
Parameters: id</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed 
responses.</t>

</section>
<section anchor="delete-binding-by-id"><name>Delete binding by id</name>

<t>Method: DELETE /connectivity/binding/id/{id}</t>

<t>Description: Delete a binding by id</t>

<t>Parameters: id</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
<section anchor="connection"><name>Connection</name>

<t>/connectivity/connection</t>

<t>The connection element allows an application to request to connect to 
a device.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Connect to a device: POST</t>
  <t>Return active connections: GET</t>
  <t>Disconnect a device: DELETE</t>
</list></t>

<section anchor="connect-to-a-device"><name>Connect to a device</name>

<t>Method: POST /connectivity/connection</t>

<t>Description: Connect to a device</t>

<t>Parameters: None</t>

<t>Request Body: 
 - an Object, as defined in <xref target="objectdef"/> 
 - optionally a set of services to be discovered. These are supplied
   in protocol-specific extensions, as defined in <xref target="protext"/>.
   In the case of BLE, service discovery is performed when connecting to
   a device. Optionally, service discovery may be limited to services 
   defined in the "ble" protocol extension. The services to be 
   discovered can be added in an array, as well as optional caching 
   parameters. Please see table below <xref target="servdisc"/> for a definition of
   the content of the BLE protocol extension for limited service 
   discovery</t>

<texttable title="Service Discovery" anchor="servdisc">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>services</c>
      <c>T</c>
      <c>array</c>
      <c>Array of serviceIDs to be discovered</c>
      <c>cached</c>
      <c>F</c>
      <c>boolean</c>
      <c>no</c>
      <c>cacheIdlePurge</c>
      <c>F</c>
      <c>int</c>
      <c>3600</c>
      <c>autoUpdate</c>
      <c>F</c>
      <c>boolean</c>
      <c>yes</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>"services" is an array of services defined by their serviceIDs.</t>
  <t>"cached" refers to whether the services need to be cached for 
subsequent connects, in order not to perform service discovery on
each request.</t>
  <t>"cacheIdlepurge" defines how long the cache should be maintained 
before purging</t>
  <t>some devices support notifications on changes in services, 
"autoUpdate" allows the network to update services based on 
notification (on by default)</t>
</list></t>

<t>Response: Success responses include standard success response attributes
as defined in <xref target="success"/> and also include cwan array of supported 
services. This array of supported services in turn contains an array of 
charateristics, which in turn contains an array of descriptors, as shown 
<xref target="services"/>. For a description of the attributes found in this array, 
please refer to <xref target="servresp"/> below. Please refer to <xref target="failure"/> for 
failed responses.</t>

<figure title="Services" anchor="services"><artwork><![CDATA[
    services
     - serviceID
        |
        |> characteristics
            - charactericID
            - flags
               |
               |> Descriptors
                   - descriptorID
]]></artwork></figure>

<t>Attributes in the array of services:</t>

<texttable title="Service Discovery Response Attributes" anchor="servresp">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>serviceID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
      <c>characteristicID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
      <c>flags</c>
      <c>F</c>
      <c>enum</c>
      <c>write</c>
      <c>descriptorID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
</texttable>

</section>
<section anchor="return-active-connections"><name>Return active connections</name>

<t>Method: GET /connectivity/connection</t>

<t>Description: Returns one or more active connections, based on ids 
provided in parameters (none = return all).</t>

<t>Parameters: 
One of following options:
 - None: return all active connections for this application 
 - single id: return connection status for this id
 - comma separated ids: return connection status for multiple ids</t>

<t>Response: An Array of connections with attributes as defined in 
<xref target="connresponse"/> or in case of a failed response, the attributes in 
<xref target="failure"/>.</t>

<texttable title="Connection response" anchor="connresponse">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>status</c>
      <c>T</c>
      <c>enum</c>
      <c>SUCCESS</c>
      <c>requestID</c>
      <c>F</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
      <c>connections</c>
      <c>T</c>
      <c>array</c>
      <c>Array of connections</c>
</texttable>

</section>
<section anchor="disconnect-a-device"><name>Disconnect a device</name>

<t>Method: DELETE /connectivity/connection</t>

<t>Description: Disconnect one or more devices, based on ids provided in
parameters</t>

<t>Parameters: 
One of following options:
 - None: Disconnect all devices for connections this application made
 - single id: disconnect device with id
 - comma separated ids: disconnect multiple devices with ids</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
<section anchor="connections-by-id"><name>Connections by id</name>

<t>/connectivity/connection/id/{id}</t>

<t>The connection by id element allows an application to request a
connection to a device by id, which provides a simpler interface than 
standard connection element, but pertains to a single device only.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Connect device by id: POST</t>
  <t>Return connection state by id: GET</t>
  <t>Disconnect device by id: DELETE</t>
</list></t>

<section anchor="connect-device-by-id"><name>Connect device by id</name>

<t>Method: POST /connectivity/connection/id/{id}</t>

<t>Description: Creates a connection by id</t>

<t>Parameters: id</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="return-connection-state-by-id"><name>Return connection state by id</name>

<t>Method: GET /connectivity/connection/id/{id}</t>

<t>Description: Returns connection state by id 
Parameters: id</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="delete-connection-by-id"><name>Delete connection by id</name>

<t>Method: DELETE /connectivity/connection/id/{id}</t>

<t>Description: Delete a binding by id</t>

<t>Parameters: id</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
<section anchor="discover-services-supported-by-a-device"><name>Discover services supported by a device</name>

<t>/connectivity/services</t>

<t>The services element allows an application to request a service 
discovery for a device, possibly to update a cache</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Discover services: GET</t>
</list></t>

<section anchor="discover-services-supported-by-a-device-1"><name>Discover services supported by a device</name>

<t>Method: GET /connectivity/service</t>

<t>Description: Discover services supported by a device, this updates 
cache in case services caching is enabled for a connection.</t>

<t>Parameters: an Object as defined in <xref target="objectdef"/>  and optionally a set
of services to be discovered in case not all services should be
discovered. These services need to be provided in protocol-specific 
extensions as defined in <xref target="protext"/>. The services to be discovered can
be added in this extension in an array, as well as optional caching
parameters, as described in <xref target="servdisc"/>.</t>

<t>Response: A successful response will contain success attributes from 
<xref target="success"/> with an array of supported services characteristics and 
descriptors, as shown in <xref target="services"/>, with attributes defined in 
<xref target="servresp"/>. 
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
</section>
<section anchor="discover-services-supported-by-a-device-by-id"><name>Discover services supported by a device by id</name>

<t>/connectivity/services/id/{id}</t>

<t>The services element allows an application to request a service 
discovery for a device by id, possibly to update a cache</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Discover services by id: GET</t>
</list></t>

<section anchor="discover-services-supported-by-a-device-by-id-1"><name>Discover services supported by a device by id</name>

<t>Method: GET /connectivity/service/id/{id}</t>

<t>Description: Discover services supported by a device, this updates 
cache in case services caching is enabled for a connection. This method
does not support partial service discovery, all services are discovered.</t>

<t>Parameters: an Object id</t>

<t>Response: A successful response will contain success attributes from 
<xref target="success"/> with an array of supported services, characteristics and 
descriptors, as shown in <xref target="services"/>, with attributes defined in 
<xref target="servresp"/>. 
Failure Response is the standard response as defined in <xref target="failure"/>.</t>

</section>
</section>
</section>
<section anchor="data"><name>Data</name>

<t>/data</t>

<t>Data elements are elements that allow operations to exchange data with
a device. This could be reading or writing attributes or enabling 
streaming data.</t>

<section anchor="attribute"><name>Attribute</name>

<t>/data/attribute</t>

<t>The attribute element allows an application get an attribute value,
write, update or delete a value.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Write value: POST</t>
  <t>Update value: PUT</t>
  <t>Read value: GET</t>
  <t>Delete value: DELETE</t>
</list></t>

<section anchor="writing-a-value"><name>Writing a value</name>

<t>Method: POST /data/attribute</t>

<t>Description: Writes a value to an attribute</t>

<t>Parameters: None</t>

<t>Request Body: an Object as defined in <xref target="objectdef"/>, a value to be 
written, as defined in <xref target="value"/> below and an attribute definition in
a protocol extension from <xref target="protext"/>. The protocol extension for BLE
is defined in <xref target="bleattr"/> below. The protocol extension for Zigbee is 
defined in <xref target="zigbeeattr"/> below.</t>

<texttable title="Value" anchor="value">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>value</c>
      <c>T</c>
      <c>array</c>
      <c>100</c>
      <c>forcedResponse</c>
      <c>F</c>
      <c>boolean</c>
      <c>no</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>value is the value to be written</t>
  <t>forcedresponse requests a specific response behavior of the device</t>
</list></t>

<t>Contents of the BLE protocol extension defining an attribute:</t>

<texttable title="BLE Attribute" anchor="bleattr">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>serviceID</c>
      <c>T</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
      <c>characteristicID</c>
      <c>T</c>
      <c>uuid</c>
      <c>abcd0987-1234-5678-1234-56789abcdef4</c>
      <c>long</c>
      <c>F</c>
      <c>boolean</c>
      <c>no</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>serviceID defines the Service</t>
  <t>characteristic ID defines the service characteristic</t>
  <t>long is an optional attribute that allows to force a write type</t>
</list></t>

<t>Contents of the Zigbee protocol extension defining an attribute:</t>

<texttable title="Zigbee Attribute" anchor="zigbeeattr">
      <ttcol align='left'>&#160;</ttcol>
      <ttcol align='left'>endpointID</ttcol>
      <ttcol align='left'>T</ttcol>
      <ttcol align='left'>int</ttcol>
      <ttcol align='left'>16</ttcol>
      <c>&#160;</c>
      <c>clusterID</c>
      <c>T</c>
      <c>int</c>
      <c>6</c>
      <c>&#160;</c>
      <c>attributeID</c>
      <c>T</c>
      <c>int</c>
      <c>12</c>
      <c>&#160;</c>
      <c>type</c>
      <c>T</c>
      <c>int</c>
      <c>1</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>endpointID defines the Zigbee endpoint that contains a cluster of 
attributes</t>
  <t>clusterID defines the Zigbee cluster that contains the attribute</t>
  <t>attributeID defines the Zigbee attribute</t>
  <t>type defines the Zigbee attribute type</t>
</list></t>

<t>Response: A successful response will contain success attributes from 
<xref target="success"/> with optionally the value written as shown in <xref target="value"/>.
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
<section anchor="updating-a-value"><name>Updating a value</name>

<t>Method: PUT /data/attribute</t>

<t>Description: Updates a value to an attribute</t>

<t>Parameters: None</t>

<t>Request Body: an Object as defined in <xref target="objectdef"/>, a value to be 
written, as defined in <xref target="value"/> and an attribute definition in
a protocol extension from <xref target="protext"/>. The protocol extension for BLE
is defined in <xref target="bleattr"/>. The protocol extension for Zigbee is 
defined in <xref target="zigbeeattr"/>.</t>

<t>Response: A successful response will contain success attributes from 
<xref target="success"/> with optionally the value written as shown in <xref target="value"/>.
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
<section anchor="read-an-attribute"><name>Read an attribute</name>

<t>Method: GET /data/attribute</t>

<t>Description: Reads an attribute from a device</t>

<t>Parameters: an Object as defined in <xref target="objectdef"/> and an attribute 
definition in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE is defined in <xref target="bleattr"/>. The protocol extension for
Zigbee is defined in <xref target="zigbeeattr"/>.</t>

<t>Response: A successful response will contain success attributes from 
<xref target="success"/> with the value read as shown in <xref target="value"/>.
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
<section anchor="clear-the-value-from-an-attribute"><name>clear the value from an attribute</name>

<t>Method: DELETE /data/attribute</t>

<t>Description: Clear the value from an attribute of a device</t>

<t>Parameters: an Object as defined in <xref target="objectdef"/> and an attribute 
definition in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE is defined in <xref target="bleattr"/>. The protocol extension for
Zigbee is defined in <xref target="zigbeeattr"/>.</t>

<t>Response: A successful response will contain success attributes from 
<xref target="success"/> with the optionally the value as null as shown in <xref target="value"/>.
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
</section>
<section anchor="subscription"><name>Subscription</name>

<t>/data/subscription</t>

<t>The subscription element allows an application to ask a device to start
streaming data attached to a certain attribute.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Start a subscription data stream: POST</t>
  <t>Update a subscription data stream value: PUT</t>
  <t>Get status of a subscription data stream: GET</t>
  <t>Stop a subscription data stream: DELETE</t>
</list></t>

<section anchor="starting-a-subscription-data-stream"><name>Starting a subscription data stream</name>

<t>Method: POST /data/subscription</t>

<t>Description: Start a subcription data stream pertaining to a specific 
attribute</t>

<t>Parameters: None</t>

<t>Request Body: an Object as defined in <xref target="objectdef"/> and an attribute 
definition in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE is defined in <xref target="bleattr"/>. The protocol extension 
for Zigbee is defined in <xref target="zigbeeattr"/>. Optionally a pub/sub topic can
be included in the request as defined in <xref target="topic"/> below. Including a
topic allows the app to skip the topic registration process.</t>

<t>Topic attributes:</t>

<texttable title="Topic" anchor="topic">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>topic</c>
      <c>F</c>
      <c>string</c>
      <c>"enterprise/hospital/pulse"</c>
      <c>dataFormat</c>
      <c>F</c>
      <c>enum</c>
      <c>"default"</c>
      <c>replay</c>
      <c>F</c>
      <c>boolean</c>
      <c>no</c>
      <c>forced_ack</c>
      <c>F</c>
      <c>boolean</c>
      <c>no</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>topic is the pub/sub topic the subscription can be consumed on</t>
  <t>dataFormat is the data format in which the pub/sub topic is delivered</t>
  <t>replay is a boolean which defines whether data should be replayed in 
case of application disconnection</t>
  <t>forced ack ignores the attribute definition and forces packet ack
behavior to the device</t>
</list></t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="updating-a-subscription-data-stream"><name>Updating a subscription data stream</name>

<t>Method: PUT /data/subscription</t>

<t>Description: Update parameters of a subscription data stream pertaining
to a specific attribute</t>

<t>Parameters: None</t>

<t>Request Body: an Object as defined in <xref target="objectdef"/> and an attribute 
definition in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE is defined in <xref target="bleattr"/>. The protocol extension 
for Zigbee is defined in <xref target="zigbeeattr"/>. Optionally a pub/sub topic can
be included in the request as defined in <xref target="topic"/>.</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="get-status-of-a-subscription-data-stream"><name>Get status of a subscription data stream</name>

<t>Method: GET /data/subscription</t>

<t>Description: Gets the status of a subscription data stream, success if
active, failure if not active</t>

<t>Parameters: an Object as defined in <xref target="objectdef"/> and an attribute 
definition in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE is defined in <xref target="bleattr"/>. The protocol extension 
for Zigbee is defined in <xref target="zigbeeattr"/>. Optionally a pub/sub topic can
be included in the request as defined in <xref target="topic"/>.</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="stop-a-subscription-data-stream"><name>stop a subscription data stream</name>

<t>Method: DELETE /data/subscription</t>

<t>Description: stops a subscription data stream</t>

<t>Parameters: an Object as defined in <xref target="objectdef"/> and an attribute 
definition in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE is defined in <xref target="bleattr"/>. The protocol extension 
for Zigbee is defined in <xref target="zigbeeattr"/>. Optionally a pub/sub topic can
be included in the request as defined in <xref target="topic"/>.</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
<section anchor="subscriptions-by-id"><name>Subscriptions by id</name>

<t>/data/subscription/id/{id}</t>

<t>The subscription by id element allows an application to operate on all
subscriptions of a specific id.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Return active subscriptions by id: GET</t>
  <t>Terminate all subscriptions of an id: DELETE</t>
</list></t>

<section anchor="return-active-subscriptions-by-id"><name>Return active subscriptions by id</name>

<t>Method: GET /data/subscription/id/{id}</t>

<t>Description: Returns connection state by id</t>

<t>Parameters: id</t>

<t>Response: Success response as defines in <xref target="success"/> and an object 
called "subscriptions" which contains an Array of active subscriptions.
Each of these include an object as defined in <xref target="objectdef"/> and a 
subscription attribute definition in a protocolextension from 
<xref target="protext"/>. The protocol extension for BLE is defined in <xref target="bleattr"/>. 
The protocol extension for Zigbee is defined in <xref target="zigbeeattr"/>. 
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
<section anchor="stop-active-subscriptions-by-id"><name>Stop active subscriptions by id</name>

<t>Method: DELETE /data/subscription/id/{id}</t>

<t>Description: Delete active subscriptions for an id</t>

<t>Parameters: id</t>

<t>Response: Success response as defines in <xref target="success"/> and an object 
called "subscriptions" which contains an Array of active subscriptions.
Each of these include an object as defined in <xref target="objectdef"/> and a 
subscription attribute definition in a protocolextension from 
<xref target="protext"/>. The protocol extension for BLE is defined in <xref target="bleattr"/>. 
The protocol extension for Zigbee is defined in <xref target="zigbeeattr"/>. 
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
</section>
<section anchor="subscriptions-by-topic"><name>Subscriptions by topic</name>

<t>/data/subscription/topic/{topic}</t>

<t>The subscription by topic element allows an application to operate on
all subscriptions of a specific topic.</t>

<t>Operations: 
 - Return active subscriptions by topic: GET
 - Terminate all subscriptions active on a topic: DELETE</t>

<section anchor="return-active-subscriptions-by-topic"><name>Return active subscriptions by topic</name>

<t>Method: GET /data/subscription/topic/{topic}</t>

<t>Description: Returns connection state by topic</t>

<t>Parameters: topic</t>

<t>Response: Success response as defines in <xref target="success"/> and an object 
called "subscriptions" which contains an Array of active subscriptions.
Each of these include an object as defined in <xref target="objectdef"/> and a 
subscription attribute definition in a protocolextension from 
<xref target="protext"/>. The protocol extension for BLE is defined in <xref target="bleattr"/>. 
The protocol extension for Zigbee is defined in <xref target="zigbeeattr"/>. 
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
<section anchor="stop-active-subscriptions-by-topic"><name>Stop active subscriptions by topic</name>

<t>Method: DELETE /data/subscription/topic/{topic}</t>

<t>Description: Delete all active subscriptions for a topic</t>

<t>Parameters: topic</t>

<t>Response: Success response as defines in <xref target="success"/> and an object 
called "subscriptions" which contains an Array of active subscriptions.
Each of these include an object as defined in <xref target="objectdef"/> and a 
subscription attribute definition in a protocolextension from 
<xref target="protext"/>. The protocol extension for BLE is defined in <xref target="bleattr"/>. 
The protocol extension for Zigbee is defined in <xref target="zigbeeattr"/>. 
Failure Response is the standard response as defined in <xref target="failure"/></t>

</section>
</section>
<section anchor="broadcast"><name>Broadcast</name>

<t>/data/broadcast</t>

<t>The broadcast element allows an application to broadcast a message to a
specific device. Note that broadcasts can be heard by other devices on 
the same L2 network.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Broadcast message: POST</t>
</list></t>

<section anchor="broadcasting-a-message"><name>Broadcasting a message</name>

<t>Method: POST /data/broadcast</t>

<t>Description: Broadcasts a message to a device</t>

<t>Parameters: None</t>

<t>Request Body: an Object as defined in <xref target="objectdef"/> along with broadcast
parameters, defined below in <xref target="broadcastparams"/>. Defining broadcast 
attributes is mandatory and is done by adding an array of broadcast 
attributes in a protocol extension from <xref target="protext"/>. The protocol 
extension for BLE broadcasts is defined in <xref target="blebcastattr"/> below.</t>

<t>Broadcast parameters:</t>

<texttable title="Broadcast parameters" anchor="broadcastparams">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>cycle</c>
      <c>T</c>
      <c>enum</c>
      <c>single</c>
      <c>broadcastTime</c>
      <c>F</c>
      <c>int</c>
      <c>30</c>
      <c>broadcastInterval</c>
      <c>F</c>
      <c>int</c>
      <c>5</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>cycle determines the repetitiveness of the broadcast, and is either
single or repeat</t>
  <t>broadcastTime is the maximum time in seconds the broadcast should 
run</t>
  <t>broadcastInterval is the time between broadcasts in seconds</t>
</list></t>

<t>Protocol-specific extensions are supplied to identify the attributes to 
be broadcasted.</t>

<texttable title="BLE Broadcast Attribute" anchor="blebcastattr">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>adType</c>
      <c>T</c>
      <c>byte</c>
      <c>ff</c>
      <c>adData</c>
      <c>T</c>
      <c>byte</c>
      <c>4c00</c>
</texttable>

<t>where-</t>

<t><list style="symbols">
  <t>adType is the BLE advertisement attribute type</t>
  <t>adData is the BLE advertisement attribute data</t>
</list></t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
</section>
<section anchor="registrations"><name>Registrations</name>

<t>/registation</t>

<t>Registration elements are elements that do not directly execute
operations on devices but register attributes on the gateway that
support operations, such attributes are topics for data streaming and
files to write files.</t>

<section anchor="topic-registration"><name>Topic registration</name>

<t>/registration/topic</t>

<t>The topic registration element allows an application to register a pub/
sub topic for the data interface. By activating a subscription on one 
or more device(s), the application can then publish streaming data to 
that topic.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Register a topic: POST</t>
  <t>Update a topic: PUT</t>
  <t>Get configuration of one or more topics: GET</t>
  <t>Delete a topic: DELETE</t>
</list></t>

<section anchor="registering-a-topic"><name>Registering a topic</name>

<t>Method: POST /registration/topic</t>

<t>Description: Register a pub/sub topic</t>

<t>Parameters: None</t>

<t>Request Body: A topic, including data apps that can subscribe to the 
topic as defined in <xref target="topic"/> and protocol-specific extensions as per 
<xref target="protext"/> that describe the attributes that will be reported on the
topic. In the case of BLE, these are either BLE subscription attributes
as in <xref target="bleattr"/>, device connection status, or Broadcast 
(advertisement) data as in <xref target="blebcastattr"/>.
For Zigbee, these are Zigbee attributes as described in <xref target="zigbeeattr"/>.</t>

<t>Response: See <xref target="success"/> with a topic name as in <xref target="topicname"/> below 
for success, and <xref target="failure"/> for failed responses.</t>

<t>Topic name that was registered:</t>

<texttable title="Topic Name" anchor="topicname">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>topic</c>
      <c>T</c>
      <c>string</c>
      <c>"enterprise/hospital/pulse"</c>
</texttable>

</section>
<section anchor="updating-a-topic"><name>Updating a topic</name>

<t>Method: PUT /registration/topic</t>

<t>Description: Update a pub/sub topic</t>

<t>Parameters: None</t>

<t>Request Body: A topic, including data apps that can subscribe to the 
topic as defined in <xref target="topic"/> and protocol-specific extensions as per 
<xref target="protext"/> that describe the attributes that will be reported on the
topic. In the case of BLE, these are either BLE subscription attributes
as in <xref target="bleattr"/>, device connection status, or Broadcast 
(advertisement) data as in <xref target="blebcastattr"/>.
For Zigbee, these are Zigbee attributes as described in <xref target="zigbeeattr"/>.</t>

<t>Response: See <xref target="success"/> with a topic name as in <xref target="topicname"/> below 
for success, and <xref target="failure"/> for failed responses.</t>

</section>
<section anchor="get-configuration-of-one-or-more-topics"><name>Get configuration of one or more topics</name>

<t>Method: GET /registration/topic</t>

<t>Description: Gets the configuration of one or more topics</t>

<t>Parameters: A topic name. Multiple topics can be added by 
comma-separated attributes.</t>

<t>Response: A success response as in <xref target="success"/> with a "topics" object
containing an array of returned topics names with attribute defined in
<xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
<section anchor="delete-one-or-more-topics"><name>Delete one or more topics</name>

<t>Method: DELETE /registration/topic</t>

<t>Description: Delete one or more topics</t>

<t>Parameters: A topic name. Multiple topics can be added by 
comma-separated attributes.</t>

<t>Response: A success response as in <xref target="success"/> with a "topics" object
containing an array of returned topics names with attribute defined in
<xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
</section>
<section anchor="topic-registrations-by-id"><name>Topic registrations by id</name>

<t>/registration/topic/id/{id}</t>

<t>The topic registration by id element allows an application to get or 
delete topic registrations for a specific id.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Return active topics by id: GET</t>
  <t>Delete all topics for an id: DELETE</t>
</list></t>

<section anchor="return-active-topics-by-id"><name>Return active topics by id</name>

<t>Method: GET /registration/topic/id/{id}</t>

<t>Description: Returns active topics by id</t>

<t>Parameters: id</t>

<t>Response: A success response as in <xref target="success"/> with a "topics" object
containing an array of returned topics names with attribute defined in
<xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
<section anchor="delete-active-topics-by-id"><name>Delete active topics by id</name>

<t>Method: DELETE /registration/topic/id/{id}</t>

<t>Description: Deletes active topics by id, will delete all topics that
are associated with a specific object id.</t>

<t>Parameters: id</t>

<t>Response: A success response as in <xref target="success"/> with a "topics" object
containing an array of returned topics names with attribute defined in
<xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
</section>
<section anchor="topic-registrations-by-data-app"><name>Topic registrations by data app</name>

<t>/registration/topic/data-app/{data-app}</t>

<t>The topic registration by data-app element allows an application to get
or delete topic registrations for which a specific data-application is
registered.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Return active topics by data-app: GET</t>
  <t>Delete all topics for an data-app: DELETE</t>
</list></t>

<section anchor="return-active-topics-by-data-app"><name>Return active topics by data-app</name>

<t>Method: GET /registration/topic/data-app/{data-app}</t>

<t>Description: Returns active topics by data-app</t>

<t>Parameters: data-app</t>

<t>Response: A success response as in <xref target="success"/> with a "topics" object
containing an array of returned topics names with attribute defined in
<xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
<section anchor="delete-active-topics-by-data-app"><name>Delete active topics by data-app</name>

<t>Method: DELETE /registration/topic/data-app/{data-app}</t>

<t>Description: Deletes active topics by data-app, will delete all topics
the specified data app is registered for.</t>

<t>Parameters: data-app</t>

<t>Response: A success response as in <xref target="success"/> with a "topics" object
containing an array of returned topics names with attribute defined in
<xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
</section>
<section anchor="topic-registrations-by-topic-name"><name>Topic registrations by topic name</name>

<t>/registration/topic/{topic}</t>

<t>The topic registration by topic element allows an application to get or 
delete a topic registration by topic name.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Return active topics by topic name: GET</t>
  <t>Delete all topics for a topic name: DELETE</t>
</list></t>

<section anchor="return-active-topics-by-topic-name"><name>Return active topics by topic name</name>

<t>Method: GET /registration/topic/{topic}</t>

<t>Description: Returns active topics by topic name</t>

<t>Parameters: topic</t>

<t>Response: A success response as in <xref target="success"/> with a topic name as 
defined in <xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
<section anchor="delete-active-topics-by-topic-name"><name>Delete active topics by topic name</name>

<t>Method: DELETE /registration/topic/{topic}</t>

<t>Description: Deletes active topics by topic name</t>

<t>Parameters: topic</t>

<t>Response: A success response as in <xref target="success"/> with a topic name as 
defined in <xref target="topicname"/>.
For failed responses see <xref target="failure"/>.</t>

</section>
</section>
<section anchor="file-registration"><name>File registration</name>

<t>/registration/file</t>

<t>The file registration element allows an application to register a file.
a file can be used in operations to devices (such as an attribute)</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Register a file: POST</t>
  <t>Update a file: PUT</t>
  <t>Check if a file exists: GET</t>
  <t>Delete a file: DELETE</t>
</list></t>

<section anchor="registering-a-file"><name>Registering a file</name>

<t>Method: POST /registration/file</t>

<t>Description: Register a file</t>

<t>Parameters: None</t>

<t>Request Body: a file or URL point to a file, as described in <xref target="file"/>
below.</t>

<t>File definition:</t>

<texttable title="File" anchor="file">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>filename</c>
      <c>T</c>
      <c>string</c>
      <c>"firmware.dat"</c>
      <c>file</c>
      <c>F</c>
      <c>binary</c>
      <c>file</c>
      <c>bindings</c>
      <c>F</c>
      <c>string</c>
      <c>"https://domain.com/firmware.dat"</c>
</texttable>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="updating-a-file"><name>Updating a file</name>

<t>Method: PUT /registration/file</t>

<t>Description: Update a file</t>

<t>Parameters: None</t>

<t>Request Body: a file or URL point to a file, as described in <xref target="file"/>
below.</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
<section anchor="check-presence-of-a-registered-file"><name>check presence of a registered file</name>

<t>Method: GET /registration/file</t>

<t>Description: Check the presence of a specific file or get all files if
no file name os present in parameters</t>

<t>Parameters: filename</t>

<t>Response: Success as in <xref target="success"/> including a "filesnames" object with
an array of file names as shown in <xref target="filename"/> or a Failure Response
as described in <xref target="failure"/>.</t>

<t>A filenames object with an Array of file names:</t>

<texttable title="File name" anchor="filename">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>filename</c>
      <c>T</c>
      <c>string</c>
      <c>"firmware.dat"</c>
</texttable>

</section>
<section anchor="delete-a-registered-file"><name>delete a registered file</name>

<t>Method: DELETE /registration/file</t>

<t>Description: Delete a registered file</t>

<t>Parameters: filename</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
<section anchor="file-registrations-by-file-name"><name>file registrations by file name</name>

<t>/registration/file/{filename}</t>

<t>The file registration by file name element allows an application to get
or delete file registrations by file name.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Return file registrations by file name: GET</t>
  <t>Delete file registrations by file name: DELETE</t>
</list></t>

<section anchor="return-file-registrations-by-file-name"><name>Return file registrations by file name</name>

<t>Method: GET /registration/file/{filename}</t>

<t>Description: Checks the presence of a file and returns its name</t>

<t>Parameters: filename</t>

<t>Response: Success as in <xref target="success"/> including a file name as shown in
<xref target="filename"/> or a Failure Response as described in <xref target="failure"/>.</t>

</section>
<section anchor="delete-file-registrations-by-file-name"><name>Delete file registrations by file name</name>

<t>Method: DELETE /registration/file/{filename}</t>

<t>Description: Delete file registrations by file name</t>

<t>Parameters: filename</t>

<t>Response: See <xref target="success"/> for success, and <xref target="failure"/> for failed
responses.</t>

</section>
</section>
</section>
</section>
<section anchor="nipc-extensibility"><name>NIPC Extensibility</name>

<t>NIPC is extensible in two ways:</t>

<t><list style="symbols">
  <t>Protocol extensions: Protocol extensions can extend NIPC with support
for new non-IP protocols</t>
  <t>interface extensions: Interface extensions allow extensions that 
leverage compound statements of basic elements to simplify common 
operations for applications.</t>
</list></t>

<section anchor="protocol-extensions-1"><name>Protocol extensions</name>

<t>As described in <xref target="schema"/> the NIPC interface supports protocol specific
extensions that allow bi-directional communication of attributes
that are specific to the protocol supported 
by the device. This allows for extensions to the schema to 
integrate new non-ip communications protocols, 
without the need to update the base schema.</t>

<figure title="Extended Schema" anchor="extschema"><artwork><![CDATA[
    ID
     - device/group attributes
        |
        |> BLE
        |     - BLE attributes
        |
        |> Zigbee
        |     - Zigbee attributes
        |
        |> Protocol extension
        |     - Protocol extension attributes

]]></artwork></figure>

<t>As shown in <xref target="extschema"/>, a protocol extension can be added by adding
a new technology specific extension to the schema.</t>

<t>This is performed by adding the new protocol to the technology enum in
the base objext definition <xref target="objectdef"/></t>

<t>Furthermore, the protocol objects need to be extended with the new
protocol as well. Protocol objects will be extended as follows:</t>

<texttable title="Adding Protocol extensions" anchor="newprotext">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>ble</c>
      <c>T</c>
      <c>object</c>
      <c>an object with BLE-specific attributes</c>
      <c>zigbee</c>
      <c>T</c>
      <c>object</c>
      <c>an object with Zigbee-specific attributes</c>
      <c>newProtocol</c>
      <c>T</c>
      <c>object</c>
      <c>an object with newProtocol-specific attr</c>
</texttable>

<t>In the new protocol object, protocol specific attributes can be added.</t>

</section>
<section anchor="interface-extensions"><name>Interface extensions</name>

<t>/extensions</t>

<t>The interface extension elements are freely extendible interfaces. These
elements leverage the basic NIPC defined elements and combine them in 
compound statements in order to streamline application operation against
devices, make operations more expediant and convenient in one API call.
In principle they do not add any basic functionality. In
the OpenAPI model <xref target="openAPI"/> below, we have defined a few example 
extensions, and we will describe them here at a high level to provide 
some context on other possible extensions.</t>

<section anchor="write-file"><name>Write file</name>

<t>/extension/write/file</t>

<t>This extension make use of multiple write operations (attribute post)
to write an entire file to an attribute. The interface allows the 
application to define the chunk size.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Write file: POST</t>
</list></t>

</section>
<section anchor="read-conditional-file"><name>Read conditional file</name>

<t>/extension/read/conditional</t>

<t>This extension performs a read operation sequentially for a defined 
amount of time until a specified value is read.</t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Read Conditional: POST</t>
</list></t>

</section>
<section anchor="bulk"><name>Bulk</name>

<t>/extension/bulk</t>

<t>This extension allows you to create a compound operation made out of 
multiple connection and data operations that are to be executed 
sequentially until they all succeed or there is a failure.
Supported operations are:</t>

<t><list style="symbols">
  <t>/extension/connection/create</t>
  <t>/extension/connection/delete</t>
  <t>/extension/attribute/read</t>
  <t>/extension/attribute/write</t>
  <t>/extension/attribute/write/file</t>
  <t>/extension/attribute/write/blob</t>
  <t>/extension/attribute/read/conditional</t>
</list></t>

<t>Operations:</t>

<t><list style="symbols">
  <t>Bulk: POST</t>
</list></t>

</section>
</section>
</section>
<section anchor="publishsubscribe-interface"><name>Publish/Subscribe Interface</name>

<t>The publish/subscribe interface, or data streaming interface, is an MQTT
publishing interface. Pub/sub topics can be created and managed by means
of the /register/topic NIPC element.</t>

<t>In this memo we propose the data format to be protocol buffers, as 
fully described in the <xref target="proto"/> protobuf definition.</t>

</section>
<section anchor="examples"><name>Examples</name>

<t>This section contains a few examples on how applications can leverage 
NIPC operations to communicate with BLE and Zigbee devices.</t>

<section anchor="ble-advertisement"><name>BLE Advertisement</name>

<t>In this example, we will onboard a device, and setup an advertisement
subscription topic for that device.</t>

<t>The sequence of operations for this are:</t>

<t><list style="symbols">
  <t>Onboard a device using the SCIM Interface (out of scope of this
memo)</t>
  <t>Register a topic with the device id to subscribe to advertisements
POST /register/topic</t>
  <t>Subscribe to the topic from the data receiver app 
MQTT subscribe topic</t>
</list></t>

</section>
<section anchor="ble-attribute-readwrite"><name>BLE Attribute Read/Write</name>

<t>In this example, we will connect to a BLE device (BLE device does not
require binding) and read and write from an attribute</t>

<t>The sequence of operations for this are:</t>

<t><list style="symbols">
  <t>Onboard a device using the SCIM Interface (out of scope of this
memo)</t>
  <t>Connect to the BLE device
POST /connectivity/connection</t>
  <t>Read an attribute from the BLE device
GET /data/attribute</t>
  <t>Write to an attribute on the BLE device
POST /data/attribute</t>
  <t>Disconnect from the BLE device
DELETE /connectivity/connection</t>
</list></t>

</section>
<section anchor="zigbee-attribute-readwrite"><name>Zigbee Attribute Read/Write</name>

<t>In this example, we will bind a zigbee device to a Zigbee mesh
and read and write from an attribute</t>

<t>The sequence of operations for this are:</t>

<t><list style="symbols">
  <t>Onboard a device using the SCIM Interface (out of scope of this
memo)</t>
  <t>Bind the Zigbee device
POST /connectivity/binding</t>
  <t>Read an attribute from the Zigbee device
GET /data/attribute</t>
  <t>Write to an attribute on the Zigbee device
POST /data/attribute</t>
  <t>Disconnect from the Zigbee device
DELETE /connectivity/connection</t>
</list></t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>TBD.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>TBD.</t>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">

<reference anchor="BLE53" >
  <front>
    <title>Bluetooth Core Specification, Version 5.3</title>
    <author >
      <organization>Bluetooth SIG</organization>
    </author>
    <date year="2021"/>
  </front>
</reference>
<reference anchor="Zigbee22" >
  <front>
    <title>zigbee Specification, Version 22 1.0</title>
    <author >
      <organization>Connectivity Standards Alliance</organization>
    </author>
    <date year="2017"/>
  </front>
</reference>
&I-D.shahzad-scim-device-model;
&RFC2119;
&RFC8174;
&RFC9114;


    </references>



<?line 1589?>

<section anchor="openapi-definition"><name>OpenAPI definition</name>

<t>The following non-normative model is provide for convenience of
the implementor.</t>

<figure anchor="openAPI"><artwork><![CDATA[
<CODE BEGINS>
file "openapi.yml"
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API
  description: |-
    There has been a large influx of non-IP devices supporting
    processes in manufacturing, healthcare, hospitality, retail, the
    home, and the office.  At the same time, wireless access points
    have been deployed nearly everywhere, many of which have radios
    that can transmit and receive different frame types, such as BLE,
    Zigbee. To integrate multiple of these use cases leveraging a
    single wireless infrastructure and avoid the need for parallel
    infrastructure, a Non IP device gateway function is necessary.
    The gateway provides the following functions:
       - authentication and authorization of application clients that
         will communicate with devices 
       - APIs that onboard a device on the network (out of scope for
         this specification, but covered in SCIM for devices)
       - APIs that allow an app to set up a connection with a device
       - APIs that allow an app to exchange data with a device
       - APIs that allow a device to create registrations in the
         network for a device 
    These collection of these APIs, in combination with the
    onboarding API (SCIM for devices) will allow an application to
    perform a complete set of operations on Non-IP devices.
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.5.3
externalDocs:
  description: NIPC IETF draft
  url: TBD
servers:
  - url: https://{gw_host}/nipc
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name: connectivity
    description: APIs that allow apps to manage device connections
  - name: data
    description: |-
      APIs that allow apps to exchange data with non-IP devices
  - name: registrations
    description: |-
      APIs that allow apps to make registrations in the network for
      devices.
  - name: extensions
    description: |-
      APIs that simplify application interaciton by implementing one
      or more basic API's into a single API call.

paths:
### Connectivity
  /connectivity/binding:
    post:
      tags:
        - connectivity
      summary: Create a binding for a device id
      description: Create a binding for a device
      operationId: CreateBinding
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Object'
          application/xml:
            schema:
              $ref: '#/components/schemas/Object'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Object'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BindingResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/BindingResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
    get:
      tags:
        - connectivity
      summary: Get bindings for a device
      description: |-
        Get all bindings control app made (no parameter) or binding
        by object ID, Multiple ids can be provided with comma
        separated strings, or a group id can be provided 
      operationId: GetBindings
      parameters:
        - name: id
          in: query
          description: device ids that need to be filtered
          required: false
          explode: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiBindingsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiBindingsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'                
    delete:
      tags:
        - connectivity
      summary: |-
        Delete bindings for a device or group of devices
      description: |-
        Delete all bindings control app made or bindings by object
        ID, Multiple ids can be provided with comma separated
        strings, or a group id can be provided 
      operationId: DeleteBindings
      parameters:
        - name: id
          in: query
          description: device or group ids that need to be filtered
          required: false
          explode: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
  /connectivity/binding/id/{id}:
    post:
      tags:
        - connectivity
      summary: |-
        Create a binding for a device id (device technology needs to
        support binding) 
      description: |-
        Create a binding for a device id, will fail if device has
        multiple technologies defined 
      operationId: CreateBindingbyID
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BindingResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/BindingResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
    get:
      tags:
        - connectivity
      summary: Get binding by id for a device
      description: |-
        Get binding by id for a device, success when binding found,
        failure when no binding 
      operationId: GetBindingbyId
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BindingResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/BindingResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
    delete:
      tags:
        - connectivity
      summary: Delete binding by id for a device
      description: Delete binding by id for a device
      operationId: DeleteBindingbyID
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
  /connectivity/connection:
    post:
      tags:
        - connectivity
      summary: |-
        Connect a device to the network, optionally with service
        discovery 
      description: |-
        Connect a device to the network, optionally with service
        discovery 
      operationId: connConnect
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Connection'
          application/xml:
            schema:
              $ref: '#/components/schemas/Connection'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Connection'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/ServiceResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    
    get:
      tags:
        - connectivity
      summary: |-
        Get connection state devices for a device or group of
        devices
      description: |-
        Get all connection status for connections made by control ap
        or connection status by object ID, multiple ids can be
        provided with comma separated strings, or a group id can be
        provided  
      operationId: GetConnections
      parameters:
        - name: id
          in: query
          description: device or group ids that need to be filtered
          required: false
          explode: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiConnectionsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiConnectionsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
    delete:
      tags:
        - connectivity
      summary: Disconnect a device or group of devices
      description: |-
        Disconnect a device or device group by object ID, Multiple
        ids can be provided with comma separated strings, or a
        group id can be provided 
      operationId: DeleteConnections
      parameters:
        - name: id
          in: query
          description: device or group ids that need to be filtered
          required: false
          explode: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /connectivity/connection/id/{id}:
    post:
      tags:
        - connectivity
      summary: |-
        Connect a device by device id (device technology needs to
        support connection) 
      description: |-
        Connect a device by device id, Serivce discovery not
        supported, will fail if device has multiple technologies
        defined.
      operationId: CreateConnectionbyID
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
    get:
      tags:
        - connectivity
      summary: Get connection by id for a device
      description: |-
        Get connection by id for a device, success when device
        connected, failure when device not connected 
      operationId: GetConnectionbyId
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
    delete:
      tags:
        - connectivity
      summary: Delete connection by id for a device
      description: Disconnect a device by id
      operationId: DeleteConnectionbyID
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
  /connectivity/services:
    get:
      tags:
        - connectivity
      summary: Discover services on a device
      description: Discover services on a device
      operationId: ServiceDiscovey
      parameters:
      - name: Service
        in: query
        description: Services to discover
        required: true
        schema:
          $ref: '#/components/schemas/Service'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/ServiceResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
  /connectivity/services/id/{id}:            
    get:
      tags:
        - connectivity
      summary: Get services by id for a device
      description: |-
        Get services by id for a connected device, success when
        device connected, failure when device not connected 
      operationId: GetServicesbyId
      parameters:
        - name: id
          in: path
          description: device or group ids that need to be filtered
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/ServiceResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### Data
  /data/attribute:
    post:
      tags:
        - data
      summary: Write a value to an attribute on a device
      description: Write a value to an attribute on a device
      operationId: dataWrite
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeValue'
          application/xml:
            schema:
              $ref: '#/components/schemas/AttributeValue'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AttributeValue'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request       
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    
    put:
      tags:
        - data
      summary: Update a value of an attribute on a device
      description: Update a value of an attribute on a device
      operationId: dataUpdate
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeValue'
          application/xml:
            schema:
              $ref: '#/components/schemas/AttributeValue'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AttributeValue'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request       
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
    delete:
      tags:
        - data
      summary: Delete a value from an attribute on a device
      description: Delete a value to an attribute on a device
      operationId: dataDelete
      parameters:
      - name: attribute
        in: query
        description: attributes of a given device
        required: true
        schema:
          $ref: '#/components/schemas/Attribute'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
    get:
      tags:
        - data
      summary: Read a value from an attribute on a device
      description: Read a value to an attribute on a device
      operationId: dataRead
      parameters:
      - name: attribute
        in: query
        description: attributes of a given device
        required: true
        schema:
          $ref: '#/components/schemas/Attribute'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
  /data/subscription:
    post:
      tags:
        - data
      summary: |-
         Subscribe to streaming data from an attribute on a device
      description: |-
        Subscribe to streaming data from an attribute on a device
      operationId: dataSubscribe
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subscription'
          application/xml:
            schema:
              $ref: '#/components/schemas/Subscription'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Subscription'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request 
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'   
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
    put:
      tags:
        - data
      summary: |-
        update streaming data subscription from an attribute on a
        device
      description: |-
        update streaming data subscription from an attribute on a 
        device
      operationId: dataUpdateSubscribe
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subscription'
          application/xml:
            schema:
              $ref: '#/components/schemas/Subscription'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Subscription'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request 
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - data
      summary: |-
        Unsubscribe to streaming data from an attribute on a device
      description: |-
        Unsubscribe to streaming data from an attribute on a device
      operationId: dataUnsubscribe
      parameters:
      - name: subscription
        in: query
        description: subscription on a device
        required: true
        schema:
          $ref: '#/components/schemas/Subscription'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    
    get:
      tags:
        - data
      summary: Get the status of a subscription on a device
      description: Get the status of a subscription on a device
      operationId: dataGetSubscription
      parameters:
      - name: subscription
        in: query
        description: subscription on a device
        required: true
        schema:
          $ref: '#/components/schemas/Subscription'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'          
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /data/subscription/topic/{topic}:    
    delete:
      tags:
        - data
      summary: delete all active subscriptions by topic
      description: delete all active subscriptions by topic
      operationId: deleteSubscriptionbyTopic
      parameters:
        - name: topic
          in: path
          description: topic that needs to be filtered
          required: true
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
            application/xml:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - data
      summary: get all active subscriptions by topic
      description: get all active subscriptions by topic
      operationId: getSubsciptionsbyTopic
      parameters:
        - name: topic
          in: path
          description: topic that needs to be filtered
          required: true
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
            application/xml:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
            application/xml:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'

  /data/subscription/id/{id}:
    delete:
      tags:
        - data
      summary: delete all subscriptions by id
      description: delete all subscriptions by id
      operationId: deleteSubscriptionbyID
      parameters:
        - name: id
          in: path
          description: object id that needs to be filtered
          required: true
          schema:
            type: string
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
            application/xml:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - data
      summary: get all subscriptions by object id
      description: get all subscriptions by object id
      operationId: getSubscriptionbyID
      parameters:
        - name: id
          in: path
          description: object id that needs to be filtered
          required: true
          schema:
            type: string
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
            application/xml:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /data/broadcast:
    post:
      tags:
        - data
      summary: Broadcast to a device
      description: Broadcast to a device
      operationId: dataBroadcast
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Broadcast'
          application/xml:
            schema:
              $ref: '#/components/schemas/Broadcast'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Broadcast'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### Registrations
  /registration/topic:
    post:
      tags:
        - registrations
      summary: Register a publish/subscribe topic
      description: Register a publish/subscribe topic
      operationId: registerTopic
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Topic'
          application/xml:
            schema:
              $ref: '#/components/schemas/Topic'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Topic'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/TopicResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    put:
      tags:
        - registrations
      summary: Update a publish/subscribe topic
      description: Update a publish/subscribe topic
      operationId: UpdateTopic
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Topic'
          application/xml:
            schema:
              $ref: '#/components/schemas/Topic'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Topic'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/TopicResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - registrations
      summary: unregister a publish/subscribe topic
      description: |-
        unregister a publish/subscribe topic, Multiple topics can
        be provided with comma separate strings, or a group id can
        be provided.
      operationId: unregisterTopic
      parameters:
        - name: topic
          in: query
          description: topic that need to be filtered
          required: false
          explode: true
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get one or multiple publish/subscribe topic
      description: |-
        unregister a publish/subscribe topic, Multiple topics can be
        provided with comma separate strings, or a group id can be
        provided
      operationId: getTopic
      parameters:
        - name: topic
          in: query
          description: topic that need to be filtered
          required: false
          explode: true
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/topic/{topic}:
    delete:
      tags:
        - registrations
      summary: delete a publish/subscribe topic by name
      description: unregister a publish/subscribe topic by Name
      operationId: deleteTopicbyName
      parameters:
        - name: topic
          in: path
          description: topic that needs to be filtered
          required: true
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/TopicResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get a publish/subscribe topic by name
      description: get a publish/subscribe topic by name
      operationId: getTopicbyName
      parameters:
        - name: topic
          in: path
          description: topic that needs to be filtered
          required: true
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/TopicResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/topic/data-app/{data-app}:
    delete:
      tags:
        - registrations
      summary: delete all publish/subscribe topics by data-app
      description: |-
        unregister all publish/subscribe topics by data-app
      operationId: deleteTopicbyDataApp
      parameters:
        - name: data-app
          in: path
          description: data app that needs to be filtered
          required: true
          schema:
            type: string
            example: https://data-app-1
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get all publish/subscribe topics by data-app
      description: get all publish/subscribe topics by data-app
      operationId: getTopicbyDataApp
      parameters:
        - name: data-app
          in: path
          description: data app that needs to be filtered
          required: true
          schema:
            type: string
            example: https://data-app-1
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/topic/id/{id}:
    delete:
      tags:
        - registrations
      summary: delete all publish/subscribe topics by object id
      description: unregister all publish/subscribe topics by id
      operationId: deleteTopicbyID
      parameters:
        - name: id
          in: path
          description: object id that needs to be filtered
          required: true
          schema:
            type: string
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get all publish/subscribe topics by object id
      description: get all publish/subscribe topics by object id
      operationId: getTopicbyID
      parameters:
        - name: id
          in: path
          description: object id that needs to be filtered
          required: true
          schema:
            type: string
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiTopicsResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/file:
    post:
      tags:
        - registrations
      summary: Register and upload a file for later use
      description: Register and upload a file for later use
      operationId: registerFile
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/File'
          application/xml:
            schema:
              $ref: '#/components/schemas/File'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/File'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    put:
      tags:
        - registrations
      summary: Update an existing file registration
      description: Update an existing file registration
      operationId: UpdateFile
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/File'
          application/xml:
            schema:
              $ref: '#/components/schemas/File'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/File'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - registrations
      summary: Delete a file
      description: Delete a file
      operationId: DeleteFile
      parameters:
        - name: filename
          in: query
          description: file that needs to be filtered
          required: false
          explode: true
          schema:
            type: string
            example: "firmware.dat"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get a file
      description: |-
        get a file by name of get all files if no names
        supplied.
      operationId: getFile
      parameters:
        - name: filename
          in: query
          description: file that needs to be filtered
          required: false
          explode: true
          schema:
            type: string
            example: "firmware.dat"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiFileResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/MultiFileResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/file/{filename}:
    delete:
      tags:
        - registrations
      summary: delete a file by name
      description: delete a file by name
      operationId: deleteFilebyName
      parameters:
        - name: filename
          in: path
          description: file that needs to be filtered
          required: true
          schema:
            type: string
            example: "firmware.dat"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FileResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get a file by name
      description: get a file by name
      operationId: getFilebyName
      parameters:
        - name: filename
          in: path
          description: file that needs to be filtered
          required: true
          schema:
            type: string
            example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FileResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### Extensions
  /extension/connection/create:
    post:
      tags:
        - extensions
      summary: |-
        Connect a device to the network, optionally with service
        discovery
      description: |-
        Connect a device to the network, optionally with service
        discovery
      operationId: ExtConnect
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Connection'
          application/xml:
            schema:
              $ref: '#/components/schemas/Connection'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Connection'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/ServiceResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/connection/delete:
    post:
      tags:
        - extensions
      summary: |-
        Connect a device to the network, optionally with service
        discovery
      description: |-
        Connect a device to the network, optionally with service
        discovery
      operationId: ExtDisconnect
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Object'
          application/xml:
            schema:
              $ref: '#/components/schemas/Object'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Object'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/attribute/write:
    post:
      tags:
        - extensions
      summary: Write a value to an attribute on a device
      description: Write a value to an attribute on a device
      operationId: dataAttrWrite
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeValue'
          application/xml:
            schema:
              $ref: '#/components/schemas/AttributeValue'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AttributeValue'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/attribute/write/file:
    post:
      tags:
        - extensions
      summary: Write a file to an attribute across multiple writes
      description: |-
        Write a file to an attribute across multiple writes
      operationId: dataWriteFile
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeFile'
          application/xml:
            schema:
              $ref: '#/components/schemas/AttributeFile'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AttributeFile'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/attribute/write/blob:
    post:
      tags:
        - extensions
      summary: |-
        Write a binary blob to an attribute across multiple writes
      description: |-
        Write a binary blob to an attribute across multiple writes
      operationId: dataWriteBlob
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeBlob'
          application/xml:
            schema:
              $ref: '#/components/schemas/AttributeBlob'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AttributeBlob'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SuccessResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/attribute/read:
    post:
      tags:
        - extensions
      summary: Read an attribute on a device
      description: Write a value to an attribute on a device
      operationId: dataAttrRead
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Attribute'
          application/xml:
            schema:
              $ref: '#/components/schemas/Attribute'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Attribute'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/attribute/read/conditional:
    post:
      tags:
        - extensions
      summary: |-
        Read a value from attribute on a device until it matches a
        specific value.
      description: |-
        Read a value from attribute on a device until it matches a
        specific value.
      operationId: dataReadCond
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeConditional'
          application/xml:
            schema:
              $ref: '#/components/schemas/AttributeConditional'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/AttributeConditional'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/AttributeValueResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /extension/bulk:
    post:
      tags:
        - extensions
      summary: Compound operations on a device
      description: Compound operations on a device
      operationId: Bulk
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Bulk'
          application/xml:
            schema:
              $ref: '#/components/schemas/Bulk'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Bulk'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/BulkResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/FailureResponse'

components:
  schemas:
# BLE objects
##  An array for BLE services
    BLEServiceslist:
      required:
        - services
      type: object
      properties:
        services:
          type: array
          xml:
            name: services
            wrapped: true
          items:
            $ref: '#/components/schemas/BLEService'
      xml:
        name: BLEServiceslist

## A BLE service with its characteristics
    BLEService:
      required:
        - serviceID
        - characteristics
      type: object
      properties:
        serviceID:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
        characteristics:
          type: array
          xml:
            name: characteristics
            wrapped: true
          items:
            $ref: '#/components/schemas/BLECharacteristic'
      xml:
        name: BLEService

## A BLE characteristics with its descriptors
    BLECharacteristic:
      required:
        - characteristicID
        - flags
        - descriptors
      type: object
      properties:
        characteristicID:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
        flags:
          type: array
          example:
          - read
          - write
          items:
            type: string
            enum:
              - read
              - write
              - notify
        descriptors:
          type: array
          xml:
            name: descriptors
            wrapped: true
          items:
            $ref: '#/components/schemas/BLEDescriptor'
      xml:
        name: BLECharacteristic

## A BLE descriptor
    BLEDescriptor:
      required:
        - descriptorID
      type: object
      properties:
        descriptorID:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
      xml:
        name: BLEDescriptor

## BLE service ID only
    BLEServiceID:
      type: object
      properties:
        serviceID:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
      xml:
        name: BLEServiceID

## Attributes that define a BLE attribute
    BLEAttributes:
      required:
        - ble
      type: object
      properties:
        ble:
          required:
            - serviceID
            - characteristicID
          type: object
          properties:
            serviceID:
              type: string
              format: uuid
              example: 12345678-1234-5678-1234-56789abcdef4
            characteristicID:
              type: string
              format: uuid
              example: 12345678-1234-5678-1234-56789abcdef4
            long:
              type: boolean
              example: false
      xml:
        name: BLEAttributes

## Defines different types of BLE topics
    BLETopic:
      required:
        - ble
      type: object
      properties:
        ble:
          oneOf:
            - $ref: '#/components/schemas/BLESubTopic'
            - $ref: '#/components/schemas/BLEConnTopic'
            - $ref: '#/components/schemas/BLEAdvTopic'
      xml:
        name: BLETopic

## BLE Gatt Topic definition
    BLESubTopic:
      required:
        - type
        - serviceID
        - characteristicID
      type: object
      properties:
        type:
          type: string
          example: gatt
          enum:
            - gatt
        serviceID:
          type: string
          example: 12345678-1234-5678-1234-56789abcdef0
        characteristicID:
          type: string
          example: 12345678-1234-5678-1234-56789abcdef1
      xml:
        name: BLESubTopic

## BLE Connection event Topic definition
    BLEConnTopic:
      required:
        - type
      type: object
      properties:
        type:
          type: string
          example: connection_events
          enum:
            - connection_events
      xml:
        name: BLEConnTopic

## BLE Advertisement Topic definition
    BLEAdvTopic:
      required:
        - type
      type: object
      properties:
        type:
          type: string
          example: advertisements
          enum:
            - advertisements
        filterType:
          type: string
          example: deny
          enum:
            - deny
            - allow
        filters:
          type: array
          xml:
            name: filters
            wrapped: true
          items:
            $ref: '#/components/schemas/BLEAdvertisement'
      xml:
        name: BLEAdvTopic

## BLE Advertisement attributes
    BLEAdvertisement:
      type: object
      properties:
        adTtype:
          type: string
          format: byte
          example: ff
        adData:
          type: string
          format: byte
          example: 4c00*
      xml:
        name: BLEAdvertisement

## Attributes that define a BLE broadcast
    BLEBroadcast:
      required:
        - ble
      type: object
      properties:
        ble:
          required:
            - advertisement
          type: array
          xml:
            name: services
            wrapped: true
          items:
            $ref: '#/components/schemas/BLEAdvertisement'
      xml:
        name: BLEBroadcast

# Zigbee objects
## An array for Zigbee Endpoints
    ZigbeeEndpointlist:
      required:
        - endpoints
      type: object
      properties:
        endpoints:
          type: array
          xml:
            name: endpoints
            wrapped: true
          items:
            $ref: '#/components/schemas/ZigbeeEndpoint'
      xml:
        name: ZigbeeEndpointlist

## A Zigbee endpoint with its clusters
    ZigbeeEndpoint:
      required:
        - endpointID
        - clusters
      type: object
      properties:
        endpointID:
          type: integer
          format: int32
          example: 10
        clusters:
          type: array
          xml:
            name: clusters
            wrapped: true
          items:
            $ref: '#/components/schemas/ZigbeeCluster'
      xml:
        name: ZigbeeEndpoint

## A Zigbee cluster with its attributes
    ZigbeeCluster:
      required:
        - clusterID
        - attributes
      type: object
      properties:
        clusterID:
          type: integer
          format: int32
          example: 0
        attributes:
          type: array
          xml:
            name: attributes
            wrapped: true
          items:
            $ref: '#/components/schemas/ZigbeeAttribute'
      xml:
        name: ZigbeeCluster

## A Zigbee attribute
    ZigbeeAttribute:
      required:
        - attributeID
        - attributeType
      type: object
      properties:
        attributeID:
          type: integer
          format: int32
          example: 1
        attributeType:
          type: integer
          format: int32
          example: 32
      xml:
        name: ZigbeeAttribute

## Attributes that define a Zigbee attribute
    ZigbeeAttributes:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          required:
            - endpointID
            - clusterID
            - attributeID
          type: object
          properties:
            endpointID:
              type: integer
              format: int32
              example: 1
            clusterID:
              type: integer
              format: int32
              example: 6
            attributeID:
              type: integer
              format: int32
              example: 16
            type:
              type: integer
              format: int32
              example: 1
      xml:
        name: ZigbeeAttributes

## Attributes that define a Zigbee broadcast
    ZigbeeBroadcast:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          required:
            - endpointID
            - clusterID
            - attributeID
            - value
          type: object
          properties:
            endpointID:
              type: integer
              format: int32
              example: 1
            clusterID:
              type: integer
              format: int32
              example: 6
            attributeID:
              type: integer
              format: int32
              example: 16
            type:
              type: integer
              format: int32
              example: 1
            value:
              type: integer
              format: int32
              example: 15
      xml:
        name: ZigbeeBroadcast

# Common objects
## A SCIM object, can be a  device or a group
    Object:
      required:
        - id
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
        type:
          type: string
          example: device
          enum:
            - device
            - group
        technology:
          type: string
          example: ble
          enum:
            - ble
            - zigbee
      xml:
        name: Object

## A Service is a device with optional service IDs
    Service:
      allOf:
        - $ref: '#/components/schemas/Object'
      type: object
      properties:
        ble:
          type: object
          properties:
            services:
              type: array
              xml:
                name: services
                wrapped: true
              items:
                $ref: '#/components/schemas/BLEServiceID'
            cached:
              description: |-
                If we can cache information, then device doesn't need
                to be rediscovered before every connected.
              type: boolean
              default: false
            cacheIdlePurge:
              description: cache expiry period, when device allows
              type: integer
              example: 3600 # default 1 hour
            autoUpdate:
              description: |-
                autoupdate services if device supports it (default)
              type: boolean
              example: true
          xml:
            name: ble
      xml:
        name: Service

## A Connection
    Connection:
      allOf:
        - $ref: '#/components/schemas/Service'
      type: object
      properties:
        retries:
          type: integer
          format: int32
          example: 3
        retryMultipleAPs:
          type: boolean
          example: true
      xml:
        name: Connection

## A specific attribute of an Device
    Attribute:
      allOf:
        - $ref: '#/components/schemas/Object'
      oneOf:
        - $ref: '#/components/schemas/BLEAttributes'
        - $ref: '#/components/schemas/ZigbeeAttributes'
      discriminator:
        propertyName: technology
        mapping:
          ble: '#/components/schemas/BLEAttributes'
          zigbee: '#/components/schemas/ZigbeeAttributes'
      xml:
        name: Attribute

## A value of an attribute of an Device
    AttributeValue:
      allOf:
        - $ref: '#/components/schemas/Attribute'
      required:
        - value
      type: object
      properties:
        value:
          type: string
          format: byte
          example: 0001
        forcedResponse:
          description: do or do not wait for a response?
          type: boolean
          example: true
      xml:
        name: AttributeValue

## A file-based attribute of an Device
    AttributeFile:
      allOf:
        - $ref: '#/components/schemas/Attribute'
      required:
        - filename
      type: object
      properties:
        filename:
          type: string
          example: "firmware.dat"
        chunksize:
          type: integer
        forcedResponse:
          description: do or do not wait for a response?
          type: boolean
          example: true
      xml:
        name: AttributeFile

## A binary blob-based attribute of an Device
    AttributeBlob:
      allOf:
        - $ref: '#/components/schemas/Attribute'
      required:
        - blob
      type: object
      properties:
        blob:
          type: string
          format: binary
        chunksize:
          type: integer
        forcedResponse:
          description: do or do not wait for a response?
          type: boolean
          example: true
      xml:
        name: AttributeFile

## Conditional read of a value (read until specific value is read)
    AttributeConditional:
      allOf:
        - $ref: '#/components/schemas/Attribute'
      required:
        - value
      type: object
      properties:
        value:
          type: string
          format: byte
          example: 0001
        maxTime:
          description: |-
            maximum time the conditional read should run in seconds
            (default 10 sec, max 60 sec)
          type: integer
        maxRepeat:
          description: |-
           maximum time the conditional read should repeat
           (default 5, max 60)
          type: integer
        frequency:
          description: |-
            time between reads in seconds (default 1, max 60)
          type: integer
      xml:
        name: AttributeConditional

## A subscription attribute of an Device
    Subscription:
      allOf:
        - $ref: '#/components/schemas/Attribute'
      type: object
      properties:
        topic:
          type: string
          example: enterprise/hospital/pulse_oximeter
        dataFormat:
          description: |-
            how is information decorated? default: timestamped and
            attribute ids.
          type: string
          example: default
          enum:
            - default # decorated with attribute ids
            - timestamped
            - payload
        replay:
          type: boolean
          example: false
          default: false
        forcedAck:
          description: |-
            When not looking at device/attribute support MUST we
            ackhnowledge?
          type: boolean
          example: true
      xml:
        name: Subscription

## A broadcast
    Broadcast:
      allOf:
        - $ref: '#/components/schemas/Object'
      oneOf:
        - $ref: '#/components/schemas/BLEBroadcast'
        - $ref: '#/components/schemas/ZigbeeBroadcast'
      discriminator:
        propertyName: technology
        mapping:
          ble: '#/components/schemas/BLEBroadcast'
          zigbee: '#/components/schemas/ZigbeeBroadcast'
      required:
        - cycle
      type: object
      properties:
        cycle:
          type: string
          example: single
          enum:
            - single
            - repeat
        # broadcast time in ms
        broadcastTime:
          type: integer
          example: 3000
        # interval between broadcasts in ms
        broadcastInterval:
          type: integer
          example: 500
      xml:
        name: Broadcast

## Topic Name
    TopicName:
      required:
        - topic
      type: object
      properties:
        topic:
          type: string
          example: enterprise/hospital/pulse_oximeter
      xml:
        name: TopicName

## DataStream Topic
    Topic:
      allOf:
        - $ref: '#/components/schemas/TopicName'      
      oneOf:
        - $ref: '#/components/schemas/BLETopic'
        - $ref: '#/components/schemas/ZigbeeAttributes'
      discriminator:
        propertyName: technology
        mapping:
          ble: '#/components/schemas/BLETopic'
          zigbee: '#/components/schemas/ZigbeeAttributes'
      type: object
      properties:
        dataFormat:
          description: |-
            How is information decorated?  Default: device
            and attribute ids.
          type: string
          example: default
          enum:
            - default
            - timestamped
            - payload
        replay:
          type: string
          example: off
          enum:
            - off #default
            - on
        dataApps:
          type: array
          xml:
            name: dataApps
            wrapped: true
          items:
            type: object
            properties:
              dataAppID:
                type: string
                example: https://data-app-1
      xml:
        name: Topic

## FileName
    FileName:
      required:
        - filename
      type: object
      properties:
        filename:
          type: string
          example: "firmware.dat"
      xml:
        name: FileName

## File
    File:
      allOf:
        - $ref: '#/components/schemas/FileName'
      type: object
      properties:
        file: #file itself is provided
          type: string
          format: binary
        fileURL: #file can be downloaded from a URL
          type: string
          example: "https://domain.com/firmware.dat"
      xml:
        name: File

## Defines an operation in a bulk API
    Operation:
      required:
        - operation
      allOf:
        - type: object
          properties:
            operation:
              type: string
              enum:
               - /extension/connection/create
               - /extension/connection/delete
               - /extension/attribute/read
               - /extension/attribute/write
               - /extension/attribute/write/file
               - /extension/attribute/write/blob
               - /extension/attribute/read/conditional
        - oneOf:
            - $ref: '#/components/schemas/Service'
            - $ref: '#/components/schemas/Attribute'
            - $ref: '#/components/schemas/AttributeValue'
            - $ref: '#/components/schemas/AttributeConditional'
            - $ref: '#/components/schemas/AttributeFile'
            - $ref: '#/components/schemas/AttributeBlob'
          discriminator:
            propertyName: operation
            mapping:
              /extension/connection/create:
                '#/components/schemas/Service'
              /extension/attribute/read:
                '#/components/schemas/Attribute'
              /extension/attribute/read/conditional:
                '#/components/schemas/AttributeConditional'
              /extension/attribute/write:
                '#/components/schemas/AttributeValue'
              /extension/attribute/write/file:
                '#/components/schemas/AttributeFile'
              /extension/attribute/write/blob:
                '#/components/schemas/AttributeBlob'
      xml:
        name: Operation

## Bulk schema
    Bulk:
      allOf:
        - $ref: '#/components/schemas/Object'
      type: object
      properties:
        autoDisconnect:
          description: |-
            do we automatically disconnect after a RESTful operation?
          type: boolean
          example: true
          default: true
        operations:
          type: array
          xml:
            name: operations
            wrapped: true
          items:
            $ref: '#/components/schemas/Operation'
      xml:
        name: Bulk

# responses
## Baseline success reponse
    Success:
      required:
        - status
      type: object
      properties:
        status:
          type: string
          example: SUCCESS
          enum:
            - SUCCESS
        requestID:
          type: string
          example: 12345678-5678-1234-5578-abcdef1234

    SuccessResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4

## Error 500 application Failure response
    FailureResponse:
      required:
        - status
        - errorCode
      type: object
      properties:
        status:
          type: string
          example: FAILURE
          enum:
            - FAILURE
        reason:
          type: string
          example: Not Found
        errorCode:
          type: integer
          format: int32
          example: 12
        requestID:
          type: string
          example: 12345678-5678-1234-5578-abcdef1234

## Response, success or failure
    Response:
      oneOf:
        - $ref: '#/components/schemas/SuccessResponse'
        - $ref: '#/components/schemas/FailureResponse'
      xml:
        name: Response

## Success response for binding API
    BindingResponse:
      oneOf:
        - $ref: '#/components/schemas/SuccessResponse'
        - $ref: '#/components/schemas/ZigbeeBindingResponse'
        - $ref: '#/components/schemas/FailureResponse'
      xml:
        name: BindingeResponse

## Returning multiple bindings
    MultiBindingsResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - bindings
      type: object
      properties:
        bindings:
          type: array
          xml:
            name: bindings
            wrapped: true
          items:
            $ref: '#/components/schemas/BindingResponse'
      xml:
        name: MultiBindingsResponse

## Returns Zigbee node & pan ID
    ZigbeeBindingResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
      type: object
      properties:
        nodeID:
          type: integer
          format: int32
          example: 65234
        panID:
          type: integer
          format: int32
          example: 48734
      xml:
        name: ZigbeeBindgingResponse

 ## Returns discovered services
    ServiceResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
      oneOf:
        - $ref: '#/components/schemas/BLEServiceslist'
        - $ref: '#/components/schemas/ZigbeeEndpointlist'
      xml:
        name: ConnectionResponse

## Response to multiple connections
    MultiConnectionsResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - connections
      type: object
      properties:
        connections:
          type: array
          xml:
            name: connections
            wrapped: true
          items:
            $ref: '#/components/schemas/Response'
      xml:
        name: MultiConnectionsResponse

## Returns an attribute value
    AttributeValueResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
      required:
       - value
      type: object
      properties:
        value:
          type: string
          example: 01
          format: byte
      xml:
        name: AttributeValueResponse

## Returns a topic
    TopicResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
      required:
        - topic
      type: object
      properties:
        topic:
          type: string
          example: enterprise/hospital/pulse_oximeter
      xml:
        name: TopicResponse

## Returning multiple topics
    MultiTopicsResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - topics
      type: object
      properties:
        topics:
          type: array
          xml:
            name: topics
            wrapped: true
          items:
            $ref: '#/components/schemas/TopicName'
      xml:
        name: MultiTopicsResponse

## Returning multiple subscriptions
    MultiSubscriptionResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - subscriptions
      type: object
      properties:
        subscriptions:
          type: array
          xml:
            name: subscriptions
            wrapped: true
          items:
            $ref: '#/components/schemas/Subscription'
      xml:
        name: MultiSubscriptionResponse

## Returns a file name
    FileResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
      required:
        - filename
      type: object
      properties:
        filename:
          type: string
          example: "firmware.dat"
      xml:
        name: FileResponse

## Returning multiple file names
    MultiFileResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - filenames
      type: object
      properties:
        filenames:
          type: array
          xml:
            name: filenames
            wrapped: true
          items:
            $ref: '#/components/schemas/FileName'
      xml:
        name: MultiFileResponse

## Multiple returns for a bulk operation
    BulkResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
      type: object
      properties:
        operations:
          type: array
          xml:
            name: operations
            wrapped: true
          items:
            $ref: '#/components/schemas/OperationResponse'
      xml:
        name: BulkResponse

## Return for an operation
    OperationResponse:
      required:
        - operation
      allOf:
        - type: object
          properties:
            operation:
              type: string
              enum:
               - /connectivity/connection/create
               - /connectivity/connection/delete
               - /extension/attribute/read
               - /extension/attribute/write
               - /extension/attribute/write/file
               - /extension/attribute/write/blob
               - /extension/attribute/read/conditional
        - oneOf:
          - $ref: '#/components/schemas/ServiceResponse'
          - $ref: '#/components/schemas/SuccessResponse'
          - $ref: '#/components/schemas/AttributeValueResponse'
          discriminator:
            propertyName: operation
            mapping:
              /connectivity/connection/create:
                '#/components/schemas/ServiceResponse'
              /connectivity/connection/delete:
                '#/components/schemas/SuccessResponse'
              /extension/attribute/read:
                '#/components/schemas/AttributeValueResponse'
              /extension/attribute/write:
                '#/components/schemas/AttributeValueResponse'
              /extension/attribute/write/file:
                '#/components/schemas/SuccessResponse'
              /extension/attribute/write/blob:
                '#/components/schemas/SuccessResponse'
              /extension/attribute/read/conditional:
                '#/components/schemas/AttributeValueResponse'
      xml:
        name: Operation

 # API key authorization
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
# Apply the API key globally to all operations
security:
  - ApiKeyAuth: []
<CODE ENDS>
]]></artwork></figure>

</section>
<section anchor="protobuf-definition"><name>Protobuf definition</name>

<t>The following non-normative protocol buffer definition is provide for 
convenience of the implementor.</t>

<figure anchor="proto"><artwork><![CDATA[
<CODE BEGINS>
file "data_app.proto"
syntax = "proto3";

option java_package = "org.ietf.nipc.proto";
option java_multiple_files = true;

package nipc;

message DataSubscription {
    optional string device_id = 1;
    bytes data = 2;

    oneof subscription {
        BLESubscription ble_subscription = 3;
        BLEAdvertisement ble_advertisement = 4;
        ZigbeeSubscription zigbee_subscription = 5;
        RawPayload raw_payload = 6;
        BLEConnectionStatus ble_connection_status = 7;
    }

    message BLESubscription {
        optional string service_uuid = 1;
        optional string characteristic_uuid = 2;
    }

    message BLEAdvertisement {
        string mac_address = 1;
        optional int32 rssi = 2;
    }
    
    message ZigbeeSubscription {
        optional int32 endpoint_id = 1;
        optional int32 cluster_id = 2;
        optional int32 attribute_id = 3;
        optional int32 attribute_type = 4;
    }

    message BLEConnectionStatus {
        string mac_address = 1;
        bool connected = 2;
        optional int32 reason = 3;
    }
    
    message RawPayload {
        optional string context_id = 1;
    }
}

<CODE ENDS>
]]></artwork></figure>

</section>


  </back>

<!-- ##markdown-source:
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
83MAvWrBSkIPeP3/AUmhEyLCRgIA

-->

</rfc>

