<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-protocol-mapping-10" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="sdf-protocol-mapping">SDF Protocol Mapping</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-protocol-mapping-10"/>
    <author initials="R." surname="Mohan" fullname="Rohit Mohan">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <code>95134</code>
          <country>USA</country>
        </postal>
        <email>rohitmo@cisco.com</email>
      </address>
    </author>
    <author initials="B." surname="Brinckman" fullname="Bart Brinckman">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <code>95134</code>
          <country>USA</country>
        </postal>
        <email>bbrinckm@cisco.com</email>
      </address>
    </author>
    <author initials="L." surname="Corneo" fullname="Lorenzo Corneo">
      <organization>Ericsson</organization>
      <address>
        <postal>
          <street>Hirsalantie 11</street>
          <city>Jorvas</city>
          <code>1296</code>
          <country>Finland</country>
        </postal>
        <email>lorenzo.corneo@ericsson.com</email>
      </address>
    </author>
    <date year="2026" month="August" day="11"/>
    <area>Applications and Real-Time</area>
    <workgroup>A Semantic Definition Format for Data and Interactions of Things</workgroup>
    <keyword>IoT</keyword>
    <abstract>
      <?line 68?>

<t>This document defines protocol mapping extensions for the Semantic Definition
Format (SDF) to enable mapping of protocol-agnostic SDF affordances to
protocol-specific operations. The protocol mapping mechanism allows SDF models
to specify how properties, actions, and events should be accessed using a
specific protocol. This document defines protocol mappings for Bluetooth Low
Energy and Zigbee, and the mechanism can be extended to other protocols such as
HTTP and CoAP. This document also describes a method to extend SCIM with an SDF
model mapping.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol-mapping/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things Working Group mailing list (<eref target="mailto:asdf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/asdf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/asdf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-asdf/sdf-protocol-mapping"/>.</t>
    </note>
  </front>
  <middle>
    <?line 79?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Semantic Definition Format (SDF) <xref target="RFC9880"/> provides a protocol-agnostic way
to describe IoT devices and their capabilities through properties, actions, and
events (collectively called affordances). A device described by an SDF model, however, is
accessed over a specific communication protocol. To interact with such a device
based on its SDF model, there needs to be a mechanism to map the
protocol-agnostic SDF definitions to the protocol-specific operations that
access the device. Moreover, such a mechanism
needs to be extensible for enabling implementers to provide novel SDF protocol
mappings to expand the SDF ecosystem. SDF protocol mappings may target a variety
of protocols spanning from non-IP protocols commonly used in IoT environments,
such as <xref target="BLE53"/> and <xref target="Zigbee30"/>, to IP-based protocols such as HTTP
<xref target="RFC9110"/> and CoAP <xref target="RFC7252"/>. This document provides the required
mechanism by defining:</t>
      <ul spacing="normal">
        <li>
          <t>The <tt>sdfProtocolMap</tt> quality, which allows SDF models to include
protocol-specific mapping information attached to the protocol-agnostic
definitions, see <xref target="sdf-pm"/>. An <tt>sdfProtocolMap</tt> <bcp14>MAY</bcp14> be applied to an SDF
affordance, be it an <tt>sdfProperty</tt>, <tt>sdfEvent</tt> or <tt>sdfAction</tt>. The mapping
enables use cases such as application gateways or multi-protocol gateways that
translate between different IoT protocols, automated generation of
protocol-specific implementations from SDF models, and interoperability across
heterogeneous device ecosystems.</t>
        </li>
        <li>
          <t>Two SDF protocol mappings for Bluetooth and Zigbee protocols, see <xref target="ble-pm"/>
and <xref target="zigbee-pm"/> respectively.</t>
        </li>
        <li>
          <t>An SDF model extension for SCIM. While SDF provides a way to describe a class
of devices, SCIM describes a device instance. The SDF model extension for SCIM
enables the inclusion of SDF models for the class of devices a device belongs
to in the SCIM object, see <xref target="scim-sdf-extension"/>.</t>
        </li>
        <li>
          <t>An IANA registry for defining additional SDF protocol mappings (in addition to
the BLE and Zigbee provided in this document), see <xref target="iana-prot-map"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The syntax extensions to <xref target="RFC9880"/> are shown in the Concise Data Definition
Language (CDDL) <xref target="RFC8610"/>, which describes their JSON representation.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="sdf-pm">
      <name>SDF Protocol Mapping Structure</name>
      <t>This section defines the structure of an <tt>sdfProtocolMap</tt>. Because each protocol
has its own addressing model, a single SDF affordance requires a distinct
mapping per protocol. For example, BLE addresses a property as a service
characteristic, while Zigbee addresses it as an attribute in a cluster of an
endpoint.</t>
      <t>The value of the <tt>sdfProtocolMap</tt> quality is a JSON object nested inside an SDF
affordance definition (<tt>sdfProperty</tt>, <tt>sdfAction</tt>, or <tt>sdfEvent</tt>).
Protocol-specific attributes are embedded within this object, keyed by a
protocol name registered in the IANA "SDF Protocol Mapping" registry
(<xref target="iana-prot-map"/>), e.g., "ble" or "zigbee".</t>
      <figure anchor="protmap">
        <name>SDF Protocol Mapping Structure</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="400" viewBox="0 0 400 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 24,48 L 24,64" fill="none" stroke="black"/>
              <path d="M 104,80 L 104,224" fill="none" stroke="black"/>
              <path d="M 176,112 L 176,128" fill="none" stroke="black"/>
              <path d="M 176,176 L 176,192" fill="none" stroke="black"/>
              <path d="M 24,64 L 72,64" fill="none" stroke="black"/>
              <path d="M 104,96 L 152,96" fill="none" stroke="black"/>
              <path d="M 176,128 L 200,128" fill="none" stroke="black"/>
              <path d="M 104,160 L 152,160" fill="none" stroke="black"/>
              <path d="M 176,192 L 200,192" fill="none" stroke="black"/>
              <path d="M 104,224 L 152,224" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="208,192 196,186.4 196,197.6" fill="black" transform="rotate(0,200,192)"/>
              <polygon class="arrowhead" points="208,128 196,122.4 196,133.6" fill="black" transform="rotate(0,200,128)"/>
              <polygon class="arrowhead" points="160,224 148,218.4 148,229.6" fill="black" transform="rotate(0,152,224)"/>
              <polygon class="arrowhead" points="160,160 148,154.4 148,165.6" fill="black" transform="rotate(0,152,160)"/>
              <polygon class="arrowhead" points="160,96 148,90.4 148,101.6" fill="black" transform="rotate(0,152,96)"/>
              <polygon class="arrowhead" points="80,64 68,58.4 68,69.6" fill="black" transform="rotate(0,72,64)"/>
              <g class="text">
                <text x="48" y="36">sdfProperty</text>
                <text x="104" y="36">/</text>
                <text x="152" y="36">sdfAction</text>
                <text x="200" y="36">/</text>
                <text x="244" y="36">sdfEvent</text>
                <text x="140" y="68">sdfProtocolMap</text>
                <text x="176" y="100">ble</text>
                <text x="260" y="132">BLE-specific</text>
                <text x="344" y="132">mapping</text>
                <text x="188" y="164">zigbee</text>
                <text x="272" y="196">Zigbee-specific</text>
                <text x="368" y="196">mapping</text>
                <text x="176" y="228">...</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
sdfProperty / sdfAction / sdfEvent
  |
  +-----> sdfProtocolMap
            |
            +-----> ble
            |        |
            |        +--> BLE-specific mapping
            |
            +-----> zigbee
            |        |
            |        +--> Zigbee-specific mapping
            |
            +-----> ...
]]></artwork>
        </artset>
      </figure>
      <section anchor="sdf-extension-points">
        <name>SDF Extension Points</name>
        <t>The <tt>sdfProtocolMap</tt> quality is introduced into SDF affordance definitions
