<?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.8 (Ruby 2.6.10) -->


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

<!ENTITY SELF "[RFC-XXXX]">
]>


<rfc ipr="trust200902" docName="draft-ietf-core-coap-pubsub-14" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>A publish-subscribe architecture for the Constrained Application Protocol (CoAP)</title>

    <author initials="J." surname="Jimenez" fullname="Jaime Jimenez">
      <organization>Ericsson</organization>
      <address>
        <email>jaime@iki.fi</email>
      </address>
    </author>
    <author initials="M." surname="Koster" fullname="Michael Koster">
      <organization>Dogtiger Labs</organization>
      <address>
        <email>michaeljohnkoster@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Keranen" fullname="Ari Keranen">
      <organization>Ericsson</organization>
      <address>
        <email>ari.keranen@ericsson.com</email>
      </address>
    </author>

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

    <area>Applications</area>
    <workgroup>CoRE Working Group</workgroup>
    

    <abstract>


<?line 68?>

<t>This document describes a publish-subscribe architecture for the Constrained Application Protocol (CoAP), extending the capabilities of CoAP communications for supporting endpoints with long breaks in connectivity and/or up-time. CoAP clients publish on and subscribe to a topic via a corresponding topic resource at a CoAP server acting as broker.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-core-coap-pubsub/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        core Working Group mailing list (<eref target="mailto:core@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/core/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/core/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/core-wg/coap-pubsub"/>.</t>
    </note>


  </front>

  <middle>


<?line 72?>

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

<t>The Constrained Application Protocol (CoAP) <xref target="RFC7252"/> supports
machine-to-machine communication across networks of constrained
devices and constrained networks. CoAP uses a request/response model where clients make requests to servers in order to request actions on resources. Depending on the situation the same device may act either as a server, a client, or both.</t>

<t>One important class of constrained devices includes devices that are intended to run for years from a small battery, or by scavenging energy from their environment. These devices have limited up-time because they spend most of their time in a sleeping state with no network connectivity. Another important class of nodes are devices with limited reachability due to middle-boxes like Network Address Translators (NATs) and firewalls.</t>

<t>For these nodes, the client/server-oriented architecture of REST can be challenging when interactions are not initiated by the devices themselves. A publish/subscribe-oriented architecture where nodes exchange data via topics through a broker entity might fit these nodes better.</t>

<t>This document applies the idea of broker-based publish-subscribe to Constrained RESTful Environments using CoAP. It defines a broker that allows to create, discover subscribe and publish on topics.</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.
<?line -6?></t>

<t>This specification requires readers to be familiar with all the terms and
concepts that are discussed in <xref target="RFC8288"/> and <xref target="RFC6690"/>. Readers
should also be familiar with the terms and concepts discussed in
<xref target="RFC7252"/>, <xref target="RFC9176"/> and <xref target="RFC7641"/>. The URI template
format <xref target="RFC6570"/> is used to describe the REST API defined in
this specification.</t>

<t>This specification makes use of the following terminology:</t>

<dl newline="true">
  <dt>publish-subscribe (pub/sub):</dt>
  <dd>
    <t>A message communication model where messages associated with specific topics are sent to a broker. Interested parties, i.e. subscribers, receive these topic-based messages from the broker without the original sender knowing the recipients. The broker handles matching and delivering these messages to the appropriate subscribers.</t>
  </dd>
  <dt>publishers and subscribers:</dt>
  <dd>
    <t>CoAP clients can act as publishers or as subscribers. Publishers send CoAP messages (publications) to the broker on specific topics. Subscribers have an ongoing observation relation (subscription) to a topic. Both roles operate without any mutual knowledge, guided by their respective topic interests.</t>
  </dd>
  <dt>topic collection:</dt>
  <dd>
    <t>A set of topic configurations. A topic collection is hosted as one collection resource at the broker, and its representation is the list of links to the topic resources corresponding to each topic configuration.</t>
  </dd>
  <dt>topic-configuration:</dt>
  <dd>
    <t>A set of information concerning a topic, including its configuration and other metadata. A topic configuration is hosted as one topic resource at the broker, and its representation is the set of configuration information concerning the topic. All the topic resources associated with the same topic collection share a common base URI, i.e., the URI of the collection resource. Throughout this document the word "topic" and "topic-configuration" can be used interchangeably.</t>
  </dd>
  <dt>topic-data resource:</dt>
  <dd>
    <t>A resource where clients can publish data and/or subscribe to data for a specific topic. The representation of the topic resource corresponding to such a topic also specifies the URI to the present topic-data resource.</t>
  </dd>
  <dt>broker:</dt>
  <dd>
    <t>A CoAP server that hosts one or more topic collections with their topic-configurations, and also topic-data resources. The broker is responsible for the store-and-forward of state update representations, for the topics for which it hosts the corresponding topic-data resources. The broker is also responsible of handling the topic lifecycle as defined in <xref target="topic-lifecycle"/>. The creation, configuration, and discovery of topics at a broker is specified in <xref target="topics"/>.</t>
  </dd>
</dl>

</section>
<section anchor="coap-publish-subscribe-architecture"><name>CoAP Publish-Subscribe Architecture</name>

<t><xref target="fig-arch"/> shows a simple Publish/Subscribe architecture over CoAP.</t>

<t>Topics are created by the broker, but the initial configuration can be proposed by a client (e.g., a publisher or a dedicated administrator) over the RESTful interface of a corresponding topic resource hosted by the broker.</t>

<t>Publishers submit their data over the RESTful interface of a topic-data resource corresponding to the topic, which may be hosted by the broker. Subscribers to a topic are notified of new publications by using Observe <xref target="RFC7641"/> on the corresponding topic-data resource.</t>

<t>The broker is responsible for the store-and-forward of state update representations between CoAP clients. Subscribers observing a resource will receive notifications, the delivery of which is done on a best-effort basis.</t>

<figure title="Publish-subscribe architecture over CoAP" anchor="fig-arch"><artset><artwork  type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="488" viewBox="0 0 488 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,64 L 8,128" fill="none" stroke="black"/>
<path d="M 8,176 L 8,240" fill="none" stroke="black"/>
<path d="M 104,64 L 104,128" fill="none" stroke="black"/>
<path d="M 104,176 L 104,240" fill="none" stroke="black"/>
<path d="M 192,64 L 192,240" fill="none" stroke="black"/>
<path d="M 280,64 L 280,240" fill="none" stroke="black"/>
<path d="M 376,64 L 376,128" fill="none" stroke="black"/>
<path d="M 376,176 L 376,240" fill="none" stroke="black"/>
<path d="M 480,64 L 480,128" fill="none" stroke="black"/>
<path d="M 480,176 L 480,240" fill="none" stroke="black"/>
<path d="M 8,64 L 104,64" fill="none" stroke="black"/>
<path d="M 192,64 L 280,64" fill="none" stroke="black"/>
<path d="M 376,64 L 480,64" fill="none" stroke="black"/>
<path d="M 288,80 L 376,80" fill="none" stroke="black"/>
<path d="M 104,96 L 184,96" fill="none" stroke="black"/>
<path d="M 280,96 L 368,96" fill="none" stroke="black"/>
<path d="M 280,112 L 368,112" fill="none" stroke="black"/>
<path d="M 8,128 L 104,128" fill="none" stroke="black"/>
<path d="M 376,128 L 480,128" fill="none" stroke="black"/>
<path d="M 8,176 L 104,176" fill="none" stroke="black"/>
<path d="M 376,176 L 480,176" fill="none" stroke="black"/>
<path d="M 288,192 L 376,192" fill="none" stroke="black"/>
<path d="M 104,208 L 184,208" fill="none" stroke="black"/>
<path d="M 280,208 L 368,208" fill="none" stroke="black"/>
<path d="M 280,224 L 368,224" fill="none" stroke="black"/>
<path d="M 8,240 L 104,240" fill="none" stroke="black"/>
<path d="M 192,240 L 280,240" fill="none" stroke="black"/>
<path d="M 376,240 L 480,240" fill="none" stroke="black"/>
<polygon class="arrowhead" points="376,224 364,218.4 364,229.6" fill="black" transform="rotate(0,368,224)"/>
<polygon class="arrowhead" points="376,208 364,202.4 364,213.6" fill="black" transform="rotate(0,368,208)"/>
<polygon class="arrowhead" points="376,112 364,106.4 364,117.6" fill="black" transform="rotate(0,368,112)"/>
<polygon class="arrowhead" points="376,96 364,90.4 364,101.6" fill="black" transform="rotate(0,368,96)"/>
<polygon class="arrowhead" points="296,192 284,186.4 284,197.6" fill="black" transform="rotate(180,288,192)"/>
<polygon class="arrowhead" points="296,80 284,74.4 284,85.6" fill="black" transform="rotate(180,288,80)"/>
<polygon class="arrowhead" points="192,208 180,202.4 180,213.6" fill="black" transform="rotate(0,184,208)"/>
<polygon class="arrowhead" points="192,96 180,90.4 180,101.6" fill="black" transform="rotate(0,184,96)"/>
<g class="text">
<text x="36" y="36">CoAP</text>
<text x="244" y="36">CoAP</text>
<text x="412" y="36">CoAP</text>
<text x="48" y="52">clients</text>
<text x="244" y="52">server</text>
<text x="424" y="52">clients</text>
<text x="328" y="68">observe</text>
<text x="144" y="84">publish</text>
<text x="56" y="100">publisher</text>
<text x="428" y="100">subscriber</text>
<text x="56" y="148">...</text>
<text x="236" y="148">broker</text>
<text x="424" y="148">...</text>
<text x="56" y="164">...</text>
<text x="424" y="164">...</text>
<text x="328" y="180">observe</text>
<text x="144" y="196">publish</text>
<text x="56" y="212">publisher</text>
<text x="428" y="212">subscriber</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="center"><![CDATA[
     CoAP                      CoAP                 CoAP
     clients                  server                clients
   .-----------.          .----------.  observe  .------------.
   |           | publish  |          |<----------+            |
   | publisher +--------->+          +---------->| subscriber |
   |           |          |          +---------->|            |
   '-----------'          |          |           '------------'
        ...               |  broker  |                ...
        ...               |          |                ...
   .-----------.          |          |  observe  .------------.
   |           | publish  |          |<----------+            |
   | publisher +--------->|          +---------->| subscriber |
   |           |          |          +---------->|            |
   '-----------'          '----------'           '------------'
]]></artwork></artset></figure>

<t>This document describes two sets of interactions, interactions to configure topics and their lifecycle (see <xref target="topic-configuration-interactions"/>) and interactions about the topic-data (see <xref target="topic-data-interactions"/>).</t>

<t>Topic-configuration interactions are discovery, create, read configuration, update configuration, and delete configuration. These operations handle the management of the topics.</t>

<t>Topic-data interactions are publish, subscribe, unsubscribe, read, and delete. These operations are oriented on how data is transferred from a publisher to a subscriber.</t>

<!--
Throughout the document there is a number of TBDs that need updating, mostly content formats or cbor data representations
-->

</section>
<section anchor="managing-topics"><name>Managing Topics</name>

<t><xref target="fig-api"/> shows the resources related to a Topic Collection that can be managed at the Broker.</t>

<figure title="Resources of a Broker" anchor="fig-api"><artset><artwork  type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="496" viewBox="0 0 496 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 92,56 L 100,72" fill="none" stroke="black"/>
<path d="M 148,136 L 156,152" fill="none" stroke="black"/>
<path d="M 136,80 L 156,120" fill="none" stroke="black"/>
<path d="M 124,40 L 132,56" fill="none" stroke="black"/>
<path d="M 180,120 L 188,136" fill="none" stroke="black"/>
<path d="M 212,136 L 220,152" fill="none" stroke="black"/>
<path d="M 212,104 L 220,120" fill="none" stroke="black"/>
<path d="M 244,120 L 252,136" fill="none" stroke="black"/>
<path d="M 308,136 L 316,152" fill="none" stroke="black"/>
<path d="M 308,104 L 316,120" fill="none" stroke="black"/>
<path d="M 340,120 L 348,136" fill="none" stroke="black"/>
<path d="M 92,56 L 100,40" fill="none" stroke="black"/>
<path d="M 124,72 L 132,56" fill="none" stroke="black"/>
<path d="M 148,136 L 156,120" fill="none" stroke="black"/>
<path d="M 180,152 L 188,136" fill="none" stroke="black"/>
<path d="M 212,136 L 220,120" fill="none" stroke="black"/>
<path d="M 244,152 L 252,136" fill="none" stroke="black"/>
<path d="M 308,136 L 316,120" fill="none" stroke="black"/>
<path d="M 340,152 L 348,136" fill="none" stroke="black"/>
<path d="M 100,40 L 124,40" fill="none" stroke="black"/>
<path d="M 100,72 L 124,72" fill="none" stroke="black"/>
<path d="M 148,104 L 308,104" fill="none" stroke="black"/>
<path d="M 156,120 L 180,120" fill="none" stroke="black"/>
<path d="M 220,120 L 244,120" fill="none" stroke="black"/>
<path d="M 316,120 L 340,120" fill="none" stroke="black"/>
<path d="M 156,152 L 180,152" fill="none" stroke="black"/>
<path d="M 220,152 L 244,152" fill="none" stroke="black"/>
<path d="M 316,152 L 340,152" fill="none" stroke="black"/>
<g class="text">
<text x="40" y="52">topic</text>
<text x="44" y="68">collection</text>
<text x="44" y="84">resource</text>
<text x="280" y="132">...</text>
<text x="392" y="132">topic</text>
<text x="456" y="132">resources</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="center"><![CDATA[
             ___
   topic    /   \
 collection \___/
  resource       \
                  \____________________
                   \___    \___        \___
                   /   \   /   \  ...  /   \   topic resources
                   \___/   \___/       \___/
]]></artwork></artset></figure>

<t>The Broker exports one or more topic-collection resources, with resource type "core.ps.coll" defined in <xref target="iana"/> of this document. The interfaces for the topic-collection resource is defined in <xref target="topic-collection-interactions"/>.</t>

<t>A topic-collection resource can have topic resources as its child resources, with resource type "core.ps.conf".</t>

</section>
</section>
<section anchor="topics"><name>Pub-Sub Topics</name>

<t>The configuration side of a "publish/subscribe broker" consists of a collection of topics. These topics as well as the collection itself are exposed by a CoAP server as resources (see <xref target="fig-topic"/>). Each topic is associated with a topic configuration resource and a topic-data resource. The topic configuration resource is used by a client creating or administering a topic. The topic-data resource is used by the publishers and the subscribers to a topic.</t>

<figure title="Topic and topic-data resources of a topic" anchor="fig-topic"><artset><artwork  type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="448" viewBox="0 0 448 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 184,152 L 184,232" fill="none" stroke="black"/>
<path d="M 272,152 L 272,232" fill="none" stroke="black"/>
<path d="M 400,152 L 400,232" fill="none" stroke="black"/>
<path d="M 164,248 L 172,264" fill="none" stroke="black"/>
<path d="M 92,56 L 100,72" fill="none" stroke="black"/>
<path d="M 164,168 L 172,184" fill="none" stroke="black"/>
<path d="M 196,232 L 204,248" fill="none" stroke="black"/>
<path d="M 228,280 L 236,296" fill="none" stroke="black"/>
<path d="M 136,80 L 172,152" fill="none" stroke="black"/>
<path d="M 124,40 L 132,56" fill="none" stroke="black"/>
<path d="M 196,152 L 204,168" fill="none" stroke="black"/>
<path d="M 252,248 L 260,264" fill="none" stroke="black"/>
<path d="M 252,168 L 260,184" fill="none" stroke="black"/>
<path d="M 284,232 L 292,248" fill="none" stroke="black"/>
<path d="M 236,104 L 260,152" fill="none" stroke="black"/>
<path d="M 284,152 L 292,168" fill="none" stroke="black"/>
<path d="M 380,248 L 388,264" fill="none" stroke="black"/>
<path d="M 380,168 L 388,184" fill="none" stroke="black"/>
<path d="M 412,232 L 420,248" fill="none" stroke="black"/>
<path d="M 364,104 L 388,152" fill="none" stroke="black"/>
<path d="M 412,152 L 420,168" fill="none" stroke="black"/>
<path d="M 92,56 L 100,40" fill="none" stroke="black"/>
<path d="M 124,72 L 132,56" fill="none" stroke="black"/>
<path d="M 164,168 L 172,152" fill="none" stroke="black"/>
<path d="M 164,248 L 172,232" fill="none" stroke="black"/>
<path d="M 196,184 L 204,168" fill="none" stroke="black"/>
<path d="M 196,264 L 204,248" fill="none" stroke="black"/>
<path d="M 252,168 L 260,152" fill="none" stroke="black"/>
<path d="M 220,296 L 228,280" fill="none" stroke="black"/>
<path d="M 252,248 L 260,232" fill="none" stroke="black"/>
<path d="M 284,184 L 292,168" fill="none" stroke="black"/>
<path d="M 284,264 L 292,248" fill="none" stroke="black"/>
<path d="M 380,168 L 388,152" fill="none" stroke="black"/>
<path d="M 380,248 L 388,232" fill="none" stroke="black"/>
<path d="M 412,184 L 420,168" fill="none" stroke="black"/>
<path d="M 412,264 L 420,248" fill="none" stroke="black"/>
<path d="M 100,40 L 124,40" fill="none" stroke="black"/>
<path d="M 100,72 L 124,72" fill="none" stroke="black"/>
<path d="M 148,104 L 364,104" fill="none" stroke="black"/>
<path d="M 172,152 L 196,152" fill="none" stroke="black"/>
<path d="M 260,152 L 284,152" fill="none" stroke="black"/>
<path d="M 388,152 L 412,152" fill="none" stroke="black"/>
<path d="M 172,264 L 196,264" fill="none" stroke="black"/>
<path d="M 260,264 L 284,264" fill="none" stroke="black"/>
<path d="M 388,264 L 412,264" fill="none" stroke="black"/>
<path d="M 148,296 L 220,296" fill="none" stroke="black"/>
<path d="M 236,296 L 308,296" fill="none" stroke="black"/>
<path d="M 364,296 L 436,296" fill="none" stroke="black"/>
<circle cx="184" cy="160" r="6" class="closeddot" fill="black"/>
<circle cx="272" cy="160" r="6" class="closeddot" fill="black"/>
<circle cx="400" cy="160" r="6" class="closeddot" fill="black"/>
<g class="text">
<text x="40" y="52">topic</text>
<text x="44" y="68">collection</text>
<text x="44" y="84">resource</text>
<text x="196" y="132">......</text>
<text x="284" y="132">......</text>
<text x="412" y="132">......</text>
<text x="112" y="148">topic</text>
<text x="152" y="148">:</text>
<text x="216" y="148">:</text>
<text x="240" y="148">:</text>
<text x="304" y="148">:</text>
<text x="368" y="148">:</text>
<text x="432" y="148">:</text>
<text x="80" y="164">configuration</text>
<text x="152" y="164">:</text>
<text x="216" y="164">:</text>
<text x="240" y="164">:</text>
<text x="304" y="164">:</text>
<text x="368" y="164">:</text>
<text x="432" y="164">:</text>
<text x="100" y="180">resource</text>
<text x="152" y="180">:</text>
<text x="176" y="180">_</text>
<text x="192" y="180">_</text>
<text x="216" y="180">:</text>
<text x="240" y="180">:</text>
<text x="264" y="180">_</text>
<text x="280" y="180">_</text>
<text x="304" y="180">:</text>
<text x="368" y="180">:</text>
<text x="392" y="180">_</text>
<text x="408" y="180">_</text>
<text x="432" y="180">:</text>
<text x="164" y="196">....</text>
<text x="204" y="196">....</text>
<text x="252" y="196">....</text>
<text x="292" y="196">....</text>
<text x="380" y="196">....</text>
<text x="420" y="196">....</text>
<text x="164" y="212">....</text>
<text x="204" y="212">....</text>
<text x="252" y="212">....</text>
<text x="292" y="212">....</text>
<text x="380" y="212">....</text>
<text x="420" y="212">....</text>
<text x="152" y="228">:</text>
<text x="176" y="228">_</text>
<text x="192" y="228">_</text>
<text x="216" y="228">:</text>
<text x="240" y="228">:</text>
<text x="264" y="228">_</text>
<text x="280" y="228">_</text>
<text x="304" y="228">:</text>
<text x="336" y="228">...</text>
<text x="368" y="228">:</text>
<text x="392" y="228">_</text>
<text x="408" y="228">_</text>
<text x="432" y="228">:</text>
<text x="92" y="244">topic-data</text>
<text x="152" y="244">:</text>
<text x="216" y="244">:</text>
<text x="240" y="244">:</text>
<text x="304" y="244">:</text>
<text x="368" y="244">:</text>
<text x="432" y="244">:</text>
<text x="100" y="260">resource</text>
<text x="152" y="260">:</text>
<text x="216" y="260">:</text>
<text x="240" y="260">:</text>
<text x="304" y="260">:</text>
<text x="368" y="260">:</text>
<text x="432" y="260">:</text>
<text x="184" y="276">:.......:</text>
<text x="272" y="276">:.......:</text>
<text x="400" y="276">:.......:</text>
<text x="144" y="292">\</text>
<text x="312" y="292">/</text>
<text x="336" y="292">...</text>
<text x="360" y="292">\</text>
<text x="440" y="292">/</text>
<text x="176" y="308">topic</text>
<text x="208" y="308">1</text>
<text x="264" y="308">topic</text>
<text x="296" y="308">2</text>
<text x="392" y="308">topic</text>
<text x="424" y="308">n</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="center"><![CDATA[
              ___
    topic    /   \
  collection \___/
   resource       \
                   \___________________________
                    \          \               \
                     \ ......   \ ......        \ ......
             topic  : \___  :  : \___  :       : \___  :
     configuration  : / * \ :  : / * \ :       : / * \ :
          resource  : \_|_/ :  : \_|_/ :       : \_|_/ :
                    ....|....  ....|....       ....|....
                    ....|....  ....|....       ....|....
                    :  _|_  :  :  _|_  :  ...  :  _|_  :
        topic-data  : /   \ :  : /   \ :       : /   \ :
          resource  : \___/ :  : \___/ :       : \___/ :
                    :.......:  :.......:       :.......:
                   \_________/\_________/ ... \_________/
                     topic 1    topic 2         topic n
]]></artwork></artset></figure>

<section anchor="collection-representation"><name>Collection Representation</name>

<t>Each topic configuration is represented as a link, where the link target is the URI of the corresponding topic resource.</t>

<t>Publication and subscription to a topic occur at a link, where the link target is the URI of the corresponding topic-data resource. Such a link is specified by the topic-data entry within the topic resource (see <xref target="topic-properties"/>).</t>

<t>A topic resource with a topic-data link can also be simply called "topic".</t>

<t>The list of links to the topic resources can be retrieved from the associated topic collection resource, and represented as a Link Format document <xref target="RFC6690"/>where each such link specifies the link target attribute 'rt' (Resource Type), with value "core.ps.conf" defined in this document.</t>

</section>
<section anchor="topic-resource-representation"><name>Topic-Configuration Representation</name>

<t>A CoAP client can create a new topic by submitting an initial configuration for the topic (see <xref target="topic-create"/>). It can also read and update the configuration of existing topics and delete them when they are no longer needed (see <xref target="topic-configuration-interactions"/>).</t>

<t>The configuration of a topic itself consists of a set of properties that can be set by a client or by the broker. The topic-configuration is represented as a CBOR map containing the configuration properties of the topic as top-level elements.</t>

<t>Unless specified otherwise, these are defined in this document and their CBOR abbreviations are defined in <xref target="pubsub-parameters"/>.</t>

<section anchor="topic-properties"><name>Topic Properties</name>

<t>The CBOR map includes the following configuration parameters, whose CBOR abbreviations are defined in <xref target="pubsub-parameters"/> of this document.</t>

<t><list style="symbols">
  <t>'topic-name': A required field used as an application identifier. It encodes the topic name as a CBOR text string. Examples of topic names include human-readable strings (e.g., "room2"), UUIDs, or other values.</t>
  <t>'topic-data': A required field (optional during creation) containing the URI of the topic-data resource for publishing/subscribing to this topic. It encodes the URI as a CBOR text string.</t>
  <t>'resource-type': A required field used to indicate the resource type of the topic-data resource for the topic. It encodes the resource type as a CBOR text string. The value should be "core.ps.conf".</t>
</list></t>

<!--
David N Christian A:
history resource with a counter 0 .. 100
-->

<t><list style="symbols">
  <t>'media-type': An optional field used to indicate the media type of the topic-data resource for the topic. It encodes the media type as a this information as the integer identifier of the CoAP content-format (e.g., value is "50" for "application/json").</t>
  <t>'topic-type': An optional field used to indicate the attribute or property of the topic-data resource for the topic. It encodes the attribute as a CBOR text string. Example attributes include "temperature".</t>
  <t>'expiration-date': An optional field used to indicate the expiration date of the topic. It encodes the expiration date as a CBOR text string. The value should be a date string in ISO 8601 format (e.g., "2023-03-31T23:59:59Z"). The broker can use this field to automatically remove topics that are no longer valid. If this field is not present, the topic will not expire automatically.</t>
  <t>'max-subscribers': An optional field used to indicate the maximum number of simultaneous subscribers allowed for the topic. It encodes the maximum number as an unsigned CBOR integer. If this field is not present, there is no limit to the number of simultaneous subscribers allowed. The broker can use this field to limit the number of subscribers for the topic. The default value for this field has been set to 100 subscribers.</t>
  <t>'observer-check': An optional field that controls the maximum number of seconds between two consecutive Observe notifications sent as Confirmable messages to each topic subscriber. Encoded as a CBOR unsigned integer greater than 0, it ensures subscribers who have lost interest and silently forgotten the observation do not remain indefinitely on the server's observer list. If another CoAP server hosts the topic-data resource, that server is responsible for applying the observer-check value. The default value for this field is 86400, as defined in <xref target="RFC7641"/>, which corresponds to 24 hours.</t>
</list></t>

</section>
</section>
<section anchor="discovery"><name>Discovery</name>

<t>A client can perform a discovery of: the broker; the topic collection resources and topic resources hosted by the broker; and the topic-data resources associated with those topic resources.</t>

<section anchor="broker-discovery"><name>Broker Discovery</name>

<t>CoAP clients MAY discover brokers by using CoAP Simple Discovery, via multicast, through a Resource Directory (RD) <xref target="RFC9176"/> or by other means specified in extensions to <xref target="RFC7252"/>. Brokers MAY register with a RD by following the steps on Section 5 of <xref target="RFC9176"/> with the resource type set to "core.ps" as defined in <xref target="iana"/> of this document.</t>

<t>The following example shows an endpoint discovering a broker using the "core.ps" resource type over a multicast network. Brokers within the multicast scope will answer the query.</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: coap://[ff0x::fe]/.well-known/core
   Resource-Type: core.ps

<= 2.05 Content
   Payload:
   Content-Format: 40 (application/link-format)
   <coap://mythinguri.com/broker/v1>; rt=core.ps
]]></artwork></figure>

