<?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.18 (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-15" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="CoAP pubsub">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="October" day="21"/>

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

    <abstract>


<?line 59?>

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

<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 for 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>
  <t>'topic-media-type': An optional field used to indicate the media type of the topic-data resource for the topic. It represents the media type 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>
  <t>'topic-history': An optional field used to indicate how many previous resource representations the broker shall store for a topic. Encoded as an unsigned CBOR integer, it defines a counter representing the number of historical resource states the broker should retain. This enables subscribers to retrieve past states of the topic data when necessary, useful in scenarios where historical context is required (e.g., for data analytics or auditing). If this field is not present, no historical data will be stored.</t>
  <t>'initialize': An optional boolean field that, when set to <spanx style="verb">true</spanx>, allows the topic-data path to be pre-populated with an empty string or other initial value during the topic creation process. This behavior facilitates one-shot publication and topic creation, enabling CoAP clients to subscribe by default without encountering a <spanx style="verb">4.04 Not Found</spanx> error. If this field is not present, the broker behaves as usual, and the topic-data path is not initialized.</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 <xref section="5" sectionFormat="of" 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[
   Request:

   Header: GET (Code=0.01)
   Uri-Host: "kdc.example.com"
   Uri-Path: ".well-known"
   Uri-Path: "core"
   Uri-Query: "rt=core.ps"

   Response:

   Header: Content (Code=2.05)
   Content-Format: 40 (application/link-format)
   Payload:
   <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 <xref section="1.2.2" sectionFormat="of" 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[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: ".well-known"
   Uri-Path: "core"
   Uri-Query: "rt=core.ps.coll"

   Response:

   Header: Content (Code=2.05)
   Content-Format: 40 (application/link-format)
   Payload:
   </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/core-pubsub+cbor
-->

<figure><artwork><![CDATA[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: ".well-known"
   Uri-Path: "core"
   Uri-Query: "rt=core.ps.conf"

   Response:

   Header: Content (Code=2.05)
   Content-Format: 40 (application/link-format)
   Payload:
   </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 {{ection 1.2.2 of RFC6690}}, 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 rt=core.ps.data resources as shown below.</t>

<figure><artwork><![CDATA[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: "ps"
   Uri-Query: "rt=core.ps.data"

   Response:

   Header: Content (Code=2.05)
   Content-Format: 40 (application/link-format)
   Payload:
   </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[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: "ps"

   Response:

   Header: Content (Code=2.05)
   Content-Format: 40 (application/link-format)
   Payload:
   </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[
   Request:

   Header: FETCH (Code=0.05)
   Uri-Path: "ps"
   Content-Format: TBD (application/core-pubsub+cbor)
   Payload:
   {
      "resource-type": "core.ps.conf",
      "topic-type": "temperature"
   }

   Response:

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

</section>
<section anchor="topic-create"><name>Creating a Topic</name>

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

<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>To facilitate immediate subscription and allow clients to observe the topic before data has been published, the client can include the "initialize" set to "true". When supported, the broker will create the topic and pre-populate the "topic-data" field with an empty value. This allows subscribers to observe the topic without encountering a 4.04 (Not Found) error, even if no data has been published yet.</t>

<t>When "initialize" is set to "false" or omitted, the topic will only be fully created after data is published to it.</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>

<figure><artwork><![CDATA[
   Request:

   Header: POST (Code=0.02)
   Uri-Path: "ps"
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-name /         0: "living-room-sensor",
      / resource-type /      1: "core.ps.conf"
   }

   Response:

   Header: Created (Code=2.01)
   Location-Path: "ps/h9392"
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-name /         0: "living-room-sensor",
      / topic-data /         1: "ps/data/1bd0d6d",
      / resource-type /      2: "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 and 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[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: "ps"
   Uri-Path: "h9392"

   Response:

   Header: Content (Code=2.05)
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-name /         0: "living-room-sensor",
      / topic-data /         1: "ps/data/1bd0d6d",
      / resource-type /      2: "core.ps.conf",
      / topic-media-type /   3: "application/senml-cbor",
      / topic-type /         4: "temperature",
      / expiration-date /    5: "2023-04-00T23:59:59Z",
      / max-subscribers /    6: 100,
      / topic-history /      7: 10
   }
]]></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[
   Request:

   Header: FETCH (Code=0.05)
   Uri-Path: "ps"
   Uri-Path: "h9392"
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / conf-filter / 0: ["topic-data", "media-type"]
   }

   Response:

   Header: Content (Code=2.05)
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-data /        1: "ps/data/1bd0d6d",
      / topic-media-type /  3: "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 choose 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 <xref target="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 section="3.2" sectionFormat="of" target="RFC7641"/>.</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[
   Request:

   Header: PUT (Code=0.03)
   Uri-Path: "ps"
   Uri-Path: "h9392"
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-name /        0: "living-room-sensor",
      / topic-data /        1: "ps/data/1bd0d6d",
      / resource-type /     2: "core.ps.conf",
      / topic-media-type /  3: "application/senml-cbor",
      / topic-type /        4: "temperature",
      / expiration-date /   5: "2023-04-28T23:59:59Z"
   }

   Response:

   Header: Changed (Code=2.04)
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-name /        0: "living-room-sensor",
      / topic-data /        1: "ps/data/1bd0d6d",
      / resource-type /     2: "core.ps.conf",
      / topic-media-type /  3: "application/senml-cbor",
      / topic-type /        4: "temperature",
      / expiration-date /   5: "2023-04-28T23:59:59Z",
      / max-subscribers /   6: 100,
      / observer-check /    7: 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 cancellation of 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 cancellation of 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 section="3.2" sectionFormat="of" target="RFC7641"/>.</t>

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

<figure><artwork><![CDATA[
   Request:

   Header: iPATCH (Code=0.07)
   Uri-Path: "ps"
   Uri-Path: "h9392"
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-type /       4: "humidity",
      / max-subscribers /  6: 5
   }

   Response:

   Header: Changed (Code=2.04)
   Content-Format: TBD2 (application/core-pubsub+cbor)
   Payload (in CBOR diagnostic notation):
   {
      / topic-name /        0: "living-room-sensor",
      / topic-data /        1: "ps/data/1bd0d6d",
      / resource-type /     2: "core.ps.conf",
      / topic-media-type /  3: "application/senml-cbor",
      / topic-type /        4: "humidity",
      / expiration-date /   5: "2023-05-28T23:59:59Z",
      / max-subscribers /   6: 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 cancellation of 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 <xref section="3.2" sectionFormat="of" target="RFC7641"/>.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
   Request:

   Header: DELETE (Code=0.04)
   Uri-Path: "ps"
   Uri-Path: "h9392"

   Response:

   Header: Deleted (Code=2.02)
]]></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[
   Request:

   Header: PUT (Code=0.03)
   Uri-Path: "ps"
   Uri-Path: "data"
   Uri-Path: "1bd0d6d"
   Content-Format: 110
   Payload:
   {
      "n": "coap://dev1.example.com/temperature",
      "u": "Cel",
      "t": 1621452122,
      "v": 23.5
   }

   Response:

   Header: Created (Code=2.01)
]]></artwork></figure>

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

<figure><artwork><![CDATA[
   Request:

   Header: PUT (Code=0.03)
   Uri-Path: "ps"
   Uri-Path: "data"
   Uri-Path: "1bd0d6d"
   Content-Format: 110
   Payload:
   {
      "n": "coap://dev1.example.com/temperature",
      "u": "Cel",
      "t": 1621452149,
      "v": 22.5
   }

   Response:

   Header: Updated (Code=2.04)
]]></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 <xref section="4.1" sectionFormat="of" 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[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: "ps"
   Uri-Path: "data"
   Uri-Path: "1bd0d6d"
   Observe: 0

   Response:

   Header: Content (Code=2.05)
   Content-Format: 110
   Observe: 10001
   Max-Age: 15
   Payload:
   {
      "n": "urn:dev:os:32473-123456",
      "u": "Cel",
      "t": 1696341182,
      "v": 19.87
   }

   Response:

   Header: Content (Code=2.05)
   Content-Format: 110
   Observe: 10002
   Max-Age: 15
   Payload:
   {
      "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 <xref section="3.6" sectionFormat="of" 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 <xref section="3.6" sectionFormat="of" 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 changing 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 section="3.2" sectionFormat="of" target="RFC7641"/>. The topic is then set back to the half created state as per <xref target="topic-lifecycle"/>.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
   Request:

   Header: DELETE (Code=0.04)
   Uri-Path: "ps"
   Uri-Path: "data"
   Uri-Path: "1bd0d6d"

   Response:

   Header: Deleted (Code=2.02)
]]></artwork></figure>

</section>
</section>
<section anchor="read-data"><name>Read the 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[
   Request:

   Header: GET (Code=0.01)
   Uri-Path: "ps"
   Uri-Path: "data"
   Uri-Path: "1bd0d6d"

   Response:

   Header: Content (Code=2.05)
   Content-Format: 110
   Max-Age: 15
   Payload:
   {
      "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] |
| topic-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] |
| topic-history    | TBD9      | uint      | [RFC-XXXX] |
| initialize       | TBD10     | bool      | [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 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/core-pubsub+cbor" anchor="new-media-type">
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Template</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>core-pubsub+cbor</c>
      <c>application/core-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>core-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/core-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>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <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="8" month="July" 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-12"/>
   
</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="7" month="July" 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-10"/>
   
</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="30" month="April" 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-19"/>
   
</reference>




    </references>

</references>


<?line 1123?>

<section anchor="sec-document-updates" removeInRFC="true"><name>Document Updates</name>

<section anchor="version-13-to-14"><name>Version -13 to -14</name>

<t><list style="symbols">
  <t>Section restructuring for better readability.</t>
  <t>Updated topic configuration interactions.</t>
  <t>Introduced iPATCH section.</t>
  <t>Various clarifications of default values for parameters.</t>
  <t>New examples for several interactions.</t>
  <t>Updated topic discovery section.</t>
  <t>Other editorial changes</t>
</list></t>

</section>
<section anchor="version-14-to-15"><name>Version -14 to -15</name>

<t><list style="symbols">
  <t>Code bug fix https://github.com/jaimejim/aiocoap-pubsub-broker/commit/f32ce4866a81319238d6e905de439c9410cce175</t>
  <t>Added two new optional topic configuration parameters; ‘initialize,’ and ‘topic-history’.</t>
  <t>Modified all examples to conform to RFC9594.</t>
  <t>Added the explicit cancelation of ongoing subscriptions when topic configuration parameters are changed.</t>
  <t>Added editorial changes based on feedback.</t>
  <t>Clarifications on Topic Configuration creation.</t>
  <t>Other editorial changes</t>
</list></t>

</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 <contact fullname="Marco Tiloca"/>, <contact fullname="Carsten Bormann"/>, <contact fullname="Hannes Tschofenig"/>, <contact fullname="Zach Shelby"/>, <contact fullname="Mohit Sethi"/>, Peter van der Stok, Tim Kellogg, Anders Eriksson, <contact fullname="Goran Selander"/>, Mikko Majanen, <contact fullname="Olaf Bergmann"/>, <contact fullname="David Navarro"/>, Oscar Novo and Lorenzo Corneo for their valuable contributions and reviews.</t>

</section>

    <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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
sGiqlmg004kVKFgCifx/Ba/8chXgAAA=

-->

</rfc>