through the extension points defined in the formal syntax of <xref section="A" sectionFormat="of" target="RFC9880"/>. For each affordance type, an <tt>sdfProtocolMap</tt> entry is added
via the corresponding CDDL group socket. The contents of the
<tt>sdfProtocolMap</tt> object are in turn extensible through a
protocol-mapping-specific group socket.</t>
        <t>A protocol <bcp14>MAY</bcp14> choose to extend only the affordance types that are applicable to
it. For example, the BLE protocol mapping defines extensions for properties and
events but not for actions.</t>
        <section anchor="property-extension">
          <name>Property Extension</name>
          <t>The <tt>$$SDF-EXTENSION-PROPERTY</tt> group socket in the <tt>propertyqualities</tt>
rule of <xref section="A" sectionFormat="of" target="RFC9880"/> is used to add protocol mapping to
<tt>sdfProperty</tt> definitions:</t>
          <figure anchor="sdf-prop-ext">
            <name>SDF Property Extension Point for Protocol Mapping</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-EXTENSION-PROPERTY //= (
  sdfProtocolMap: {
    * $$SDF-PROPERTY-PROTOCOL-MAP
  }
)

property-protocol-map<name, props, read-props, write-props> = (
  name => props /
    {
      read: read-props,
      write: write-props
    }
)
]]></sourcecode>
          </figure>
          <t>The <tt>property-protocol-map</tt> generic (<xref target="sdf-prop-ext"/>) captures the common
structure of property protocol mappings. The <tt>name</tt> parameter is the protocol
name and <tt>props</tt> is the protocol-specific map of attributes. A protocol can
provide either:</t>
          <ul spacing="normal">
            <li>
              <t>A single mapping that applies to both read and write operations, or</t>
            </li>
            <li>
              <t>Separate <tt>read</tt> and <tt>write</tt> mappings when the protocol uses different
attributes for each direction.</t>
            </li>
          </ul>
          <t>To keep these two forms unambiguous, the protocol-specific attribute map
(the <tt>props</tt> type) <bcp14>MUST NOT</bcp14> define members named <tt>read</tt> or <tt>write</tt>.</t>
          <t>To extend <tt>$$SDF-PROPERTY-PROTOCOL-MAP</tt> for a new protocol (e.g.,
"new-protocol"), implementers <bcp14>MUST</bcp14> use the <tt>property-protocol-map</tt> generic with
the protocol name and a map type defining the protocol-specific attributes.</t>
          <t>It is to be noted that the protocol <tt>name</tt> (e.g., "new-protocol") <bcp14>MUST</bcp14> be
registered in the IANA registry defined in <xref target="iana-prot-map"/>.</t>
          <t>For example:</t>
          <figure anchor="prop-ext-example">
            <name>Example Property Protocol Map Extension</name>
            <sourcecode type="cddl"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

$$SDF-PROPERTY-PROTOCOL-MAP //= (
  property-protocol-map<"new-protocol", new-protocol-property, new-\
                            protocol-property, new-protocol-property>
)

new-protocol-property = {
  attributeA: text,
  attributeB: uint
}
]]></sourcecode>
          </figure>
          <t>An SDF model using this extension could look like:</t>
          <figure anchor="prop-ext-json-example">
            <name>Example Property Protocol Map in JSON</name>
            <sourcecode type="json"><![CDATA[{
  "sdfProperty": {
    "temperature": {
      "type": "number",
      "unit": "Cel",
      "sdfProtocolMap": {
        "new-protocol": {
          "attributeA": "temperature-service",
          "attributeB": 1
        }
      }
    }
  }
}
]]></sourcecode>
          </figure>
          <t>When a property uses different protocol attributes for read and write
operations, the mapping can be split:</t>
          <figure anchor="prop-ext-rw-json-example">
            <name>Example Property Protocol Map with Read/Write in JSON</name>
            <sourcecode type="json"><![CDATA[{
  "sdfProperty": {
    "temperature": {
      "type": "number",
      "unit": "Cel",
      "sdfProtocolMap": {
        "new-protocol": {
          "read": {
            "attributeA": "temperature-read-service",
            "attributeB": 1
          },
          "write": {
            "attributeA": "temperature-write-service",
            "attributeB": 2
          }
        }
      }
    }
  }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="action-extension">
          <name>Action Extension</name>
          <t>The <tt>$$SDF-EXTENSION-ACTION</tt> group socket in the <tt>actionqualities</tt>
rule of <xref section="A" sectionFormat="of" target="RFC9880"/> is used to add protocol mapping to
<tt>sdfAction</tt> definitions:</t>
          <figure anchor="sdf-action-ext">
            <name>SDF Action Extension Point for Protocol Mapping</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-EXTENSION-ACTION //= (
  sdfProtocolMap: {
    * $$SDF-ACTION-PROTOCOL-MAP
  }
)
]]></sourcecode>
          </figure>
          <t>Actions use a simpler structure than properties, as they do not require the