</section>
<section anchor="topic-collection-discovery"><name>Topic Collection Discovery</name>

<t>A Broker SHOULD offer a topic discovery entry point to enable clients to find topics of interest. The resource entry point is the topic collection resource collecting the topic configurations for those topics (see Section 1.2.2 of <xref target="RFC6690"/>) and is identified by the resource type "core.ps.coll".</t>

<t>The specific resource path is left for implementations, examples in this document use the "/ps" path. The interactions with a topic collection are further defined in <xref target="topic-collection-interactions"/>.</t>

<t>Since the representation of the topic collection resource includes the links to the associated topic resources, it is not required to locate those links under "/.well-known/core", also in order to limit the size of the Link Format document returned as result of the discovery.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: .well-known/core
   Resource-Type: core.ps.coll

   <= 2.05 Content
   Content-Format: 40 (application/link-format)
   </ps1>;rt="core.ps.coll";ct=40,
   </other/path>;rt="core.ps.coll";ct=40
]]></artwork></figure>

</section>
<section anchor="topic-discovery"><name>Topic-Configuration Discovery</name>

<t>Each topic collection is associated with a group of topic resources, each detailing the configuration of its respective topic (refer to <xref target="topic-properties"/>). Each topic resource is identified by the resource type "core.ps.conf".</t>

