<?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 2.6.10) -->


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

<!ENTITY I-D.ietf-scim-device-model SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-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-ietf-asdf-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="August" day="20"/>

    
    
    <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.ietf-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.ietf-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">

&I-D.ietf-scim-device-model;
&RFC2119;
&RFC8174;
&RFC9114;


    </references>

    <references title='Informative References' anchor="sec-informative-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>


    </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: 2.0.0
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/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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 
    
    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: false
          schema:
            type: array
            items:
              type: string
              format: uuid
              example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 
                
    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: false
          schema:
            type: array
            items:
              type: string
              format: uuid
              example: 12345678-1234-5678-1234-56789abcdef4
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 

  /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, full service discovery 
        will be performed. Will fail if device has multiple 
        technologies defined. Group ids will fail.
      operationId: CreateConnectionbyID
      parameters:
        - name: id
          in: path
          description: device id 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'          
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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.
        Group ids will also fail. 
      operationId: GetConnectionbyId
      parameters:
        - name: id
          in: path
          description: device id 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'          
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse' 
                
    delete:
      tags:
        - connectivity
      summary: Delete connection by id for a device
      description: |-
        Disconnect a device by id, success when device
        is disconnected, failure disconnect fails.
        Group ids will also fail. 
      operationId: DeleteConnectionbyID
      parameters:
        - name: id
          in: path
          description: device id 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'          
        '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}:            
    get:
      tags:
        - connectivity
      summary: Get all services by id for a device
      description: |-
        Get all services by id for a connected device, success
        when service discovery succeeds failure, failure when 
        Service discovery fails. This updates cache for cached
        Services. Fails when using a group id.
      operationId: GetServicesbyId
      parameters:
        - name: id
          in: path
          description: device id 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'          
        '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/discover:
    post:
      tags:
        - connectivity
      summary: |-
        Selectively discover services on a device, limited 
        to services described in the parameters
      description: |-
        Selectively discover services on a device, limited 
        to services described in the parameters.
        Group ids will fail.
      operationId: GetSelectiveServices
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Service'
        required: true    
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

### 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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 
    
    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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 
  
  /data/attribute/{id}/{attributename}:
    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: id
        in: path
        description: device id that need to be filtered
        required: true
        schema:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
      - name: attributename
        in: path
        description: attribute name that needs to be filtered
        required: true
        schema:
          type: string
          example: "temperature"
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 
                
    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: id
        in: path
        description: device id that need to be filtered
        required: true
        schema:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
      - name: attributename
        in: path
        description: attribute name that needs to be filtered
        required: true
        schema:
          type: string
          example: "temperature"
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 

  /data/attribute/write:
    post:
      tags:
        - data
      summary: Write a value to an attribute using technology extensions
      description: |-
        Write a value to an attribute directly, addressing the attribute
        with technology-specific extensions, this does not require
        attribute registration. You cannot write to a group id.
      operationId: dataAttrWrite
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeValueRaw'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponseRaw'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                
  /data/attribute/read:
    post:
      tags:
        - data
      summary: Read a value to an attribute using technology extensions
      description: |-
        Read a value to an attribute directly, addressing the attribute
        with technology-specific extensions, this does not require
        attribute registration. You cannot write to a group id.
      operationId: dataAttrRead
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeRaw'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeValueResponseRaw'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
  /data/attribute/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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'   
                
    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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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' 
  
  /data/attribute/subscription/{id}/{attributename}:
    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: id
        in: path
        description: device id that need to be filtered
        required: true
        schema:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
      - name: attributename
        in: path
        description: attribute name that needs to be filtered
        required: true
        schema:
          type: string
          example: "temperature" 
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'
                
    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: id
        in: path
        description: device id that need to be filtered
        required: true
        schema:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
      - name: attributename
        in: path
        description: attribute name that needs to be filtered
        required: true
        explode: true
        schema:
          type: string
          example: "temperature" 
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

  /data/attribute/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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref:
                   '#/components/schemas/MultiSubscriptionResponse'

  /data/attribute/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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /data/attribute/subscription/start:
    post:
      tags:
        - data
      summary: |-
         Subscribe to streaming data from an attribute on a device
         by directly addressing hte attribute (unregistered attr)
      description: |-
        Subscribe to streaming data from an attribute on a device
        by directly addressing hte attribute (unregistered attr)
      operationId: dataSubscriptionStart
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionRaw'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'  
  
  /data/attribute/subscription/stop:
    post:
      tags:
        - data
      summary: |-
         Stop streaming data from an attribute on a device
         by directly addressing hte attribute (unregistered attr)
      description: |-
        Stop streaming data from an attribute on a device
        by directly addressing hte attribute (unregistered attr)
      operationId: dataSubscriptionStop
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionRaw'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'  
 
  /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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