read/write distinction. To extend <tt>$$SDF-ACTION-PROTOCOL-MAP</tt> for a new
protocol, implementers <bcp14>MUST</bcp14> add a group entry that maps the protocol name to the
protocol-specific attributes. For example, an extension for a fictitious
"new-protocol" could be defined as:</t>
          <figure anchor="action-ext-example">
            <name>Example Action Protocol Map Extension</name>
            <sourcecode type="cddl"><![CDATA[$$SDF-ACTION-PROTOCOL-MAP //= (
  "new-protocol": new-protocol-action
)

new-protocol-action = {
  commandID: uint
}
]]></sourcecode>
          </figure>
          <t>An SDF model using this extension could look like:</t>
          <figure anchor="action-ext-json-example">
            <name>Example Action Protocol Map in JSON</name>
            <sourcecode type="json"><![CDATA[{
  "sdfAction": {
    "reset": {
      "sdfProtocolMap": {
        "new-protocol": {
          "commandID": 42
        }
      }
    }
  }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="event-extension">
          <name>Event Extension</name>
          <t>The <tt>$$SDF-EXTENSION-EVENT</tt> group socket in the <tt>eventqualities</tt>
rule of <xref section="A" sectionFormat="of" target="RFC9880"/> is used to add protocol mapping to
<tt>sdfEvent</tt> definitions:</t>
          <figure anchor="sdf-event-ext">
            <name>SDF Event Extension Point for Protocol Mapping</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-EXTENSION-EVENT //= (
  sdfProtocolMap: {
    * $$SDF-EVENT-PROTOCOL-MAP
  }
)
]]></sourcecode>
          </figure>
          <t>Events follow the same simple pattern as actions. To extend
<tt>$$SDF-EVENT-PROTOCOL-MAP</tt> for a new protocol, implementers add a group entry
that maps the protocol name to the protocol-specific attributes. For example, an
extension for a fictitious "new-protocol" could be defined as:</t>
          <figure anchor="event-ext-example">
            <name>Example Event Protocol Map Extension</name>
            <sourcecode type="cddl"><![CDATA[$$SDF-EVENT-PROTOCOL-MAP //= (
  "new-protocol": new-protocol-event
)

new-protocol-event = {
  eventID: uint
}
]]></sourcecode>
          </figure>
          <t>An SDF model using this extension could look like:</t>
          <figure anchor="event-ext-json-example">
            <name>Example Event Protocol Map in JSON</name>
            <sourcecode type="json"><![CDATA[{
  "sdfEvent": {
    "alert": {
      "sdfProtocolMap": {
        "new-protocol": {
          "eventID": 3
        }
      }
    }
  }
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="protocol-registration">
      <name>New Protocol Registration Procedure</name>
      <t>Protocol names used as keys in the <tt>sdfProtocolMap</tt> object (e.g., "ble",
"zigbee") <bcp14>MUST</bcp14> be registered in the IANA registry defined in
<xref target="iana-prot-map"/>.</t>
      <t>A new SDF protocol mapping <bcp14>MUST</bcp14> be defined by a specification that mandatorily
includes:</t>
      <ul spacing="normal">
        <li>
          <t>A CDDL definition that extends at least one of the group sockets
defined in this document:
<tt>$$SDF-PROPERTY-PROTOCOL-MAP</tt> (<xref target="property-extension"/>),
<tt>$$SDF-ACTION-PROTOCOL-MAP</tt> (<xref target="action-extension"/>), or
<tt>$$SDF-EVENT-PROTOCOL-MAP</tt> (<xref target="event-extension"/>).
Property mappings <bcp14>MUST</bcp14> use the <tt>property-protocol-map</tt> generic
(<xref target="property-extension"/>) to ensure a consistent structure.</t>
        </li>
        <li>
          <t>A description of the protocol-specific attributes introduced by the
CDDL extension, including their semantics and how they relate to the
underlying protocol operations.</t>
        </li>
      </ul>
    </section>
    <section anchor="registered-protocol-mappings">
      <name>Registered Protocol Mappings</name>
      <t>This section defines the protocol mappings registered by this document.</t>
      <section anchor="ble-pm">
        <name>BLE</name>
        <t>The BLE protocol mapping allows SDF models to specify how properties and events
should be accessed using Bluetooth Low Energy (BLE) protocol <xref target="BLE53"/>. The
mapping includes details such as service IDs and characteristic IDs that are
used to access the corresponding SDF affordances.</t>
        <section anchor="properties">
          <name>Properties</name>
          <t>For <tt>sdfProperty</tt>, the BLE protocol mapping structure is defined as follows:</t>
          <figure anchor="blemap1">
            <name>CDDL definition for BLE Protocol Mapping for sdfProperty</name>
            <sourcecode type="cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

$$SDF-PROPERTY-PROTOCOL-MAP //= (
  property-protocol-map<"ble", ble-property, ble-property, ble-\
                                                            property>
)

ble-property = {
  serviceID: text,
  characteristicID: text
}
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>serviceID</tt> is the BLE service ID that corresponds to the SDF property.</t>
            </li>
            <li>
              <t><tt>characteristicID</tt> is the BLE characteristic ID that corresponds to the SDF property.</t>
            </li>
          </ul>
          <t>For example, a BLE protocol mapping for a temperature property:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfProperty": {
    "temperature": {
      "sdfProtocolMap": {
        "ble": {
          "serviceID": "00001809-0000-1000-8000-00805f9b34fb",
          "characteristicID": "00002a1c-0000-1000-8000-00805f9b34fb"
        }
      }
    }
  }
}
]]></sourcecode>
          <t>For a temperature property that has different mappings for read and write operations,