<t>Below is an example of discovery via /.well-known/core with rt=core.ps.conf that returns a list of topics, as the list of links to the corresponding topic resources.</t>

<!--
TODO: add the ct part in IANA and add the example here:
- If you want to indicate ct= in one of this links, then it should be ct=X, where is the the Content-Format identifier for application/pubsub+cbor
-->

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: .well-known/core
   Resource-Type: core.ps.conf

<= 2.05 Content
   Content-Format: 40 (application/link-format)
   </ps1/h9392>;rt="core.ps.conf";ct=TBD,
   </other/path/2e3570>;rt=core.ps.conf;ct=TBD
]]></artwork></figure>

</section>
<section anchor="topic-data-discovery"><name>Topic-Data Discovery</name>

<!--
TODO DISCUSS Decide on this section

   Also, as based on Section 1.2.2 of RFC 6690, I'd realistically expect to have located by /.well-known/core certainly the topic collection resources and MAYBE the topic resources (and likely limited only to "perpetual", hence well-known topics).

   Instead, I'd expect to discover the links to the topic resources mostly by GET/FETCH accessing the topic collection resource.

   Practically, you may have to literally *discover* the broker, its collection resource, and a particular topic resource. At that point, you just *learn* the URI of the topic-data resource, from the corresponding parameter within the exact, corresponding topic resource.
-->

<t>Within a topic, there is the topic-data property containing the URI of the topic-data resource that a CoAP client can subscribe and publish to. Resources exposing resources of the topic-data type are expected to use the resource type 'core.ps.data'.</t>

<t>The topic-data contains the URI of the topic-data resource for publishing and subscribing. So retrieving the topic configuration will also provide the URL of the topic-data (see <xref target="topic-get-resource"/>).</t>

<t>It is also possible to discover a list of topic-data resources by sending a request to the collection with with rt=core.ps.data resources as shown below.</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: /ps
   Resource-Type: core.ps.data

<= 2.05 Content
   Content-Format: 40 (application/link-format)
   </ps/data/62e4f8d>; rt=core.ps.data; obs
]]></artwork></figure>

</section>
</section>
<section anchor="topic-collection-interactions"><name>Topic Collection Interactions</name>

<t>These are the interactions that can happen directly with a specific topic collection.</t>

<section anchor="topic-get-all"><name>Retrieving all topic-configurations</name>

<t>A client can request a collection of the topics present in the broker by making a GET request to the collection URI.</t>

<t>On success, the server returns a 2.05 (Content) response, specifying the list of links to topic resources associated with this topic collection (see  <xref target="topic-resource-representation"/>).</t>

<t>Depending on its granted permissions, a client MAY retrieve a different list of links, corresponding to the topics that the client is authorized to access.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: ps

<= 2.05 Content
   Content-Format: 40 (application/link-format)
   </ps/h9392>;rt="core.ps.conf",
   </ps/2e3570>; rt="core.ps.conf"
]]></artwork></figure>

</section>
<section anchor="topic-get-properties"><name>Getting topic-configurations by Properties</name>
<!--
FETCH to /topic-collection with filter
retrieve only the topics that match the filter
request is cbor
response is link format
-->

<t>A client can filter a collection of topics by submitting the
representation of a topic filter (see  <xref target="topic-fetch-resource"/>) in a FETCH request to the topic collection URI.</t>

<t>On success, the server returns a 2.05 (Content) response with a
representation of a list of topics in the collection (see
 <xref target="topic-discovery"/>) that match the filter in CoRE link format <xref target="RFC6690"/>.</t>