### 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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

    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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

    delete:
      tags:
        - registrations
      summary: unregister a publish/subscribe topic
      description: |-
        unregister a publish/subscribe topic, single topic,
        multiple topics not allowed.
      operationId: unregisterTopic
      parameters:
        - name: topic
          in: query
          description: topic that need to be filtered
          required: false
          explode: false
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

    get:
      tags:
        - registrations
      summary: get one or all publish/subscribe topic
      description: |-
        get publish/subscribe topic, if no topic is specified
        in query, all topics will be returned
      operationId: getTopic
      parameters:
        - name: topic
          in: query
          description: topic that need to be filtered
          required: false
          explode: false
          schema:
            type: string
            example: "enterprise/hospital/pulse_oximeter"
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

  /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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/attribute:
    post:
      tags:
        - registrations
      summary: Register an attribute
      description: |-
        Register an attribute for use in data APIs
      operationId: registerAttribute
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeRegistration'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeRegistrationResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    put:
      tags:
        - registrations
      summary: Update an attribute registration
      description: |-
        Update an existing attribute registration
      operationId: updateAttributeRegistration
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeRegistration'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeRegistrationResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - registrations
      summary: Delete an attribute registration
      description: Delete an attribute registration
      operationId: deleteAttributeRegistration
      parameters:
        - name: attributename
          in: query
          description: attribute name that needs to be filtered
          required: false
          explode: false
          schema:
            type: string
            example: "temperature"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeRegistrationResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: list registered attributes
      description: |-
        get a registered attribute by name of get all 
        attributes if no names supplied.
      operationId: getAttributeRegistration
      parameters:
        - name: attributename
          in: query
          description: attribute name that needs to be filtered
          required: false
          explode: true
          schema:
            type: string
            example: "temperature"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiAttributeRegistrationResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /registration/attribute/{attributename}:
    delete:
      tags:
        - registrations
      summary: delete an attribute registration by name
      description: delete an attribute registration by name
      operationId: deleteAttributeRegistrationbyName
      parameters:
        - name: attributename
          in: path
          description: attribute that needs to be filtered
          required: true
          schema:
            type: string
            example: "temperature"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeRegistrationResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - registrations
      summary: get an attribute registration by name
      description: get an attribute registration by name
      operationId: getAttirbuteRegistrationbyName
      parameters:
        - name: attributename
          in: path
          description: attribute that needs to be filtered
          required: true
          schema:
            type: string
            example: "temperature"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeRegistrationResponse'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

    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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

    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: false
          schema:
            type: string
            example: "firmware.dat"
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

    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: false
          schema:
            type: string
            example: "firmware.dat"
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

  /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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              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'
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '405':
          description: Invalid request
        '500':
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### Extensions

  /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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

  /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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

  /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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

  /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'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              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'

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

## 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
          items:
            $ref: '#/components/schemas/BLECharacteristic'

## 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
          items:
            $ref: '#/components/schemas/BLEDescriptor'

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

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

## 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

## 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'

## 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

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

## 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
          items:
            $ref: '#/components/schemas/BLEAdvertisement'

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

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

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

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

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

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

## 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

## 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

# Common objects
## A SCIM id, can be a  device or a group
    Id:
      required:
        - id
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4

## A SCIM object, can be a  device or a group
    Object:
      allOf:
        - $ref: '#/components/schemas/Id'
      type: object
      properties:
        type:
          type: string
          example: device
          enum:
            - device
            - group
        technology:
          type: string
          example: ble
          enum:
            - ble
            - zigbee