here is an example of the BLE protocol mapping:</t>
          <sourcecode type="json"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "sdfProperty": {
    "temperature": {
      "sdfProtocolMap": {
        "ble": {
          "read": {
            "serviceID": "00001809-0000-1000-8000-00805f9b34fb",
            "characteristicID": "00002a1c-0000-1000-8000-\
                                                        00805f9b34fb"
          },
          "write": {
            "serviceID": "00001809-0000-1000-8000-00805f9b34fb",
            "characteristicID": "00002a51-0000-1000-8000-\
                                                        00805f9b34fb"
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
        <section anchor="events">
          <name>Events</name>
          <t>For <tt>sdfEvent</tt>s, the BLE protocol mapping structure is similar to
<tt>sdfProperties</tt>, but it <bcp14>MUST</bcp14> include additional attributes such as the <tt>type</tt> of
the event.</t>
          <figure anchor="blemap2">
            <name>BLE Protocol Mapping for sdfEvents</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-EVENT-PROTOCOL-MAP //= (
  ble: ble-event-map
)

ble-event-map = {
  type: "gatt",
  serviceID: text,
  characteristicID: text
} / { type: "advertisements" } / { type: "connection_events" }
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>type</tt> specifies the type of BLE event, such as "gatt" for GATT events,
"advertisements" for advertisement events, or "connection_events" for
connection-related events.</t>
            </li>
            <li>
              <t><tt>serviceID</tt> and <tt>characteristicID</tt> identify the GATT service and
characteristic. They <bcp14>MUST</bcp14> be present when <tt>type</tt> is <tt>"gatt"</tt>, and <bcp14>MUST</bcp14> be
absent when <tt>type</tt> is <tt>"advertisements"</tt> or <tt>"connection_events"</tt>.</t>
            </li>
          </ul>
          <t>For example, a BLE event mapping for a heart rate measurement event:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfEvent": {
    "heartRate": {
      "sdfProtocolMap": {
        "ble": {
          "type": "gatt",
          "serviceID": "0000180d-0000-1000-8000-00805f9b34fb",
          "characteristicID": "00002a37-0000-1000-8000-00805f9b34fb"
        }
      }
    }
  }
}
]]></sourcecode>
          <t>Here is an example of an <tt>isPresent</tt> event using BLE advertisements:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfEvent": {
    "isPresent": {
      "sdfProtocolMap": {
        "ble": {
          "type": "advertisements"
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="zigbee-pm">
        <name>Zigbee</name>
        <t>The Zigbee protocol mapping allows SDF models to specify how properties,
actions, and events should be accessed using the Zigbee protocol <xref target="Zigbee30"/>.
The mapping includes details such as cluster IDs and attribute IDs that are used
to access the corresponding SDF affordances.</t>
        <section anchor="properties-1">
          <name>Properties</name>
          <t>An <tt>sdfProperty</tt> is mapped to a Zigbee cluster attribute. The Zigbee property
protocol mapping structure is defined as follows:</t>
          <figure anchor="zigmap1">
            <name>CDDL definition for Zigbee Protocol Mapping for sdfProperty</name>
            <sourcecode type="cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

$$SDF-PROPERTY-PROTOCOL-MAP //= (
  property-protocol-map<"zigbee", zigbee-property, zigbee-property, \
                                                     zigbee-property>
)

zigbee-property = {
  endpointID: uint,
  clusterID: uint,
  attributeID: uint,
  attributeType: uint,
  ? profileID: uint,
  ? manufacturerCode: uint,
}
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>endpointID</tt> is the Zigbee endpoint ID that corresponds to the SDF property.</t>
            </li>
            <li>
              <t><tt>clusterID</tt> is the Zigbee cluster ID that corresponds to the SDF property.</t>
            </li>
            <li>
              <t><tt>attributeID</tt> is the Zigbee attribute ID that corresponds to the SDF property.</t>
            </li>
            <li>
              <t><tt>attributeType</tt> is the Zigbee data type of the attribute.</t>
            </li>
            <li>
              <t><tt>profileID</tt> is the Zigbee application profile ID (optional). If not provided, it defaults to the Home Automation profile (0x0104), which is the default profile in Zigbee 3.0.</t>
            </li>
            <li>
              <t><tt>manufacturerCode</tt> is the Zigbee manufacturer code of the attribute (optional).</t>
            </li>
          </ul>
          <t>For example, a Zigbee protocol mapping for a temperature property may look as
follows:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfProperty": {
    "temperature": {
      "sdfProtocolMap": {
        "zigbee": {
          "endpointID": 1,
          "clusterID": 1026,
          "attributeID": 0,
          "attributeType": 41,
          "profileID": 260
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
        <section anchor="events-1">
          <name>Events</name>
          <t>An <tt>sdfEvent</tt> is mapped to a Zigbee cluster event such as attribute reporting
or a device-initiated write to an attribute on the gateway. The Zigbee event
protocol mapping structure is defined as follows. The <tt>"attribute_reporting"</tt>
and <tt>"write_event"</tt> variants reuse the <tt>zigbee-property</tt> definition from
<xref target="zigmap1"/> to identify the underlying Zigbee attribute:</t>
          <figure anchor="zigmap-event">
            <name>CDDL definition for Zigbee Protocol Mapping for sdfEvents</name>
            <sourcecode type="cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

$$SDF-EVENT-PROTOCOL-MAP //= (
  zigbee: zigbee-event-map
)

zigbee-event-map = zigbee-attribute-reporting / zigbee-write-event \
                                            / zigbee-connection-event

zigbee-attribute-reporting = {
  type: "attribute_reporting",
  ~zigbee-property,
  ? minReportingInterval: uint,
  ? maxReportingInterval: uint,
  ? reportableChange: number,
}

zigbee-write-event = {
  type: "write_event",
  ~zigbee-property,
}

zigbee-connection-event = {
  type: "connection_events",
}
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>type</tt> is the type of Zigbee event. It <bcp14>MUST</bcp14> be one of:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>"attribute_reporting"</tt>: the event is triggered by Zigbee attribute
reporting.</t>
                </li>
                <li>
                  <t><tt>"write_event"</tt>: the event is triggered by the device writing to an
attribute on the gateway.</t>
                </li>
                <li>
                  <t><tt>"connection_events"</tt>: the event is triggered when a Zigbee end device
joins or leaves the Zigbee network.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>endpointID</tt>, <tt>clusterID</tt>, <tt>attributeID</tt>, <tt>attributeType</tt>, <tt>profileID</tt>, and
<tt>manufacturerCode</tt> have the same meaning as described for <tt>sdfProperty</tt> in
<xref target="zigmap1"/>. These fields are present when <tt>type</tt> is <tt>"attribute_reporting"</tt>
or <tt>"write_event"</tt>, and <bcp14>MUST</bcp14> be absent when <tt>type</tt> is <tt>"connection_events"</tt>.</t>
            </li>
            <li>
              <t><tt>minReportingInterval</tt> is the minimum reporting interval in seconds
(optional). It is the minimum time between issued attribute reports and
only applies when <tt>type</tt> is <tt>"attribute_reporting"</tt>.</t>
            </li>
            <li>
              <t><tt>maxReportingInterval</tt> is the maximum reporting interval in seconds
(optional). It is the maximum time between issued attribute reports and
only applies when <tt>type</tt> is <tt>"attribute_reporting"</tt>.</t>
            </li>
            <li>
              <t><tt>reportableChange</tt> is the minimum change to the attribute value that triggers
a report (optional). It only applies when <tt>type</tt> is <tt>"attribute_reporting"</tt>
and to attributes whose <tt>attributeType</tt> is one of the "analog" data types
defined by the Zigbee Cluster Library, part of <xref target="Zigbee30"/> (e.g., unsigned
and signed integers, floating point numbers), as opposed to "discrete" data types
(e.g., booleans, enumerations, bitmaps), for which reporting a minimum
change is not meaningful. The encoded value <bcp14>MUST</bcp14> use the same Zigbee data type
as the reported attribute's <tt>attributeType</tt>.</t>
            </li>
          </ul>
          <t>For example, a Zigbee event mapping for a temperature change report:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfEvent": {
    "temperatureChange": {
      "sdfProtocolMap": {
        "zigbee": {
          "type": "attribute_reporting",
          "profileID": 260,
          "endpointID": 1,
          "clusterID": 1026,
          "attributeID": 0,
          "attributeType": 41,
          "minReportingInterval": 10,
          "maxReportingInterval": 300,
          "reportableChange": 50
        }
      }
    }
  }
}
]]></sourcecode>
          <t>Here is an example of an <tt>isPresent</tt> event using Zigbee connection events:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfEvent": {
    "isPresent": {
      "sdfProtocolMap": {
        "zigbee": {
          "type": "connection_events"
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
        <section anchor="actions">
          <name>Actions</name>
          <t>An <tt>sdfAction</tt> is mapped to a Zigbee cluster command. The Zigbee protocol
mapping structure for actions is defined as follows:</t>
          <figure anchor="zigmap2">
            <name>CDDL definition for Zigbee Protocol Mapping for sdfAction</name>
            <sourcecode type="cddl"><![CDATA[
$$SDF-ACTION-PROTOCOL-MAP //= (
  zigbee: zigbee-action-map
)

zigbee-action-map = {
  endpointID: uint,
  clusterID: uint,
  commandID: uint,
  ? profileID: uint,
  ? manufacturerCode: uint,
}
]]></sourcecode>
          </figure>
          <t>Where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>endpointID</tt> is the Zigbee endpoint ID that corresponds to the SDF action.</t>
            </li>
            <li>
              <t><tt>clusterID</tt> is the Zigbee cluster ID that corresponds to the SDF action.</t>
            </li>
            <li>
              <t><tt>commandID</tt> is the Zigbee command ID that corresponds to the SDF action.</t>
            </li>
            <li>
              <t><tt>profileID</tt> is the Zigbee application profile ID (optional). If not provided, it defaults to the Home Automation profile (0x0104), which is the default profile in Zigbee 3.0.</t>
            </li>
            <li>
              <t><tt>manufacturerCode</tt> is the Zigbee manufacturer code of the command (optional).</t>
            </li>
          </ul>
          <t>For example, a Zigbee protocol mapping to set a temperature:</t>
          <sourcecode type="json"><![CDATA[{
  "sdfAction": {
    "setTemperature": {
      "sdfProtocolMap": {
        "zigbee": {
          "profileID": 260,
          "endpointID": 1,
          "clusterID": 1026,
          "commandID": 0
        }
      }
    }
  }
}
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="scim-sdf-extension">
      <name>SCIM SDF Extension</name>
      <t>While SDF provides a way to describe a device class and SCIM defines a device
instance, a method is needed to associate a mapping between an instance of a
device and its associated SDF models. To accomplish so, this document defines
a SCIM extension that <bcp14>MAY</bcp14> be used in conjunction with
<xref target="RFC9944"/> in <xref target="scim-sdf-extension-schema"/>. Implementation
of this SCIM extension is <bcp14>OPTIONAL</bcp14> and independent of the protocol mapping
functionality defined in the rest of this document. The SCIM schema attributes
used here are described in Section 7 of <xref target="RFC7643"/>.</t>
      <figure anchor="scim-sdf-extension-schema">
        <name>SCIM SDF Extension Schema</name>
        <sourcecode type="json"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

{
    "id": "urn:ietf:params:scim:schemas:extension:sdf:2.0:Device",
    "name": "SDFExtension",
    "description": "Device extension schema for SDF.",
    "attributes": [
        {
            "name": "sdf",
            "type": "string",
            "description": "SDF models supported by the device.",
            "multiValued": true,
            "required": true,
            "caseExact": true,
            "mutability": "readWrite",
            "returned": "default",
            "uniqueness": "none"
        }
    ],
    "meta": {
        "resourceType": "Schema",
        "location": "/v2/Schemas/urn:ietf:params:scim:schemas:\
                                            extension:sdf:2.0:Device"
    }
}
]]></sourcecode>
      </figure>
      <t>Here is an example SCIM device schema extension with SDF models:</t>
      <sourcecode type="json"><![CDATA[{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:Device",
        "urn:ietf:params:scim:schemas:extension:sdf:2.0:Device"
    ],
    "id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
    "displayName": "Heart Monitor",
    "active": true,
    "urn:ietf:params:scim:schemas:extension:sdf:2.0:Device": {
        "sdf": [
            "https://example.com/thermometer#/sdfThing/thermometer",
            "https://example.com/heartrate#/sdfObject/healthsensor"
        ]
    }
}
]]></sourcecode>
      <t>An SDF model <bcp14>MUST</bcp14> be referenced with the <tt>sdf</tt> keyword inside the SCIM device
schema as described in <xref target="RFC9944"/>.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="RFC9880"/> apply to this document as well.</t>
      <t>Each protocol mapped using this mechanism has its own security model.
The protocol mapping mechanism defined in this document does not provide
additional security beyond what is offered by the underlying protocols.
Implementations <bcp14>MUST</bcp14> ensure that appropriate protocol-level security
mechanisms are employed when accessing affordances through the mapped
protocol operations.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This section provides guidance to the Internet Assigned Numbers Authority
(IANA) regarding registration of values related to this document,
in accordance with <xref target="RFC8126"/>.</t>
      <section anchor="iana-prot-map">
        <name>Protocol Mapping</name>
        <t>IANA is requested to create a new registry called "SDF Protocol Mapping" in
the "Semantic Definition Format (SDF)" registry group <xref target="IANA.sdf"/>, with the following template:</t>
        <ul spacing="normal">
          <li>
            <t>Protocol map name, as per <tt>sdfProtocolMap</tt></t>
          </li>
          <li>
            <t>Protocol name</t>
          </li>
          <li>
            <t>Description</t>
          </li>
          <li>
            <t>Reference of the specification describing the protocol mapping.</t>
          </li>
        </ul>
        <t>The registration policy for this registry is "Specification Required" as
defined in Section 4.6 of <xref target="RFC8126"/>.</t>
        <t>The specification requirements for a registration request are
defined in <xref target="protocol-registration"/>.</t>
        <t>The designated expert(s) <bcp14>MUST</bcp14> verify that the protocol map name is appropriate and not likely to cause confusion with existing entries.</t>
        <t>The registrant of an existing entry may request updates to that entry, subject to the same expert review.
They should verify that updates preserve backward compatibility with deployed implementations, or if breaking changes are necessary, consider whether a new registry entry is more appropriate.</t>
        <t>The following protocol mappings are described in this document:</t>
        <table anchor="protmap-reg">
          <name>Protocol Mapping Registry</name>
          <thead>
            <tr>
              <th align="left">Protocol Map Name</th>
              <th align="left">Protocol Name</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ble</td>
              <td align="left">Bluetooth Low Energy (BLE)</td>
              <td align="left">Protocol mapping for BLE devices</td>
              <td align="left">This document, <xref target="ble-pm"/></td>
            </tr>
            <tr>
              <td align="left">zigbee</td>
              <td align="left">Zigbee</td>
              <td align="left">Protocol mapping for Zigbee devices</td>
              <td align="left">This document, <xref target="zigbee-pm"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="scim-device-schema-sdf-extension">
        <name>SCIM Device Schema SDF Extension</name>
        <t>IANA is requested to create the following extension in the "SCIM
Server-Related Schema URIs" registry, within the "System for Cross-domain
Identity Management (SCIM) Schema URIs" registry group <xref target="IANA.scim"/>, as
described in <xref target="scim-sdf-extension"/>:</t>
        <table anchor="iana-scim">
          <name>SCIM Device Schema SDF Extension</name>
          <thead>
            <tr>
              <th align="left">URN</th>
              <th align="left">Description</th>
              <th align="left">Resource Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">urn:ietf:params:scim: schemas:extension: sdf:2.0:Device</td>
              <td align="left">SDF Extension</td>
              <td align="left">Device</td>
              <td align="left">This document, <xref target="scim-sdf-extension"/></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9880">
          <front>
            <title>Semantic Definition Format (SDF) for Data and Interactions of Things</title>
            <author fullname="M. Koster" initials="M." role="editor" surname="Koster"/>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <author fullname="A. Keränen" initials="A." surname="Keränen"/>
            <date month="January" year="2026"/>
            <abstract>
              <t>The Semantic Definition Format (SDF) is a format for domain experts to use in the creation and maintenance of data and interaction models that describe Things, i.e., physical objects that are available for interaction over a network. An SDF specification describes definitions of SDF Objects/SDF Things and their associated interactions (Events, Actions, and Properties), as well as the Data types for the information exchanged in those interactions. Tools convert this format to database formats and other serializations as needed.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9880"/>
          <seriesInfo name="DOI" value="10.17487/RFC9880"/>
        </reference>
        <reference anchor="RFC9944">
          <front>
            <title>Device Schema Extensions to the System for Cross-Domain Identity Management (SCIM) Model</title>
            <author fullname="M. Shahzad" initials="M." surname="Shahzad"/>
            <author fullname="H. Iqbal" initials="H." surname="Iqbal"/>
            <author fullname="E. Lear" initials="E." surname="Lear"/>
            <date month="May" year="2026"/>
            <abstract>
              <t>The initial core schema for the System for Cross-domain Identity Management (SCIM) was designed for provisioning users. This memo specifies schema extensions that enable provisioning of devices using various underlying bootstrapping systems such as Wi-Fi Easy Connect, FIDO device onboarding vouchers, Bluetooth Low Energy (BLE) passcodes, and MAC Authenticated Bypass (MAB).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9944"/>
          <seriesInfo name="DOI" value="10.17487/RFC9944"/>
        </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="RFC7643">
          <front>
            <title>System for Cross-domain Identity Management: Core Schema</title>
            <author fullname="P. Hunt" initials="P." role="editor" surname="Hunt"/>
            <author fullname="K. Grizzle" initials="K." surname="Grizzle"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>The System for Cross-domain Identity Management (SCIM) specifications are designed to make identity management in cloud-based applications and services easier. The specification suite builds upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models. Its intent is to reduce the cost and complexity of user management operations by providing a common user schema and extension model as well as binding documents to provide patterns for exchanging this schema using HTTP.</t>
              <t>This document provides a platform-neutral schema and extension model for representing users and groups and other resource types in JSON format. This schema is intended for exchange and use with cloud service providers.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7643"/>
          <seriesInfo name="DOI" value="10.17487/RFC7643"/>
        </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="IANA.sdf" target="https://www.iana.org/assignments/sdf">
          <front>
            <title>Semantic Definition Format (SDF)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.scim" target="https://www.iana.org/assignments/scim">
          <front>
            <title>System for Cross-domain Identity Management (SCIM) Schema URIs</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="BLE53" target="https://www.bluetooth.com/specifications/specs/core-specification-5-3/">
          <front>
            <title>Bluetooth Core Specification Version 5.3</title>
            <author>
              <organization>Bluetooth SIG</organization>
            </author>
            <date year="2021" month="July" day="13"/>
          </front>
        </reference>
        <reference anchor="Zigbee30" target="https://csa-iot.org/all-solutions/zigbee/">
          <front>
            <title>Zigbee 3.0 Specification</title>
            <author>
              <organization>CSA IoT</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </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>
      </references>
    </references>
    <?line 889?>

<section anchor="cddl-definition">
      <name>CDDL Definition</name>
      <t>This appendix contains the combined CDDL definitions for the SDF protocol mappings.</t>
      <figure anchor="sdf-protocol-map-cddl">
        <name>CDDL for SDF protocol mappings</name>
        <sourcecode type="cddl" name="sdf-protocol-map.cddl" markers="true"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

$$SDF-EXTENSION-PROPERTY //= (
  sdfProtocolMap: {
    * $$SDF-PROPERTY-PROTOCOL-MAP
  }
)