<t>Upon success, the server responds with a 2.05 (Content), providing a list of links to topic resources associated with this topic collection that match the request's filter criteria (refer to  <xref target="topic-discovery"/>). A positive match happens only when each request parameter is present with the indicated value in the topic resource representation.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.05 FETCH
   Uri-Path: ps
   Content-Format: TBD (application/pubsub+cbor)

   {
     "resource-type": "core.ps.conf",
     "topic-type": "temperature"
   }

<= 2.05 Content
   Content-Format: 40 (application/link-format)
   </ps/2e3570>;rt="core.ps.conf"
]]></artwork></figure>

</section>
<section anchor="topic-create"><name>Creating a Topic</name>
<!--
POST to /topic-collection
create new topic
request is cbor
response (created) is cbor including the link to new topic-config resource
creator proposes topic name but broker approves
-->

<t>A client can add a new topic-configurations to a collection of topics by submitting an initial representation of the initial topic resource (see  <xref target="topic-resource-representation"/>) in a POST request to the topic collection URI. The request MUST specify at least a subset of the properties in  <xref target="topic-properties"/>, namely: topic-name and resource-type.</t>

<!--
   TODO Next two paragraphs are thorny
   Also, as above, the topic-data resource may not even hosted at the broker, which only knows the link to that resource. It is up to the actual, responsible host to "assign" a topic-data resource (i.e., associate it with a URI to store within the topic resource at the broker), without even creating the resource yet.

   Removed

A CoAP endpoint creating a topic MAY specify a topic-data URI when the topic-data resource is not hosted by the broker.
-->

<t>Please note that the topic will NOT be fully created until a publisher has published some data to it (See <xref target="topic-lifecycle"/>).</t>

<t>On success, the server returns a 2.01 (Created) response, indicating the Location-Path of the new topic and the current representation of the topic resource. The response payload includes a CBOR map with key-value pairs. The response must include the required topic properties (see <xref target="topic-properties"/>), namely: "topic-name", "resource-type" and "topic-data". It may also include a number of optional properties too.</t>

<t>If requirements are defined for the client to create the topic as requested and the broker does not successfully assess that those requirements are met, then the broker MUST respond with a 4.03 (Forbidden) error. The response MUST have Content-Format set to "application/core-pubsub+cbor".</t>

<t>The broker MUST issue a 4.00 (Bad Request) error if a received parameter is invalid, unrecognized, or if the topic-name is already in use or otherwise invalid.</t>

<!--
   TODO Regardless, what if the topic-name is already in use or not fine for other reasons? Is the broker going to use and return a new one that fits?
-->

<figure><artwork><![CDATA[
=> 0.02 POST
   Uri-Path: ps
   Content-Format: TBD2 (application/core-pubsub+cbor)
   TBD (this should be a CBOR map with the mandatory parameters)
   {
     "topic-name": "living-room-sensor",
     "resource-type": "core.ps.conf"
   }

<= 2.01 Created
   Location-Path: ps/h9392
   Content-Format: TBD2 (application/core-pubsub+cbor)

   TBD (this should be a CBOR map)
   {
     "topic-name": "living-room-sensor",
     "topic-data": "ps/data/1bd0d6d",
     "resource-type": "core.ps.conf"
   }
]]></artwork></figure>

</section>
</section>
<section anchor="topic-configuration-interactions"><name>Topic-Configuration Interactions</name>

<t>These are the interactions that can happen at the topic resource level.</t>

<section anchor="topic-get-resource"><name>Getting a topic-configuration</name>

<!--
GET to /topic-config
retrieve a topic configuration
response is cbor
-->

<t>A client can read the configuration of a topic by making a GET request to the topic resource URI.</t>

<t>On success, the server returns a 2.05 (Content) response with a partial representation of the topic resource, as specified in <xref target="topic-resource-representation"/>. The partial representation includes only the configuration parameters such that they are present and have the same value in both the current topic configuration as well as in the FETCH request.</t>

<t>If requirements are defined for the client to create the topic as requested and the broker does not successfully assess that those requirements are met, then the broker MUST respond with a 4.03 (Forbidden) error.</t>

<t>The response payload is a CBOR map, whose possible entries are specified in <xref target="topic-resource-representation"/> and use the same abbreviations defined in <xref target="pubsub-parameters"/>.</t>

<t>For example, below is a request on the topic "ps/h9392":</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: ps
   Uri-Path: h9392

<= 2.05 Content
   Content-Format: TBD2 (application/core-pubsub+cbor)
   {
      "topic-name" : "living-room-sensor",
      "topic-data" : "ps/data/1bd0d6d",
      "resource-type": "core.ps.conf",
      "media-type": "application/senml-cbor",
      "topic-type": "temperature",
      "expiration-date": "2023-04-00T23:59:59Z",
      "max-subscribers": 100
   }

]]></artwork></figure>

</section>
<section anchor="topic-fetch-resource"><name>Getting part of a topic-configuration</name>
<!--
FETCH to /topic-conf with filter
retrieve only certain parameters from the configuration
request is cbor
response is cbor
-->

<t>A client can read the configuration of a topic by making a FETCH request to the topic resource URI with a filter for specific parameters. This is done in order to retrieve part of the current topic resource.</t>

<t>The request contains a CBOR map with a configuration filter or 'conf-filter', a CBOR array with CBOR abbreviation. Each element of the array specifies one requested configuration parameter of the current topic resource (see <xref target="topic-resource-representation"/>).</t>

<t>On success, the server returns a 2.05 (Content) response with a representation of the topic resource. The response has as payload the partial representation of the topic resource as specified in <xref target="topic-resource-representation"/>.</t>

<t>If requirements are defined for the client to create the topic as requested and the broker does not successfully assess that those requirements are met, then the broker MUST respond with a 4.03 (Forbidden) error.</t>

<t>The response payload is a CBOR map, whose possible entries are specified in <xref target="topic-resource-representation"/> and use the same abbreviations defined in <xref target="pubsub-parameters"/>.</t>

<t>Both request and response MUST have Content-Format set to "application/core-pubsub+cbor".</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.05 FETCH
   Uri-Path: ps
   Uri-Path: h9392
   Content-Format: TBD2 (application/core-pubsub+cbor)
   {
     "conf-filter": ["topic-data", "media-type"]
   }

<= 2.05 Content
   Content-Format: TBD2 (application/core-pubsub+cbor)
   {
     "topic-data": "ps/data/1bd0d6d",
     "media-type": "application/senml-cbor"
   }

]]></artwork></figure>

</section>
<section anchor="topic-update-resource"><name>Updating the topic-configuration</name>

<!--
PUT to /topic-conf
override the whole configuration
request is cbor
response is cbor
-->

<t>A client can update a topic's configuration by submitting the updated topic representation in a PUT request to the topic URI. However, the parameters "topic-name", "topic-data", and "resource-type" are immutable post-creation, and any request attempting to change them will be deemed invalid by the broker.</t>

<t>On success, the topic configuration is overwritten and server returns a 2.04 (Changed) response and the current full resource representation. The broker may chose not to overwrite parameters that are not explicitly modified in the request.</t>

<t>Note that updating the "topic-data" path will automatically cancel all existing observations on it and thus will unsubscribe all subscribers. Updating the "topic-data" may happen also after it being deleted, as described on {delete-topic-data}, this will in turn create a new "topic-data" path for that topic configuration.</t>

<t>Similarly, decreasing max-subscribers will also cause that some subscribers get unsubscribed. Unsubscribed endpoints SHOULD receive a final 4.04 (Not Found) response as per <xref target="RFC7641"/> Section 3.2.</t>

<t>Please note that when using PUT the topic configuration is being overwritten, thus some of the optional parameters (e.g., "max-subscribers", "observer-check") not included in the PUT message will be reset to their default values.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.03 PUT
   Uri-Path: ps
   Uri-Path: h9392
   Content-Format: TBD2 (application/core-pubsub+cbor)

   {
      "topic-name": "living-room-sensor",
      "topic-data": "ps/data/1bd0d6d",
      "resource-type": "core.ps.conf",
      "media-type": "application/senml-cbor",
      "topic-type": "temperature",
      "expiration-date": "2023-04-28T23:59:59Z",
   }

<= 2.04 Changed
   Content-Format: TBD2 (application/core-pubsub+cbor)

   TBD (this should be a CBOR map)
   {
      "topic-name": "living-room-sensor",
      "topic-data": "ps/data/1bd0d6d",
      "resource-type": "core.ps.conf",
      "media-type": "application/senml-cbor",
      "topic-type": "temperature",
      "expiration-date": "2023-04-28T23:59:59Z",
      "max-subscribers": 100,
      "observer-check": 86400
   }
]]></artwork></figure>

<t>Note that when a topic configuration changes, it may result in disruptions for the subscribers. Some potential issues that may arise include:</t>

<t><list style="symbols">
  <t>Limiting the number of subscribers will cause to cancel ongoing subscriptions until max-subscribers has been reached.</t>
  <t>Changing the topic-data value will cancel all ongoing subscriptions.</t>
  <t>Changing of the expiration-date may cause to cancel ongoing subscriptions if the topic expires at an earlier data.</t>
</list></t>

</section>
<section anchor="topic-update-resource-patch"><name>Updating the topic-configuration with iPATCH</name>

<t>A client can partially update a topic's configuration by submitting a partial topic representation in an iPATCH request to the topic URI. The iPATCH request allows for updating only specific fields of the topic configuration while leaving the others unchanged. As with the PUT method, the parameters "topic-name", "topic-data", and "resource-type" are immutable post-creation, and any request attempting to change them will be deemed invalid by the broker.</t>

<t>On success, the server returns a 2.04 (Changed) response and the current full resource representation. The broker only updates parameters that are explicitly mentioned in the request.</t>

<t>As with the PUT method, updating the "topic-data" path will automatically cancel all existing observations on it and thus will unsubscribe all subscribers. Decreasing max-subscribers will also cause some subscribers to get unsubscribed. Unsubscribed endpoints SHOULD receive a final 4.04 (Not Found) response as per <xref target="RFC7641"/> Section 3.2.</t>

<t>Contrary to PUT, iPATCH operations will explicitly update some parameters, leaving others unmodified.</t>

<figure><artwork><![CDATA[
=> 0.07 iPATCH
   Uri-Path: ps
   Uri-Path: h9392
   Content-Format: TBD2 (application/core-pubsub+cbor)

   {
      "topic-type": "humidity",
      "max-subscribers": 5
   }

<= 2.04 Changed
   Content-Format: TBD2 (application/core-pubsub+cbor)

   TBD (this should be a CBOR map)
   {
      "topic-name" : "living-room-sensor",
      "topic-data" : "ps/data/1bd0d6d",
      "resource-type": "core.ps.conf",
      "media-type": "application/senml-cbor",
      "topic-type": "humidity",
      "expiration-date": "2023-05-28T23:59:59Z",
      "max-subscribers": 5
   }
]]></artwork></figure>