## 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
              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
            bonding: #optional, by default defined in SCIM object 
              type: string
              example: default
              enum:
                - default 
                - none
                - justworks
                - passkey
                - oob

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

## A specific attribute of an Device
    AttributeRaw:
      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'

## A value of an attribute of an Device
    AttributeValueRaw:
      allOf:
        - $ref: '#/components/schemas/AttributeRaw'
      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
        
## An attribute ID
    AttributeID:
      required:
        - attributeID
      type: object
      properties:
        attributeID:
          type: string
          example: "temperature"
          
## A specific attribute of an Device
    Attribute:
      allOf:
        - $ref: '#/components/schemas/Object'
        - $ref: '#/components/schemas/AttributeID'

## 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
          
## An attribute registration
    AttributeRegistration:
      allOf:
        - $ref: '#/components/schemas/AttributeID'
      oneOf:
        - $ref: '#/components/schemas/BLEAttributes'
        - $ref: '#/components/schemas/ZigbeeAttributes'
      discriminator:
        propertyName: technology
        mapping:
          ble: '#/components/schemas/BLEAttributes'
          zigbee: '#/components/schemas/ZigbeeAttributes'

## 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

## 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

## 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

## A subscription attribute of an Device
    SubscriptionRaw:
      allOf:
        - $ref: '#/components/schemas/AttributeRaw'
      type: object
      properties:
        forcedAck:
          description: |-
            When not looking at device/attribute support MUST we
            ackhnowledge?
          type: boolean
          example: true

## A specific attribute of an Device
    Subscription:
      allOf:
        - $ref: '#/components/schemas/Object'
        - $ref: '#/components/schemas/AttributeID'
      type: object
      properties:
        forcedAck:
          description: |-
            When not looking at device/attribute support MUST we
            ackhnowledge?
          type: boolean
          example: true

## 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

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

## DataStream Topic
    Topic:
      allOf:
        - $ref: '#/components/schemas/TopicName'      
      oneOf:
        - $ref: '#/components/schemas/AttributeID'
        - $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
            - payload
        replay:
          type: boolean
          example: false
          default: false
        id:
          type: string
          format: uuid
          example: 12345678-1234-5678-1234-56789abcdef4
        type:
          type: string
          example: device
          enum:
            - device
            - group
        dataApps:
          type: array
          items:
            type: object
            properties:
              dataAppID:
                type: string
                format: uuid
                example: 12345678-1234-5678-1234-56789abcdef4
        technology:
          type: string
          example: ble
          enum:
            - ble
            - zigbee

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

## FileURL
    FileURL:
      required:
        - fileURL
      type: object
      properties:
        fileURL:
          type: string
          example: "https://domain.com/firmware.dat"
          
## FileBinary        
    FileBin:
      required:
        - fileBin
      type: object
      properties:
        fileBin:
          type: string
          format: binary
          example: "firmware.dat"

## File
    File:
      allOf:
        - $ref: '#/components/schemas/FileName'
      oneOf:
        - $ref: '#/components/schemas/FileURL'
        - $ref: '#/components/schemas/FileBin'