property-protocol-map<name, props, read-props, write-props> = (
  name => props /
    {
      read: read-props,
      write: write-props
    }
)

$$SDF-EXTENSION-ACTION //= (
  sdfProtocolMap: {
    * $$SDF-ACTION-PROTOCOL-MAP
  }
)

$$SDF-EXTENSION-EVENT //= (
  sdfProtocolMap: {
    * $$SDF-EVENT-PROTOCOL-MAP
  }
)

$$SDF-PROPERTY-PROTOCOL-MAP //= (
  property-protocol-map<"ble", ble-property, ble-property, ble-\
                                                            property>
)

ble-property = {
  serviceID: text,
  characteristicID: text
}

$$SDF-EVENT-PROTOCOL-MAP //= (
  ble: ble-event-map
)

ble-event-map = {
  type: "gatt",
  serviceID: text,
  characteristicID: text
} / { type: "advertisements" } / { type: "connection_events" }

$$SDF-PROPERTY-PROTOCOL-MAP //= (
  property-protocol-map<"zigbee", zigbee-property, zigbee-property, \
                                                     zigbee-property>
)

zigbee-property = {
  endpointID: uint,
  clusterID: uint,
  attributeID: uint,
  attributeType: uint,
  ? profileID: uint,
  ? manufacturerCode: uint,
}