<t>Note that when a topic configuration changes through an iPATCH request, it may result in disruptions for the subscribers. For example, limiting the number of subscribers will cause to cancel ongoing subscriptions until max-subscribers has been reached.</t>

</section>
<section anchor="topic-delete"><name>Deleting a topic-configuration</name>

<t>A client can delete a topic by making a CoAP DELETE request on the topic resource URI.</t>

<t>On success, the server returns a 2.02 (Deleted) response.</t>

<t>When a topic-configuration resource is deleted, the broker MUST also delete the topic-data resource, unsubscribe all subscribers by removing them from the list of observers and returning a final 4.04 (Not Found) response as per section 3.2 of <xref target="RFC7641"/>.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.04 DELETE
   Uri-Path: ps
   Uri-Path: h9392

<= 2.02 Deleted
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="pubsub"><name>Publish and Subscribe</name>

<t>The overview of the publish/subscribe mechanism over CoAP is as follows: a publisher publishes to a topic by submitting the data in a PUT request to a topic-data resource and subscribers subscribe to a topic by submitting a GET request with Observe option set to 0 (register) to a topic-data resource. When resource state changes, subscribers observing the resource <xref target="RFC7641"/> at that time will receive a notification.</t>

<t>A topic-data resource does not exist until some initial data has been published to it. Before initial data publication, a GET request to the topic-data resource URI results in a 4.04 (Not Found) response. If such a "half created" topic is undesired, the creator of the topic can simply immediately publish some initial placeholder data to make the topic "fully created" (see <xref target="topic-lifecycle"/>).</t>

<!--
* "URIs for topic-data MAY be broker-generated or client-generated."

   See a comment above. I think that only the host of the topic-data resource should be in control of generating this URI (to be provided to the broker if that host is not the broker already).
-->

<t>URIs for topic resources are broker-generated (see <xref target="topic-create"/>). There is no necessary URI pattern dependence between the URI where the topic-data exists and the URI of the topic-configuration resource.</t>

<section anchor="topic-lifecycle"><name>Topic Lifecycle</name>

<t>When a topic is newly created, it is first placed by the broker into the HALF CREATED state (see <xref target="fig-life"/>). In this state, a client can read and update the configuration of the topic and delete the topic. A publisher can publish to the topic-data resource.  However, a subscriber cannot yet subscribe to the topic-data resource nor read the latest data.</t>

<!--
TODO I got a comment that mqtt folks my want to pre-subscribe to topics, so they'd like to be able to place an observation even if the resource is not "fully created"

Also, we might want to restrict the discovery part ONLY for FULLY created topics. If so, let's mention it.
-->

<figure title="Lifecycle of a Topic" anchor="fig-life"><artset><artwork  type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="544" viewBox="0 0 544 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 128,72 L 128,120" fill="none" stroke="black"/>
<path d="M 128,144 L 128,176" fill="none" stroke="black"/>
<path d="M 160,144 L 160,176" fill="none" stroke="black"/>
<path d="M 168,72 L 168,120" fill="none" stroke="black"/>
<path d="M 248,152 L 248,184" fill="none" stroke="black"/>
<path d="M 280,152 L 280,184" fill="none" stroke="black"/>
<path d="M 368,72 L 368,120" fill="none" stroke="black"/>
<path d="M 368,144 L 368,176" fill="none" stroke="black"/>
<path d="M 400,144 L 400,176" fill="none" stroke="black"/>
<path d="M 408,72 L 408,120" fill="none" stroke="black"/>
<path d="M 8,80 L 104,80" fill="none" stroke="black"/>
<path d="M 192,80 L 344,80" fill="none" stroke="black"/>
<path d="M 432,80 L 520,80" fill="none" stroke="black"/>
<path d="M 192,112 L 344,112" fill="none" stroke="black"/>
<path d="M 432,112 L 520,112" fill="none" stroke="black"/>
<path d="M 200,160 L 224,160" fill="none" stroke="black"/>
<path d="M 304,160 L 328,160" fill="none" stroke="black"/>
<path d="M 184,128 L 200,160" fill="none" stroke="black"/>
<path d="M 328,160 L 344,128" fill="none" stroke="black"/>
<path d="M 520,80 C 528.83064,80 536,87.16936 536,96" fill="none" stroke="black"/>
<path d="M 520,112 C 528.83064,112 536,104.83064 536,96" fill="none" stroke="black"/>
<path d="M 144,192 C 135.16936,192 128,184.83064 128,176" fill="none" stroke="black"/>
<path d="M 144,192 C 152.83064,192 160,184.83064 160,176" fill="none" stroke="black"/>
<path d="M 384,192 C 375.16936,192 368,184.83064 368,176" fill="none" stroke="black"/>
<path d="M 384,192 C 392.83064,192 400,184.83064 400,176" fill="none" stroke="black"/>
<path d="M 128,72 L 168,72" fill="none" stroke="black"/>
<path d="M 368,72 L 408,72" fill="none" stroke="black"/>
<path d="M 128,120 L 168,120" fill="none" stroke="black"/>
<path d="M 368,120 L 408,120" fill="none" stroke="black"/>
<path d="M 248,152 L 280,152" fill="none" stroke="black"/>
<path d="M 248,184 L 280,184" fill="none" stroke="black"/>
<polygon class="arrowhead" points="440,112 428,106.4 428,117.6" fill="black" transform="rotate(180,432,112)"/>
<polygon class="arrowhead" points="408,144 396,138.4 396,149.6" fill="black" transform="rotate(270,400,144)"/>
<polygon class="arrowhead" points="352,112 340,106.4 340,117.6" fill="black" transform="rotate(0,344,112)"/>
<polygon class="arrowhead" points="312,160 300,154.4 300,165.6" fill="black" transform="rotate(180,304,160)"/>
<polygon class="arrowhead" points="232,160 220,154.4 220,165.6" fill="black" transform="rotate(0,224,160)"/>
<polygon class="arrowhead" points="200,80 188,74.4 188,85.6" fill="black" transform="rotate(180,192,80)"/>
<polygon class="arrowhead" points="168,144 156,138.4 156,149.6" fill="black" transform="rotate(270,160,144)"/>
<polygon class="arrowhead" points="112,80 100,74.4 100,85.6" fill="black" transform="rotate(0,104,80)"/>
<g class="text">
<text x="148" y="36">HALF</text>
<text x="392" y="36">FULLY</text>
<text x="152" y="52">CREATED</text>
<text x="260" y="52">Delete</text>
<text x="392" y="52">CREATED</text>
<text x="268" y="68">topic-data</text>
<text x="472" y="68">Publish</text>
<text x="52" y="100">Create</text>
<text x="264" y="132">Publish</text>
<text x="480" y="132">Subscribe</text>
<text x="96" y="164">Read/</text>
<text x="432" y="164">Read/</text>
<text x="92" y="180">Update</text>
<text x="204" y="180">Delete</text>
<text x="324" y="180">Delete</text>
<text x="436" y="180">Update</text>
<text x="200" y="196">Topic</text>
<text x="320" y="196">Topic</text>
<text x="264" y="212">DELETED</text>
</g>
</svg>
</artwork><artwork  type="ascii-art" align="center"><![CDATA[
                HALF                          FULLY
               CREATED       Delete          CREATED
                ____        topic-data        ____     Publish
------------>  |    |  <-------------------  |    |  ------------.
   Create      |    |                        |    |               |
               |____|  ------------------->  |____|  <-----------'
                      \      Publish      /            Subscribe
               |   ^   \       ___       /   |   ^
         Read/ |   |    '-->  |   |  <--'    |   | Read/
        Update |   |  Delete  |___|  Delete  |   | Update
                '-'   Topic          Topic    '-'
                             DELETED
]]></artwork></artset></figure>

<t>After a publisher publishes to the topic-data for the first time, the topic is placed into the FULLY CREATED state. In this state, a client can read data by means of a GET request without observe. A publisher can publish to the topic-data resource and a subscriber can observe the topic-data resource.</t>

<t>When a client deletes a topic-configuration resource, the topic is placed into the DELETED state and shortly after removed from the server. In this state, all subscribers are removed from the list of observers of the topic-data resource and no further interactions with the topic are possible.</t>

<t>When a client deletes a topic-data, the topic is placed into the HALF CREATED state, where clients can read, update and delete the topic-configuration and await for a publisher to begin publication.</t>

</section>
<section anchor="topic-data-interactions"><name>Topic-Data Interactions</name>

<!--
TODO: Should we remove this
   See comments above. I'm not sure whether the client should have any say on where the topic-data resource is hosted.

   It'd already be difficult to have some sort of coordination between the broker and the separate server hosting the topic-data resource, let alone involving the client as yet another actor in the process.

JJ: Also note that the broker has no way to know anything about a topic-data hosted elsewhere.
-->

<t>Interactions with the topic-data resource are covered in this section.</t>

<section anchor="publish"><name>Publish</name>

<t>A topic-configuration with a topic-data resource must have been created in order to publish data to it (See <xref target="topic-create"/>) and be in the half-created or fully-created state in order to the publish operation to work (see <xref target="topic-lifecycle"/>).</t>

<t>A client can publish data to a topic by submitting the data in a PUT request to the topic-data URI as indicated in its topic resource property. Please note that the topic-data URI is not the same as the topic-configuration URI used for configuring the topic (see <xref target="topic-resource-representation"/>).</t>

<t>On success, the server returns a 2.04 (Updated) response. However, when data is published to the topic for the first time, the server instead MUST return a 2.01 (Created) response and set the topic in the fully-created state (see <xref target="topic-lifecycle"/>).</t>

<t>If the request does not have an acceptable content-format, the server returns a 4.15 (Unsupported Content-Format) response.</t>

<t>If the client is sending publications too fast, the server returns a
4.29 (Too Many Requests) response <xref target="RFC8516"/>.</t>

<t>Example of first publication:</t>

<figure><artwork><![CDATA[
=> 0.03 PUT
   Uri-Path: ps
   Uri-Path: data
   Uri-Path: 1bd0d6d
   Content-Format: 110

   {
      "n": "coap://dev1.example.com/temperature",
      "u": "Cel",
      "t": 1621452122,
      "v": 23.5
   }

<= 2.01 Created
]]></artwork></figure>

<t>Example of subsequent publication:</t>

<figure><artwork><![CDATA[
=> 0.03 PUT
   Uri-Path: ps
   Uri-Path: data
   Uri-Path: 1bd0d6d
   Content-Format: 110

   {
      "n": "coap://dev1.example.com/temperature",
      "u": "Cel",
      "t": 1621452149,
      "v": 22.5
   }

<= 2.04 Updated
]]></artwork></figure>

</section>
<section anchor="subscribe"><name>Subscribe</name>

<t>A client can subscribe to a topic-data by sending a CoAP GET request with the Observe set to 0 to subscribe to resource updates. <xref target="RFC7641"/>.</t>