## Defines an operation in a bulk API
    Operation:
      required:
        - operation
      allOf:
        - type: object
          properties:
            path:
              type: string
              enum:
               - /connectivity/connection
               - /data/attribute
               - /data/attribute/subscription
               - /extension/attribute/write/file
               - /extension/attribute/write/blob
               - /extension/attribute/read/conditional
            method:
              type: string
              enum:
               - POST
               - DELETE
               - GET
        - oneOf:
            - $ref: '#/components/schemas/Object'
            - $ref: '#/components/schemas/Attribute'
            - $ref: '#/components/schemas/AttributeValue'
            - $ref: '#/components/schemas/AttributeConditional'
            - $ref: '#/components/schemas/AttributeFile'
            - $ref: '#/components/schemas/AttributeBlob'
            - $ref: '#/components/schemas/Subscription'
          discriminator:
            propertyName: operation
            mapping:
              POST /connectivity/connection:
                '#/components/schemas/Service'
              DELETE /connectivity/connection:
                '#/components/schemas/Object'
              GET /connectivity/connection:
                '#/components/schemas/Object'
              POST /data/attribute:
                '#/components/schemas/AttributeValue'
              DELETE /data/attribute:
                '#/components/schemas/Attribute'
              GET /data/attribute:
                '#/components/schemas/Attribute'
              POST /data/attribute/Subscription:
                '#/components/schemas/Subscription'
              DELETE /data/attribute/Subscription:
                '#/components/schemas/Subscription'
              GET /data/attribute/Subscription:
                '#/components/schemas/Subscription'
              POST /extension/attribute/read/conditional:
                '#/components/schemas/AttributeConditional'
              POST /extension/attribute/write/file:
                '#/components/schemas/AttributeFile'
              POST /extension/attribute/write/blob:
                '#/components/schemas/AttributeBlob'

## 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
          items:
            $ref: '#/components/schemas/Operation'

# 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'

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

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

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

## Returns an attribute registration
    AttributeRegistrationResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
        - $ref: '#/components/schemas/AttributeRegistration'
        
## Returning multiple attribute registrations
    MultiAttributeRegistrationResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - attributes
      type: object
      properties:
        attributes:
          type: array
          items:
            $ref: '#/components/schemas/AttributeRegistration'

## Returns a topic
    TopicResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessResponse'
        - $ref: '#/components/schemas/Topic'

## Returning multiple topics
    MultiTopicsResponse:
      allOf:
        - $ref: '#/components/schemas/Success'
      required:
        - topics
      type: object
      properties:
        topics:
          type: array
          items:
            $ref: '#/components/schemas/Topic'

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

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

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

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

## Return for an operation
    OperationResponse:
      required:
        - operation
      allOf:
        - type: object
          properties:
            operation:
              type: string
              enum:
               - /connectivity/connection
               - /data/attribute
               - /data/attribute/subscription
               - /extension/attribute/write/file
               - /extension/attribute/write/blob
               - /extension/attribute/read/conditional
            type:  
              type: string
              enum:
               - POST
               - DELETE
               - GET
        - oneOf:
            - $ref: '#/components/schemas/SuccessResponse'
            - $ref: '#/components/schemas/ServiceResponse'
            - $ref: '#/components/schemas/AttributeValueResponse'
          discriminator:
            propertyName: operation
            mapping:
              POST /connectivity/connection:
                '#/components/schemas/ServiceResponse'
              DELETE /connectivity/connection:
                '#/components/schemas/SuccessResponse'
              GET /connectivity/connection:
                '#/components/schemas/SuccessResponse'
              POST /data/attribute:
                '#/components/schemas/AttributeValueResponse'
              DELETE /data/attribute:
                '#/components/schemas/AttributeValueResponse'
              GET /data/attribute:
                '#/components/schemas/AttributeValueResponse'
              POST /data/attribute/Subscription:
                '#/components/schemas/SuccessResponse'
              DELETE /data/attribute/Subscription:
                '#/components/schemas/SuccessResponse'
              GET /data/attribute/Subscription:
                '#/components/schemas/SuccessResponse'
              POST /extension/attribute/read/conditional:
                '#/components/schemas/AttributeValueResponse'
              POST /extension/attribute/write/file:
                '#/components/schemas/SuccessResponse'
              POST /extension/attribute/write/blob:
                '#/components/schemas/SuccessResponse'

 # 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";

import "google/protobuf/timestamp.proto";

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

package nipc;

message DataSubscription {
    optional string device_id = 1;
    bytes data = 2;
    google.protobuf.Timestamp timestamp = 3;
    optional string ap_mac_address = 4;

    reserved 5 to 10;

    oneof subscription {
        BLESubscription ble_subscription = 11;
        BLEAdvertisement ble_advertisement = 12;
        ZigbeeSubscription zigbee_subscription = 13;
        RawPayload raw_payload = 14;
        BLEConnectionStatus ble_connection_status = 15;
    }

    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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

-->

</rfc>