$$SDF-EVENT-PROTOCOL-MAP //= (
  zigbee: zigbee-event-map
)

zigbee-event-map = zigbee-attribute-reporting / zigbee-write-event \
                                            / zigbee-connection-event

zigbee-attribute-reporting = {
  type: "attribute_reporting",
  ~zigbee-property,
  ? minReportingInterval: uint,
  ? maxReportingInterval: uint,
  ? reportableChange: number,
}

zigbee-write-event = {
  type: "write_event",
  ~zigbee-property,
}

zigbee-connection-event = {
  type: "connection_events",
}

$$SDF-ACTION-PROTOCOL-MAP //= (
  zigbee: zigbee-action-map
)

zigbee-action-map = {
  endpointID: uint,
  clusterID: uint,
  commandID: uint,
  ? profileID: uint,
  ? manufacturerCode: uint,
}

]]></sourcecode>
      </figure>
    </section>
    <section anchor="openapi-definition">
      <name>OpenAPI Definition</name>
      <t>The following non-normative model is provided for convenience of the implementer.</t>
      <figure anchor="protocolmapmodel">
        <name>OpenAPI model</name>
        <sourcecode type="yaml" name="ProtocolMap.yaml" markers="true"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Mapping
  description: |-
    SDF Protocol Mapping. When adding a
    new protocol mapping please add a reference to the protocol map
    for all the schemas in this file.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
                                                            -mapping/