<t>On success, the server hosting the topic-data resource MUST return 2.05 (Content) notifications with the data and the Observe Option. Otherwise, if no Observe Option is present the client should assume that the subscription was not successful.</t>

<t>If the topic is not yet in the fully created state (see <xref target="topic-lifecycle"/>) the broker SHOULD return a response code 4.04 (Not Found).</t>

<!--
TODO: After a publisher publishes to the topic-data for the first time, the topic is placed into the FULLY CREATED state.

This is a problem if the topic-data is hosted elsewhere and not in the broker, how does the broker know when to put it in fully created state if the pub/sub mechanism is happening directly btw pub and sub?

Shall I add: The topic-data URI may link to resources that are not hosted directly by the broker as shown in {{fig-external-server}}. Thus subscribers would use the broker for discovery only.
-->

<t>The following response codes are defined for the Subscribe operation:</t>

<dl>
  <dt>Success:</dt>
  <dd>
    <t>2.05 "Content". Successful subscribe with observe response, current value included in the response.</t>
  </dd>
  <dt>Failure:</dt>
  <dd>
    <t>4.04 "Not Found". The topic-data does not exist.</t>
  </dd>
</dl>

<t>If the 'max-subscribers' parameter has been reached, the server must treat that as specified in section 4.1 of <xref target="RFC7641"/>. The response MUST NOT include an Observe Option, the absence of which signals to the subscriber that the subscription failed.</t>

<!--
TODO Right. However, how can this work when the server hosting the topic-data resource is not the broker? The broker knows the maximum number of subscribers, but that separate server does not. Is it just up to a not-specified-here synchronization protocol between the broker and that server?
-->

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: ps
   Uri-Path: data
   Uri-Path: 1bd0d6d
   Observe: 0

<= 2.05 Content
   Content-Format: 110
   Observe: 10001
   Max-Age: 15

  {
    "n": "urn:dev:os:32473-123456",
    "u": "Cel",
    "t": 1696341182,
    "v": 19.87
  }

<= 2.05 Content
   Content-Format: 110
   Observe: 10002
   Max-Age: 15

  {

    "n": "urn:dev:os:32473-123456",
    "u": "Cel",
    "t": 1696340184,
    "v": 21.87
  }
]]></artwork></figure>

</section>
<section anchor="unsubscribe"><name>Unsubscribe</name>

<t>A CoAP client can unsubscribe simply by cancelling the observation as described in Section 3.6 of <xref target="RFC7641"/>. The client MUST either use CoAP GET with the Observe Option set to 1 or send a CoAP Reset message in response to a notification. Also on Section 3.6 of <xref target="RFC7641"/> the client can simply "forget" the observation and the server will remove it from the list of observers after the next notification.</t>

<t>As per <xref target="RFC7641"/> a server that transmits notifications mostly in non-confirmable messages, but it MUST send a notification in a confirmable message instead of a non-confirmable message at least every 24 hours.</t>

<t>This value can be modified at the broker by the administrator of a topic by modifying the parameter "observer-check" on <xref target="topic-resource-representation"/>. This would allow to change the rate at which different implementations verify that a subscriber is still interested in observing a topic-data resource.</t>

<!--
TODO: another item that points to make topic-data a broker thing only.

   Yes, and again, what if the topic-data resource is not hosted at the broker but at a different server? Is it just up to a not-specified-here synchronization protocol between the broker and that server?
-->

</section>
<section anchor="delete-topic-data"><name>Delete topic-data</name>

<t>A publisher MAY delete a topic by making a CoAP DELETE request on the topic-data URI.</t>

<t>On success, the server returns a 2.02 (Deleted) response.</t>

<t>When a topic-data resource is deleted, the broker SHOULD also delete the topic-data parameter in the topic resource, unsubscribe all subscribers by removing them from the list of observers and return a final 4.04 (Not Found) response as per <xref target="RFC7641"/> Section 3.2. The topic is then set back to the half created state as per <xref target="topic-lifecycle"/>.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.04 DELETE
   Uri-Path: ps
   Uri-Path: data
   Uri-Path: 1bd0d6d

<= 2.02 Deleted
]]></artwork></figure>

</section>
</section>
<section anchor="read-data"><name>Read latest data</name>

<t>A client can get the latest published topic-data by making a GET request to the topic-data URI in the broker. Please note that discovery of the topic-data parameter is a required previous step (see <xref target="topic-get-resource"/>).</t>

<t>On success, the server MUST return 2.05 (Content) response with the data.</t>

<t>If the target URI does not match an existing resource or the topic is not in the fully created state (see <xref target="topic-lifecycle"/>), the broker MUST return a response code 4.04 (Not Found).</t>

<t>Example:</t>

<figure><artwork><![CDATA[
=> 0.01 GET
   Uri-Path: ps
   Uri-Path: data
   Uri-Path: 1bd0d6d

<= 2.05 Content
   Content-Format: 110
   Max-Age: 15

   {
      "n": "coap://dev1.example.com/temperature",
      "u": "Cel",
      "t": 1621452122,
      "v": 23.5
   }
]]></artwork></figure>

<!--
TODO: Do we add wildcards here?
https://github.com/core-wg/coap-pubsub/issues/42

### Subscribe to a subset of topic-data resources  {#wildcard}

Some implementations may want to subscribe to multiple topic-data resources with one single request. That is possible by using FETCH with

-->

</section>
<section anchor="rate-limit"><name>Rate Limiting</name>

<t>The server hosting the topic-data may have to handle a potentially large number of publishers and subscribers at the same time. This means it could become overwhelmed if it receives too many publications in a short period of time.</t>

<t>In this situation, if a publisher is sending publications too fast, the server SHOULD return a 4.29 (Too Many Requests) response <xref target="RFC8516"/>.  As described in <xref target="RFC8516"/>, the Max-Age option <xref target="RFC7252"/> in this response indicates the number of seconds after which the client may retry. The broker MAY also stop publishing messages from that publisher for the indicated time.</t>

<!--
TODO DISCUSS
* "The broker MAY also stop publishing messages from that publisher for the indicated time."

   It's not necessarily the broker, but rather the server hosting the topic-data resource.

   What does "stop publishing" practically mean? Suppose that the client sends a new PUT request right away? What error response does the server send?

   (note that this opens for the server to keep more state about the publishers, which in turn requires pairwise secure association in order to identify them)

   This does not contradict the next, legitimate paragraph on forbidding a client to do so.

-->

<t>When a publisher receives a 4.29 (Too Many Requests) response, it MUST NOT send any new publication requests to the same topic-data resource before the time indicated by the Max-Age option has passed.</t>

</section>
</section>
<section anchor="pubsub-parameters"><name>CoAP Pubsub Parameters</name>

<t>This document defines parameters used in the messages exchanged between a client and the broker during the topic creation and configuration process (see <xref target="topic-resource-representation"/>). The table below summarizes them and specifies the CBOR key to use instead of the full descriptive name.</t>

<t>Note that the media type application/core-pubsub+cbor MUST be used when these parameters are transported in the respective message fields.</t>

<figure title="CoAP Pubsub Parameters" anchor="fig-CoAP-Pubsub-Parameters"><artwork align="center"><![CDATA[
+-----------------+-----------+-----------+------------+
| Name            | CBOR Key  | CBOR Type | Reference  |
|-----------------|-----------|-----------|------------|
| topic-name      | TBD1      | tstr      | [RFC-XXXX] |
| topic-data      | TBD2      | tstr      | [RFC-XXXX] |
| resource-type   | TBD3      | tstr      | [RFC-XXXX] |
| media-type      | TBD4      | uint      | [RFC-XXXX] |
| topic-type      | TBD5      | tstr      | [RFC-XXXX] |
| expiration-date | TBD6      | tstr      | [RFC-XXXX] |
| max-subscribers | TBD7      | uint      | [RFC-XXXX] |
| observer-check  | TBD8      | uint      | [RFC-XXXX] |
+-----------------+-----------+-----------+------------+
]]></artwork></figure>

</section>
<section anchor="seccons"><name>Security Considerations</name>

<t>The architecture presented in this document inherits the security considerations from CoAP <xref target="RFC7252"/> and Observe <xref target="RFC7641"/>, as well as from Web Linking <xref target="RFC8288"/>, Link-Format <xref target="RFC6690"/>, and the CoRE Resource Directory <xref target="RFC9176"/>.</t>

<t>Communications between each client and the broker MUST be secured, e.g., by using OSCORE <xref target="RFC8613"/> or DTLS <xref target="RFC9147"/>. Security considerations for the used secure communication protocols apply too.</t>

<t>The content published on a topic by a publisher client SHOULD be protected end-to-end between the publisher and all the subscribers to that topic. In such a case, it MUST be possible to assert source authentication of the published data. This can be achieved at the application layer, e.g., by using COSE <xref target="RFC9052"/>, <xref target="RFC9053"/>, <xref target="RFC9338"/>.</t>

<t>Access control of clients at the broker MAY be enforced for performing discovery operation, and SHOULD be enforced in a fine-grained fashion for operations related to the the creation, update, and deletion of topic resources, as well as for operations on topic-data resources such as publication on and subscription to topics. This prevents rogue clients to, among other things, repeatedly create topics at the broker or publish (large) contents, which may result in Denial of Service against the broker and the active subscribers.</t>

<t>Building on <xref target="I-D.ietf-ace-key-groupcomm"/>, its application profile for publish-subscribe communication with CoAP <xref target="I-D.ietf-ace-pubsub-profile"/> provides a security model that can be used in the architecture presented in this document, in order to enable secure communication between the different parties as well as secure, authorized operations of publishers and subscribers that fulfill the requirements above.</t>

<t>In particular, the application profile above relies on the ACE framework for Authentication and Authorization in Constrained Environments (ACE) <xref target="RFC9200"/> and defines a method to: authorize publishers and subscribers to perform operations at the broker, with fine-grained access control; authorize publishers and subscribers to obtain the keying material required to take part to a topic managed by the broker; protect published data end-to-end between its publisher and all the subscribers to the targeted topic, ensuring confidentiality, integrity, and source authentication of the published content end-to-end. That approach can be extended to enforce authorization and fine-grained access control for administrator clients that are intended to create, update, and delete topic configurations at the broker.</t>

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

<t>This document has the following actions for IANA.</t>

<t>Note to RFC Editor: Please replace all occurrences of "&SELF;" with the RFC number of this specification and delete this paragraph.</t>

<section anchor="media-type"><name>Media Type</name>

<t>IANA is requested to add the following Media-Type to the "Media Types"
registry <xref target="IANA.media-types"/>.</t>

<texttable align="left" title="New Media Type application/pubsub+cbor" anchor="new-media-type">
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Template</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>pubsub+cbor</c>
      <c>application/pubsub+cbor</c>
      <c>RFC XXXX, <xref target="media-type"/></c>
</texttable>

<dl spacing="compact">
  <dt>Type name:</dt>
  <dd>
    <t>application</t>
  </dd>
  <dt>Subtype name:</dt>
  <dd>
    <t>pubsub+cbor</t>
  </dd>
  <dt>Required parameters:</dt>
  <dd>
    <t>N/A</t>
  </dd>
  <dt>Optional parameters:</dt>
  <dd>
    <t>N/A</t>
  </dd>
  <dt>Encoding considerations:</dt>
  <dd>
    <t>binary (CBOR data item)</t>
  </dd>
  <dt>Security considerations:</dt>
  <dd>
    <t><xref target="seccons"/> of RFC XXXX</t>
  </dd>
  <dt>Interoperability considerations:</dt>
  <dd>
    <t>none</t>
  </dd>
  <dt>Published specification:</dt>
  <dd>
    <t><xref target="media-type"/> of RFC XXXX</t>
  </dd>
  <dt>Applications that use this media type:</dt>
  <dd>
    <t>This type is used by clients that create, retrieve, and update topic configurations at servers acting as a pub-sub broker.</t>
  </dd>
  <dt>Fragment identifier considerations:</dt>
  <dd>
    <t>N/A</t>
  </dd>
  <dt>Person &amp; email address to contact for further information:</dt>
  <dd>
    <t>CoRE WG mailing list (core@ietf.org),
or IETF Applications and Real-Time Area (art@ietf.org)</t>
  </dd>
  <dt>Intended usage:</dt>
  <dd>
    <t>COMMON</t>
  </dd>
  <dt>Restrictions on usage:</dt>
  <dd>
    <t>none</t>
  </dd>
  <dt>Author/Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Provisional registration:</dt>
  <dd>
    <t>no</t>
  </dd>
</dl>

</section>
<section anchor="content-format"><name>Content-Format</name>

<t>IANA has added the following Content-Formats to the
<xref section="&quot;CoAP Content-Formats&quot;" relative="#content-formats" sectionFormat="bare" target="IANA.core-parameters"/>
sub-registry, within the "Constrained RESTful Environments (CoRE)
Parameters" Registry <xref target="IANA.core-parameters"/>, as follows:</t>

<texttable align="left" title="New Content-Format">
      <ttcol align='left'>Content Type</ttcol>
      <ttcol align='left'>Content Coding</ttcol>
      <ttcol align='left'>ID</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>application/pubsub+cbor</c>
      <c>-</c>
      <c>TBD9</c>
      <c>RFC XXXX</c>
</texttable>

<t>TBD9 is to be assigned from the space 256..999.</t>

</section>
<section anchor="iana-coap-pubsub-parameters"><name>CoAP Pubsub Parameters</name>

<t>IANA is asked to register the following entries in the subregistry of the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>

<t>This specification establishes the "Pubsub Topic Configuration Parameters" IANA registry within the "Constrained RESTful Environments (CoRE)
Parameters" registry group.</t>

<t>The columns of this registry are:</t>

<t><list style="symbols">
  <t>Name: This is a descriptive name that enables easier reference to the item. The name MUST be unique. It is not used in the encoding.</t>
  <t>CBOR Key: This is the value used as CBOR key of the item. These values MUST be unique. The value can be a positive integer, a negative integer, or a text string. Different ranges of values use different registration policies <xref target="RFC8126"/>. Integer values from -256 to 255 as well as text strings of length 1 are designated as "Standards Action With Expert Review". Integer values from -65536 to -257 and from 256 to 65535, as well as text strings of length 2 are designated as "Specification Required". Integer values greater than 65535 as well as text strings of length greater than 2 are designated as "Expert Review". Integer values less than -65536 are marked as "Private Use".</t>
  <t>CBOR Type: This contains the CBOR type of the item, or a pointer to the registry that defines its type, when that depends on another item.</t>
  <t>Reference: This contains a pointer to the public specification for the item.</t>
</list></t>

<t>The registry is initially populated with the entries in <xref target="fig-CoAP-Pubsub-Parameters"/> of <xref target="pubsub-parameters"/>.</t>

</section>
<section anchor="iana-rt"><name>Resource Types</name>

<t>IANA is asked to enter the following values in the "Resource Type (rt=) Link Target Attribute Values" registry within the "Constrained Restful Environments (CoRE) Parameters" registry group.</t>

<figure><artwork><![CDATA[
Value: core.ps
Description: Publish-Subscribe Broker
Reference: [RFC-XXXX]

Value: core.ps.coll
Description: Topic-collection resource of a Publish-Subscribe Broker
Reference: [RFC-XXXX]

Value: core.ps.conf
Description: Topic-configuration resource of a Publish-Subscribe Broker
Reference: [RFC-XXXX]

Value: core.ps.data
Description: Topic-data resource of a broker
Reference: [RFC-XXXX]
]]></artwork></figure>

</section>
</section>
<section numbered="no" anchor="acknowledgements"><name>Acknowledgements</name>

<t>The current version of this document contains a substantial contribution by Klaus Hartke's proposal <xref target="I-D.hartke-t2trg-coral-pubsub"/>, which defines the topic resource model and structure as well as the topic lifecycle and interactions. It also follows a similar architectural design as that provided by Marco Tiloca's <xref target="I-D.ietf-ace-oscore-gm-admin"/>.</t>

<t>The authors would like to also thank Carsten Bormann, Hannes Tschofenig, Zach Shelby, Mohit Sethi, Peter van der Stok, Tim Kellogg, Anders Eriksson, Goran Selander, Mikko Majanen, Olaf Bergmann and Oscar Novo for their valuable contributions and reviews.</t>

</section>


  </middle>

  <back>


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



<reference anchor="RFC6570">
  <front>
    <title>URI Template</title>
    <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="M. Hadley" initials="M." surname="Hadley"/>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="D. Orchard" initials="D." surname="Orchard"/>
    <date month="March" year="2012"/>
    <abstract>
      <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6570"/>
  <seriesInfo name="DOI" value="10.17487/RFC6570"/>
</reference>

<reference anchor="RFC6690">
  <front>
    <title>Constrained RESTful Environments (CoRE) Link Format</title>
    <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
    <date month="August" year="2012"/>
    <abstract>
      <t>This specification defines Web Linking using a link format for use by constrained web servers to describe hosted resources, their attributes, and other relationships between links. Based on the HTTP Link Header field defined in RFC 5988, the Constrained RESTful Environments (CoRE) Link Format is carried as a payload and is assigned an Internet media type. "RESTful" refers to the Representational State Transfer (REST) architecture. A well-known URI is defined as a default entry point for requesting the links hosted by a server. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6690"/>
  <seriesInfo name="DOI" value="10.17487/RFC6690"/>
</reference>

<reference anchor="RFC7252">
  <front>
    <title>The Constrained Application Protocol (CoAP)</title>
    <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
    <author fullname="K. Hartke" initials="K." surname="Hartke"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <date month="June" year="2014"/>
    <abstract>
      <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
      <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7252"/>
  <seriesInfo name="DOI" value="10.17487/RFC7252"/>
</reference>

<reference anchor="RFC8516">
  <front>
    <title>"Too Many Requests" Response Code for the Constrained Application Protocol</title>
    <author fullname="A. Keranen" initials="A." surname="Keranen"/>
    <date month="January" year="2019"/>
    <abstract>
      <t>A Constrained Application Protocol (CoAP) server can experience temporary overload because one or more clients are sending requests to the server at a higher rate than the server is capable or willing to handle. This document defines a new CoAP response code for a server to indicate that a client should reduce the rate of requests.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8516"/>
  <seriesInfo name="DOI" value="10.17487/RFC8516"/>
</reference>

<reference anchor="RFC9176">
  <front>
    <title>Constrained RESTful Environments (CoRE) Resource Directory</title>
    <author fullname="C. Amsüss" initials="C." role="editor" surname="Amsüss"/>
    <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
    <author fullname="M. Koster" initials="M." surname="Koster"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="P. van der Stok" initials="P." surname="van der Stok"/>
    <date month="April" year="2022"/>
    <abstract>
      <t>In many Internet of Things (IoT) applications, direct discovery of resources is not practical due to sleeping nodes or networks where multicast traffic is inefficient. These problems can be solved by employing an entity called a Resource Directory (RD), which contains information about resources held on other servers, allowing lookups to be performed for those resources. The input to an RD is composed of links, and the output is composed of links constructed from the information stored in the RD. This document specifies the web interfaces that an RD supports for web servers to discover the RD and to register, maintain, look up, and remove information on resources. Furthermore, new target attributes useful in conjunction with an RD are defined.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9176"/>
  <seriesInfo name="DOI" value="10.17487/RFC9176"/>
</reference>

<reference anchor="RFC8613">
  <front>
    <title>Object Security for Constrained RESTful Environments (OSCORE)</title>
    <author fullname="G. Selander" initials="G." surname="Selander"/>
    <author fullname="J. Mattsson" initials="J." surname="Mattsson"/>
    <author fullname="F. Palombini" initials="F." surname="Palombini"/>
    <author fullname="L. Seitz" initials="L." surname="Seitz"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE). OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t>
      <t>Although an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration. Therefore, this document updates RFC 7252.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8613"/>
  <seriesInfo name="DOI" value="10.17487/RFC8613"/>
</reference>

<reference anchor="RFC7641">
  <front>
    <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
    <author fullname="K. Hartke" initials="K." surname="Hartke"/>
    <date month="September" year="2015"/>
    <abstract>
      <t>The Constrained Application Protocol (CoAP) is a RESTful application protocol for constrained nodes and networks. The state of a resource on a CoAP server can change over time. This document specifies a simple protocol extension for CoAP that enables CoAP clients to "observe" resources, i.e., to retrieve a representation of a resource and keep this representation updated by the server over a period of time. The protocol follows a best-effort approach for sending new representations to clients and provides eventual consistency between the state observed by each client and the actual resource state at the server.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7641"/>
  <seriesInfo name="DOI" value="10.17487/RFC7641"/>
</reference>

<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>

<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>

<reference anchor="IANA.media-types" target="https://www.iana.org/assignments/media-types">
  <front>
    <title>Media Types</title>
    <author>
      <organization>IANA</organization>
    </author>
  </front>
</reference>

<reference anchor="IANA.core-parameters" target="https://www.iana.org/assignments/core-parameters">
  <front>
    <title>Constrained RESTful Environments (CoRE) Parameters</title>
    <author>
      <organization>IANA</organization>
    </author>
  </front>
</reference>




    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC8288">
  <front>
    <title>Web Linking</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="October" year="2017"/>
    <abstract>
      <t>This specification defines a model for the relationships between resources on the Web ("links") and the type of those relationships ("link relation types").</t>
      <t>It also defines the serialisation of such links in HTTP headers with the Link header field.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8288"/>
  <seriesInfo name="DOI" value="10.17487/RFC8288"/>