paths: {}

components:
  schemas:
## Protocol Map for a property
    ProtocolMap-Property:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:  
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/\
                                             ProtocolMap-BLE-Propmap'
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/\
                                          ProtocolMap-Zigbee-Propmap'

## Protocol Map for an event
    ProtocolMap-Event:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:  
            - $ref: './ProtocolMap-BLE.yaml#/components/schemas/\
                                               ProtocolMap-BLE-Event'
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/\
                                            ProtocolMap-Zigbee-Event'

## Protocol Map for an action
    ProtocolMap-Action:
      type: object
      properties:
        sdfProtocolMap:
          oneOf:  
            - $ref: './ProtocolMap-Zigbee.yaml#/components/schemas/\
                                           ProtocolMap-Zigbee-Action'
 
]]></sourcecode>
      </figure>
      <section anchor="protocol-map-for-ble">
        <name>Protocol map for BLE</name>
        <figure anchor="protocolmapble">
          <name>OpenAPI model for BLE</name>
          <sourcecode type="yaml" name="ProtocolMap-BLE.yaml" markers="true"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Mapping for BLE
  description: |-
    SDF Protocol Mapping for BLE devices.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
                                                            -mapping/

paths: {}

components:
  schemas:
## Protocol Mapping for BLE Property
    ProtocolMap-BLE-Propmap:
      required:
        - ble
      type: object
      properties:
        ble:
          oneOf:
            - $ref: '#/components/schemas/BLE-Property'
            - type: object
              required:
                - read
                - write
              properties:
                read:
                  $ref: '#/components/schemas/BLE-Property'
                write:
                  $ref: '#/components/schemas/BLE-Property'

## Reusable BLE property object
    BLE-Property:
      required:
        - serviceID
        - characteristicID
      type: object
      properties:
        serviceID:
          type: string
          format: uuid
          example: 00001809-0000-1000-8000-00805f9b34fb
        characteristicID:
          type: string
          format: uuid
          example: 00002a1c-0000-1000-8000-00805f9b34fb

## Defines different types of BLE events
    ProtocolMap-BLE-Event:
      required:
        - ble
      type: object
      properties:
        ble:
          oneOf:
            - type: object
              required:
                - type
                - serviceID
                - characteristicID
              properties:
                type:
                  type: string
                  example: gatt
                  enum:
                    - gatt
                serviceID:
                  type: string
                  example: 00001809-0000-1000-8000-00805f9b34fb
                characteristicID:
                  type: string
                  example: 00002a1c-0000-1000-8000-00805f9b34fb
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  example: advertisements
                  enum:
                    - advertisements
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  example: connection_events
                  enum:
                    - connection_events
]]></sourcecode>
        </figure>
      </section>
      <section anchor="protocol-map-for-zigbee">
        <name>Protocol map for Zigbee</name>
        <figure anchor="protocolmapzigbee">
          <name>OpenAPI model for Zigbee</name>
          <sourcecode type="yaml" name="ProtocolMap-Zigbee.yaml" markers="true"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Mapping for Zigbee
  description: |-
    SDF Protocol Mapping for Zigbee devices.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
                                                            -mapping/

paths: {}

components:
  schemas:
## Protocol mapping for Zigbee property
    ProtocolMap-Zigbee-Propmap:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          oneOf:
            - $ref: '#/components/schemas/Zigbee-Property'
            - type: object
              required:
                - read
                - write
              properties:
                read:
                  $ref: '#/components/schemas/Zigbee-Property'
                write:
                  $ref: '#/components/schemas/Zigbee-Property'

## Reusable Zigbee property object
    Zigbee-Property:
      required:
        - endpointID
        - clusterID
        - attributeID
        - attributeType
      type: object
      properties:
        endpointID:
          type: integer
          format: int32
          example: 1
        clusterID:
          type: integer
          format: int32
          example: 6
        attributeID:
          type: integer
          format: int32
          example: 16
        attributeType:
          type: integer
          format: int32
          example: 32
        profileID:
          type: integer
          format: int32
          example: 260
        manufacturerCode:
          type: integer
          format: int32
          example: 4174

    ProtocolMap-Zigbee-Event:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          oneOf:
            - type: object
              required:
                - type
                - endpointID
                - clusterID
                - attributeID
                - attributeType
              properties:
                type:
                  type: string
                  example: attribute_reporting
                  enum:
                    - attribute_reporting
                endpointID:
                  type: integer
                  format: int32
                  example: 1
                clusterID:
                  type: integer
                  format: int32
                  example: 6
                attributeID:
                  type: integer
                  format: int32
                  example: 16
                attributeType:
                  type: integer
                  format: int32
                  example: 41
                profileID:
                  type: integer
                  format: int32
                  example: 260
                manufacturerCode:
                  type: integer
                  format: int32
                minReportingInterval:
                  type: integer
                  format: int32
                  example: 10
                maxReportingInterval:
                  type: integer
                  format: int32
                  example: 300
                reportableChange:
                  type: number
                  example: 50
            - type: object
              required:
                - type
                - endpointID
                - clusterID
                - attributeID
                - attributeType
              properties:
                type:
                  type: string
                  example: write_event
                  enum:
                    - write_event
                endpointID:
                  type: integer
                  format: int32
                  example: 1
                clusterID:
                  type: integer
                  format: int32
                  example: 6
                attributeID:
                  type: integer
                  format: int32
                  example: 16
                attributeType:
                  type: integer
                  format: int32
                  example: 41
                profileID:
                  type: integer
                  format: int32
                  example: 260
                manufacturerCode:
                  type: integer
                  format: int32
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  example: connection_events
                  enum:
                    - connection_events