</reference>

<reference anchor="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</reference>

<reference anchor="RFC9052">
  <front>
    <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
    <author fullname="J. Schaad" initials="J." surname="Schaad"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
      <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="96"/>
  <seriesInfo name="RFC" value="9052"/>
  <seriesInfo name="DOI" value="10.17487/RFC9052"/>
</reference>

<reference anchor="RFC9147">
  <front>
    <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="April" year="2022"/>
    <abstract>
      <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
      <t>This document obsoletes RFC 6347.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9147"/>
  <seriesInfo name="DOI" value="10.17487/RFC9147"/>
</reference>

<reference anchor="RFC9053">
  <front>
    <title>CBOR Object Signing and Encryption (COSE): Initial Algorithms</title>
    <author fullname="J. Schaad" initials="J." surname="Schaad"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines a set of algorithms that can be used with the CBOR Object Signing and Encryption (COSE) protocol (RFC 9052).</t>
      <t>This document, along with RFC 9052, obsoletes RFC 8152.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9053"/>
  <seriesInfo name="DOI" value="10.17487/RFC9053"/>
</reference>

<reference anchor="RFC9200">
  <front>
    <title>Authentication and Authorization for Constrained Environments Using the OAuth 2.0 Framework (ACE-OAuth)</title>
    <author fullname="L. Seitz" initials="L." surname="Seitz"/>
    <author fullname="G. Selander" initials="G." surname="Selander"/>
    <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
    <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>This specification defines a framework for authentication and authorization in Internet of Things (IoT) environments called ACE-OAuth. The framework is based on a set of building blocks including OAuth 2.0 and the Constrained Application Protocol (CoAP), thus transforming a well-known and widely used authorization solution into a form suitable for IoT devices. Existing specifications are used where possible, but extensions are added and profiles are defined to better serve the IoT use cases.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9200"/>
  <seriesInfo name="DOI" value="10.17487/RFC9200"/>
</reference>

<reference anchor="RFC9338">
  <front>
    <title>CBOR Object Signing and Encryption (COSE): Countersignatures</title>
    <author fullname="J. Schaad" initials="J." surname="Schaad"/>
    <date month="December" year="2022"/>
    <abstract>
      <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. CBOR Object Signing and Encryption (COSE) defines a set of security services for CBOR. This document defines a countersignature algorithm along with the needed header parameters and CBOR tags for COSE. This document updates RFC 9052.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="96"/>
  <seriesInfo name="RFC" value="9338"/>
  <seriesInfo name="DOI" value="10.17487/RFC9338"/>
</reference>


<reference anchor="I-D.hartke-t2trg-coral-pubsub">
   <front>
      <title>Publish/Subscribe over the Constrained Application Protocol (CoAP) using the Constrained RESTful Application Language (CoRAL)</title>
      <author fullname="Klaus Hartke" initials="K." surname="Hartke">
         <organization>Ericsson</organization>
      </author>
      <date day="9" month="May" year="2020"/>
      <abstract>
	 <t>   This document explores how the Constrained RESTful Application
   Language (CoRAL) might be used for enabling publish/subscribe-style
   communication over the Constrained Application Protocol (CoAP), which
   allows CoAP nodes with long breaks in connectivity and/or up-time to
   exchange data via a publish/subscribe broker.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-hartke-t2trg-coral-pubsub-01"/>
   
</reference>


<reference anchor="I-D.ietf-ace-oscore-gm-admin">
   <front>
      <title>Admin Interface for the OSCORE Group Manager</title>
      <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
         <organization>RISE AB</organization>
      </author>
      <author fullname="Rikard Höglund" initials="R." surname="Höglund">
         <organization>RISE AB</organization>
      </author>
      <author fullname="Peter Van der Stok" initials="P." surname="Van der Stok">
         </author>
      <author fullname="Francesca Palombini" initials="F." surname="Palombini">
         <organization>Ericsson AB</organization>
      </author>
      <date day="4" month="March" year="2024"/>
      <abstract>
	 <t>   Group communication for CoAP can be secured using Group Object
   Security for Constrained RESTful Environments (Group OSCORE).  A
   Group Manager is responsible for handling the joining of new group
   members, as well as managing and distributing the group keying
   material.  This document defines a RESTful admin interface at the
   Group Manager that allows an Administrator entity to create and
   delete OSCORE groups, as well as to retrieve and update their
   configuration.  The ACE framework for Authentication and
   Authorization is used to enforce authentication and authorization of
   the Administrator at the Group Manager.  Protocol-specific transport
   profiles of ACE are used to achieve communication security, proof-of-
   possession, and server authentication.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-ace-oscore-gm-admin-11"/>
   
</reference>


<reference anchor="I-D.ietf-ace-pubsub-profile">
   <front>
      <title>Publish-Subscribe Profile for Authentication and Authorization for Constrained Environments (ACE)</title>
      <author fullname="Francesca Palombini" initials="F." surname="Palombini">
         <organization>Ericsson</organization>
      </author>
      <author fullname="Cigdem Sengul" initials="C." surname="Sengul">
         <organization>Brunel University</organization>
      </author>
      <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
         <organization>RISE AB</organization>
      </author>
      <date day="4" month="March" year="2024"/>
      <abstract>
	 <t>   This document defines an application profile of the Authentication
   and Authorization for Constrained Environments (ACE) framework, to
   enable secure group communication in the Publish-Subscribe (pub/sub)
   architecture for the Constrained Application Protocol (CoAP) [draft-
   ietf-core-coap-pubsub], where Publishers and Subscribers communicate
   through a Broker.  This profile relies on protocol-specific transport
   profiles of ACE to achieve communication security, server
   authentication, and proof-of-possession for a key owned by the Client
   and bound to an OAuth 2.0 Access Token.  This document specifies the
   provisioning and enforcement of authorization information for Clients
   to act as Publishers and/or Subscribers, as well as the provisioning
   of keying material and security parameters that Clients use for
   protecting their communications end-to-end through the Broker.

   Note to RFC Editor: Please replace &quot;[draft-ietf-core-coap-pubsub]&quot;
   with the RFC number of that document and delete this paragraph.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-ace-pubsub-profile-09"/>
   
</reference>


<reference anchor="I-D.ietf-ace-key-groupcomm">
   <front>
      <title>Key Provisioning for Group Communication using ACE</title>
      <author fullname="Francesca Palombini" initials="F." surname="Palombini">
         <organization>Ericsson AB</organization>
      </author>
      <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
         <organization>RISE AB</organization>
      </author>
      <date day="16" month="January" year="2024"/>
      <abstract>
	 <t>   This document defines how to use the Authentication and Authorization
   for Constrained Environments (ACE) framework to distribute keying
   material and configuration parameters for secure group communication.
   Candidate group members acting as Clients and authorized to join a
   group can do so by interacting with a Key Distribution Center (KDC)
   acting as Resource Server, from which they obtain the keying material
   to communicate with other group members.  While defining general
   message formats as well as the interface and operations available at
   the KDC, this document supports different approaches and protocols
   for secure group communication.  Therefore, details are delegated to
   separate application profiles of this document, as specialized
   instances that target a particular group communication approach and
   define how communications in the group are protected.  Compliance
   requirements for such application profiles are also specified.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-ace-key-groupcomm-18"/>
   
</reference>




    </references>


    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
        <name>Contributors</name>
    <contact initials="M." surname="Tiloca" fullname="Marco Tiloca">
      <organization>RISE AB</organization>
      <address>
        <email>marco.tiloca@ri.se</email>
      </address>
    </contact>
<t>Marco offered comprehensive reviews and insightful guidance on the recent iterations of this document. His contributions were particularly notable in the Security Considerations section, among others.</t>

    </section>

  </back>

<!-- ##markdown-source:
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
17fDf+IU1tN/1mKZDQb2TmpfBRp5O+/i5PGG7vH2XV336KAjp7RRHICn2Rdg
TJK6botU1Gs2N5yK8oKP663J8Wgof7dCYSHj+I/FtaZrS4SOWV5bs4NF2EBW
sLplDKOI5vMl38AE57Xq+5KyFC+V3/izU6HsIk5hJddTVJR+j9bRCyRuQGnG
1tLSqIFaJ/tt6gMAGXfoukwpA4lidlq4wz5wB5pAYAVtmDWRKK70oYXpaWgL
HBHJQpIKi7NTiIAbZBNSPiBgcIrxIPNi7Aha4FuEBb92luRliMiROErR7hxj
FGUyjvCurYxCR1z1gyAXy3C4g6x5abiLoM4dvRkVnn+3cg4cX8eWADSJJhMy
v1Wwp9ieKy2MJUXK3lGBp49/6fu+PvbY/0qzQXigoSsqJ9FcPLPCpFWdpND6
eUo3hfVgcOyKws1qAnAQpWXvukE6jrb3sBXW4ghgNAagBN+CK6Qke8MWhUXx
EM3B+4R5sK3qRbHMI9wzGHASpY25gNGHg71Bi3eBvBWcpUN0avWJ4G0IzkWP
95zWJ/KKN1l7jLXJtXVtAR7F6XLdLbnPhiwIDpNxWvYuCXvG8QxZkpSWcXLd
ypCXh9jV35EjrtIL11cL/820wr0nda3Q8fZ9JZTxH2Mo/X8V3iu1cPdr7YgN
OdE0NPW+jmlBe6U9ZrSc84OEWtJtUoxINOVyEeZtxfeXqDOkD4sCMQAVHXLE
uIgqNPuxX4QO/RCzo19i2LhlEe1J2UQHhMYWlkvZC0fC4lZGXKN1Su2ytOkS
MKDBMC5hbCzn8b1XZHqUIR0/bB0t6kZoYm1Dmc+vNfXQCSS5/1w8H4N7ygzT
LujujTXFVNKp0reHaJFYIbKC2lKNZvUIUNFRQR74JBnTG6JXSpi5nc9qKRMl
pFojubxrQrcnyqLJ8ONsJpRWXSs7VAPGLM3QuZC4sGu+zBPwhXEd2PKhvyBC
uBDos+N/c3n37y/I0lYwpphW0TUUW5EqFHmb3LoK+v8KUuzR+jJgQ/yDbfxn
SoDIjMukpIQcAGvPHq6g8DQtIdgkOfW0krCKlT097uRYJSQO5X8sQ/xjRS/L
ZGfLeTpOq5u7GObBv4zs8m/kQ2gCdqXocrC26HLwuZKJclUb6jzlc2SWyC+V
/VPkEeLpR6ja3u/xZg24zralNmGbW4Li246OXx6fH7f72j7DIw3H4oh1dE+P
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

-->

</rfc>