## Protocol mapping for Zigbee action
    ProtocolMap-Zigbee-Action:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          required:
            - endpointID
            - clusterID
            - commandID
          type: object
          properties:
            endpointID:
              type: integer
              format: int32
              example: 1
            clusterID:
              type: integer
              format: int32
              example: 6
            commandID:
              type: integer
              format: int32
              example: 0
            profileID:
              type: integer
              format: int32
              example: 260
            manufacturerCode:
              type: integer
              format: int32
              example: 4174
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document relies on SDF models described in <xref target="RFC9880"/>, as such, we are grateful to the authors of this document for putting their time and effort into defining SDF in depth, allowing us to make use of it.
The authors are grateful to Carsten Bormann, Jan Romann, Ari Keränen, and Eliot Lear
for their reviews and contributions to this document,
in particular Jan Romann for his help with the CDDL definitions (<xref target="sdf-protocol-map-cddl"/>)
and Eliot Lear for his contributions to <xref target="scim-sdf-extension"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
AvBsWAeV6jVTFnA0En0QK/rgCkeYWXElElUVRfy1qUAdhga1LICm7t405aJ0
eorVVFmJqR4vq7g+peOJwWf/MCliEOFco9/e32dXmhbCyc+OlFVvBp9b1b/f
1Fxb7eZqT0GvmPBeIXTJQbfPntoxsTtMl9UFn6kJr2h70ymJrUargpl+v3+q
XHNu1varN0ZU1zX9upW3P7vFLFHaNT6vmAd1TvhK17JEZKQ8SAbuPppfbj18
He5EBNiPJ+8gOEWhylonys6pXr49OcqtnWjaiqv4GhUtp2nYx/rmrWE6DcH4
HFEmDYjiO7BwY84Y38A+NutbLVsfwHdofsqllusrc5O8fHvyfiHbL/srCw6K
CDt+Aj2/5SJzi+ys9lcWj9t+L5ajWs9DVF0P4fseMEbfL/ys+czMUYWl69ZB
8TaBGrzveZ5LOBcZHEZA2pxKmWPQ3ik5zlAv1LU0sGhpGCWmZmKfrGgp0u98
JKeuEnv70TK4fh71Mx+rhNLj1DX5OR3q/Zc4Y/bLMYH1HRP4JbX0Z5xa+i+w
s1+u1WxEvaU+dCgYruEObwvN3KvKV0vb+GTDfW4aZh9llr9qYNyWwptuwoDa
j6nCBk7hEB8AifSOj0oYxQXY+Dkr83VGFQ+NcvtpF+xhQF9sidyQh1PGihEK
gpSrcLo2kAJclYSzqEub6Lv09UfM8lUfR6yLJQXCrQHTFZ9bJM51j+JHgiR/
4IY+1YfPeVWLtdc0w8o9UtXpMuHhciUuKrSMbVAcJY45XMBg1vjMyEmY6nvB
H6Lsiu12Z7u9TQW6siSMD9JB3i2PofbbAfgRWv6CLTw+z2L7WUdMecNvNQLH
tPWHWLcADG8t+97twxCBrqO/BdgvLCY5QB1gPYxypAnnPwmD68uxRRV3Mqf+
sD0HNbV0WrD+yiUrEC4YpS7ZA5ZdM4wS9nKGByR9GHWF8EbcEr+ClQUWbW+5
nYOT3kaGfrJlB7OlRrJ1xzkrtUsDg3n7YhU62GlfDynVdi0p9Yuj0tgqS3N4
oapT/VOvS3VlaFw/+rrUrowiZdG6qLKe5Zc5necnWZm1zkjNhPDQYHGUvTHx
KXwOeJiMV62ZdRoj8lazsNp4UrsqtuVtI6hYnrJ/P7H5M9SsbgbLwchfzNPi
KTpeZKQcfa4FR+eUWEFqOZ8/WlEm0fmtCGK9GNZKm6YLiS4rtBoS9F+Vdvsa
Bl5qLnOldv9q3YhsF2FN8+Keo8E/jv88qElc/BM5z+lrPaogDzvIzjS5ryxb
bBN+cK6V4w931NAmoOGMkt/l1CnnMn9lFfySeeQul/6whFileJJ5rxI2WU//
t5WHovU4UAmUtgwXf2DJrbuT1wqkB09+NHG8p1ipMyrly1UmsvcWMJP+WyZ9
RGSNqCxYTP1nVg9jbHX3k/m0rlmktvaVWo6+KzF3YmX9t4yl70PArbzsz8b6
uOQxl9kPhd5xwZe8/M8y/kqU6o5TUH2/FrMqPbQMsRqP5x6oVcOXRrAAvjK0
/gdCsH/Sn268E4j1d7Z/wbFL9/8Xxlv8kMAy8+l9YHNFC6rCtw/BtA6B/xqw
dumA8O9eyLbSqgduS1zgzlfpxWUcYOPqLsbVgXXnmrNlVHf1zKr1FfnIiehX
sKg6ylwDRuHOrvvhIqPo7SeU7LbAOtp9Zi66m2Zrobim6bOSubt3485Vu/2x
jobdskGVPZR1dLDXeb4XLNJptzoEj6jR1usW1AievVkVQHuvThBr7p79yDiz
ugV6V7C5Qgv1OsOntcpy+m8R61UG06ncrNUpa+/3WeXmAp2z/hEv6bqsk9be
+V51vmt11to7dnWZ/lum09ZDQO3+/6Mubt0oa3IMHpOG3e0qEZVEhoUEcILD
svaf+s3/oq2XamsnC+SOWnrZm79o58ca8S/aWf09rnb++Qa1bos1LNil9nZ0
Hx+W1y/BQu28SDO3bJpYxWGpLP2idVys7Jbx3zLmX6DgFiq3B/fjaxWbOrfu
fnwxXqg8HtxPWWHcpiwe3CG5qrXxYMvvS0PCTqrFfaPC3AQHhkVv8DFJL2M5
HKuQ/XWXoZMcvmqMwjiXjRt1usGc880k1cJLE7f+feX8M5/ODLkkfVNccjWN
MR7iHs1jU5WPjrjmlQIdROlsXhT2G2xUU5BK6OMRXfy2KdViwfxGVag+wjOY
swJ6C3WW45wO903Dj1TMBLuJCj7hrHsuU7UfZviZOfEa1zNJmuKbMBEnKf+7
l0Xi32X2f/+TyIRrSR7GUVqItzLMAnWcI8rUKUH1qbI0YcNLRz5qD+Zi5b5o
MMfvvNjOaAbw0YmMZ/aUa+UQycb1dW3a6c3NZuATaFqskFR/WKYd/D+R3j97
h58AAA==

-->

</rfc>
