<?xml version='1.0'encoding='utf-8'?>encoding='UTF-8'?> <!DOCTYPE rfc [ <!ENTITY nbsp " "> <!ENTITY zwsp "​"> <!ENTITY nbhy "‑"> <!ENTITY wj "⁠"> ]><?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.1) --><rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-24" number="9880" updates="" obsoletes="" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true"version="3"> <!-- xml2rfc v2v3 conversion 3.29.0 --> <?v3xml2rfc table_borders="light"?>version="3" xml:lang="en"> <front> <titleabbrev="SDF (Semanticabbrev="SDF: Semantic DefinitionFormat)">SemanticFormat">Semantic Definition Format (SDF) for Data and Interactions of Things</title> <seriesInfoname="Internet-Draft" value="draft-ietf-asdf-sdf-24"/>name="RFC" value="9880"/> <author initials="M." surname="Koster" fullname="Michael Koster" role="editor"> <organization>KTC Control AB</organization> <address> <postal> <street>29415 Alderpoint Road</street><city>Blocksburg, CA</city><city>Blocksburg</city><region>CA</region> <code>95514</code><country>USA</country><country>United States of America</country> </postal> <phone>+1-707-502-5136</phone> <email>michaeljohnkoster@gmail.com</email> </address> </author> <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor"> <organization ascii="Universitaet Bremen TZI">Universität Bremen TZI</organization> <address> <postal> <street>Postfach 330440</street> <city>Bremen</city> <code>D-28359</code> <country>Germany</country> </postal> <phone>+49-421-218-63921</phone> <email>cabo@tzi.org</email> </address> </author> <author initials="A." surname="Keränen" fullname="Ari Keränen"> <organization>Ericsson</organization> <address> <postal> <city>Jorvas</city> <code>02420</code> <country>Finland</country> </postal> <email>ari.keranen@ericsson.com</email> </address> </author> <date year="2025"month="July" day="27"/> <area>Applications</area> <workgroup>ASDF</workgroup> <keyword>Internet-Draft</keyword>month="October"/> <area>ART</area> <workgroup>asdf</workgroup> <!-- [rfced] Please insert any keywords (beyond those that appear in the title) for use on https://www.rfc-editor.org/search. --> <keyword>example</keyword> <abstract><?line 168?><t>The Semantic Definition Format (SDF) is concerned with Things, namely physical objects that are available for interaction over a network. SDF is a format for domain experts to use in the creation and maintenance of data and interaction models that describe Things. 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><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/"/>. </t> <t> Discussion of this document takes place on the A Semantic Definition Format for Data and Interactions of Things (ASDF) 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"/>.</t> </note></front> <middle><?line 186?><section anchor="introduction"> <name>Introduction</name> <t>The Semantic Definition Format (SDF) is concerned with Things, namely physical objects that are available for interaction over a network. SDF is a format for domain experts to use in the creation and maintenance of data and interaction models that describe Things. 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> <t>SDF is designed to be an extensible format. The present document constitutes the base specification forSDF:SDF, "base SDF" for short. In addition, SDF extensions can be defined, some of which may make use of extension points specifically defined for this in base SDF. One area for such extensions would be refinements of SDF's abstract interaction models into protocol bindings for specific ecosystems (e.g., <xref target="I-D.bormann-asdf-sdf-mapping"/>). For the use of certain other extensions, it may be necessary to indicate in the SDF document using them that a specific extension is in effect; see <xref target="information-block"/> for details of the <tt>features</tt> quality that can be used for such indications. With extension points and feature indications available, base SDF does not define a "version" concept for the SDF format itself (as opposed to version indications within SDF documents indicating their ownevolution,evolution; see <xref target="information-block"/>).</t> <section anchor="structure-of-this-document"> <name>Structure of This Document</name> <t>After introductory material and an overview (<xref target="overview"/>) over the elements of the model andoverthe different kinds of names used, <xref target="sdf-structure"/> introduces the main components of an SDF model. <xref target="names-and-namespaces"/> revisits names and structures them into namespaces. <xref target="kw-defgroups"/> discusses the inner structure of the Objects defined by SDF, the sdfObjects, in further detail. <xref target="high-level-composition"/> discusses how SDF supports composition. Conventional Sections (<xref format="title" target="iana"/>, <xref format="title" target="seccons"/>, <xref format="title" target="sec-normative-references"/>, and <xref format="title" target="sec-informative-references"/>) follow. The normative <xref target="syntax"/> defines the syntax of SDF in terms of its JSON structures, employing the Concise Data Definition Language (CDDL) <xref target="RFC8610"/>. This is followed by the informative <xref target="jso"/>, a rendition of the SDF syntax in a "JSON Schema" format as they are defined by <tt>json-schema.org</tt> (collectively called JSO). The normative <xref target="jso-inspired"/> defines certain terms ("data qualities") used at the SDF data model level that were inspired by JSO. The informative <xref target="composition-examples"/> provides a few examples for the use of composition in SDF. Finally, <xref target="earlier"/> provides some historical information that can be useful in upgrading earlier, pre-standard SDF models and implementations to SDF base.</t> </section> <section anchor="terminology-and-conventions"> <name>Terminology and Conventions</name> <t>Terms introduced in this section are capitalized when used in thissection; tosection. To maintain readability, capitalization is onlydoneused when needed where they are used in the body of this document.</t> <section numbered="false" anchor="programming-platform-terms"> <name>Programming Platform Terms</name> <t>The following definitions mention terms that are used with specific meanings in various programming platforms, but often have an independent definition for this document, which can be found further below in this section.</t> <dl> <dt>Element:</dt> <dd> <t>A generic term used here in its English sense. Exceptionally, in <xref target="jso-inspired"/>, the term is used explicitly in accordance with its meaning in the JSON ecosystem, i.e., the elements of JSON arrays.</t> </dd> <dt>Entry:</dt> <dd> <t>A key-value pair in a map. (In JSON maps, sometimes also called "member".)</t> </dd> <dt>Map:</dt> <dd> <t>A collection of entries (key-valuepairs),pairs) where there are no two entries with equivalent keys. (Also known as associative array, dictionary, or symbol table.)</t> </dd> <dt>Object:</dt> <dd> <t>An otherwise very generic term that JavaScript (and thus JSON) uses for the kind of maps that were part of the original languages from the outset. In this document, Object is used exclusively in its general English meaning or as the colloquial shorthand for sdfObject, even if the type name<tt>"object"</tt>"<tt>object</tt>" is imported with JSON-related semantics from a data definition language.</t> </dd> <dt>Property:</dt> <dd> <t>Certain environments use the term "property" for a JSON concept that JSON calls "member" and is called "entry" here, or sometimes just for the map key of these. In this document, the term Property is specifically reserved for a certain kind of Affordance, even if the map key<tt>"properties"</tt>"<tt>properties</tt>" is imported with JSON-related semantics from a data definition language.</t> </dd> <dt>Byte:</dt> <dd> <t>This document uses the term "byte" in its now-customary sense as a synonym for "octet".</t> </dd> </dl> </section> <section numbered="false" anchor="conceptual-terms"> <name>Conceptual Terms</name> <dl> <dt>Thing:</dt> <dd> <t>A physical item that is also available for interaction over a network.</t> </dd> <dt>Element:</dt> <dd> <t>A part or an aspect of something abstract; i.e., the term is used here in its usual English definition.</t> </dd> <dt>Affordance:</dt> <dd> <t>An element of an interface offered for interaction. Such an element becomes an Affordance when information is available (directly or indirectly) that indicates how it can or should be used. In the present document, the term is used for the digital (network-directed) interfaces of a Thing only; as it is a physical object as well, the Thing might also have physical affordances such as buttons, dials, and displays. The specification language offers certain ways to create sets of related Affordances and combine them into "Groupings" (see below).</t> </dd> <dt>Property:</dt> <dd> <t>An Affordance that can potentially be used to read, write, and/or observe state (current/stored information) on a Grouping.</t> </dd> <dt>Action:</dt> <dd> <t>An Affordance that can potentially be used to perform a named operation on a Grouping.</t> </dd> <dt>Event:</dt> <dd> <t>An Affordance that can potentially be used to obtain information about what happened to a Grouping.</t> </dd> </dl> </section> <section numbered="false" anchor="specification-language-terms"> <name>Specification Language Terms</name> <dl> <dt>SDF Document:</dt> <dd> <t>Container for SDF Definitions, together with data about the SDF Document itself (information block). Represented as a JSON text representing a single JSON map, which is built from nested maps.</t> </dd> <dt>SDF Model:</dt> <dd> <t>Definitions and declarations that model the digital interaction opportunities offered by one or more kinds of Things, represented by Groupings (sdfObjects and sdfThings). An SDF Model can be fully contained in a single SDF Document, or it can be built from an SDF Document that references definitions and declarations from additional SDF documents.</t> </dd> <dt>Block:</dt> <dd> <t>One or more entries in a JSON map that is part of an SDFspecification; thesespecification. These entries can be described as a Block to emphasize that theytogetherserve a specificfunction.</t>function together.</t> </dd> <dt>Group:</dt> <dd> <!-- [rfced] We are having trouble understanding how the text after the comma relates to the earlier part of the sentence. Does this mean Group in nested definitions also represents the SDF document? Please clarify. Original (full definition included for context): Group: An entry in the main JSON map that represents the SDF document, and in certain nested definitions. A group has a Class Name Keyword as its key and a map of named definition entries (Definition Group) as a value. Perhaps: Group: An entry in the main JSON map and certain nested definitions that represent the SDF document. --> <t>An entry in the main JSON map that represents the SDF document, and in certain nested definitions. A group has a Class Name Keyword as its key and a map of named definition entries (Definition Group) as a value.</t> </dd> <dt>Class Name Keyword:</dt> <dd> <t>One of <tt>sdfThing</tt>, <tt>sdfObject</tt>, <tt>sdfProperty</tt>, <tt>sdfAction</tt>, <tt>sdfEvent</tt>, or<tt>sdfData</tt>; the<tt>sdfData</tt>. The Classes for these type keywords are capitalized and prefixed with <tt>sdf</tt>.</t> </dd> <dt>Class:</dt> <dd> <t>Abstract term for the information that is contained in groups identified by a Class Name Keyword.</t> </dd> <dt>Quality:</dt> <dd> <t>A metadata item in a definition or declarationwhichthat says something about that definition or declaration. A quality is represented in SDF as an entry in a JSON map (JSON object) that serves as a definition or declaration. (The term "Quality" is used because another popular term, "Property", already has a different meaning.)</t> </dd> <dt>Definition:</dt> <dd> <t>An entry in a Definition Group. The entry creates a new semantic term for use in SDF models and associates it with a set of qualities. Unless the Class Name Keyword of the Group also makes it a Declaration (see <xref target="definitions-block"/>), a definition just defines aterm,term and it does not create a component item within the enclosing definition.</t> </dd> <dt>Declaration:</dt> <dd> <t>A definition within an enclosing definition that is intended to create a component item within that enclosing definition. Every declaration can also be used as a definition for reference elsewhere.</t> </dd> <dt>Grouping:</dt> <dd> <t>An sdfThing or sdfObject, i.e., (directly or indirectly) a description for a combination of Affordances.</t> </dd> <dt>Object, sdfObject:</dt> <dd> <t>A Grouping that contains Affordance declarations (Property, Action, and Event declarations) only. It serves as the main "atom" of reusable semantics for model construction, representing the interaction model for a Thing that is simple enough to not require a nested structure. Therefore, sdfObjects arethereforesimilar tosdfThingssdfThings, but do not allow nesting, i.e., they cannot contain other Groupings (sdfObjects or sdfThings).</t> </dd> <dt>sdfThing:</dt> <dd> <t>A Grouping that can contain nested Groupings (sdfThings and sdfObjects). Like sdfObject, it can also contain Affordance declarations (Property, Action, and Event declarations). (Note that "Thing" has a different meaning from sdfThing andthereforeis therefore not available as a colloquial shorthand of sdfThing.)</t> </dd> <dt>Augmentation Mechanism:</dt> <dd> <t>A companion document to a base SDF Model that provides additional information ("augments" the base specification). The information may be for use in a specific ecosystem or with a specific protocol ("Protocol Binding"). No specific Augmentation Mechanisms are defined in base SDF. A simple mechanism for such augmentations has been discussed as a "mapping file" <xref target="I-D.bormann-asdf-sdf-mapping"/>.</t> </dd> <dt>Protocol Binding:</dt> <dd> <t>A companion document to an SDF Model that defines how to map the abstract concepts in the model into the protocols that are in use in a specific ecosystem. The Protocol Binding might supply URL components, numeric IDs, and similar details. Protocol Bindings are one case of an Augmentation Mechanism.</t> </dd> </dl> </section> <section numbered="false" anchor="conventions"> <name>Conventions</name> <t>Regular expressions that are used in the text as a "pattern" for some string are interpreted as per <xref target="RFC9485"/>. (Note that a form of regular expressions is also used as values of the quality <tt>pattern</tt>; see <xref target="type-string"/>.)</t> <t>The term "URI" in this document always refers to "full" URIs ("<tt>URI</tt>" in Section <xref target="RFC3986" section="3" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>), never to relative URI references ("<tt>relative-ref</tt>" in Section <xref target="RFC3986" section="4.1" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>), so the term "URI" does <em>NOT</em> serve as the colloquial abbreviation of "URI-Reference" it is often used for. Therefore, the "reference resolution" process defined in Section <xref target="RFC3986" section="5" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/> is <em>NOT</em> used in this specification. Where necessary, full URIs are assembled out of substrings by simple concatenation,e.g.e.g., when CURIEs are expanded (<xreftarget="ref-global"/>),target="ref-global"/>) or when a global name is formed out of a namespace <tt>absolute-URI</tt> (Section <xref target="RFC3986" section="5" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>) and a fragment identifier part (<xref target="names-structure"/>).Note alsoAlso note that URIs are not only used to construct the SDF models, they are also the <em>subject</em> of SDF models where they are used as data in actual interactions (and could even be represented as relative references there); these two usages are entirely separate.</t> <t>The singular form is chosen as the preferred one for the keywords defined in this specification.</t><t>The<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 <xreftarget="BCP14"/> (<xref target="RFC2119"/>) (<xref target="RFC8174"/>)target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shownhere.</t> <?line -18?>here. </t> </section> </section> </section> <section anchor="overview"> <name>Overview</name> <section anchor="example-definition"> <name>Example Definition</name> <t>The overview starts with an example for the SDF definition of a simple sdfObject called "Switch" (<xref target="example1"/>).</t> <figure anchor="example1"> <name>Asimple exampleSimple Example of an SDFdocument</name>Document</name> <sourcecode type="json" name="example1.sdf.json"><![CDATA[ { "info": { "title": "Example document for SDF (Semantic Definition Format)", "version": "2019-04-24", "copyright": "Copyright 2019 Example Corp. All rights reserved.", "license": "https://example.com/license" }, "namespace": { "cap": "https://example.com/capability/cap" }, "defaultNamespace": "cap", "sdfObject": { "Switch": { "sdfProperty": { "value": { "description": "The state of the switch; false for off and true for on.", "type": "boolean" } }, "sdfAction": { "on": { "description": "Turn the switch on; equivalent to setting value to true." }, "off": { "description": "Turn the switch off; equivalent to setting value to false." }, "toggle": { "description": "Toggle the switch; equivalent to setting value to its complement." } } } } } ]]></sourcecode> </figure> <t>This is a model of a switch. The state <tt>value</tt> declared in the <tt>sdfProperty</tt> group, represented by a Boolean, will be true for "on" and will be false for "off". TheactionsActions <tt>on</tt> or <tt>off</tt> declared in the <tt>sdfAction</tt> group are redundant with setting the <tt>value</tt> and are in the example to illustrate that there are often different ways of achieving the same effect. The action <tt>toggle</tt> will invert the value of the sdfPropertyvalue,value so that 2-way switches can be created; having such action will avoid the need forfirstretrieving the current value first and then applying/setting the inverted value.</t> <t>The <tt>sdfObject</tt> group lists the affordances of Things modeled by this sdfObject. The <tt>sdfProperty</tt> group lists the property affordances described by the model; these represent various perspectives on the state of the sdfObject. Properties can have additional qualities to describe the state more precisely. Properties can be annotated to be read,writewrite, or read/write; how this is actually done by the underlying transfer protocols is not described in the SDF model but left to companion protocol bindings. Properties are often used with RESTful paradigms <xreftarget="I-D.irtf-t2trg-rest-iot"/>,target="I-D.irtf-t2trg-rest-iot"/> describing state. The <tt>sdfAction</tt> group is the mechanism to describe other interactions in terms of their names, input, and output data (no data are used in the example), as in a POST method in REST or in a remote procedure call. The example <tt>toggle</tt> is an Action that changes the state based on the current state of the Property named <tt>value</tt>. (The third type of affordance is Events, which are not described in this example.)</t> <t>In the JSON representation, the <tt>info</tt> group is an exception in that this group's map has keys taken from the SDF vocabulary. All other groups (such as<tt>namespace</tt>,<tt>namespace</tt> and <tt>sdfObject</tt>) have maps with keys that are freely defined by the model writer (<tt>Switch</tt>, <tt>value</tt>, <tt>on</tt>,etc.); theseetc.). These map keys are therefore called <em>given names</em>. The groups made up of entries with given names as keys usually use the <tt>named<></tt> production in the<xref target="syntax">formalformal syntax ofSDF</xref>.SDF <xref target="syntax"/>. Where the values of these entries are maps, these again use SDF vocabulary keys, and so on, generally alternating in further nesting. The SDF-defined vocabulary items used in the hierarchy of such groups are often, but not always, called <em>quality names</em> or <em>qualities</em>. See <xref target="member-names"/> for more information about naming in SDF.</t> </section> <section anchor="elements-of-an-sdf-model"> <name>Elements of an SDFmodel</name>Model</name> <t>The SDF language uses six predefined Class Name Keywords for modeling connectedThingsThings, which are illustrated in <xref target="fig-class-2"/> (limited rendition in the plaintext form of this document, please use typographic forms for full information).</t> <!-- [rfced] Some author comments are present in the XML. Please confirm that no updates related to these comments are outstanding. Note that the comments will be deleted prior to publication. --> <figure anchor="fig-class-2"> <name>Mainclasses usedClasses Used in SDFmodels</name>Models</name> <!-- [rfced] The SVG figure contains duplicate ids, which generates invalid HTML. We ran a utility that is supposed to create unique ids within the SVG on a copy of the file, but it didn't seem to work. xml2rfc yeilds the following warning - please review and let us know if a correction is possible. rfc9880.xml(480): Warning: Duplicate attribute id="link_sdfAction_sdfData" found after including svg from inline:b'<svg xmlns:xlink="http://www.w3' .... This can cause problems with some browsers. --> <!-- [rfced] Figure 2: The SVG includes additional information that is not present in the text. Is this as expected? For example, we see 0+, 1, and (c) in the SVG but not in the text artwork. In addition, sdfEvent and sdfAction appear in a different order. Please review. --> <artset> <artwork type="svg" align="center"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="437px" preserveAspectRatio="none" version="1.1" viewBox="0 0 542 437" width="542px"> <defs/> <g> <!--class sdfThing--> <g id="elem_sdfThing"> <rect fill="white" height="48" id="sdfThing" rx="2.5" ry="2.5" width="93" x="136.13" y="7" stroke="black" stroke-width="0.5"/> <ellipse cx="151.13" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/> <path d="M153.6031,29.1431 Q153.0221,29.4419 152.3829,29.5913 Q151.7438,29.7407 151.0382,29.7407 Q148.5314,29.7407 147.2115,28.0889 Q145.8917,26.437 145.8917,23.3159 Q145.8917,20.1865 147.2115,18.5347 Q148.5314,16.8828 151.0382,16.8828 Q151.7438,16.8828 152.3912,17.0322 Q153.0387,17.1816 153.6031,17.4805 L153.6031,20.2031 Q152.9723,19.6221 152.3788,19.3523 Q151.7853,19.0825 151.1544,19.0825 Q149.8097,19.0825 149.1249,20.1492 Q148.4401,21.2158 148.4401,23.3159 Q148.4401,25.4077 149.1249,26.4744 Q149.8097,27.541 151.1544,27.541 Q151.7853,27.541 152.3788,27.2712 Q152.9723,27.0015 153.6031,26.4204 Z " fill="black"/> <text fill="black" font-family="sans-serif" font-size="14" x="165.13" y="28.291">sdfThing</text> <line x1="137.13" x2="228.13" y1="39" y2="39" stroke="black" stroke-width="0.5"/> <line x1="137.13" x2="228.13" y1="47" y2="47" stroke="black" stroke-width="0.5"/> </g> <!--class sdfObject--> <g id="elem_sdfObject"> <rect fill="white" height="48" id="sdfObject" rx="2.5" ry="2.5" width="97" x="205.13" y="132" stroke="black" stroke-width="0.5"/> <ellipse cx="220.13" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/> <path d="M222.6031,154.1431 Q222.0221,154.4419 221.3829,154.5913 Q220.7438,154.7407 220.0382,154.7407 Q217.5314,154.7407 216.2115,153.0889 Q214.8917,151.437 214.8917,148.3159 Q214.8917,145.1865 216.2115,143.5347 Q217.5314,141.8828 220.0382,141.8828 Q220.7438,141.8828 221.3912,142.0322 Q222.0387,142.1816 222.6031,142.4805 L222.6031,145.2031 Q221.9723,144.6221 221.3788,144.3523 Q220.7853,144.0825 220.1544,144.0825 Q218.8097,144.0825 218.1249,145.1492 Q217.4401,146.2158 217.4401,148.3159 Q217.4401,150.4077 218.1249,151.4744 Q218.8097,152.541 220.1544,152.541 Q220.7853,152.541 221.3788,152.2712 Q221.9723,152.0015 222.6031,151.4204 Z " fill="black"/> <text fill="black" font-family="sans-serif" font-size="14" x="234.13" y="153.291">sdfObject</text> <line x1="206.13" x2="301.13" y1="164" y2="164" stroke="black" stroke-width="0.5"/> <line x1="206.13" x2="301.13" y1="172" y2="172" stroke="black" stroke-width="0.5"/> </g> <!--class sdfProperty--> <g id="elem_sdfProperty"> <rect fill="white" height="48" id="sdfProperty" rx="2.5" ry="2.5" width="111" x="29.13" y="257" stroke="black" stroke-width="0.5"/> <ellipse cx="44.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/> <path d="M46.6031,279.1431 Q46.0221,279.4419 45.3829,279.5913 Q44.7438,279.7407 44.0382,279.7407 Q41.5314,279.7407 40.2115,278.0889 Q38.8917,276.437 38.8917,273.3159 Q38.8917,270.1865 40.2115,268.5347 Q41.5314,266.8828 44.0382,266.8828 Q44.7438,266.8828 45.3912,267.0322 Q46.0387,267.1816 46.6031,267.4805 L46.6031,270.2031 Q45.9723,269.6221 45.3788,269.3523 Q44.7853,269.0825 44.1544,269.0825 Q42.8097,269.0825 42.1249,270.1492 Q41.4401,271.2158 41.4401,273.3159 Q41.4401,275.4077 42.1249,276.4744 Q42.8097,277.541 44.1544,277.541 Q44.7853,277.541 45.3788,277.2712 Q45.9723,277.0015 46.6031,276.4204 Z " fill="black"/> <text fill="black" font-family="sans-serif" font-size="14" x="58.13" y="278.291">sdfProperty</text> <line x1="30.13" x2="139.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/> <line x1="30.13" x2="139.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/> </g> <!--class sdfAction--> <g id="elem_sdfAction"> <rect fill="white" height="48" id="sdfAction" rx="2.5" ry="2.5" width="97" x="363.13" y="257" stroke="black" stroke-width="0.5"/> <ellipse cx="378.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/> <path d="M380.6031,279.1431 Q380.0221,279.4419 379.3829,279.5913 Q378.7438,279.7407 378.0382,279.7407 Q375.5314,279.7407 374.2115,278.0889 Q372.8917,276.437 372.8917,273.3159 Q372.8917,270.1865 374.2115,268.5347 Q375.5314,266.8828 378.0382,266.8828 Q378.7438,266.8828 379.3912,267.0322 Q380.0387,267.1816 380.6031,267.4805 L380.6031,270.2031 Q379.9723,269.6221 379.3788,269.3523 Q378.7853,269.0825 378.1544,269.0825 Q376.8097,269.0825 376.1249,270.1492 Q375.4401,271.2158 375.4401,273.3159 Q375.4401,275.4077 376.1249,276.4744 Q376.8097,277.541 378.1544,277.541 Q378.7853,277.541 379.3788,277.2712 Q379.9723,277.0015 380.6031,276.4204 Z " fill="black"/> <text fill="black" font-family="sans-serif" font-size="14" x="392.13" y="278.291">sdfAction</text> <line x1="364.13" x2="459.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/> <line x1="364.13" x2="459.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/> </g> <!--class sdfEvent--> <g id="elem_sdfEvent"> <rect fill="white" height="48" id="sdfEvent" rx="2.5" ry="2.5" width="90" x="175.63" y="257" stroke="black" stroke-width="0.5"/> <ellipse cx="190.63" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/> <path d="M193.1031,279.1431 Q192.5221,279.4419 191.8829,279.5913 Q191.2438,279.7407 190.5382,279.7407 Q188.0314,279.7407 186.7115,278.0889 Q185.3917,276.437 185.3917,273.3159 Q185.3917,270.1865 186.7115,268.5347 Q188.0314,266.8828 190.5382,266.8828 Q191.2438,266.8828 191.8912,267.0322 Q192.5387,267.1816 193.1031,267.4805 L193.1031,270.2031 Q192.4723,269.6221 191.8788,269.3523 Q191.2853,269.0825 190.6544,269.0825 Q189.3097,269.0825 188.6249,270.1492 Q187.9401,271.2158 187.9401,273.3159 Q187.9401,275.4077 188.6249,276.4744 Q189.3097,277.541 190.6544,277.541 Q191.2853,277.541 191.8788,277.2712 Q192.4723,277.0015 193.1031,276.4204 Z " fill="black"/> <text fill="black" font-family="sans-serif" font-size="14" x="204.63" y="278.291">sdfEvent</text> <line x1="176.63" x2="264.63" y1="289" y2="289" stroke="black" stroke-width="0.5"/> <line x1="176.63" x2="264.63" y1="297" y2="297" stroke="black" stroke-width="0.5"/> </g> <!--class sdfData--> <g id="elem_sdfData"> <rect fill="white" height="48" id="sdfData" rx="2.5" ry="2.5" width="84" x="236.63" y="382" stroke="black" stroke-width="0.5"/> <ellipse cx="251.63" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/> <path d="M254.1031,404.1431 Q253.5221,404.4419 252.8829,404.5913 Q252.2438,404.7407 251.5382,404.7407 Q249.0314,404.7407 247.7115,403.0889 Q246.3917,401.437 246.3917,398.3159 Q246.3917,395.1865 247.7115,393.5347 Q249.0314,391.8828 251.5382,391.8828 Q252.2438,391.8828 252.8912,392.0322 Q253.5387,392.1816 254.1031,392.4805 L254.1031,395.2031 Q253.4723,394.6221 252.8788,394.3523 Q252.2853,394.0825 251.6544,394.0825 Q250.3097,394.0825 249.6249,395.1492 Q248.9401,396.2158 248.9401,398.3159 Q248.9401,400.4077 249.6249,401.4744 Q250.3097,402.541 251.6544,402.541 Q252.2853,402.541 252.8788,402.2712 Q253.4723,402.0015 254.1031,401.4204 Z " fill="black"/> <text fill="black" font-family="sans-serif" font-size="14" x="265.63" y="403.291">sdfData</text> <line x1="237.63" x2="319.63" y1="414" y2="414" stroke="black" stroke-width="0.5"/> <line x1="237.63" x2="319.63" y1="422" y2="422" stroke="black" stroke-width="0.5"/> </g> <!--link sdfThing to sdfObject--> <g id="link_sdfThing_sdfObject"> <path d="M196.16,55.42 C207.75,75.52 224.51,104.54 236.94,126.08 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="239.41,130.35,238.3726,120.5559,236.9093,126.0203,231.445,124.557,239.41,130.35" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="222.63" y="98.5684">hasObject</text> <text fill="black" font-family="sans-serif" font-size="13" x="216.4021" y="121.1091">0+</text> </g> <!--link sdfThing to sdfThing--> <g id="link_sdfThing_sdfThing"> <path d="M229.53,19.35 C248.35,18.69 264.13,22.58 264.13,31 C264.13,38.44 251.83,42.33 236,42.69 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="231.05,42.66,240.027,46.7114,236.0499,42.6886,240.0727,38.7115,231.05,42.66" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="270.13" y="36.0684">hasThing</text> <text fill="black" font-family="sans-serif" font-size="13" x="237.0416" y="40.7969">0+</text> </g> <!--link sdfThing to sdfProperty--> <g id="link_sdfThing_sdfProperty"> <path d="M136,47.85 C99.23,63.1 50.46,90.1 27.63,132 C6,171.7 35.57,221.37 59.56,251.88 " fill="none" id="sdfThing-to-sdfProperty" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="62.41,255.43,59.8985,245.9068,59.2813,251.5298,53.6582,250.9127,62.41,255.43" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="28.63" y="161.0684">hasProperty</text> <text fill="black" font-family="sans-serif" font-size="13" x="37.9817" y="246.443">0+</text> </g> <!--link sdfThing to sdfAction--> <g id="link_sdfThing_sdfAction"> <path d="M229.41,49.61 C250.34,58.6 274.73,70.67 294.63,85 C357.14,129.99 385.89,138.55 414.63,210 C419.75,222.7 419.78,237.77 418.22,250.67 " fill="none" id="sdfThing-to-sdfAction" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="417.55,255.31,422.7961,246.9746,418.2651,250.3614,414.8783,245.8304,417.55,255.31" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="400.63" y="161.0684">hasAction</text> <text fill="black" font-family="sans-serif" font-size="13" x="398.4969" y="246.285">0+</text> </g> <!--link sdfThing to sdfEvent--> <g id="link_sdfThing_sdfEvent"> <path d="M164.06,55.38 C136.18,93.53 90.16,170.57 123.63,227 C129.23,236.43 149.15,248 169.5,257.92 " fill="none" id="sdfThing-to-sdfEvent" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="173.87,260.02,167.4833,252.5226,169.3613,257.8587,164.0252,259.7366,173.87,260.02" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="121.63" y="161.0684">hasEvent</text> <text fill="black" font-family="sans-serif" font-size="13" x="149.5914" y="254.3466">0+</text> </g> <!--link sdfObject to sdfProperty--> <g id="link_sdfObject_sdfProperty"> <path d="M204.71,177.95 C186.9,186.64 167.11,197.61 150.63,210 C134.71,221.98 119.28,238.01 107.36,251.7 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="104.12,255.48,113.0049,251.2306,107.3657,251.6767,106.9196,246.0374,104.12,255.48" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="151.63" y="223.5684">hasProperty</text> <text fill="black" font-family="sans-serif" font-size="13" x="87.5644" y="246.0715">0+</text> </g> <!--link sdfObject to sdfAction--> <g id="link_sdfObject_sdfAction"> <path d="M283.72,180.42 C310.19,201.03 348.73,231.03 376.58,252.71 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="380.46,255.73,375.8181,247.0436,376.5155,252.6573,370.9019,253.3548,380.46,255.73" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="342.63" y="223.5684">hasAction</text> <text fill="black" font-family="sans-serif" font-size="13" x="353.6739" y="246.1091">0+</text> </g> <!--link sdfObject to sdfEvent--> <g id="link_sdfObject_sdfEvent"> <path d="M247.35,180.42 C242,200.34 234.3,229.05 228.54,250.53 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="227.29,255.2,233.4711,247.5323,228.5765,250.3684,225.7404,245.4738,227.29,255.2" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="239.63" y="223.5684">hasEvent</text> <text fill="black" font-family="sans-serif" font-size="13" x="208.2004" y="246.1091">0+</text> </g> <!--link sdfAction to sdfData--> <g id="link_sdfAction_sdfData"> <path d="M380.17,305.36 C368.69,314.29 355.78,324.78 344.63,335 C330.27,348.17 315.29,363.87 303.24,377.07 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="299.96,380.69,308.97,376.7126,303.3198,376.9871,303.0453,371.3369,299.96,380.69" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="345.63" y="348.5684">hasInputData</text> <text fill="black" font-family="sans-serif" font-size="13" x="283.8382" y="371.2976">0+</text> </g> <!--link sdfAction to sdfData--> <g id="link_sdfAction_sdfData"> <path d="M429.32,305.37 C437.95,319.82 444.54,338.17 434.63,352 C410.38,385.85 363.27,398.34 327.13,402.82 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="322.48,403.35,331.8779,406.2961,327.4473,402.779,330.9644,398.3484,322.48,403.35" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="439.63" y="348.5684">hasOutputData</text> <text fill="black" font-family="sans-serif" font-size="13" x="328.522" y="399.6454">0+</text> </g> <!--link sdfEvent to sdfData--> <g id="link_sdfEvent_sdfData"> <path d="M209.17,305.42 C203.95,319.53 200.38,337.53 207.63,352 C213.04,362.77 221.78,371.92 231.32,379.42 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="235.15,382.28,230.3303,373.691,231.1431,379.2892,225.545,380.102,235.15,382.28" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="208.63" y="348.5684">hasOutputData</text> <text fill="black" font-family="sans-serif" font-size="13" x="210.5093" y="376.1409">0+</text> </g> <!--link sdfProperty to sdfData--> <g id="link_sdfProperty_sdfData"> <path d="M89.02,305.4 C93.01,320.6 100.38,339.79 113.63,352 C145.64,381.48 194.15,394.57 230.3,400.38 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/> <polygon fill="black" points="234.94,401.08,226.6344,395.7868,229.9955,400.3369,225.4455,403.698,234.94,401.08" stroke="black" stroke-width="1.0"/> <text fill="black" font-family="sans-serif" font-size="13" x="114.63" y="348.5684">isInstanceOf</text> <text fill="black" font-family="sans-serif" font-size="13" x="220.5011" y="396.8099">1</text> </g> <!--SRC=[ZP7D2i8m48Jl-nIXLoderOCWwC5JFVW2CKrjHTBItGeYlhisc_u45knjTlYIcMKnBovbvMugJNSgMQyIXNcHNU_MaDggKYDhG8bZnsDUojIvhHlRqel1OPBPlQ6gTaoobhdZqxfGq4k0gVQoR06MmmLGJ0-lvzn1asRiv9gE-l4lcNKqe316BKB7NJszcSFLhm2ITiPc1O1vQCJfVc_upBomRcoENyTsM2GskN7i-HgzzGK0]--> </g> </svg> </artwork> <artwork type="ascii-art" align="center"><![CDATA[ ,--------. |sdfThing|------. ,--------------|--------| | hasThing | |--------|<-----' | `--------' | | | | | hasObject | | \ | v | \ | ,---------. | \ | |sdfObject| | \ | |---------| | \ ,--------|---------|---------. | `---------' | | has|Property | hasAction | hasEvent v v v v ,-----------. ,---------. ,--------. |sdfProperty| |sdfAction| |sdfEvent| |-----------| |---------| |--------| |-----------| |---------| |--------| `-----------' `---------' `--------' | hasInput| |hasOutput | | Data| |Data | | v v | | ,-------. | | isInst |sdfData| hasOutp | `----------->|-------|<----------' anceOf |-------| utData `-------' ]]></artwork> </artset> </figure> <t>The six main Class Name Keywords are discussed below.</t> <section anchor="sdfobject"> <name>sdfObject</name> <t>sdfObjects, the items listed in an <tt>sdfObject</tt> definition group, are the main "atom" of reusable semantics for model construction. The concept aligns in scope with common definition items from many IoT modeling systems,for examplee.g., ZigBee Clusters <xref target="ZCL"/>, OMA SpecWorks LwM2M Objects <xref target="OMA"/>, OCF Resource Types <xref target="OCF"/>, and W3C Web of Things <xref target="WoT"/>.</t> <t>An sdfObject definition contains a set of <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt> definitions that describe the interaction affordances associated with some scope of functionality.</t> <t>For the granularity of definition, sdfObject definitions are meant to be kept narrow enough in scope to enable broad reuse and interoperability. For example, defining a light bulb using separate sdfObject definitions for on/off control, dimming, and color control affordances will enable interoperable functionality to be configured for diverse product types. An sdfObject definition for a common on/off control may be used to control many different kinds of Things that require on/off control.</t> <t>The presence of one or both of the optional qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>" defines the sdfObject as an array, i.e., all the affordances defined for the sdfObject exist a number of times, indexed by a number constrained to be between <tt>minItems</tt> and <tt>maxItems</tt>, inclusive, if given. <!-- [rfced] Please review whether any of the notes in this document should be in the <aside> element. It is defined as "a container for content that is semantically less important or tangential to the content that surrounds it" (https://authors.ietf.org/en/rfcxml-vocabulary#aside). --> (Note: Setting "<tt>minItems</tt>" to zero and leaving out "<tt>maxItems</tt>" puts the minimum constraints on that array.)</t> </section> <section anchor="sdfproperty"> <name>sdfProperty</name> <t><tt>sdfProperty</tt> is used to model elements of state within Things modeled by the enclosing grouping.</t> <t>A named definition entry in an sdfProperty may be associated with some protocol affordance to enable the application to obtain the state variable and, optionally, modify the state variable. Additionally, some protocols provide for in-time reporting of state changes. (These three aspects are described by the qualities <tt>readable</tt>, <tt>writable</tt>, and <tt>observable</tt> defined for an sdfProperty.)</t> <t>Definitions in <tt>sdfProperty</tt> groups look like the definitions in <tt>sdfData</tt> groups. However, they actuallyalsodeclare that a Property with the given qualities potentially is present in the containing sdfObject.</t> <t>For definitions in <tt>sdfProperty</tt> and <tt>sdfData</tt>, SDF provides qualities that can constrain the structure and values of data allowed in the interactions modeled by them. It also provides qualities that associate semantics tothesethis data, such as engineering units and unit scaling information.</t> <t>For the data definition within <tt>sdfProperty</tt> or <tt>sdfData</tt>, SDF borrows some vocabulary proposed forthedrafts 4 <xreftarget="JSO4"/>target="I-D.zyp-json-schema"/> <xreftarget="JSO4V"/>target="I-D.fge-json-schema-validation"/> and 7 <xreftarget="JSO7"/>target="I-D.handrews-json-schema"/> <xreftarget="JSO7V"/>target="I-D.handrews-json-schema-validation"/> of the json-schema.org "JSON Schema" format (collectively called JSO here), enhanced by qualities that are specific to SDF. Details about the JSO-inspired vocabulary are in <xref target="jso-inspired"/>. For base SDF, data are constrained to be of simple types (number, string, Boolean), JSON maps composed of named data, and arrays of these types. Syntax extension points are provided that can be used to provide richer types in a future extension of this specification (possibly more of which can be borrowed from json-schema.org).</t> <t>Note that sdfProperty definitions (and sdfData definitions in general) are not intended to constrain the formats of data used for communication over network interfaces. Where needed, data definitions for payloads of protocol messages are expected to be part of the protocol binding.</t> </section> <section anchor="sdfaction-overview"> <name>sdfAction</name> <t>The <tt>sdfAction</tt> group contains declarations of Actions, which model affordances that, when triggered, have an effect that can go beyond just reading, updating, or observing Thing state. Actions often result in some outward physical effect (which, itself, cannot be modeled in SDF). From a programmer's perspective, they might be considered to be roughly analogous to method calls.</t> <t>Actions may have dataparameters:parameters; these are each modeled as a single item of input data and outputdata, each.data. Where multiple parameters need to be modeled, an<tt>"object"</tt>"<tt>object</tt>" type can be used to combine these parameters into one; for anexampleexample, see <xref target="example-obj-type"/> in <xref target="type-object"/>.</t> <t>Actions may be long-running, that is to say that the effects may not take place immediately as would be expected for an update to an sdfProperty; the effects may play out over time and emit action results. Actions may also not always complete and may result in application errors, such as an item blocking the closing of an automatic door.</t> <t>One idiom for giving an action initiator status and control about the ongoing action is to provide a URI for an ephemeral "action resource" in the sdfAction output data, allowing the action to deliver immediate feedback (including errors that prevent the action from starting) and the action initiator to use the action resource for further observation or modification of the ongoing action (including canceling it). Base SDF does not provide any tailored support for describing such action resources; an extension for modeling links in more detail (for instance, <xref target="I-D.bormann-asdf-sdftype-link"/>) may be all that is needed to fully enable modeling them.</t> <t>Actions may have (or lack) the characteristics of idempotence and side-effect safety (see Section <xref target="RFC9110" section="9.2" sectionFormat="bare"/> of RFC 9110 <xref target="STD97"/> for more on these terms).</t> <t>Base SDF only provides data constraint modeling and semantics for the input and output data of definitions in <tt>sdfAction</tt> groups. Again, data definitions for payloads of protocol messages, and detailed protocol settings for invoking the action, are expected to be part of the protocol binding.</t> </section> <section anchor="sdfevent-overview"> <name>sdfEvent</name> <t>The <tt>sdfEvent</tt> group contains declarations of Events, which model affordances that inform about "happenings" associated with a Thing modeled by the enclosing sdfObject; these may result in a signal being stored or emitted as a result.</t> <t>Note that there is a trivial overlap with sdfProperty state changes, which may also be defined aseventsEvents but are not generally required to be defined as such. However, Events may exhibit certain ordering, consistency, and reliability requirements that are expected to be supported in various implementations of sdfEvent that do distinguish sdfEvent from sdfProperty. For instance, while a state change may simply be superseded by another state change, someeventsEvents are "precious" and need to be preserved even if furthereventsEvents follow.</t> <t>Base SDF only provides data constraint modeling and semantics for the output data of Event affordances. Again, data definitions for payloads of protocol messages, and detailed protocol settings for soliciting the event, are expected to be part of the protocol binding.</t> </section> <section anchor="sdfdata"> <name>sdfData</name> <t>Definitions in <tt>sdfData</tt> groups do not themselves specify affordances. These definitions are provided separately from those in sdfProperty groups to enable common modeling patterns, data constraints, and semantic anchor concepts to be factored out for data items that make up sdfProperty items and serve as input and output data for sdfAction and sdfEvent items. The data types defined in sdfData definitions only spring to life by being referenced in one of these contexts (directly or indirectly via some other sdfData definitions).</t> <t>It is a common use case for such a data definition to be shared between an sdfProperty item and input or output parameters of an sdfAction or output data provided by an sdfEvent. sdfData definitions also enable factoring out extended application datatypestypes, such as mode and machine state enumerations to be reused across multiple definitions that have similar basic characteristics and requirements.</t> </section> <section anchor="sdfthing"> <name>sdfThing</name> <t>Back at the top level, the <tt>sdfThing</tt> group enables definition of models for complex devices that will use one or more sdfObject definitions. Like sdfObject, sdfThing groups allow for the inclusion of interaction affordances, sdfData, as well as "<tt>minItems</tt>" and "<tt>maxItems</tt>" qualities. Therefore, they can be seen as a superset of sdfObject groups, additionally allowing for composition.</t> <t>As a result, an sdfThing directly or indirectly contains a set of sdfProperty, sdfAction, and sdfEvent definitions that describe the interaction affordances associated with some scope of functionality.</t> <t>A definition in an sdfThing group can refine the metadata of the definitions it is composed of: other definitions in sdfThing groups or definitions in sdfObject groups.</t> </section> </section> <section anchor="member-names"> <name>Membernames:Names: Given Names and Quality Names</name> <t>SDF documents are JSON maps that mostly employ JSON maps as member values, which in turn mostly employ JSON maps as their member values, and so on. This nested structure of JSON maps creates a tree, where the edges are the member names (map keys) used in these JSON maps. (In certain cases, where member names are not needed, JSON arrays may be interspersed in this tree.)</t> <section anchor="given-names-and-quality-names"> <name>Given Names and Quality Names</name> <t>For any particular JSON map in an SDF document, the set of member names that are used iseither of:</t>either:</t> <ul spacing="normal"> <li> <t>A set of "<em>Quality Names</em>", where the entries in the map are Qualities. Quality Names are defined by the present specification and its extensions, together with specific semantics to be associated with the member value given with a certain Quality Name.</t> </li> <li> <t>A set of "<em>Given Names</em>", where the entries in the map are separate entities (definitions, declarations, etc.) that each have names that are chosen by the SDF document author in order that these names can be employed by a user of that model.</t> </li> </ul> <t>In a path from the root of the tree to any leaf, Quality Names and Given Names roughly alternate (with the information block, <xref target="information-block"/>, as a prominent exception).</t> <t>The meaning of the JSON map that is the member value associated with a Given Name is derived from the Quality Name that was used as the member name associated to the parent. In the CDDL grammar given in <xref target="syntax"/>, JSON maps with member names that are Given Names are defined using the CDDL generic rule reference <tt>named<membervalues></tt>, where <tt>membervalues</tt> is in turn the structure of the member values of the JSON map, i.e., the value of the member named by the Given Name. As quality-named maps and given-named maps roughly alternate in a path down the tree, <tt>membervalues</tt> is usually a map built from Quality Names as keys.</t> </section> <section anchor="hierarchical-names"> <name>Hierarchical Names</name> <!-- [rfced] May we rephrase "itself" to "which is" for improved readability? Original: From the outside of a specification, Given Names are usually used as part of a hierarchical name that looks like a JSON pointer [RFC6901], itself generally rooted in (used as the fragment identifier in) an outer namespace that looks like an https:// URL (see Section 4). Perhaps: From the outside of a specification, Given Names are usually used as part of a hierarchical name that looks like a JSON pointer [RFC6901], which is generally rooted in (used as the fragment identifier in) an outer namespace that looks like an https:// URL (see Section 4). --> <t>From the outside of a specification, Given Names are usually used as part of a hierarchical name that looks like a JSON pointer <xref target="RFC6901"/>, itself generally rooted in (used as the fragment identifier in) an outer namespace that looks like an <tt>https://</tt> URL (see <xref target="names-and-namespaces"/>).</t> <t>As Quality Names and Given Names roughly alternate in a path into the model, the JSON pointer part of the hierarchical name also alternates between Quality Names and Given Names.</t> <t>Note that the actual Given Names may need to be encoded when specified via the JSON pointer fragment identifiersyntax, and that theresyntax. There are two layers of such encoding: tilde encoding of <tt>~</tt> and <tt>/</tt> as per <xref section="3" sectionFormat="of" target="RFC6901"/>,and thenas well as percent encoding of the tilde-encoded name into a valid URI fragment as per <xref section="6" sectionFormat="of" target="RFC6901"/>. For example, when a model is using the Given Name</t> <artwork><![CDATA[ warning/danger alarm ]]></artwork> <t>(with an embedded slash and a space) for an sdfObject, that sdfObject may need to be referenced as</t> <artwork><![CDATA[ #/sdfObject/warning~1danger%20alarm ]]></artwork> <t>To sidestep potential interoperability problems, it is probably wise to avoid characters in Given Names that need such encoding (Quality Names are already defined in such a way that they never do).</t> </section> <section anchor="gnqn"> <name>Extensibility of Given Names and Quality Names</name> <t>In SDF, both Quality Names and Given Names are <em>extension points</em>. This is more obvious for QualityNames:Names. Extending SDF is mostly done by defining additional qualities. To enable non-conflicting third party extensions to SDF, qualified names (names with an embedded colon) can be used as Quality Names.</t> <t>A nonqualified Quality Name is composed of ASCII letters, digits, and <tt>$</tt> signs, starting with a lower case letter or a <tt>$</tt> sign (i.e., using a pattern of"<tt>[a-z$][A-Za-z$0-9]*</tt>")."_<tt>[a-z$][A-Za-z$0-9]*</tt>"). Names with <tt>$</tt> signs are intended to be used for functions separate from most other names; for instance,in this specification<tt>$comment</tt> is used for the comment quality in this specification (the presence or absence of a <tt>$comment</tt> quality does not change the meaning of the SDF model). Names that are composed of multiple English words can use the "lowerCamelCase" convention <xref target="CamelCase"/> for indicating the word boundaries; no other use is intended for upper case letters in quality names.</t> <t>A qualified Quality Name is composed of a Quality Name Prefix, a <tt>:</tt> (colon) character, and a nonqualified Quality Name. Quality Name Prefixes are registered in the "Quality Name Prefixes" registry in the "Semantic Definition Format (SDF)" registry group (<xref target="qnp"/>). They are composed of lower case ASCII letters and digits, starting with alower caselowercase ASCII letter (i.e., using a pattern of"<tt>[a-z][a-z0-9]*</tt>").</t>"_<tt>[a-z][a-z0-9]*</tt>").</t> <t>Given Names are not restricted by the formal SDF syntax. To enable non-surprising name translations in tools, combinations of ASCII alphanumeric characters and <tt>-</tt> (ASCII hyphen/minus) are preferred, typically employing kebab-case for names constructed out of multiple words <xref target="KebabCase"/>. ASCII hyphen/minus can then unambiguously be translated to an ASCII <tt>_</tt> underscore character and back depending on the programming environment. Some styles also allow a dot ("<tt>.</tt>") in given names. Given Names are often sufficiently self-explanatory that they can be used in place of the <tt>label</tt> quality if that is not given. In turn, if a given name turns out too complicated, a more elaborate <tt>label</tt> can be given and the given name kept simple. As given names are "programmers' names", base SDF does not address internationalization of given names. (More likely qualities to receive localizable equivalents by exercising the quality name extension point are <tt>label</tt> and <tt>description</tt>).</t> <t>Further, to enable Given Names to have a more powerful role in building global hierarchical names, an extension is planned that makes use of qualified names for Given Names. So, until that extension is defined, Given Names with one or more embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF document.</t> <t>All names in SDF are case-sensitive.</t> </section> </section> </section> <section anchor="sdf-structure"> <name>SDFstructure</name>Structure</name> <t>SDF definitions are contained in SDFdocuments,documents together with data about the SDF document itself (information block). Definitions and declarations from additional SDF documents can be referenced; together with the definitions and declarations in the referencing SDFdocumentdocument, they build the SDF model expressed by that SDF document.</t> <t>Each SDF document is represented as a single JSON map. This map can be thought of as having three blocks: the information block, the namespaces block, and the definitions block. These blocks contain zero or more JSON name/value pairs, the names of which are quality names and the values of which mostly are (nested) maps (the exception defined in SDF base is the defaultNamespace quality, the value of which is a text string). An empty nested map of this kind is equivalent to not having the quality included at all.</t> <section anchor="information-block"> <name>Informationblock</name>Block</name> <t>The information block contains generic metadata for the SDF document itself and all included definitions. To enable tool integration, the information block is optional in the grammar of SDF; most processes for working with SDF documents will have policies that only SDF documents with an info block can be processed. It is therefore <bcp14>RECOMMENDED</bcp14> that SDF validator tools emit a warning when no information block is found.</t> <!-- [rfced] May we rephrase the text below as follows to improve readability and specify "it" in the second sentence? Original: The keyword (map key) that defines an information block is "info". Its value is a JSON map in turn, with a set of entries that represent qualities that apply to the included definition. Perhaps: The keyword (map key) that defines an information block as "info". In turn, the keyword's value is a JSON map with a set of entries that represent qualities that apply to the included definition. --> <t>The keyword (map key) that defines an information block is "info". Its value is a JSON map in turn, with a set of entries that represent qualities that apply to the included definition.</t> <t>Qualities of this map are shown in <xref target="infoblockqual"/>. None of these qualities are required or have default values that are assumed if the quality is absent.</t> <table anchor="infoblockqual"> <name>Qualities of the Information Block</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">title</td> <td align="left">string</td> <td align="left">A short summary to be displayed in search results, etc.</td> </tr> <tr> <td align="left">description</td> <td align="left">string</td> <td align="left">Long-form text description (no constraints)</td> </tr> <tr> <td align="left">version</td> <td align="left">string</td> <td align="left">The incremental version of the definition</td> </tr> <tr> <td align="left">modified</td> <td align="left">string</td> <td align="left">Time of the latest modification</td> </tr> <tr> <td align="left">copyright</td> <td align="left">string</td> <td align="left">Link to text or embedded text containing a copyright notice</td> </tr> <tr> <td align="left">license</td> <td align="left">string</td> <td align="left">Link to text or embedded text containing license terms</td> </tr> <tr> <td align="left">features</td> <td align="left">array of strings</td> <td align="left">List of extension features used</td> </tr> <tr> <td align="left">$comment</td> <td align="left">string</td> <td align="left">Source code comments only, no semantics</td> </tr> </tbody> </table> <t>The version quality is used to indicate version information about the set of definitions in the SDF document. The version is <bcp14>RECOMMENDED</bcp14> to be lexicographically increasing over the life of amodel:model; a newer model always has a version string that string-compares higher than all previous versions. This is easily achieved by following the convention to start the version withana <tt>date-time</tt> as defined in <xref target="RFC3339"/><tt>date-time</tt>or, if new versions are generated less frequently than once a day, just the <tt>full-date</tt> (i.e., YYYY-MM-DD); in many cases, that will be all that is needed (see <xref target="example1"/> for an example). <!-- [rfced] We suggest rephrasing the following sentence (i.e., adjusting the placement of "using"). Does the following suggestion retain the sentence's original meaning? Original: This specification does not give a strict definition for the format of the version string but each using system or organization should define internal structure and semantics to the level needed for their use. Perhaps: This specification does not give a strict definition for the format of the version string, but each system or organization using the version string should define internal structure and semantics to the level needed for their use. --> This specification does not give a strict definition for the format of the version string but each using system or organization should define internal structure and semantics to the level needed for their use. If no further details are provided, a <tt>date-time</tt> or <tt>full-date</tt> in this field can be assumed to indicate the latest update time of the definitions in the SDF document.</t> <t>The modified quality can be used with a value using <tt>date-time</tt> as defined in <xref target="RFC3339"/><tt>date-time</tt>(with <tt>Z</tt> for time-zone) or <tt>full-date</tt> format to express time of the latest revision of the definitions.</t> <t>The license string is preferably either a URI that points to a web page with an unambiguous definition of thelicense,license or an <xref target="SPDX"/> license identifier. (As an example, for models to be handled by the One Data Model liaison group, this license identifier will typically be "BSD-3-Clause".)</t> <t>The <tt>features</tt> quality can be used to list names of critical (i.e., cannot be safely ignored) SDF extension features that need to be understood for the definitions to be properly processed. Extension feature names will be specified in extension documents. They can either be registered (see <xref target="fn"/> for specifics, which make sure that a registered feature name does not contain a colon) or be a URI (which always contain a colon). Note that SDF processors are not expected to, and normally <bcp14>SHOULD NOT</bcp14>, dereference URIs used as feature names; any representation retrievable under such a URI could be useful to humans, though. (See <xref target="I-D.bormann-t2trg-deref-id"/> for a more extensive discussion of dereferenceable identifiers).</t> </section> <section anchor="namespaces-block"> <name>Namespacesblock</name>Block</name> <t>The namespaces block contains the <tt>namespace</tt> map and the <tt>defaultNamespace</tt> setting; none of these qualities are required or have default values that are assumed if the quality is absent.</t> <t>The namespace map is a map from short names for URIs to the namespace URIs themselves.</t> <t>The defaultNamespace setting selects one of the entries in the namespace map by giving its short name. The associated URI (value of this entry) becomes the default namespace for the SDF document.</t> <table anchor="nssec"> <name>Namespaces Block</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">namespace</td> <td align="left">map</td> <td align="left">Defines short names mapped to namespace URIs, to be used as identifier prefixes</td> </tr> <tr> <td align="left">defaultNamespace</td> <td align="left">string</td> <td align="left">Identifies one of the prefixes in the namespace map to be used as a default in resolving identifiers</td> </tr> </tbody> </table> <t>The following example declares a set of namespaces and defines <tt>cap</tt> as the default namespace. By convention, the values in the namespace map contain full URIs without a fragmentidentifier,identifier and the fragment identifier is then added, if needed, where the namespace entry is used.</t> <sourcecode type="json"><![CDATA[ "namespace": { "cap": "https://example.com/capability/cap", "zcl": "https://zcl.example.com/sdf" }, "defaultNamespace": "cap" ]]></sourcecode> <t>Multiple SDF documents can contribute to the same namespace by using the same namespace URI for the default namespace across the documents.</t> <t>If no defaultNamespace setting is given, the SDF document does not contribute to a global namespace (all definitions remain local to the model and are not accessible for re-use by other models). As the defaultNamespace is set by supplying a namespace short name, its presence requires a namespace map that contains a mapping for that namespace short name.</t> <t>If no namespace map is given, no short names for namespace URIs are setup,up and no defaultNamespace can be given.</t> </section> <section anchor="definitions-block"> <name>Definitionsblock</name>Block</name> <t>The Definitions block contains one or more groups, each identified by a Class Name Keyword such as <tt>sdfObject</tt> or <tt>sdfProperty</tt>. There can only be one group per keyword at this level; putting all the individual definitions in the group under that keyword is just a shortcut for identifying the class name keyword that applies to each ofthem,them without repeating it for each definition.</t> <t>The value of each group is a JSON map, the keys of which serve for naming the individual definitions in this group, and the corresponding values provide a set of qualities (name-value pairs) for the individual definition. (In short, these map entries are also termed "named sets of qualities".)</t> <t>Each group may contain zero or more definitions. Each identifier defined creates a new type and term in the target namespace. Declarations have a scope of the definition block they are directly contained in.</t><t>A<t>In turn, a definition mayin turncontain other definitions. Each definition is a named set of qualities, i.e., it consists of the newly defined identifier and a set of key-value pairs that represent the defined qualities and contained definitions.</t> <t>An example for an sdfObject definition is given in <xref target="exobject"/>:</t> <figure anchor="exobject"> <name>Example sdfObjectdefinition</name>Definition</name> <sourcecode type="json"><![CDATA[ "sdfObject": { "foo": { "sdfProperty": { "bar": { "type": "boolean" } } } } ]]></sourcecode> </figure> <t>This example defines an sdfObject "foo" that is defined in the default namespace (full address: <tt>#/sdfObject/foo</tt>), containing a property that can be addressed as <tt>#/sdfObject/foo/sdfProperty/bar</tt>, with data of type boolean.</t> <t>Often, definitions are alsodeclarations: thedeclarations. The definition of the entry "bar" in the property "foo" means that data corresponding to the "foo" property in a property interaction offered by Thing can have zero or one components modeled by "bar". Entries within <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt> that are in turn within <tt>sdfObject</tt> or <tt>sdfThing</tt> entries, are also declarations; entries within <tt>sdfData</tt> are not. Similarly, <tt>sdfObject</tt> or <tt>sdfThing</tt> entries within an sdfThing definition specify that the interactions offered by a Thing modeled by this sdfThing include the interactions modeled by the nested <tt>sdfObject</tt> or <tt>sdfThing</tt>.</t> </section> <section anchor="top-level-affordances-and-sdfdata"><name>Top-level<name>Top-Level Affordances and sdfData</name> <t>Besides their placement within an sdfObject or sdfThing, affordances (i.e., <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>) as well as <tt>sdfData</tt> can also be placed at the top level of an SDF document. Since they are not associated with an sdfObject or sdfThing, these kinds of definitions are intended to bere-usedreused via the <tt>sdfRef</tt> mechanism (see <xref target="sdfref"/>).</t> </section> </section> <section anchor="names-and-namespaces"> <name>Names andnamespaces</name>Namespaces</name> <t>SDF documents may contribute to a globalnamespace,namespace and may reference elements from that global namespace. (An SDF document that does not set a defaultNamespace does not contribute to a global namespace.)</t> <section anchor="names-structure"> <name>Structure</name> <t>Global names look exactly like <tt>https://</tt> URIs with attached fragment identifiers.</t> <t>There is no intention to require that these URIs can be dereferenced. (However, as future extensions of SDF might find a use for dereferencing global names, the URI should be chosen in such a way that this may become possible in the future. See also <xref target="I-D.bormann-t2trg-deref-id"/> for a discussion of dereferenceable identifiers.)</t> <t>The absolute-URI of a global name should be a URI as per Section <xref target="RFC3986" section="3" sectionFormat="bare"/> of RFC 3986 <xreftarget="STD66"/>,target="STD66"/> with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="STD66"/>). For base SDF, the query part should not be used (it might be used in extensions).</t> <t>The fragment identifier is constructed as per <xref section="6" sectionFormat="of" target="RFC6901"/>.</t> </section> <section anchor="contributing-global-names"> <name>Contributingglobal names</name>Global Names</name> <t>The fragment identifier part of a global name defined in an SDF document is constructed from a JSON pointer that selects the element defined for this name in the SDF document. The absolute-URI part is a copy of the default namespace.</t> <t>As a result, the default namespace is always the target namespace for a name for which a definition is contributed. In order to emphasize that name definitions are contributed to the default namespace, this namespace is also termed the "target namespace" of the SDF document.</t> <t>For instance, in <xref target="example1"/>, definitions for the following global names are contributed:</t> <ul spacing="normal"> <li> <t>https://example.com/capability/cap#/sdfObject/Switch</t> </li> <li> <t>https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</t> </li> <li> <t>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</t> </li> <li> <t>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</t> </li> </ul> <t>Note the <tt>#</tt>, which separates the absolute-URI part (Section <xref target="RFC3986" section="4.3" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>) from the fragment identifier part (including the <tt>#</tt>, a JSON Pointer as in <xref section="6" sectionFormat="of" target="RFC6901"/>).</t> </section> <section anchor="ref-global"> <name>Referencingglobal names</name>Global Names</name> <t>A name reference takes the form of the production <tt>curie</tt> in Section 3 of <xref target="W3C.NOTE-curie-20101216"/>, but limiting the IRIs involved in that grammar to URIs as per <xref target="STD66"/> and the prefixes to ASCII characters <xref target="STD80"/>. (Note that this definition does not make use of the production <tt>safe-curie</tt> in <xref target="W3C.NOTE-curie-20101216"/>.)</t> <t>A name that is contributed by the current SDF document can be referenced by a Same-Document Reference as per Section <xref target="RFC3986" section="4.4" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>. As there is little point in referencing the entire SDF document, this will be a <tt>#</tt> followed by a JSON pointer. This is the only kind of name reference to itself that is possible in an SDF document that does not set a default namespace.</t> <t>Name references that point outside the current SDF document need to contain curie prefixes. These then reference namespace declarations in the namespaces block.</t> <t>For example, if a namespace prefix is defined:</t> <sourcecode type="json"><![CDATA[ "namespace": { "foo": "https://example.com/" } ]]></sourcecode><t>Then<t>then this reference to that namespace:</t> <sourcecode type="json"><![CDATA[ "sdfRef": "foo:#/sdfData/temperatureData" ]]></sourcecode> <t>references the global name:</t> <sourcecode type="json"><![CDATA[ "https://example.com/#/sdfData/temperatureData" ]]></sourcecode> <t>Note that there is no way to provide a URI scheme name in a curie, so all references to outside of the document need to go through the namespace map.</t> <t>Name references occur only in specific elements of the syntax of SDF:</t> <ul spacing="normal"> <li> <t>copying elements via sdfRef values</t> </li> <li> <t>pointing to elements via sdfRequired value elements</t> </li> </ul> </section> <section anchor="sdfref"> <name>sdfRef</name> <t>In a JSON map establishing a definition, the keyword <tt>sdfRef</tt> is used to copy the qualities and enclosed definitions of the referenced definition, indicated by the included name reference, into the newly formed definition. (This can be compared to the processing of the <tt>$ref</tt> keyword in <xreftarget="JSO7"/>.)target="I-D.handrews-json-schema"/>.) The referenced definition should be such that, after copying and applying the additional qualities in the referencing definition, the newly built definition is also valid SDF (e.g., the copied qualities and definitions are valid in the context of the new definition).</t> <t>For example, this reference:</t> <sourcecode type="json"><![CDATA[ "temperatureProperty": { "sdfRef": "#/sdfData/temperatureData" } ]]></sourcecode> <t>creates a new definition "temperatureProperty" that contains all of the qualities defined in the definition at /sdfData/temperatureData.</t> <t>The sdfRef member need not be the only member of a map. Additional members may be present with the intentionto overrideof overriding parts of the referenced map orto addadding new qualities or definitions.</t> <t>When processing sdfRef, if the target definition contains also sdfRef (i.e., is based on yet another definition), that <bcp14>MUST</bcp14> be processed as well.</t> <t>More formally, for a JSON map that contains an sdfRef member, the semanticsisare defined to be as if the following steps were performed:</t> <ol spacing="normal" type="1"><li> <t>The JSON map that contains the sdfRef member is copied into a variable named "patch".</t> </li> <li> <t>The sdfRef member of the copy in "patch" is removed.</t> </li> <li><t>the<t>The JSON pointer that is the value of the sdfRef member is dereferenced and the result is copied into a variable named "original".</t> </li> <li> <t>The JSON Merge Patch algorithm <xref target="RFC7396"/> is applied to patch the contents of "original" with the contents of "patch".</t> </li> <li> <t>The result of the Merge Patch is used in place of the value of the original JSON map.</t> </li> </ol> <t>Note that the formal syntaxes given in Appendices <xref format="counter" target="syntax"/> and <xref format="counter" target="jso"/> generally describe the <em>result</em> of applying amerge-patch: themerge-patch. The notations are not powerful enough to describe, for instance, how the merge-patch algorithm causes null values within the sdfRef to remove members of JSON maps from the referenced target. Nonetheless, the syntaxes also give the syntax of the sdfRef itself, which vanishes during the resolution; therefore, in manycases thereforecases, even merge-patch inputs will validate with these formal syntaxes.</t> <t>Given the example (<xreftarget="example1"/>),target="example1"/>) and the following definition:</t> <sourcecode type="json"><![CDATA[ { "info": { "title": "Example light switch using sdfRef" }, "namespace": { "cap": "https://example.com/capability/cap" }, "defaultNamespace": "cap", "sdfObject": { "BasicSwitch": { "sdfRef": "cap:#/sdfObject/Switch", "sdfAction": { "toggle": null } } } } ]]></sourcecode> <t>The resulting definition of the "BasicSwitch" sdfObject would be identical to the definition of the "Switch"sdfObjectsdfObject, except it would not contain the "toggle" Action.</t> <sourcecode type="json" name="example1-without-toggle.sdf.json"><![CDATA[ { "info": { "title": "Example light switch using sdfRef" }, "namespace": { "cap": "https://example.com/capability/cap" }, "defaultNamespace": "cap", "sdfObject": { "BasicSwitch": { "sdfProperty": { "value": { "description": "The state of the switch; false for off and true for on.", "type": "boolean" } }, "sdfAction": { "on": { "description": "Turn the switch on; equivalent to setting value to true." }, "off": { "description": "Turn the switch off; equivalent to setting value to false." } } } } } ]]></sourcecode> <section anchor="resolved-models"> <name>Resolvedmodels</name>Models</name> <t>A model where all sdfRef references are processed as described in <xref target="sdfref"/> is called a resolved model.</t> <t>For example, given the following sdfData definitions:</t> <sourcecode type="json"><![CDATA[ "sdfData": { "Coordinate" : { "type": "number", "unit": "m" }, "X-Coordinate" : { "sdfRef" : "#/sdfData/Coordinate", "description": "Distance from the base of the Thing along the X axis." }, "Non-neg-X-Coordinate" : { "sdfRef": "#/sdfData/X-Coordinate", "minimum": 0 } } ]]></sourcecode><t>After resolving the<t>the definitions would look asfollows:</t>follows after being resolved:</t> <sourcecode type="json"><![CDATA[ "sdfData": { "Coordinate" : { "type": "number", "unit": "m" }, "X-Coordinate" : { "description": "Distance from the base of the Thing along the X axis.", "type": "number", "unit": "m" }, "Non-neg-X-Coordinate" : { "description": "Distance from the base of the Thing along the X axis.", "minimum": 0, "type": "number", "unit": "m" } } ]]></sourcecode> </section> </section> <section anchor="sdfrequired"> <name>sdfRequired</name> <t>The keyword <tt>sdfRequired</tt> is provided to apply a constraint that defines for which declarations the corresponding data are mandatory in a grouping (sdfThing or sdfObject) modeled by the current definition.</t> <t>The value of <tt>sdfRequired</tt> is an array of references, each indicating one or more declarations that are mandatory to be represented.</t> <t>References in this array can be SDF names (JSONPointers),Pointers) or one of two abbreviated reference formats:</t> <ul spacing="normal"> <li><t>a<t>A text string with a "referenceable-name", namely an affordance name or a grouping name: </t> <ul spacing="normal"> <li> <t>All affordance declarations that are directly in the same grouping (i.e., not nested further in another grouping) and that carry this name are declared to be mandatory to be represented. Note that there can be multiple such affordance declarations, one per affordance type.</t> </li> <li> <t>The same applies to groupings made mandatory within groupings containing them.</t> </li> </ul> </li> <li><t>the<t>The Boolean value <tt>true</tt>. The affordance or grouping itself that carries the <tt>sdfRequired</tt> keyword is declared to be mandatory to be represented.</t> </li> </ul> <t>Note that referenceable-names are not subject to the encoding JSON pointers require as discussed in <xref target="hierarchical-names"/>. To ensure that referenceable-names are reliably distinguished from JSON pointers, they are defined such that they cannot contain ":" or "#" characters (see rule <tt>referenceable-name</tt> in <xref target="syntax"/>). (If these characters are indeed contained in a Given Name, a JSON pointer needs to be formed instead in order to reference it in "sdfRequired", potentially requiring further path elements as well as JSON pointer encoding. The need for this is best avoided by choosing Given Names without these characters.)</t> <t>The example in <xref target="example-req"/> shows two required elements in the sdfObject definition for "temperatureWithAlarm", the sdfProperty "currentTemperature", and the sdfEvent "overTemperatureEvent". <!-- [rfced] Should "JSON pointer" be rephrased as "a JSON pointer" or "JSON pointers" to describe Figure 4? Original: The example also shows the use of JSON pointer with "sdfRef" to use a pre-existing definition for the sdfProperty "currentTemperature" and for the sdfOutputData produced by the sdfEvent "overTemperatureEvent". Perhaps: The example also shows the use of a JSON pointer with "sdfRef" to use a pre-existing definition for the sdfProperty "currentTemperature" and for the sdfOutputData produced by the sdfEvent "overTemperatureEvent". Or: The example also shows the use of JSON pointers with "sdfRef" to use a pre-existing definition for the sdfProperty "currentTemperature" and for the sdfOutputData produced by the sdfEvent "overTemperatureEvent". --> The example also shows the use of JSON pointer with "sdfRef" to use a pre-existing definition for the sdfProperty "currentTemperature" and for the sdfOutputData produced by the sdfEvent "overTemperatureEvent".</t> <figure anchor="example-req"> <name>Using sdfRequired</name> <sourcecode type="json"><![CDATA[ "sdfObject": { "temperatureWithAlarm": { "sdfRequired": [ "#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature", "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent" ], "sdfData":{ "temperatureData": { "type": "number" } }, "sdfProperty": { "currentTemperature": { "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData", "writable": false } }, "sdfEvent": { "overTemperatureEvent": { "sdfOutputData": { "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData" } } } } } ]]></sourcecode> </figure> <t>In <xref target="example-req"/>, the same sdfRequired can also be represented in short form:</t> <sourcecode type="json"><![CDATA[ "sdfRequired": ["currentTemperature", "overTemperatureEvent"] ]]></sourcecode> <t>Or, forinstanceinstance, "overTemperatureEvent" couldcarry</t>carry:</t> <sourcecode type="json"><![CDATA[ "overTemperatureEvent": { "sdfRequired": [true], "...": "..." } ]]></sourcecode> </section> <section anchor="common-qualities"> <name>Common Qualities</name> <t>Definitions in SDF share a number of qualities that provide metadata for them. These are listed in <xref target="tbl-common-qualities"/>. None of these qualities are required or have default values that are assumed if the quality is absent. If a short textual description is required for an application and no label is given in the SDF model,in its placeapplications could use the last part (the last <tt>reference-token</tt>, <xref section="3" sectionFormat="of" target="RFC6901"/>) of the JSON pointer to thedefinition.</t>definition in its place.</t> <table anchor="tbl-common-qualities"> <name>Common Qualities</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">description</td> <td align="left">string</td> <td align="left">long text (no constraints)</td> </tr> <tr> <td align="left">label</td> <td align="left">string</td> <td align="left">short text (no constraints)</td> </tr> <tr> <td align="left">$comment</td> <td align="left">string</td> <td align="left">source code comments only, no semantics</td> </tr> <tr> <td align="left">sdfRef</td> <td align="left">sdf-pointer</td> <td align="left">(see <xref target="sdfref"/>)</td> </tr> <tr> <td align="left">sdfRequired</td> <td align="left">pointer-list</td> <td align="left">(see <xref target="sdfrequired"/>, used in affordances or groupings)</td> </tr> </tbody> </table> </section> <section anchor="data-qualities"> <name>Data Qualities</name> <t>Data qualities are used in sdfData and sdfProperty definitions, which are named sets of data qualities (abbreviated as <tt>named-sdq</tt>).</t> <t>These qualities include the common qualities, JSO-inspired qualities (see below), and data qualities defined specifically for the present specification; the latter are shown in <xref target="sdfdataqual2"/>. None of these qualities are required or have default values that are assumed if the quality is absent.</t> <t><xref target="jso-inspired"/> lists data qualities inspired by the various proposals at json-schema.org; the intention is that these (informationmodel level)model-level) qualities are compatible with the (data model) semantics from the versions of the json-schema.org proposal they were imported from.</t> <table anchor="sdfdataqual2"><name>SDF-defined<name>SDF-Defined Qualities of sdfData and sdfProperty</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> <th align="left">Default</th> </tr> </thead> <tbody> <tr> <td align="left">(common)</td> <tdalign="left"> </td>align="left"> </td> <td align="left"> <xref target="common-qualities"/></td> <tdalign="left"> </td>align="left"> </td> </tr> <tr> <td align="left">unit</td> <td align="left">string</td> <td align="left">unit name (note 1)</td> <td align="left">N/A</td> </tr> <tr> <td align="left">nullable</td> <td align="left">boolean</td> <td align="left">indicates a null value is available for this type</td> <td align="left">true</td> </tr> <tr> <td align="left">contentFormat</td> <td align="left">string</td> <td align="left">content type (IANA media type string plus parameters), encoding (note 2)</td> <td align="left">N/A</td> </tr> <tr> <td align="left">sdfType</td> <td align="left">string (<xref target="sdftype"/>)</td> <td align="left">sdfType enumeration (extensible)</td> <td align="left">N/A</td> </tr> <tr> <td align="left">sdfChoice</td> <td align="left">named set of data qualities (<xref target="sdfchoice"/>)</td> <td align="left">named alternatives</td> <td align="left">N/A</td> </tr> <tr> <td align="left">enum</td> <td align="left">array of strings</td> <td align="left">abbreviation for string-valued named alternatives</td> <td align="left">N/A</td> </tr> </tbody> </table> <ol spacing="normal" type="1"><li> <!-- [rfced] FYI - In the XML, we have removed the links from "SenML Units" and "Secondary Units" since those links do not point to the correct section (and the correct section pointers follow shortly thereafter). Please let us know any objections. Original XML: <t>The unit name <bcp14>SHOULD</bcp14> be as per the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="RFC8428"/> registry or the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="RFC8798"/> registry in <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, respectively. </t> --> <t>The unit name <bcp14>SHOULD</bcp14> be as per the SenML Units registry or the Secondary Units registry in <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428" section="4.5.2" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, respectively. </t> <t> Exceptionally, if a registration in these registries cannot be obtained or would be inappropriate, the unit name can also be a URI that is pointing to a definition of the unit. Note that SDF processors are not expected to, and normally <bcp14>SHOULD NOT</bcp14>, dereference these URIs; the definition pointed to may be useful to humans, though. (See <xref target="I-D.bormann-t2trg-deref-id"/> for a more extensive discussion of dereferenceable identifiers). </t> <t anchor="cannot-colon">A URI unit name is distinguished from a registered unit name by the presence of a colon; therefore, any registered unit names that contain a colon (at the time of writing, none)can therefore notcannot be directly used in SDF.</t> <t> For use by translators into ecosystems that require URIs for unit names, the URN sub-namespace "urn:ietf:params:unit" is provided (<xref target="unit-urn"/>). URNs from this sub-namespace <bcp14>MUST NOT</bcp14> be used in a <tt>unit</tt>quality,quality in favor of simply notating the unit name (such as <tt>kg</tt> instead of<tt>urn:ietf:params:unit:kg</tt>),<tt>urn:ietf:params:unit:kg</tt>) except where the unit name contains a colon and can therefore not be directly used in SDF.</t> </li> <li> <t>The <tt>contentFormat</tt> quality follows the Content-Format-Spec as defined in <xref section="6" sectionFormat="of" target="RFC9193"/>, allowing for expressing both numeric and string based Content-Formats.</t> </li> </ol> <section anchor="sdftype"> <name>sdfType</name> <t>SDF defines a number of basic types beyond those provided by JSON or JSO. These types are identified by the <tt>sdfType</tt> quality, which is a text string from a set of type names defined by the "sdfType values" registry in the "Semantic Definition Format (SDF)" registry group (<xref target="sdftype-values"/>). The sdfType name is composed oflower caselowercase ASCII letters, digits, and <tt>-</tt> (ASCII hyphen/minus) characters, starting with alower caselowercase ASCII letter (i.e., using a pattern of"<tt>[a-z][-a-z0-9]*</tt>"),"<tt>[a-z][-a-z0-9]*</tt>") and typically employing kebab-case for names constructed out of multiple words <xref target="KebabCase"/>.</t> <t>To aid interworking with JSO implementations, it is <bcp14>RECOMMENDED</bcp14> that sdfType is always used in conjunction with the <tt>type</tt> quality inherited from <xreftarget="JSO7V"/>,target="I-D.handrews-json-schema-validation"/> in such a way as to yield a common representation of the type's values in JSON.</t> <t>Values for sdfType that are defined in this specification are shown in <xref target="sdftype1"/>. This table also gives a description of the semantics of the sdfType, the conventional value for <tt>type</tt> to be used with the sdfType value, and a conventional JSON representation for values of the type. The <tt>type</tt> and the JSON representation are chosen to be consistent with each other; this <bcp14>MUST</bcp14> be true for additionally registered sdfType values as well.</t> <table anchor="sdftype1"> <name>Values Defined in Base SDF for the sdfType Quality</name> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> <th align="left">type</th> <th align="left">JSON Representation</th> <th align="left">Reference</th> </tr> </thead> <tbody> <tr> <td align="left">byte-string</td> <td align="left">A sequence of zero or more bytes</td> <td align="left">string</td> <td align="left">base64url without padding</td> <td align="left">Section <xref target="RFC8949" section="3.4.5.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/></td> </tr> <!-- [rfced] The IANA registry includes "(note 1)" as part of the description for unix-time, but there is no note included in the registry. Should the notes be included in the registry or perhaps "(note 1)" should be removed from the description? Original (text): | unix-time | A point in | number | POSIX time | Section | | | civil time | | | 3.4.2 of | | | (note 1) | | | RFC 8949 | | | | | | [STD94] | See the IANA registry: https://www.iana.org/assignments/sdf/sdf.xhtml#sdftype-values --> <tr> <td align="left">unix-time</td> <td align="left">A point in civil time (note 1)</td> <td align="left">number</td> <td align="left">POSIX time</td> <td align="left">Section <xref target="RFC8949" section="3.4.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/></td> </tr> </tbody> </table> <t>(1) Note that the definition of <tt>unix-time</tt> does not imply the capability to represent points in time that fall on leap seconds. More date/time-related sdfTypes are likely to be added in the sdfType value registry.</t> </section> <section anchor="sdfchoice"> <name>sdfChoice</name> <t>Data can be a choice of namedalternatives,alternatives called <tt>sdfChoice</tt>. Each alternative is identified by a name (string, key in the outer JSON map used to represent the overall choice) and a set of dataqualities (each in an inner JSON map, the value used to represent the individual alternative in the outer JSON map). Dataqualities that are specified at the same level as the sdfChoice apply to all choices in thesdfChoice,sdfChoice except those specific choices where the dataquality is overridden at the choice level.</t> <t>sdfChoice merges the functions of two constructs found in <xreftarget="JSO7V"/>:</t>target="I-D.handrews-json-schema-validation"/>:</t> <ul spacing="normal"> <li><t><tt>enum</tt> </t><t><tt>enum</tt></t> <t> What could be expressedas </t>as:</t> <sourcecode type="json"><![CDATA[ "enum": ["foo", "bar", "baz"] ]]></sourcecode> <t> in JSO, is often best represented as: </t> <sourcecode type="json"><![CDATA[ "sdfChoice": { "foo": { "description": "This is a foonly"}, "bar": { "description": "As defined in the second world congress"}, "baz": { "description": "From bigzee foobaz"} } ]]></sourcecode> <t> This allows the placement of other dataqualities such as <tt>description</tt> in the example. </t> <t> If an enum needs to use a data type different from the text string, whatwouldwould, forinstanceinstance, have been: </t> <sourcecode type="json"><![CDATA[ "type": "number", "enum": [1, 2, 3] ]]></sourcecode> <t> in JSO, is represented as: </t> <sourcecode type="json"><![CDATA[ "type": "number", "sdfChoice": { "a-better-name-for-alternative-1": { "const": 1 }, "alternative-2": { "const": 2 }, "the-third-alternative": { "const": 3 } } ]]></sourcecode> <t> where the string names obviously would be chosen in a way that is descriptive for what these numbers actually stand for; sdfChoice also makes it easy to add number ranges into the mix. </t> <t> (Note that <tt>const</tt> can also be used for strings as in the previous example, for instance, if the actual string value is indeed a crucial element for the data model.)</t> </li> <li><t>anyOf </t><t>anyOf</t> <t> JSO provides a type union called <tt>anyOf</tt>, which provides a choice between anonymous alternatives. </t> <t> What could have been in JSO: </t> <sourcecode type="json"><![CDATA[ "anyOf": [ {"type": "array", "minItems": 3, "maxItems": "3", "items": {"$ref": "#/sdfData/rgbVal"}}, {"type": "array", "minItems": 4, "maxItems": "4", "items": {"$ref": "#/sdfData/cmykVal"}} ] ]]></sourcecode> <t> can be more descriptively notated in SDF as: </t> <sourcecode type="json"><![CDATA[ "sdfChoice": { "rgb": {"type": "array", "minItems": 3, "maxItems": "3", "items": {"sdfRef": "#/sdfData/rgbVal"}}, "cmyk": {"type": "array", "minItems": 4, "maxItems": "4", "items": {"sdfRef": "#/sdfData/cmykVal"}} } ]]></sourcecode> </li> </ul> <t>Note that there is no need in SDF for the type intersection construct <tt>allOf</tt> or the peculiar type-xor construct <tt>oneOf</tt> found in <xreftarget="JSO7V"/>.</t>target="I-D.handrews-json-schema-validation"/>.</t> <t>As a simplification for users of SDF models who are accustomed to the JSO enum keyword, this is retained, but limited to a choice of text string values, suchthat</t>that:</t> <sourcecode type="json"><![CDATA[ "enum": ["foo", "bar", "baz"] ]]></sourcecode> <t>is syntactic sugarfor</t>for:</t> <sourcecode type="json"><![CDATA[ "sdfChoice": { "foo": { "const": "foo"}, "bar": { "const": "bar"}, "baz": { "const": "baz"} } ]]></sourcecode> <t>In a single definition, the keyword <tt>enum</tt> cannot be used at the same time as the keyword <tt>sdfChoice</tt>, as the former is just syntactic sugar for the latter.</t> </section> </section> </section> <section anchor="kw-defgroups"> <name>Keywords fordefinition groups</name>Definition Groups</name> <t>The following SDF keywords are used to create definition groups in the target namespace. All these definitions share some common qualities as discussed in <xref target="common-qualities"/>.</t> <section anchor="sdfobject-1"> <name>sdfObject</name> <t>The <tt>sdfObject</tt> keyword denotes a group of zero or more sdfObject definitions. sdfObject definitions may contain or include definitions of named Properties, Actions, and Events declared for the sdfObject, as well as named data types (sdfData group) to be used in this or other sdfObjects.</t> <t>The qualities of an sdfObject include the common qualities; additional qualities are shown in <xref target="sdfobjqual"/>. None of these qualities are required or have default values that are assumed if the quality is absent.</t> <table anchor="sdfobjqual"> <name>Qualities of sdfObject</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">(common)</td> <tdalign="left"> </td>align="left"> </td> <td align="left"> <xref target="common-qualities"/></td> </tr> <tr> <td align="left">sdfProperty</td> <td align="left">property</td> <td align="left">zero or more named property definitions for this sdfObject</td> </tr> <tr> <td align="left">sdfAction</td> <td align="left">action</td> <td align="left">zero or more named action definitions for this sdfObject</td> </tr> <tr> <td align="left">sdfEvent</td> <td align="left">event</td> <td align="left">zero or more named event definitions for this sdfObject</td> </tr> <tr> <td align="left">sdfData</td> <td align="left">named-sdq</td> <td align="left">zero or more named data type definitions that might be used in the above</td> </tr> <tr> <td align="left">minItems</td> <td align="left">number</td> <td align="left">(array)Minimumminimum number of multiplied affordances in array</td> </tr> <tr> <td align="left">maxItems</td> <td align="left">number</td> <td align="left">(array)Maximummaximum number of multiplied affordances in array</td> </tr> </tbody> </table> </section> <section anchor="sdfproperty-1"> <name>sdfProperty</name> <t>The <tt>sdfProperty</tt> keyword denotes a group of zero or more Property definitions.</t> <t>Properties are used to model elements of state.</t> <t>The qualities of a Property definition include the data qualities (and thus the commonqualities),qualities); see <xreftarget="data-qualities"/>, additionaltarget="data-qualities"/>. Additional qualities are shown in <xref target="sdfpropqual"/>.</t> <table anchor="sdfpropqual"> <name>Qualities of sdfProperty</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> <th align="left">Default</th> </tr> </thead> <tbody> <tr> <td align="left">(data)</td> <tdalign="left"> </td>align="left"> </td> <td align="left"> <xref target="data-qualities"/></td> <tdalign="left"> </td>align="left"> </td> </tr> <tr> <td align="left">readable</td> <td align="left">boolean</td> <td align="left">Reads are allowed</td> <td align="left">true</td> </tr> <tr> <td align="left">writable</td> <td align="left">boolean</td> <td align="left">Writes are allowed</td> <td align="left">true</td> </tr> <tr> <td align="left">observable</td> <td align="left">boolean</td> <tdalign="left">flagalign="left">Flag to indicate asynchronous notification is available</td> <td align="left">true</td> </tr> </tbody> </table> </section> <section anchor="sdfaction"> <name>sdfAction</name> <t>The <tt>sdfAction</tt> keyword denotes a group of zero or more Action definitions.</t> <t>Actions are used to model commands and methodswhichthat are invoked. Actions may have parameter data thatareis supplied upon invocation and output data that is provided as a direct result of the invocation of the action (note that "action objects" may also be created to furnish ongoing information during a long-running action; these would be pointed to by the output data).</t> <t>The qualities of an Action definition include the commonqualities, additionalqualities. Additional qualities are shown in <xref target="sdfactqual"/>.</t> <table anchor="sdfactqual"> <name>Qualities of sdfAction</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">(common)</td> <tdalign="left"> </td>align="left"> </td> <td align="left"> <xref target="common-qualities"/></td> </tr> <tr> <td align="left">sdfInputData</td> <td align="left">map</td> <td align="left">data qualities of the input data for an Action</td> </tr> <tr> <td align="left">sdfOutputData</td> <td align="left">map</td> <td align="left">data qualities of the output data for an Action</td> </tr> <tr> <td align="left">sdfData</td> <td align="left">named-sdq</td> <td align="left">zero or more named data type definitions that might be used in the above</td> </tr> </tbody> </table> <t><tt>sdfInputData</tt> defines the input data of the action. <tt>sdfOutputData</tt> defines the output data of the action. As discussed in <xref target="sdfaction-overview"/>, a set of data qualities with type<tt>"object"</tt>"<tt>object</tt>" can be used to substructure either data item, with optionality indicated by the data quality <tt>required</tt>.</t> </section> <section anchor="sdfevent"> <name>sdfEvent</name> <t>The <tt>sdfEvent</tt> keyword denotes zero or more Event definitions.</t> <t>Events are used to model asynchronous occurrences that may be communicated proactively. Events have data elementswhichthat are communicated upon the occurrence of the event.</t> <t>The qualities of sdfEvent include the commonqualities, additionalqualities. Additional qualities are shown in <xref target="sdfevqual"/>.</t> <table anchor="sdfevqual"> <name>Qualities of sdfEvent</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">(common)</td> <tdalign="left"> </td>align="left"> </td> <td align="left"> <xref target="common-qualities"/></td> </tr> <tr> <td align="left">sdfOutputData</td> <td align="left">map</td> <td align="left">data qualities of the output data for an Event</td> </tr> <tr> <td align="left">sdfData</td> <td align="left">named-sdq</td> <td align="left">zero or more named data type definitions that might be used in the above</td> </tr> </tbody> </table> <t><tt>sdfOutputData</tt> defines the output data of the action. As discussed in <xref target="sdfevent-overview"/>, a set of data qualities with type<tt>"object"</tt>"<tt>object</tt>" can be used to substructure the output data item, with optionality indicated by the data quality <tt>required</tt>.</t> </section> <section anchor="sdfdata-1"> <name>sdfData</name> <t>The <tt>sdfData</tt> keyword denotes a group of zero or more named data type definitions (named-sdq).</t> <t>An sdfData definition provides a reusable semantic identifier for a type of data item and describes the constraints on the defined type. sdfData is not itself a declaration, so it does not cause any of these data items to be included in an affordance definition.</t> <t>The qualities of sdfData include the data qualities (and thus the commonqualities),qualities); see <xref target="data-qualities"/>.</t> </section> </section> <section anchor="high-level-composition"><name>High Level<name>High-Level Composition</name> <t>The requirements forhigh levelhigh-level composition include the following:</t> <ul spacing="normal"> <li> <t>The ability to represent products, standardized product types, and modular products while maintaining the atomicity of sdfObjects.</t> </li> <li> <t>The ability to compose a reusable definition block from sdfObjects. Example: a single plug unit of an outlet strip with sdfObjects for on/off control, energy monitor, and optional dimmer, while retaining the atomicity of the individual sdfObjects.</t> </li> <li> <t>The ability to compose sdfObjects and other definition blocks into a higher level sdfThing that represents a product, while retaining the atomicity of sdfObjects.</t> </li> <li> <t>The ability to enrich and refine a base definition to have product-specific qualities and quality values, such as unit, range, and scale settings.</t> </li> <li> <t>The ability to reference items in one part of a complex definition from another part of the same definition. Example: summarizing the energy readings from all plugs in an outlet strip.</t> </li> </ul> <section anchor="paths-in-the-model-namespaces"> <name>Paths in themodel namespaces</name>Model Namespaces</name> <t>The model namespace is organized according to terms that are defined in the SDF documents that contribute to the namespace. For example, definitions that originate from an organization or vendor are expected to be in a namespace that is specific to that organization or vendor.</t> <t>The structure of a path in a namespace is defined by the JSON Pointers to the definitions in the SDF documents in that namespace. For example, if there is an SDF document defining an sdfObject "<tt>Switch</tt>" with an action "<tt>on</tt>", then the reference to the action would be"<tt>ns:#/sdfObject/Switch/sdfAction/on</tt>""<tt>ns:#/sdfObject/Switch/sdfAction/on</tt>", where <tt>ns</tt> is the namespace prefix (short name for the namespace).</t> </section> <section anchor="modular-composition"> <name>Modular Composition</name> <t>Modular composition of definitions enables an existing definition(could(which could be in the same or another SDF document) to become part of a new definition by including a reference to the existing definition within the model namespace.</t> <section anchor="use-of-the-sdfref-keyword-to-re-use-a-definition"> <name>Use of the "sdfRef"keywordKeyword tore-useReuse adefinition</name>Definition</name> <t>An existing definition may be used as a template for a new definition, that is, a new definition is created in the target namespace which uses the defined qualities of some existing definition. This pattern uses the keyword <tt>sdfRef</tt> as a quality of a new definition with a value consisting of a reference to the existing definition that is to be used as a template.</t> <t>In the definition that uses <tt>sdfRef</tt>, new qualities may be added and existing qualities from the referenced definition may be overridden. (Note that JSON maps do not have a defined order, so the SDF processor may see these overrides before seeing the <tt>sdfRef</tt>.)</t> <t>Note that the definition referenced by <tt>sdfRef</tt> might contain qualities or definitions that are not valid in the context where the <tt>sdfRef</tt> is used. In this case, the resulting model, when resolved, may be invalid. Example: an sdfRef adds an sdfThing definition in an sdfObject definition.</t> <t>As a convention, overrides are intended to be used only for further restricting the allowable set of data values. Such a usage is shown in <xref target="exa-sdfref"/>: any value allowable for a <tt>cable-length</tt>alsois also an allowable value for a <tt>length</tt>, with the additional restriction that the length cannot be smaller than5 cm.5 cm. (This is labeled as a convention as it cannot be checked in the general case. A quality of implementation consideration for a tool might be to provide at least some form of checking.) Note that the example provides a <tt>description</tt> that overrides the <tt>description</tt> of the referenced definition; as this quality is intended for humanconsumptionconsumption, there is no conflict with the intended goal.</t> <figure anchor="exa-sdfref"> <name>Using an Override to Further Restrict the Set of Data Values</name><artwork><![CDATA[<sourcecode type=""><![CDATA[ "sdfData": "length" : { "type": "number", "minimum": 0, "unit": "m" "description": "There can be no negative lengths." } ... "cable-length" : { "sdfRef": "#/sdfData/length" "minimum": 5e-2, "description": "Cables must be at least 5 cm." }]]></artwork>]]></sourcecode> </figure> </section> </section> <section anchor="sdfthing-1"> <name>sdfThing</name> <t>An sdfThing is a set of declarations and qualities that may be part of a more complex model. For example, the sdfObject declarations that make up the definition of a single socket of an outlet strip could be encapsulated in an sdfThing, which itself could be used in a declaration in the sdfThing definition for the outlet strip. (See <xref target="exa-sdfthing-outlet-strip"/> in <xref target="outlet-strip-example"/> for parts of an SDF model for this example).</t> <t>sdfThing definitions carry semantic meaning, such as a defined refrigerator compartment and a defined freezer compartment, making up a combination refrigerator-freezer product. An sdfThing may be composed of sdfObjects and other sdfThings. It can also contain sdfData definitions, as well as declarations of interaction affordances itself, such as a status (on/off) for the refrigerator-freezer as a whole (see <xref target="exa-sdfthing-fridge-freezer"/> in <xref target="fridge-freezer-example"/> for an example SDF model illustrating these aspects).</t> <t>The qualities of sdfThing are shown in <xref target="sdfthingqual"/>. Analogous to sdfObject, the presence of one or both of the optional qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>" defines the sdfThing as an array.</t> <table anchor="sdfthingqual"> <name>Qualities of sdfThing</name> <thead> <tr> <th align="left">Quality</th> <th align="left">Type</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left">(common)</td> <tdalign="left"> </td>align="left"> </td> <td align="left"> <xref target="common-qualities"/></td> </tr> <tr> <td align="left">sdfThing</td> <td align="left">thing</td> <tdalign="left"> </td>align="left"> </td> </tr> <tr> <td align="left">sdfObject</td> <td align="left">object</td> <tdalign="left"> </td>align="left"> </td> </tr> <tr> <td align="left">sdfProperty</td> <td align="left">property</td> <td align="left">zero or more named property definitions for this thing</td> </tr> <tr> <td align="left">sdfAction</td> <td align="left">action</td> <td align="left">zero or more named action definitions for this thing</td> </tr> <tr> <td align="left">sdfEvent</td> <td align="left">event</td> <td align="left">zero or more named event definitions for this thing</td> </tr> <tr> <td align="left">sdfData</td> <td align="left">named-sdq</td> <td align="left">zero or more named data type definitions that might be used in the above</td> </tr> <tr> <td align="left">minItems</td> <td align="left">number</td> <td align="left">(array)Minimumminimum number of multiplied affordances in array</td> </tr> <tr> <td align="left">maxItems</td> <td align="left">number</td> <td align="left">(array)Maximummaximum number of multiplied affordances in array</td> </tr> </tbody> </table> </section> </section> <section anchor="iana"> <name>IANA Considerations</name><t><cref anchor="replace-xxxx">RFC Ed.: throughout this section, please replace RFC XXXX with this<!-- [rfced] IANA provided the following notes to the RFCnumber,Production Center. We believe the document has been updated accordingly. Please review andremove this note.</cref></t>let us know if any updates are needed. NOTE 1: The authors have notified us that "4.5.1" (Names) needs to be changed to "4.5.2" (Units) both in the "Repository" field in Section 7.3 and in Note 1 to Table 4 in Section 4.7. NOTE 2: With author permission, we've prepended "SDF" to the three new registry names that didn't already refer to SDF. --> <section anchor="media-type"> <name>Media Type</name> <t>IANAis requested to addhas added the following Media-Type to the "Media Types" registry <xref target="IANA.media-types"/>.</t> <table align="left" anchor="mediatypereg"> <name>Media Type Registration for SDF</name> <thead> <tr> <th align="left">Name</th> <th align="left">Template</th> <th align="left">Reference</th> </tr> </thead> <tbody> <tr> <td align="left">sdf+json</td> <td align="left">application/sdf+json</td> <td align="left">RFCXXXX,9880, <xref target="media-type"/></td> </tr> </tbody> </table> <dlspacing="compact">spacing="normal" newline="false"> <dt>Type name:</dt><dd> <t>application</t> </dd><dd>application</dd> <dt>Subtype name:</dt><dd> <t>sdf+json</t> </dd><dd>sdf+json</dd> <dt>Required parameters:</dt><dd> <t>N/A</t> </dd><dd>N/A</dd> <dt>Optional parameters:</dt><dd> <t>N/A</t> </dd><dd>N/A</dd> <dt>Encoding considerations:</dt><dd> <t>binary<dd>binary (JSON is UTF-8-encodedtext)</t> </dd>text)</dd> <dt>Security considerations:</dt><dd> <t><xref<dd><xref target="seccons"/> of RFCXXXX</t> </dd>9880</dd> <dt>Interoperability considerations:</dt><dd> <t>none</t> </dd><dd>none</dd> <dt>Published specification:</dt> <dd><t><xref<xref target="media-type"/> of RFCXXXX</t> </dd>9880</dd> <dt>Applications that use this media type:</dt><dd> <t>Tools<dd>Tools for data and interaction modeling in the Internet of Things and relatedenvironments</t> </dd>environments.</dd> <dt>Fragment identifier considerations:</dt><dd> <t>A<dd>A JSON Pointer fragment identifier may beused,used as defined in <xref section="6" sectionFormat="of"target="RFC6901"/>.</t> </dd>target="RFC6901"/>.</dd> <dt>Additional information:</dt><dd> <dl><dd><t><br/></t> <dl spacing="compact" newline="false"> <dt>Magic number(s):</dt><dd> <t>n/a</t> </dd><dd>n/a</dd> <dt>File extension(s):</dt><dd> <t>.sdf.json</t> </dd><dd>.sdf.json</dd> <dt>Windows Clipboard Name:</dt><dd> <t>"Semantic<dd>"Semantic Definition Format (SDF) for Data and Interactions ofThings"</t> </dd>Things"</dd> <dt>Macintosh file type code(s):</dt><dd> <t>n/a</t> </dd><dd>n/a</dd> <dt>Macintosh Universal Type Identifier code:</dt><dd> <t>org.ietf.sdf-json<br/><dd>org.ietf.sdf-json conforms topublic.text</t> </dd>public.text</dd> </dl> </dd> <dt>Person & email address to contact for further information:</dt><dd> <t>ASDF<dd>ASDF WG mailing list(asdf@ietf.org),(asdf@ietf.org) or IETF Applications and Real-Time Area(art@ietf.org)</t> </dd>(art@ietf.org)</dd> <dt>Intended usage:</dt><dd> <t>COMMON</t> </dd><dd>COMMON</dd> <dt>Restrictions on usage:</dt><dd> <t>none</t> </dd><dd>none</dd> <dt>Author/Change controller:</dt><dd> <t>IETF</t> </dd><dd>IETF</dd> <dt>Provisional registration:</dt><dd> <t>no</t> </dd><dd>no</dd> </dl> </section> <section anchor="content-format"> <name>Content-Format</name><t>This document adds<t>IANA has added the following Content-Format to the "CoAP Content-Formats"registry,registry within the "Constrained RESTful Environments (CoRE) Parameters" registry group <xreftarget="IANA.core-parameters"/>, where 434 comes from the "IETF Review" 256-999 range.</t>target="IANA.core-parameters"/>.</t> <table align="left" anchor="contentformatreg"> <name>SDFContent-formatContent-Format Registration</name> <thead> <tr> <th align="left">Content Type</th> <th align="left">Content Coding</th> <th align="left">ID</th> <th align="left">Reference</th> </tr> </thead> <tbody> <tr> <td align="left">application/sdf+json</td> <td align="left">-</td> <td align="left">434</td> <td align="left">RFCXXXX</td>9880</td> </tr> </tbody> </table><t>// RFC Ed.: 434 was earmarked in <eref target="https://mailarchive.ietf.org/arch/msg/core-parameters/iLDsdxk80YO9IsLMXMAgcx5S8Ak/">https://mailarchive.ietf.org/arch/msg/core-parameters/iLDsdxk80YO9IsLMXMAgcx5S8Ak/</eref>; please replace 434 with the assigned ID, remove the requested range, and remove this note.<br/> // RFC Ed.: please replace RFC XXXX with this RFC number and remove this note.</t></section> <section anchor="unit-urn"> <name>IETF URNSub-namespaceSub-Namespace for Unit Names (urn:ietf:params:unit)</name> <t>IANAis requested to registerhas registered the following value in the"<xref section="IETF"IETF URN Sub-namespace for Registered Protocol Parameter Identifiers"relative="#params-1" sectionFormat="bare" target="IANA.params"/>"registry in <xref target="IANA.params"/>, following the template in <xref target="BCP73"/>:</t> <dl> <dt>Registry name:</dt> <dd> <t>unit</t> </dd> <dt>Specification:</dt> <dd> <t>RFCXXXX</t>9880</t> </dd> <dt>Repository:</dt> <!-- [rfced] We have updated this text to remove the use of relative references. Please review. Original: Repository: combining the symbol values from the SenML Units registry and the Secondary Units registry in [IANA.senml] as specified by Sections 4.5.1 and 12.1 of [RFC8428] and Section 3 of [RFC8798], respectively (which by the registration policy are guaranteed to be non-overlapping). Current: Repository: Combining the symbol values from the "SenML Units" registry and the "Secondary Units" registry in the "Sensor Measurement Lists (SenML)" registry group [IANA.senml] as specified by Sections 4.5.2 and 12.1 of [RFC8428] and Section 3 of [RFC8798], respectively (which, by the registration policy, are guaranteed to be non-overlapping). --> <dd><t>combining<t>Combining the symbol values from the<xref section="SenML"SenML Units"relative="#senml-units" sectionFormat="bare" target="IANA.senml"/>registry and the<xref section="Secondary"Secondary Units"relative="#secondary-units" sectionFormat="bare" target="IANA.senml"/>registry in the "Sensor Measurement Lists (SenML)" registry group <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428"section="4.5.1"section="4.5.2" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, respectively(which(which, by the registrationpolicypolicy, are guaranteed to be non-overlapping).</t> </dd> <dt>Index value:</dt> <dd> <!-- [rfced] Please review the text below. We note that "sub-delims" is not mentioned in Section 2.3 of RFC 3986 [STD66]. The term is defined in Section 2.2 of RFC 3986 [STD66]. Should Section 2.3 be updated to Section 2.2? Original: Index value: Percent-encoding (Section 2.1 of RFC 3986 [STD66]) is required of any characters in unit names except for the set "unreserved" (Section 2.3 of RFC 3986 [STD66]), the set "sub- delims" (Section 2.3 of RFC 3986 [STD66]), ":" or "@" (i.e., the result must match the ABNF rule "pchar" in Section 3.3 of RFC 3986 [STD66]). --> <t>Percent-encoding (Section <xref target="RFC3986" section="2.1" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>) is required of any characters in unit names except for the set "<tt>unreserved</tt>" (Section <xref target="RFC3986" section="2.3" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>), the set "<tt>sub-delims</tt>" (Section <xref target="RFC3986" section="2.3" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>), and "<tt>:</tt>" or "<tt>@</tt>" (i.e., the result must match the ABNF rule "<tt>pchar</tt>" in Section <xref target="RFC3986" section="3.3" sectionFormat="bare"/> of RFC 3986 <xref target="STD66"/>).</t> </dd> </dl> </section> <section anchor="unit-colonrn"> <name>SenMLregistry group</name>Registry Group</name> <t>IANAis requested to addhas added the following note to theSenML"Sensor Measurement Lists (SenML)" registry group <xref target="IANA.senml"/>:</t> <blockquote> <t>In SDF[RFC XXXX],[RFC9880], a URI unit name is distinguished from a registered unit name by the presence of a colon; any registered unit name that contains a colon can therefore not be directly used in SDF.</t> </blockquote> </section> <section anchor="registries"> <name>Registries</name> <t>IANAis requested to create ahas created the "Semantic Definition Format (SDF)" registrygroup,group with the registries defined in this Section.</t> <section anchor="qn"><name>Quality<name>SDF Quality Names</name> <t>IANAis requested to create a "Qualityhas created the "SDF Quality Names" registry in the "Semantic Definition Format (SDF)" registrygroup,group with the following template:</t> <dl> <dt>Name:</dt> <dd> <t>A quality name composed of ASCII letters, digits, and dollar signs, starting with alower caselowercase ASCII letter or a dollar sign (i.e., using a pattern of "<tt>[a-z$][A-Za-z$0-9]*</tt>").</t> </dd> <dt>Brief Description:</dt> <dd> <t>A brief description.</t> </dd> <dt>Reference:</dt> <dd> <t>A pointer to a specification.</t> </dd> <dt>Change Controller:</dt> <dd><t>(see<t>(See Section <xref target="RFC8126" section="2.3" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>)</t> </dd> </dl> <t>Quality Names in this registry are intended to be registered in conjunction with RFCs and activities of the IETF.</t> <t>The registration policy is Specification Required as per Section <xref target="RFC8126" section="4.6" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>.(NoteNote that the policy is not "RFC Required" or "IETF Review"Sections(Sections <xref target="RFC8126" section="4.7" sectionFormat="bare"/> and <xref target="RFC8126" section="4.8" sectionFormat="bare"/> of RFC 8126 <xreftarget="BCP26"/>target="BCP26"/>) so that registrations can be made earlier in the process, even earlier than foreseen in <xref target="BCP100"/>.)</t> <t>The instructions to the Experts are:</t> <ul spacing="normal"> <li> <t>to ascertain that the specification is available in an immutable reference and has achieved a good level of review in conjunction with RFCs or activities of the IETF, and</t> </li> <li> <t>to be frugal in the allocation of quality names that are suggestive of generally applicable semantics, keeping them in reserve for qualities that are likely to enjoy wide use and can make good use of their conciseness.</t> </li> </ul> <t>The"Quality"SDF Quality Names" registry starts out as in <xref target="tab-quality-names"/>; all references for these initial entries are to RFCXXXX9880 (this document) and all change controllers aregiven as"IETF"".</t> <table anchor="tab-quality-names"> <name>Initial Content of the SDF Quality Names Registry</name> <thead> <tr> <th align="left">Name</th> <th align="left">Brief Description</th> </tr> </thead> <tbody> <tr> <td align="left">$comment</td> <td align="left">source code comments only, no semantics</td> </tr> <tr> <td align="left">const</td> <td align="left">constant value</td> </tr> <tr> <td align="left">contentFormat</td> <td align="left">content format</td> </tr> <tr> <td align="left">default</td> <td align="left">default value</td> </tr> <tr> <td align="left">description</td> <td align="left">long description text</td> </tr> <tr> <td align="left">enum</td> <td align="left">sdfChoice limited to text strings</td> </tr> <tr> <td align="left">exclusiveMaximum</td> <td align="left">exclusive maximum for a number</td> </tr> <tr> <td align="left">exclusiveMinimum</td> <td align="left">exclusive minimum for a number</td> </tr> <tr> <td align="left">format</td> <td align="left">specific format for a text string</td> </tr> <tr> <td align="left">items</td> <td align="left">items of an array</td> </tr> <tr> <td align="left">label</td> <td align="left">short text (no constraints); defaults to key</td> </tr> <tr> <td align="left">maxItems</td> <td align="left">maximum number of items in an array</td> </tr> <tr> <td align="left">maxLength</td> <td align="left">maximum length for a text string (in characters, i.e., Unicode scalar values)</td> </tr> <tr> <td align="left">maximum</td> <td align="left">maximum for a number</td> </tr> <tr> <td align="left">minItems</td> <td align="left">minimum number of items in an array</td> </tr> <tr> <td align="left">minLength</td> <td align="left">minimum length for a text string (in characters, i.e., Unicode scalar values)</td> </tr> <tr> <td align="left">minimum</td> <td align="left">minimum for a number</td> </tr> <tr> <td align="left">multipleOf</td> <td align="left">step size of number</td> </tr> <tr> <td align="left">nullable</td> <td align="left">boolean: can the item be left out?</td> </tr> <tr> <td align="left">observable</td> <td align="left">boolean: can the item be observed?</td> </tr> <tr> <td align="left">pattern</td> <td align="left">regular expression pattern for a text string</td> </tr> <tr> <td align="left">properties</td> <td align="left">named dataqualities for type="object"</td> </tr> <tr> <td align="left">readable</td> <td align="left">boolean: can the item be read?</td> </tr> <tr> <td align="left">required</td> <td align="left">which data items are required?</td> </tr> <tr> <td align="left">sdfChoice</td> <td align="left">named dataqualities for a choice</td> </tr> <tr> <td align="left">sdfData</td> <td align="left">named dataqualities for an independent data type definition</td> </tr> <tr> <td align="left">sdfInputData</td> <td align="left">input data to an action</td> </tr> <tr> <td align="left">sdfOutputData</td> <td align="left">output data of an action or event (sdfRequired applies here)</td> </tr> <tr> <td align="left">sdfRef</td> <td align="left">sdf-pointer to definition being referenced</td> </tr> <tr> <td align="left">sdfRequired</td> <td align="left">pointer-list to declarations of required components</td> </tr> <tr> <td align="left">sdfRequiredInputData</td> <td align="left">pointer-list to declarations of required input data for an action</td> </tr> <tr> <td align="left">sdfType</td> <td align="left">more detailed information about the type of a string</td> </tr> <tr> <td align="left">type</td> <td align="left">general category of data type</td> </tr> <tr> <td align="left">uniqueItems</td> <td align="left">boolean: do the items of the array need to be all different?</td> </tr> <tr> <td align="left">unit</td> <td align="left">engineering unit and scale (per SenML registry)</td> </tr> <tr> <td align="left">writable</td> <td align="left">boolean: can the item be written to?</td> </tr> </tbody> </table> </section> <section anchor="qnp"><name>Quality<name>SDF Quality Name Prefixes</name> <t>IANAis requested to create a "Qualityhas created the "SDF Quality Name Prefixes" registry in the "Semantic Definition Format (SDF)" registrygroup,group with the following template:</t> <dl> <dt>Prefix:</dt> <dd> <t>A quality name prefix composed of lower case ASCII letters and digits, starting with a lower case ASCII letter (i.e., using a pattern of "<tt>[a-z][a-z0-9]*</tt>").</t> </dd> <dt>Contact:</dt> <dd> <t>A contact point for the organization that assigns quality names with this prefix.</t> </dd> <dt>Reference:</dt> <dd> <t>A pointer to additional information, if available.</t> </dd> </dl> <t>Quality Name Prefixes are intended to be registered by organizations that plan to define quality names constructed with anorganization-specifixorganization-specific prefix (<xref target="gnqn"/>).</t> <t>The registration policy is Expert Review as per Section <xref target="RFC8126" section="4.5" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>. The instructions to the Expert are to ascertain that the organization will handle quality names constructed using their prefix in a way that roughly achieves the objectives for an IANA registry thatsupportsupports interoperability of SDF models employing these quality names, including:</t> <ul spacing="normal"> <li> <t>Stability, "stable and permanent";</t> </li> <li> <t>Transparency, "readilyavailable",available" and "in sufficient detail" (Section <xref target="RFC8126" section="4.6" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>).</t> </li> </ul> <t>The"Quality"SDF Quality Name Prefixes" registrystarts out empty.</t>is empty at this time.</t> </section> <section anchor="sdftype-values"> <name>sdfType Values</name> <t>IANAis requested to create ahas created the "sdfTypevalues"Values" registry in the "Semantic Definition Format (SDF)" registrygroup,group with the following template:</t> <dl> <dt>Name:</dt> <dd> <t>A name composed of lower case ASCII letters, digits and <tt>-</tt> (ASCII hyphen/minus) characters, starting with a lower case ASCII letter (i.e., using a pattern of "<tt>[a-z][-a-z0-9]*</tt>").</t> </dd> <dt>Description:</dt> <dd> <t>A short description of the information model level structure andsemantics</t>semantics.</t> </dd> <dt>type:</dt> <dd> <t>The value of the quality "type" to be used with thissdfType</t>sdfType.</t> </dd> <dt>JSON Representation</dt> <dd> <t>A short description of a JSON representation that can be used for this sdfType. As per <xref target="sdftype"/>, this <bcp14>MUST</bcp14> be consistent with the type.</t> </dd> <dt>Reference:</dt> <dd> <t>A more detailed specification of meaning and use of sdfType.</t> </dd> </dl> <t>sdfType values are intended to be registered to enable modeling additional SDF-specific types (see <xref target="sdftype"/>).</t> <t>The registration policy is Specification Required as per Section <xref target="RFC8126" section="4.6" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>. The instructions to the Expert are to ascertain that the specification provides enough detail to enable interoperability between implementations of the sdfType being registered, and that names are chosen with enough specificity that ecosystem-specific sdfTypes will not be confused with more generally applicable ones.</t> <t>The initial set of registrations is described in <xref target="sdftype1"/>.</t> </section> <section anchor="fn"><name>Feature<name>SDF Feature Names</name> <t>IANAis requested to create a "Featurehas created the "SDF Feature Names" registry in the "Semantic Definition Format (SDF)" registrygroup,group with the following template:</t> <dl> <dt>Name:</dt> <dd> <t>A feature name composed of ASCII letters, digits, and dollar signs, starting with a lower case ASCII letter or a dollar sign (i.e., using a pattern of "<tt>[a-z$][A-Za-z$0-9]*</tt>").</t> </dd> <dt>Brief Description:</dt> <dd> <t>A brief description.</t> </dd> <dt>Reference:</dt> <dd> <t>A pointer to a specification.</t> </dd> <dt>Change Controller:</dt> <dd><t>(see<t>(See Section <xref target="RFC8126" section="2.3" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>)</t> </dd> </dl> <t>The registration policy is Specification Required as per Section <xref target="RFC8126" section="4.6" sectionFormat="bare"/> of RFC 8126 <xref target="BCP26"/>.</t> <t>The instructions to the Experts are:</t> <ul spacing="normal"> <li> <t>to ascertain that the specification is available in an immutable reference and has achieved a good level of review, and</t> </li> <li> <t>to be frugal in the allocation of feature names that are suggestive of generally applicable semantics, keeping them in reserve for features that are likely to enjoy wide use and can make good use of their conciseness.</t> </li> </ul> <t>The"Feature"SDF Feature Names" registrystarts out empty.</t>is empty at this time.</t> </section> </section> </section> <section anchor="seccons"> <name>Security Considerations</name> <t>Some wider security considerations applicable to Things are discussed in <xref target="RFC8576"/>.</t> <t><xref section="5" sectionFormat="of" target="RFC8610"/> gives an overview over security considerations that arise when formal description techniques are used to govern interoperability; analogs of these security considerations can apply to SDF.</t> <t>The security considerations of underlying building blocks such as those detailed in Section <xref target="RFC3629" section="10" sectionFormat="bare"/> of RFC 3629 <xref target="STD63"/> apply.</t> <t>SDF uses JSON as a representation language. For a number of cases, <xref target="STD90"/> indicates that implementation behavior for certain constructs allowed by the JSON grammar is unpredictable.</t> <t>Implementations need to be robust against invalid or unpredictable cases on input, preferably by rejecting input that is invalid or that would lead to unpredictable behavior, andneed toavoid generating these cases on output.</t> <t>Implementations of model languages may also exhibit performance-related availability issues when the attacker can control the input, see <xref section="4.1" sectionFormat="of" target="RFC9535"/> for a brief discussion and <xref section="8" sectionFormat="of" target="RFC9485"/> for considerations specific to the use of <tt>pattern</tt>.</t> <t>SDF may be used in two processes that are often security relevant: model-based <em>validation</em> of data that is intended to be described by SDFmodels,models and model-based <em>augmentation</em> of these data with information obtained from the SDF models that apply.</t> <t>Implementations need to ascertain the provenance (and thus authenticity and integrity) and applicability of the SDF models they employ operationally in suchsecurity relevantsecurity-relevant ways. Implementations that make use of the composition mechanisms defined in this document need to do this for each of the components they combine into the SDF models they employ. Essentially, this process needs to undergo the same care and scrutiny as any other introduction of source code into a build environment; the possibility of supply-chain attacks on the modules imported needs to be considered.</t> <t>Specifically, implementations might rely on model-based input validation for enforcing certain properties of the data structure ingested (which, if not validated, could lead to malfunctions such as crashes and remote code execution). These implementations need to be particularly careful about the data models they apply, including their provenance and potential changes of these properties that upgrades to the referenced modules may (inadvertently or as part of an attack) cause. More generally speaking, implementations should strive to be robust against expected and unexpected limitations of the model-based input validation mechanisms and their implementations.</t> <t>Similarly, implementations that rely on model-based augmentation may generate false data from their inputs; this is an integrity violation in anycasecase, but also can possibly be exploited for further attacks.</t> <!-- [rfced] What is "these" referring to in the sentence below? Current: In applications that dynamically acquire models and obtain modules from module references in these, the security considerations of dereferenceable identifiers apply (see [DEREFERENCEABLE-ID-PATTERN] for a more extensive discussion of dereferenceable identifiers). Perhaps: In applications that dynamically acquire models and obtain modules from module references in these applications, the security considerations of dereferenceable identifiers apply (see [DEREF-ID-PATTERN] for a more extensive discussion of dereferenceable identifiers). --> <t>In applications that dynamically acquire models and obtain modules from module references in these, the security considerations of dereferenceable identifiers apply (see <xref target="I-D.bormann-t2trg-deref-id"/> for a more extensive discussion of dereferenceable identifiers).</t> <t>There may be confidentiality requirements on SDF models, both on their content and on the fact that a specific model is used in a particular Thing or environment. The present specification does not discuss model discovery or define an access control model for SDF models, nor does it define a way to obtain selective disclosure where that may be required. It is likely that these definitions require additional context from underlying ecosystems and the characteristics of the protocols employed there; therefore, this isthereforeleft as future work (e.g., for documents such as <xref target="I-D.bormann-asdf-sdf-mapping"/>).</t> </section> </middle> <back> <displayreference target="I-D.irtf-t2trg-rest-iot" to="REST-IOT"/> <displayreference target="I-D.bormann-t2trg-deref-id" to="DEREF-ID-PATTERN"/> <displayreference target="I-D.bormann-asdf-sdftype-link" to="SDFTYPE-LINK"/> <displayreference target="I-D.bormann-asdf-sdf-mapping" to="SDF-MAPPING"/> <displayreference target="I-D.handrews-json-schema" to="JSO7"/> <displayreference target="I-D.handrews-json-schema-validation" to="JSO7V"/> <displayreference target="I-D.fge-json-schema-validation" to="JSO4V"/> <displayreference target="I-D.zyp-json-schema" to="JSO4"/> <references anchor="sec-combined-references"> <name>References</name> <references anchor="sec-normative-references"> <name>Normative References</name> <reference anchor="IANA.senml" target="https://www.iana.org/assignments/senml"> <front> <title>Sensor Measurement Lists (SenML)</title> <author> <organization>IANA</organization> </author> </front> </reference> <reference anchor="IANA.params" target="https://www.iana.org/assignments/params"> <front> <title>Uniform Resource Name (URN) Namespace for IETF Use</title> <author> <organization>IANA</organization> </author> </front> </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><reference anchor="RFC3339"> <front> <title>Date and Time on the Internet: Timestamps</title> <author fullname="G. Klyne" initials="G." surname="Klyne"/> <author fullname="C. Newman" initials="C." surname="Newman"/> <date month="July" year="2002"/> <abstract> <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t> </abstract> </front> <seriesInfo name="RFC" value="3339"/> <seriesInfo name="DOI" value="10.17487/RFC3339"/> </reference> <reference anchor="RFC8428"> <front> <title>Sensor Measurement Lists (SenML)</title> <author fullname="C. Jennings" initials="C." surname="Jennings"/> <author fullname="Z. Shelby" initials="Z." surname="Shelby"/> <author fullname="J. Arkko" initials="J." surname="Arkko"/> <author fullname="A. Keranen" initials="A." surname="Keranen"/> <author fullname="C. Bormann" initials="C." surname="Bormann"/> <date month="August" year="2018"/> <abstract> <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML). Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model. A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t> </abstract> </front> <seriesInfo name="RFC" value="8428"/> <seriesInfo name="DOI" value="10.17487/RFC8428"/> </reference> <reference anchor="RFC8798"> <front> <title>Additional Units for Sensor Measurement Lists (SenML)</title> <author fullname="C. Bormann" initials="C." surname="Bormann"/> <date month="June" year="2020"/> <abstract> <t>The Sensor Measurement Lists (SenML) media type supports the indication of units for a quantity represented. This short document registers a number of additional unit names in the IANA registry for units in SenML. It also defines a registry for secondary units that cannot be in SenML's main registry, as they are derived by linear transformation from units already in that registry.</t> </abstract> </front> <seriesInfo name="RFC" value="8798"/> <seriesInfo name="DOI" value="10.17487/RFC8798"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8428.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8798.xml"/> <referencegroup anchor="STD66" target="https://www.rfc-editor.org/info/std66"><reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986"> <front> <title>Uniform Resource Identifier (URI): Generic Syntax</title> <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/> <author fullname="R. Fielding" initials="R." surname="Fielding"/> <author fullname="L. Masinter" initials="L." surname="Masinter"/> <date month="January" year="2005"/> <abstract> <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t> </abstract> </front> <seriesInfo name="STD" value="66"/> <seriesInfo name="RFC" value="3986"/> <seriesInfo name="DOI" value="10.17487/RFC3986"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml"/> </referencegroup><reference anchor="RFC9562"> <front> <title>Universally Unique IDentifiers (UUIDs)</title> <author fullname="K. Davis" initials="K." surname="Davis"/> <author fullname="B. Peabody" initials="B." surname="Peabody"/> <author fullname="P. Leach" initials="P." surname="Leach"/> <date month="May" year="2024"/> <abstract> <t>This specification defines UUIDs (Universally Unique IDentifiers) -- also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform Resource Name namespace for UUIDs. A UUID is 128 bits long and is intended to guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System (NCS), later in the Open Software Foundation's (OSF's) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t> <t>This specification is derived from the OSF DCE specification with the kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have been incorporated into this document. This document obsoletes RFC 4122.</t> </abstract> </front> <seriesInfo name="RFC" value="9562"/> <seriesInfo name="DOI" value="10.17487/RFC9562"/> </reference> <reference anchor="RFC6901"> <front> <title>JavaScript Object Notation (JSON) Pointer</title> <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/> <author fullname="K. Zyp" initials="K." surname="Zyp"/> <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/> <date month="April" year="2013"/> <abstract> <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t> </abstract> </front> <seriesInfo name="RFC" value="6901"/> <seriesInfo name="DOI" value="10.17487/RFC6901"/> </reference> <reference anchor="RFC7396"> <front> <title>JSON Merge Patch</title> <author fullname="P. Hoffman" initials="P." surname="Hoffman"/> <author fullname="J. Snell" initials="J." surname="Snell"/> <date month="October" year="2014"/> <abstract> <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t> </abstract> </front> <seriesInfo name="RFC" value="7396"/> <seriesInfo name="DOI" value="10.17487/RFC7396"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9562.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6901.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7396.xml"/> <referencegroup anchor="STD63" target="https://www.rfc-editor.org/info/std63"><reference anchor="RFC3629" target="https://www.rfc-editor.org/info/rfc3629"> <front> <title>UTF-8, a transformation format of ISO 10646</title> <author fullname="F. Yergeau" initials="F." surname="Yergeau"/> <date month="November" year="2003"/> <abstract> <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t> </abstract> </front> <seriesInfo name="STD" value="63"/> <seriesInfo name="RFC" value="3629"/> <seriesInfo name="DOI" value="10.17487/RFC3629"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3629.xml"/> </referencegroup> <referencegroup anchor="STD90" target="https://www.rfc-editor.org/info/std90"><reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259"> <front> <title>The JavaScript Object Notation (JSON) Data Interchange Format</title> <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/> <date month="December" year="2017"/> <abstract> <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t> <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t> </abstract> </front> <seriesInfo name="STD" value="90"/> <seriesInfo name="RFC" value="8259"/> <seriesInfo name="DOI" value="10.17487/RFC8259"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/> </referencegroup><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><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8610.xml"/> <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94"><reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949"> <front> <title>Concise Binary Object Representation (CBOR)</title> <author fullname="C. Bormann" initials="C." surname="Bormann"/> <author fullname="P. Hoffman" initials="P." surname="Hoffman"/> <date month="December" year="2020"/> <abstract> <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t> <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t> </abstract> </front> <seriesInfo name="STD" value="94"/> <seriesInfo name="RFC" value="8949"/> <seriesInfo name="DOI" value="10.17487/RFC8949"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8949.xml"/> </referencegroup><reference anchor="RFC9193"> <front> <title>Sensor Measurement Lists (SenML) Fields for Indicating Data Value Content-Format</title> <author fullname="A. Keränen" initials="A." surname="Keränen"/> <author fullname="C. Bormann" initials="C." surname="Bormann"/> <date month="June" year="2022"/> <abstract> <t>The Sensor Measurement Lists (SenML) media types support multiple types of values, from numbers to text strings and arbitrary binary Data Values. In order to facilitate processing of binary Data Values, this document specifies a pair of new SenML fields for indicating the content format of those binary Data Values, i.e., their Internet media type, including parameters as well as any content codings applied.</t> </abstract> </front> <seriesInfo name="RFC" value="9193"/> <seriesInfo name="DOI" value="10.17487/RFC9193"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9193.xml"/> <referencegroup anchor="BCP26" target="https://www.rfc-editor.org/info/bcp26"><reference anchor="RFC8126" target="https://www.rfc-editor.org/info/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><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/> </referencegroup> <referencegroup anchor="BCP73" target="https://www.rfc-editor.org/info/bcp73"><reference anchor="RFC3553" target="https://www.rfc-editor.org/info/rfc3553"> <front> <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title> <author fullname="M. Mealling" initials="M." surname="Mealling"/> <author fullname="L. Masinter" initials="L." surname="Masinter"/> <author fullname="T. Hardie" initials="T." surname="Hardie"/> <author fullname="G. Klyne" initials="G." surname="Klyne"/> <date month="June" year="2003"/> <abstract> <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. 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="73"/> <seriesInfo name="RFC" value="3553"/> <seriesInfo name="DOI" value="10.17487/RFC3553"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3553.xml"/> </referencegroup> <reference anchor="W3C.NOTE-curie-20101216" target="https://www.w3.org/TR/2010/NOTE-curie-20101216/"> <front> <title>CURIE Syntax 1.0</title> <author fullname="Mark Birbeck" role="editor"/> <author fullname="Shane McCarron" role="editor"/> <date day="16" month="December" year="2010"/> </front><seriesInfo name="W3C NOTE" value="NOTE-curie-20101216"/> <seriesInfo name="W3C" value="NOTE-curie-20101216"/><refcontent>W3C Working Group Note</refcontent> </reference> <referencegroup anchor="STD80" target="https://www.rfc-editor.org/info/std80"><reference anchor="RFC0020" target="https://www.rfc-editor.org/info/rfc20"> <front> <title>ASCII format for network interchange</title> <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/> <date month="October" year="1969"/> </front> <seriesInfo name="STD" value="80"/> <seriesInfo name="RFC" value="20"/> <seriesInfo name="DOI" value="10.17487/RFC0020"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0020.xml"/> </referencegroup> <reference anchor="SPDX" target="https://spdx.org/licenses/"> <front> <title>SPDX License List</title> <author> <organization/> </author> <date/> </front> </reference><reference anchor="RFC9165"> <front> <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title> <author fullname="C. Bormann" initials="C." surname="Bormann"/> <date month="December" year="2021"/> <abstract> <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t> <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:.plus,.cat, and.det for the construction of constants;.abnf/.abnfb for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and.feature for indicating the use of a non-basic feature in an instance.</t> </abstract> </front> <seriesInfo name="RFC" value="9165"/> <seriesInfo name="DOI" value="10.17487/RFC9165"/> </reference> <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14"> <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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> </referencegroup><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9165.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/> </references> <references anchor="sec-informative-references"> <name>Informative References</name> <!-- [JSO7] draft-handrews-json-schema-02 IESG State: Replaced by draft-bhutton-json-schema --> <referenceanchor="JSO7">anchor="I-D.handrews-json-schema" target="https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-02"> <front> <title>JSON Schema: A Media Type for Describing JSON Documents</title> <author initials="A." surname="Wright" fullname="Austin Wright"initials="A." surname="Wright">role="editor"> </author> <author initials="H." surname="Andrews" fullname="Henry Andrews"initials="H." surname="Andrews"> <organization>Cloudflare, Inc.</organization>role="editor"> </author> <author initials="B." surname="Hutton" fullname="Ben Hutton" role="editor"> <organization>Wellcome Sanger Institute</organization> </author> <author initials="G." surname="Dennis" fullname="Greg Dennis"> </author> <dateday="19" month="March" year="2018"/> <abstract> <t> JSON Schema defines the media type "application/schema+json", a JSON- based format for describing the structure of JSON data. JSON Schema asserts what a JSON document must look like, ways to extract information from it, and how to interact with it. The "application/ schema-instance+json" media type provides additional feature-rich integration with "application/schema+json" beyond what can be offered for "application/json" documents. </t> </abstract>month="September" day="17" year="2019" /> </front> <seriesInfo name="Internet-Draft"value="draft-handrews-json-schema-01"/> <annotation>This is the base specification for json-schema.org "draft 7".</annotation>value="draft-handrews-json-schema-02" /> </reference> <!-- [JSO7V] draft-handrews-json-schema-validation-02 IESG State: Replaced by draft-bhutton-json-schema-validation --> <referenceanchor="JSO7V">anchor="I-D.handrews-json-schema-validation" target="https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-02"> <front> <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title> <author initials="A." surname="Wright" fullname="Austin Wright"initials="A." surname="Wright">role="editor"> </author> <author initials="H." surname="Andrews" fullname="Henry Andrews"initials="H." surname="Andrews"> <organization>Cloudflare, Inc.</organization>role="editor"> </author> <authorfullname="Geraint Luff" initials="G." surname="Luff">initials="B." surname="Hutton" fullname="Ben Hutton" role="editor"> <organization>Wellcome Sanger Institute</organization> </author> <dateday="19" month="March" year="2018"/> <abstract> <t> JSON Schema (application/schema+json) has several purposes, one of which is JSON instance validation. This document specifies a vocabulary for JSON Schema to describe the meaning of JSON documents, provide hints for user interfaces working with JSON data, and to make assertions about what a valid document must look like. </t> </abstract>month="September" day="17" year="2019" /> </front> <seriesInfo name="Internet-Draft"value="draft-handrews-json-schema-validation-01"/> <annotation>This is the validation specification for json-schema.org "draft 7".</annotation>value="draft-handrews-json-schema-validation-02" /> </reference> <!-- [JSO4] draft-zyp-json-schema-04 IESG State: Replaced by draft-wright-json-schema --> <referenceanchor="JSO4">anchor="I-D.zyp-json-schema" target="https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-04"> <front> <title>JSON Schema: core definitions and terminology</title> <author initials="F." surname="Galiegue" fullname="Francis Galiegue"initials="F." surname="Galiegue">role="editor"> </author> <authorfullname="Kris Zyp"initials="K."surname="Zyp"> <organization>SitePen (USA)</organization> </author> <author fullname="Gary Court" initials="G." surname="Court"> </author> <date day="31" month="January" year="2013"/> <abstract> <t> JSON Schema defines the media type "application/schema+json", a JSON based format for defining the structure of JSON data. JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it. JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data. </t> </abstract> </front> <seriesInfo name="Internet-Draft" value="draft-zyp-json-schema-04"/> <annotation>This is the base specification for json-schema.org "draft 4".</annotation> </reference> <reference anchor="JSO4V"> <front> <title>JSON Schema: interactive and non interactive validation</title> <authorsurname="Zyp" fullname="Kris Zyp"initials="K." surname="Zyp">role="editor"> <organization>SitePen (USA)</organization> </author> <authorfullname="Gary Court"initials="G."surname="Court">surname="Court" fullname="Gary Court"> </author> <dateday="31"month="January"year="2013"/> <abstract> <t> JSON Schema (application/schema+json) has several purposes, one of which is instance validation. The validation process may be interactive or non interactive. For instance, applications may use JSON Schema to build a user interface enabling interactive content generation in addition to user input checking, or validate data retrieved from various sources. This specification describes schema keywords dedicated to validation purposes. </t> </abstract>day="31" year="2013" /> </front> <seriesInfo name="Internet-Draft"value="draft-fge-json-schema-validation-00"/> <annotation>This is the validation specification for json-schema.org "draft 4".</annotation>value="draft-zyp-json-schema-04" /> </reference><reference anchor="I-D.irtf-t2trg-rest-iot"> <front> <title>Guidance on RESTful Design for Internet of Things Systems</title> <author fullname="Ari Keränen" initials="A." surname="Keränen"> <organization>Ericsson</organization> </author> <author fullname="Matthias Kovatsch" initials="M." surname="Kovatsch"> <organization>Siemens</organization> </author> <author fullname="Klaus Hartke" initials="K." surname="Hartke"> </author> <date day="23" month="April" year="2025"/> <abstract> <t> This document gives guidance for designing Internet of Things (IoT) systems that follow the principles of the Representational State Transfer (REST) architectural style. This document is a product<!-- [JSO4V] draft-fge-json-schema-validation-00 IESG State: Replaced by draft-wright-json-schema-validation --> <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.fge-json-schema-validation.xml"/> <!-- [I-D.irtf-t2trg-rest-iot] draft-irtf-t2trg-rest-iot-16 IESG State: I-D Exists as ofthe IRTF Thing-to-Thing Research Group (T2TRG). </t> </abstract> </front> <seriesInfo name="Internet-Draft" value="draft-irtf-t2trg-rest-iot-16"/> </reference>05/14/25 --> <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.irtf-t2trg-rest-iot.xml"/> <reference anchor="ZCL"> <front><title>The<title>Chapter 6 - The ZigBee Cluster Library</title> <author> <organization/> </author> <date year="2008"/> </front><seriesInfo name="Zigbee<refcontent>Zigbee WirelessNetworking" value="pp. 239-271"/>Networking, pp. 239-271</refcontent> <seriesInfo name="DOI" value="10.1016/b978-0-7506-8597-9.00006-9"/> <seriesInfo name="ISBN"value="["9780750685979"]"/> <refcontent>Elsevier</refcontent>value="9780750685979"/> </reference> <!-- [rfced] References a) Please review the following reference. The original URL for this reference - http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html - redirects to the following URL: https://www.openmobilealliance.org/specifications with the title "OMA Specifications". We could not find a page with the original title for this reference "OMA LightweightM2M (LwM2M) Object and Resource Registry". We did find the following page: https://www.openmobilealliance.org/specifications/registries, which contains separate links to the LwM2M Objects and Resources registries. Would you like to update this reference to point to this new URL? Current: [OMA] Open Mobile Alliance, "OMA LightweightM2M (LwM2M) Object and Resource Registry", <http://www.openmobilealliance.org/wp/omna/lwm2m/ lwm2mregistry.html>. b) The information for this reference appears to be from the 2020 version of ECMA Standard ECMA-262. However, the URL provided points to the 2024 edition. We've updated this reference to use the information from the URL - that is, the 2024 edition. Please let us know if you have any objections. Current: [ECMA-262] Ecma International, "ECMAScript 2024 Language Specification", 15th Edition, ECMA Standard ECMA-262, June 2024, <https://www.ecma-international.org/wp- content/uploads/ECMA-262.pdf>. --> <reference anchor="OMA" target="http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html"> <front> <title>OMA LightweightM2M (LwM2M) Object and Resource Registry</title> <author><organization/><organization>Open Mobile Alliance</organization> </author> <date/> </front> </reference> <!-- XML for new OMA URL <reference anchor="OMA" target="https://www.openmobilealliance.org/specifications/registries"> <front> <title>LwM2M Registries</title> <author> <organization>Open Mobile Alliance</organization> </author> <date/> </front> </reference> --> <reference anchor="OCF" target="https://openconnectivity.org/specs/OCF_Resource_Type_Specification.pdf"> <front> <title>OCF Resource Type Specification</title> <author><organization/><organization>Open Connectivity Foundation</organization> </author><date/> </front> </reference> <reference anchor="RFC8576"> <front> <title>Internet of Things (IoT) Security: State of the Art and Challenges</title> <author fullname="O. Garcia-Morchon" initials="O." surname="Garcia-Morchon"/> <author fullname="S. Kumar" initials="S." surname="Kumar"/> <author fullname="M. Sethi" initials="M." surname="Sethi"/><datemonth="April" year="2019"/> <abstract> <t>The Internet of Things (IoT) concept refers to the usage of standard Internet protocols to allow for human-to-thing and thing-to-thing communication. The security needs for IoT systems are well recognized, and many standardization steps to provide security have been taken -- for example, the specification of the Constrained Application Protocol (CoAP) secured with Datagram Transport Layer Security (DTLS). However, security challenges still exist, not only because there are some use cases that lack a suitable solution, but also because many IoT devices and systems have been designed and deployed with very limited security capabilities. In this document, we first discuss the various stages in the lifecycle of a thing. Next, we document the security threats to a thing and the challenges that one might face to protect against these threats. Lastly, we discuss the next steps needed to facilitate the deployment of secure IoT systems. This document can be used by implementers and authors of IoT specifications as a reference for details about security considerations while documenting their specific security challenges, threat models, and mitigations.</t> <t>This document is a product of the IRTF Thing-to-Thing Research Group (T2TRG).</t> </abstract>month="November" year="2023"/> </front><seriesInfo name="RFC" value="8576"/> <seriesInfo name="DOI" value="10.17487/RFC8576"/><refcontent>Version 2.2.7</refcontent> </reference> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8576.xml"/> <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262.pdf"> <front> <title>ECMAScript20202024 Language Specification</title> <author> <organization>Ecma International</organization> </author> <dateyear="2020"year="2024" month="June"/> </front> <seriesInfoname="ECMA" value="Standard ECMA-262, 11th Edition"/>name="ECMA Standard" value="ECMA-262"/> <refcontent>15th Edition</refcontent> </reference> <reference anchor="CamelCase" target="http://wiki.c2.com/?CamelCase"> <front> <title>Camel Case</title> <author> <organization/> </author> <date year="2014" month="December"/> </front> </reference> <reference anchor="KebabCase" target="http://wiki.c2.com/?KebabCase"> <front> <title>Kebab Case</title> <author> <organization/> </author> <date year="2014" month="August"/> </front> </reference><reference anchor="I-D.bormann-asdf-sdftype-link"> <front> <title>An sdfType for Links</title> <author fullname="Carsten Bormann" initials="C." surname="Bormann"> <organization>Universität Bremen TZI</organization> </author> <date day="6" month="December" year="2024"/> <abstract> <t> This document defines and registers an sdfType "link" for the Semantic Definition Format (SDF) for Data and Interactions<!-- [I-D.bormann-asdf-sdftype-link] draft-bormann-asdf-sdftype-link-04 IESG State: I-D Exists as ofThings (draft-ietf-asdf-sdf). </t> </abstract> </front> <seriesInfo name="Internet-Draft" value="draft-bormann-asdf-sdftype-link-04"/> </reference>05/14/25 --> <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.bormann-asdf-sdftype-link.xml"/> <!-- [I-D.bormann-asdf-sdf-mapping] draft-bormann-asdf-sdf-mapping-05 IESG State: I-D Exists as of 05/14/25 --> <referenceanchor="I-D.bormann-asdf-sdf-mapping">anchor="I-D.bormann-asdf-sdf-mapping" target="https://datatracker.ietf.org/doc/html/draft-bormann-asdf-sdf-mapping-05"> <front> <title>Semantic Definition Format (SDF): Mapping files</title> <authorfullname="Carsten Bormann"initials="C."surname="Bormann"> <organization>Universität Bremen TZI</organization> </author> <author fullname="Jan Romann" initials="J." surname="Romann"> <organization>Universität Bremen</organization> </author> <date day="20" month="July" year="2025"/> <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. It was created as a common language for use in the development of the One Data Model liaison organization (OneDM) models. Tools convert this format to database formats and other serializations as needed. An SDF specification often needs to be augmented by additional information that is specific to its use in a particular ecosystem or application. SDF mapping files provide a mechanism to represent this augmentation. </t> </abstract> </front> <seriesInfo name="Internet-Draft" value="draft-bormann-asdf-sdf-mapping-07"/> </reference> <reference anchor="I-D.bormann-t2trg-deref-id"> <front> <title>The "dereferenceable identifier" pattern</title> <authorsurname="Bormann" fullname="Carsten Bormann"initials="C." surname="Bormann">role="editor"> <organization>Universität Bremen TZI</organization> </author> <authorfullname="Christian Amsüss" initials="C." surname="Amsüss">initials="J." surname="Romann" fullname="Jan Romann"> <organization>Hochschule Emden/Leer</organization> </author> <dateday="3" month="March" year="2025"/> <abstract> <t> In a protocol or an application environment, it is often important to be able to create unambiguous identifiers for some meaning (concept or some entity). Due to the simplicity of creating URIs, these have become popular for this purpose. Beyond the purpose of identifiers to be uniquely associated with a meaning, some of these URIs are in principle _dereferenceable_, so something can be placed that can be retrieved when encountering such a URI. // The present revision -04 includes a few clarifications. </t> </abstract>month="December" day="6" year="2024" /> </front> <seriesInfo name="Internet-Draft"value="draft-bormann-t2trg-deref-id-05"/>value="draft-bormann-asdf-sdf-mapping-05" /> </reference><reference anchor="RFC9485"> <front> <title>I-Regexp: An Interoperable Regular Expression Format</title> <author fullname="C. Bormann" initials="C." surname="Bormann"/> <author fullname="T. Bray" initials="T." surname="Bray"/> <date month="October" year="2023"/> <abstract> <t>This document specifies I-Regexp, a flavor of regular expression that is limited in scope with the goal<!-- [I-D.bormann-t2trg-deref-id] draft-bormann-t2trg-deref-id-05 IESG State: I-D Exists as ofinteroperation across many different regular expression libraries.</t> </abstract> </front> <seriesInfo name="RFC" value="9485"/> <seriesInfo name="DOI" value="10.17487/RFC9485"/> </reference> <reference anchor="RFC9535"> <front> <title>JSONPath: Query Expressions for JSON</title> <author fullname="S. Gössner" initials="S." role="editor" surname="Gössner"/> <author fullname="G. Normington" initials="G." role="editor" surname="Normington"/> <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/> <date month="February" year="2024"/> <abstract> <t>JSONPath defines a string syntax for selecting and extracting JSON (RFC 8259) values from within a given JSON value.</t> </abstract> </front> <seriesInfo name="RFC" value="9535"/> <seriesInfo name="DOI" value="10.17487/RFC9535"/> </reference>05/14/25 --> <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.bormann-t2trg-deref-id.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9485.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9535.xml"/> <referencegroup anchor="STD97" target="https://www.rfc-editor.org/info/std97"><reference anchor="RFC9110" target="https://www.rfc-editor.org/info/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><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/> </referencegroup> <referencegroup anchor="BCP100" target="https://www.rfc-editor.org/info/bcp100"><reference anchor="RFC7120" target="https://www.rfc-editor.org/info/rfc7120"> <front> <title>Early IANA Allocation of Standards Track Code Points</title> <author fullname="M. Cotton" initials="M." surname="Cotton"/> <date month="January" year="2014"/> <abstract> <t>This memo describes the process for early allocation of code points by IANA from registries for which "Specification Required", "RFC Required", "IETF Review", or "Standards Action" policies apply. This process can be used to alleviate the problem where code point allocation is needed to facilitate desired or required implementation and deployment experience prior to publication of an RFC, which would normally trigger code point allocation. The procedures in this document are intended to apply only to IETF Stream documents.</t> </abstract> </front> <seriesInfo name="BCP" value="100"/> <seriesInfo name="RFC" value="7120"/> <seriesInfo name="DOI" value="10.17487/RFC7120"/> </reference><xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7120.xml"/> </referencegroup> <reference anchor="WoT"target="https://www.w3.org/TR/wot-thing-description11/">target="https://www.w3.org/TR/2023/REC-wot-thing-description11-20231205/"> <front> <title>Web of Things (WoT) Thing Description 1.1</title> <author initials="S." surname="Kaebisch" fullname="SebastianKaebisch">Kaebisch" role="editor"> <organization/> </author> <author initials="M." surname="McCool" fullname="MichaelMcCool">McCool" role="editor"> <organization/> </author> <author initials="E." surname="Korkan" fullname="EgeKorkan">Korkan" role="editor"> <organization/> </author> <date year="2023" month="December" day="05"/> </front> <seriesInfo name="W3C" value="Recommendation"/> </reference> </references> </references><?line 2321?><section anchor="syntax"> <name>Formal Syntax of SDF</name> <t>This normative appendix describes the syntax of SDF using CDDL <xref target="RFC8610"/>.</t> <t>This appendix shows the framework syntax only, i.e., a syntax with liberal extension points. Since this syntax is nearly useless in finding typos in an SDF specification, a second syntax, the validation syntax, is defined that does not include the extension points. The validation syntax can be generated from the framework syntax by leaving out all lines containing the string <tt>EXTENSION-POINT</tt>; as this is trivial, the result is not shown here.</t> <t>This appendix makes use of CDDL "features" as defined in <xref section="4" sectionFormat="of" target="RFC9165"/>. Features whose names end in "-ext" indicate extension points for further evolution.</t> <sourcecode type="cddl"><![CDATA[ start = sdf-syntax sdf-syntax = { ; info will be required in most process policies ? info: sdfinfo ? namespace: named<text> ? defaultNamespace: text ; Thing is a composition of objects that work together in some way ? sdfThing: named<thingqualities> ; Object is a set of Properties, Actions, and Events that together ; perform a particular function ? sdfObject: named<objectqualities> ; Includes Properties, Actions, and Events as well as sdfData paedataqualities * $$SDF-EXTENSION-TOP EXTENSION-POINT<"top-ext"> } sdfinfo = { ? title: text ? description: text ? version: text ? copyright: text ? license: text ? modified: modified-date-time ? features: [ * (any .feature "feature-name") ; EXTENSION-POINT ] optional-comment * $$SDF-EXTENSION-INFO EXTENSION-POINT<"info-ext"> } ; Shortcut for a map that gives names to instances of X ; (has keys of type text and values of type X) named<X> = { * text => X } ; EXTENSION-POINT is only used in framework syntax EXTENSION-POINT<f> = ( * (quality-name .feature f) => any ) quality-name = text .regexp "([a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*" sdf-pointer = global / same-object / true global = text .regexp ".*[:#].*" ; rough CURIE or JSON Pointer syntax same-object = referenceable-name referenceable-name = text .regexp "[^:#]*" ; per se no point in having an empty list, but used for sdfRequired ; in odmobject-multiple_axis_joystick.sdf.json pointer-list = [* sdf-pointer] optional-comment = ( ? $comment: text ; source code comments only, no semantics ) commonqualities = ( ? description: text ; long text (no constraints) ? label: text ; short text (no constraints); default to key optional-comment ? sdfRef: sdf-pointer ; applies to qualities of properties, of data: ? sdfRequired: pointer-list ) arraydefinitionqualities = ( ? "minItems" => uint ? "maxItems" => uint ) paedataqualities = ( ; Property represents the state of an instance of an object ? sdfProperty: named<propertyqualities> ; Action invokes an application layer verb associated with an object ? sdfAction: named<actionqualities> ; Event represents an occurrence of event associated with an object ? sdfEvent: named<eventqualities> ; Data represents a piece of information that can be the state of a ; property or a parameter to an action or a signal in an event ? sdfData: named<dataqualities> ) ; for building hierarchy thingqualities = { commonqualities ? sdfObject: named<objectqualities> ? sdfThing: named<thingqualities> paedataqualities arraydefinitionqualities * $$SDF-EXTENSION-THING EXTENSION-POINT<"thing-ext"> } ; for single objects, or for arrays of objects objectqualities = { commonqualities paedataqualities arraydefinitionqualities * $$SDF-EXTENSION-OBJECT EXTENSION-POINT<"object-ext"> } parameter-list = dataqualities actionqualities = { commonqualities ? sdfInputData: parameter-list ; sdfRequiredInputData applies here ? sdfOutputData: parameter-list ; sdfRequired applies here ; zero or more named data type definitions that might be used above ? sdfData: named<dataqualities> * $$SDF-EXTENSION-ACTION EXTENSION-POINT<"action-ext"> } eventqualities = { commonqualities ? sdfOutputData: parameter-list ; sdfRequired applies here ; zero or more named data type definitions that might be used above ? sdfData: named<dataqualities> * $$SDF-EXTENSION-EVENT EXTENSION-POINT<"event-ext"> } sdftype-name = text .regexp "[a-z][-a-z0-9]*" ; EXTENSION-POINT dataqualities = { commonqualities jsonschema ? "unit" => text ? nullable: bool ? "sdfType" => "byte-string" / "unix-time" / $SDF-EXTENSION-SDFTYPE .within sdftype-name / (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT ? contentFormat: text * $$SDF-EXTENSION-DATA EXTENSION-POINT<"data-ext"> } propertyqualities = { ? observable: bool ? readable: bool ? writable: bool ~dataqualities } allowed-types = number / text / bool / null / [* number] / [* text] / [* bool] / {* text => any} / $SDF-EXTENSION-ALLOWED / (any .feature "allowed-ext") ; EXTENSION-POINT compound-type = ( "type" => "object" ? required: [+text] ? properties: named<dataqualities> ) optional-choice = ( ? (("sdfChoice" => named<dataqualities>) // ("enum" => [+ text])) ; limited to text strings ) jsonschema = ( ? (("type" => "number" / "string" / "boolean" / "integer" / "array") // compound-type // $$SDF-EXTENSION-TYPE // (type: text .feature "type-ext") ; EXTENSION-POINT ) ; if present, all other qualities apply to all choices: optional-choice ; the next three should validate against type: ? const: allowed-types ? default: allowed-types ; number/integer constraints ? minimum: number ? maximum: number ? exclusiveMinimum: number ? exclusiveMaximum: number ? multipleOf: number ; text string constraints ? minLength: uint ? maxLength: uint ? pattern: text ; regexp ? format: "date-time" / "date" / "time" / "uri" / "uri-reference" / "uuid" / $SDF-EXTENSION-FORMAT .within text / (text .feature "format-ext") ; EXTENSION-POINT ; array constraints ? minItems: uint ? maxItems: uint ? uniqueItems: bool ? items: jso-items ) jso-items = { ? sdfRef: sdf-pointer ; import limited to subset allowed here... ? description: text ; long text (no constraints) optional-comment ; leave commonqualities out for non-complex data types, ; but need the above three. ; no further nesting: no "array" ? ((type: "number" / "string" / "boolean" / "integer") // compound-type // $$SDF-EXTENSION-ITEMTYPE // (type: text .feature "itemtype-ext") ; EXTENSION-POINT ) ; if present, all other qualities apply to all choices optional-choice ; jso subset ? minimum: number ? maximum: number ? format: text ? minLength: uint ? maxLength: uint * $$SDF-EXTENSION-ITEMS EXTENSION-POINT<"items-ext"> } modified-date-time = text .abnf modified-dt-abnf modified-dt-abnf = "modified-dt" .det rfc3339z ; RFC 3339 sans time-numoffset, slightly condensed rfc3339z = ' date-fullyear = 4DIGIT date-month = 2DIGIT ; 01-12 date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on ; month/year time-hour = 2DIGIT ; 00-23 time-minute = 2DIGIT ; 00-59 time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap sec ; rules time-secfrac = "." 1*DIGIT DIGIT = %x30-39 ; 0-9 partial-time = time-hour ":" time-minute ":" time-second [time-secfrac] full-date = date-fullyear "-" date-month "-" date-mday modified-dt = full-date ["T" partial-time "Z"] ' ]]></sourcecode> </section> <section anchor="jso"> <name>json-schema.org Rendition of SDF Syntax</name> <t>This informative appendix describes the syntax of SDF defined in <xref target="syntax"/>, butusinguses a version of the description techniques advertised on json-schema.org <xreftarget="JSO7"/>target="I-D.handrews-json-schema"/> <xreftarget="JSO7V"/>.</t>target="I-D.handrews-json-schema-validation"/>.</t> <t>The appendix shows both the validation and the framework syntax. Since most of the lines are the same between these two files, those lines are shown only once, with a leading space, in the form of a unified diff. Lines leading with a <tt>-</tt> are part of the validationsyntax,syntax and lines leading with a <tt>+</tt> are part of the framework syntax.</t> <sourcecode type="jso.json"><![CDATA[ { - "title": "sdf-validation.cddl -- Generated: 2024-02-29T07:42:35Z", + "title": "sdf-framework.cddl -- Generated: 2024-02-29T07:42:52Z", "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/sdf-syntax", "definitions": { "sdf-syntax": { "type": "object", "properties": { "info": { "$ref": "#/definitions/sdfinfo" }, "namespace": { "type": "object", "additionalProperties": { "type": "string" } }, "defaultNamespace": { "type": "string" }, "sdfThing": { "type": "object", "additionalProperties": { "$ref": "#/definitions/thingqualities" } }, "sdfObject": { "type": "object", "additionalProperties": { "$ref": "#/definitions/objectqualities" } }, "sdfProperty": { "$ref": "#/definitions/sdfProperty-" }, "sdfAction": { "$ref": "#/definitions/sdfAction-" }, "sdfEvent": { "$ref": "#/definitions/sdfEvent-" }, "sdfData": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" } }, + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "additionalProperties": false }, "sdfinfo": { "type": "object", "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "version": { "type": "string" }, "copyright": { "type": "string" }, "license": { "type": "string" }, "modified": { "$ref": "#/definitions/modified-date-time" }, "features": { - "type": "array", - "maxItems": 0 + "type": "array" }, "$comment": { "type": "string" } }, + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "additionalProperties": false }, "modified-date-time": { "type": "string" }, "thingqualities": { "type": "object", "properties": { "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "sdfObject": { "type": "object", "additionalProperties": { "$ref": "#/definitions/objectqualities" } }, "sdfThing": { "type": "object", "additionalProperties": { "$ref": "#/definitions/thingqualities" } }, "sdfProperty": { "$ref": "#/definitions/sdfProperty-" }, "sdfAction": { "$ref": "#/definitions/sdfAction-" }, "sdfEvent": { "$ref": "#/definitions/sdfEvent-" }, "sdfData": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" } }, + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "additionalProperties": false }, "sdf-pointer": { "anyOf": [ { "$ref": "#/definitions/global" }, { "$ref": "#/definitions/same-object" }, { "$ref": "#/definitions/true" } ] }, "global": { "type": "string", "pattern": "^[^\\n\\r]*[:#][^\\n\\r]*$" }, "same-object": { "$ref": "#/definitions/referenceable-name" }, "referenceable-name": { "type": "string", "pattern": "^[^:#]*$" }, "true": { "type": "boolean", "const": true }, "pointer-list": { "type": "array", "items": { "$ref": "#/definitions/sdf-pointer" } }, "objectqualities": { "type": "object", "properties": { "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "sdfProperty": { "$ref": "#/definitions/sdfProperty-" }, "sdfAction": { "$ref": "#/definitions/sdfAction-" }, "sdfEvent": { "$ref": "#/definitions/sdfEvent-" }, "sdfData": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" } }, + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "additionalProperties": false }, "propertyqualities": { "anyOf": [ { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "$ref": "#/definitions/type-" }, "sdfChoice": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "observable": { "type": "boolean" }, "readable": { "type": "boolean" }, "writable": { "type": "boolean" }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, + "properties": { + "type": { + "type": "string", + "const": "object" + }, + "required": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "properties": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" + }, + "sdfChoice": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" + }, + "observable": { + "type": "boolean" + }, + "readable": { + "type": "boolean" + }, + "writable": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "label": { + "type": "string" + }, + "$comment": { + "type": "string" + }, + "sdfRef": { + "$ref": "#/definitions/sdf-pointer" + }, + "sdfRequired": { + "$ref": "#/definitions/pointer-list" + }, + "const": { + "$ref": "#/definitions/allowed-types" + }, + "default": { + "$ref": "#/definitions/allowed-types" + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "multipleOf": { + "type": "number" + }, + "minLength": { + "$ref": "#/definitions/uint" + }, + "maxLength": { + "$ref": "#/definitions/uint" + }, + "pattern": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/format-" + }, + "minItems": { + "$ref": "#/definitions/uint" + }, + "maxItems": { + "$ref": "#/definitions/uint" + }, + "uniqueItems": { + "type": "boolean" + }, + "items": { + "$ref": "#/definitions/jso-items" + }, + "unit": { + "type": "string" + }, + "nullable": { + "type": "boolean" + }, + "sdfType": { + "$ref": "#/definitions/sdfType-" + }, + "contentFormat": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, + "properties": { + "type": { + "type": "string" + }, + "sdfChoice": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" + }, + "observable": { + "type": "boolean" + }, + "readable": { + "type": "boolean" + }, + "writable": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "label": { + "type": "string" + }, + "$comment": { + "type": "string" + }, + "sdfRef": { + "$ref": "#/definitions/sdf-pointer" + }, + "sdfRequired": { + "$ref": "#/definitions/pointer-list" + }, + "const": { + "$ref": "#/definitions/allowed-types" + }, + "default": { + "$ref": "#/definitions/allowed-types" + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "multipleOf": { + "type": "number" + }, + "minLength": { + "$ref": "#/definitions/uint" + }, + "maxLength": { + "$ref": "#/definitions/uint" + }, + "pattern": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/format-" + }, + "minItems": { + "$ref": "#/definitions/uint" + }, + "maxItems": { + "$ref": "#/definitions/uint" + }, + "uniqueItems": { + "type": "boolean" + }, + "items": { + "$ref": "#/definitions/jso-items" + }, + "unit": { + "type": "string" + }, + "nullable": { + "type": "boolean" + }, + "sdfType": { + "$ref": "#/definitions/sdfType-" + }, + "contentFormat": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, + "properties": { + "type": { + "$ref": "#/definitions/type-" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "observable": { + "type": "boolean" + }, + "readable": { + "type": "boolean" + }, + "writable": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "label": { + "type": "string" + }, + "$comment": { + "type": "string" + }, + "sdfRef": { + "$ref": "#/definitions/sdf-pointer" + }, + "sdfRequired": { + "$ref": "#/definitions/pointer-list" + }, + "const": { + "$ref": "#/definitions/allowed-types" + }, + "default": { + "$ref": "#/definitions/allowed-types" + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "multipleOf": { + "type": "number" + }, + "minLength": { + "$ref": "#/definitions/uint" + }, + "maxLength": { + "$ref": "#/definitions/uint" + }, + "pattern": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/format-" + }, + "minItems": { + "$ref": "#/definitions/uint" + }, + "maxItems": { + "$ref": "#/definitions/uint" + }, + "uniqueItems": { + "type": "boolean" + }, + "items": { + "$ref": "#/definitions/jso-items" + }, + "unit": { + "type": "string" + }, + "nullable": { + "type": "boolean" + }, + "sdfType": { + "$ref": "#/definitions/sdfType-" + }, + "contentFormat": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, + "properties": { + "type": { + "type": "string", + "const": "object" + }, + "required": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "properties": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "observable": { + "type": "boolean" + }, + "readable": { + "type": "boolean" + }, + "writable": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "label": { + "type": "string" + }, + "$comment": { + "type": "string" + }, + "sdfRef": { + "$ref": "#/definitions/sdf-pointer" + }, + "sdfRequired": { + "$ref": "#/definitions/pointer-list" + }, + "const": { + "$ref": "#/definitions/allowed-types" + }, + "default": { + "$ref": "#/definitions/allowed-types" + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "multipleOf": { + "type": "number" + }, + "minLength": { + "$ref": "#/definitions/uint" + }, + "maxLength": { + "$ref": "#/definitions/uint" + }, + "pattern": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/format-" + }, + "minItems": { + "$ref": "#/definitions/uint" + }, + "maxItems": { + "$ref": "#/definitions/uint" + }, + "uniqueItems": { + "type": "boolean" + }, + "items": { + "$ref": "#/definitions/jso-items" + }, + "unit": { + "type": "string" + }, + "nullable": { + "type": "boolean" + }, + "sdfType": { + "$ref": "#/definitions/sdfType-" + }, + "contentFormat": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { - "type": "string", - "const": "object" + "type": "string" }, - "required": { + "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, - "properties": { - "$ref": "#/definitions/sdfData-sdfChoice-properties-" - }, - "sdfChoice": { - "$ref": "#/definitions/sdfData-sdfChoice-properties-" - }, "observable": { "type": "boolean" }, "readable": { "type": "boolean" }, "writable": { "type": "boolean" }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false - }, + } + ] + }, + "dataqualities": { + "anyOf": [ { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "$ref": "#/definitions/type-" }, - "enum": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "observable": { - "type": "boolean" - }, - "readable": { - "type": "boolean" - }, - "writable": { - "type": "boolean" + "sdfChoice": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "type": "string", "const": "object" }, "required": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "properties": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, - "enum": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "observable": { - "type": "boolean" - }, - "readable": { - "type": "boolean" - }, - "writable": { - "type": "boolean" + "sdfChoice": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false - } - ] - }, - "dataqualities": { - "anyOf": [ + }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { - "$ref": "#/definitions/type-" + "type": "string" }, "sdfChoice": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { - "type": "string", - "const": "object" + "$ref": "#/definitions/type-" }, - "required": { + "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, - "properties": { - "$ref": "#/definitions/sdfData-sdfChoice-properties-" - }, - "sdfChoice": { - "$ref": "#/definitions/sdfData-sdfChoice-properties-" - }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { - "$ref": "#/definitions/type-" + "type": "string", + "const": "object" + }, + "required": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "properties": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { - "type": "string", - "const": "object" - }, - "required": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "properties": { - "$ref": "#/definitions/sdfData-sdfChoice-properties-" + "type": "string" }, "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "const": { "$ref": "#/definitions/allowed-types" }, "default": { "$ref": "#/definitions/allowed-types" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "exclusiveMinimum": { "type": "number" }, "exclusiveMaximum": { "type": "number" }, "multipleOf": { "type": "number" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" }, "pattern": { "type": "string" }, "format": { "$ref": "#/definitions/format-" }, "minItems": { "$ref": "#/definitions/uint" }, "maxItems": { "$ref": "#/definitions/uint" }, "uniqueItems": { "type": "boolean" }, "items": { "$ref": "#/definitions/jso-items" }, "unit": { "type": "string" }, "nullable": { "type": "boolean" }, "sdfType": { "$ref": "#/definitions/sdfType-" }, "contentFormat": { "type": "string" } }, "additionalProperties": false } ] }, "allowed-types": { "anyOf": [ { "type": "number" }, { "type": "string" }, { "type": "boolean" }, { "type": "null" }, { "type": "array", "items": { "type": "number" } }, { "type": "array", "items": { "type": "string" } }, { "type": "array", "items": { "type": "boolean" } }, { "type": "object", "additionalProperties": { } + }, + { } ] }, "uint": { "type": "integer", "minimum": 0 }, "jso-items": { "anyOf": [ { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "type": "string", "enum": [ "number", "string", "boolean", "integer" ] }, "sdfChoice": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "description": { "type": "string" }, "$comment": { "type": "string" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "format": { "type": "string" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "type": "string", "const": "object" }, "required": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "properties": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "sdfChoice": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "description": { "type": "string" }, "$comment": { "type": "string" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "format": { "type": "string" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, + "properties": { + "type": { + "type": "string" + }, + "sdfChoice": { + "$ref": "#/definitions/sdfData-sdfChoice-properties-" + }, + "sdfRef": { + "$ref": "#/definitions/sdf-pointer" + }, + "description": { + "type": "string" + }, + "$comment": { + "type": "string" + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "format": { + "type": "string" + }, + "minLength": { + "$ref": "#/definitions/uint" + }, + "maxLength": { + "$ref": "#/definitions/uint" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "type": "string", "enum": [ "number", "string", "boolean", "integer" ] }, "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "description": { "type": "string" }, "$comment": { "type": "string" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "format": { "type": "string" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" } }, "additionalProperties": false }, { "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "properties": { "type": { "type": "string", "const": "object" }, "required": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "properties": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" }, "enum": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "description": { "type": "string" }, "$comment": { "type": "string" }, "minimum": { "type": "number" }, "maximum": { "type": "number" }, "format": { "type": "string" }, "minLength": { "$ref": "#/definitions/uint" }, "maxLength": { "$ref": "#/definitions/uint" } }, "additionalProperties": false + }, + { + "type": "object", + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, + "properties": { + "type": { + "type": "string" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "sdfRef": { + "$ref": "#/definitions/sdf-pointer" + }, + "description": { + "type": "string" + }, + "$comment": { + "type": "string" + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "format": { + "type": "string" + }, + "minLength": { + "$ref": "#/definitions/uint" + }, + "maxLength": { + "$ref": "#/definitions/uint" + } + }, + "additionalProperties": false } ] }, + "sdftype-name": { + "type": "string", + "pattern": "^[a-z][\\-a-z0-9]*$" + }, "actionqualities": { "type": "object", "properties": { "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "sdfInputData": { "$ref": "#/definitions/parameter-list" }, "sdfOutputData": { "$ref": "#/definitions/parameter-list" }, "sdfData": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" } }, + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "additionalProperties": false }, "parameter-list": { "$ref": "#/definitions/dataqualities" }, "eventqualities": { "type": "object", "properties": { "description": { "type": "string" }, "label": { "type": "string" }, "$comment": { "type": "string" }, "sdfRef": { "$ref": "#/definitions/sdf-pointer" }, "sdfRequired": { "$ref": "#/definitions/pointer-list" }, "sdfOutputData": { "$ref": "#/definitions/parameter-list" }, "sdfData": { "$ref": "#/definitions/sdfData-sdfChoice-properties-" } }, + "patternProperties": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + } + }, "additionalProperties": false }, "format-": { - "type": "string", - "enum": [ - "date-time", - "date", - "time", - "uri", - "uri-reference", - "uuid" + "anyOf": [ + { + "type": "string", + "const": "date-time" + }, + { + "type": "string", + "const": "date" + }, + { + "type": "string", + "const": "time" + }, + { + "type": "string", + "const": "uri" + }, + { + "type": "string", + "const": "uri-reference" + }, + { + "type": "string", + "const": "uuid" + }, + { + "type": "string" + } + ] + }, + "sdfType-": { + "anyOf": [ + { + "type": "string", + "const": "byte-string" + }, + { + "type": "string", + "const": "unix-time" + }, + { + "$ref": "#/definitions/sdftype-name" + } ] }, "sdfData-sdfChoice-properties-": { "type": "object", "additionalProperties": { "$ref": "#/definitions/dataqualities" } }, "type-": { "type": "string", "enum": [ "number", "string", "boolean", "integer", "array" ] }, - "sdfAction-": { + "sdfEvent-": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/actionqualities" + "$ref": "#/definitions/eventqualities" } }, - "sdfProperty-": { + "sdfAction-": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/propertyqualities" + "$ref": "#/definitions/actionqualities" } }, - "sdfEvent-": { + "sdfProperty-": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/eventqualities" + "$ref": "#/definitions/propertyqualities" } - }, - "sdfType-": { - "type": "string", - "enum": [ - "byte-string", - "unix-time" - ] } } } ]]></sourcecode> </section> <section anchor="jso-inspired"> <name>Data QualitiesinspiredInspired by json-schema.org</name> <t>This appendix is normative.</t> <t>Data qualities define data used in SDF affordances at an information model level. A popular way to describe JSON data at a data model level is proposed by a number of drafts on json-schema.org (which collectively are abbreviated JSO here); for reference to a popularversionversion, this appendix points to <xreftarget="JSO7"/>target="I-D.handrews-json-schema"/> and <xreftarget="JSO7V"/>.target="I-D.handrews-json-schema-validation"/>. As the vocabulary used by JSO is familiar to many JSON modelers, the present specification borrows some of the terms and ports their semantics to the information model level needed for SDF.</t> <t>The main data quality imported is the "<tt>type</tt>". In SDF, this can take one of six (text string) values, which are discussed in the following subsections (note that the JSO type "<tt>null</tt>" is not supported as a value of this data quality in SDF).</t> <t>The additional quality "<tt>const</tt>" restricts the data to one specific value (given as the value of the <tt>const</tt> quality).</t> <t>Similarly, the additional quality "<tt>default</tt>" provides data that can be used in the absence of the data (given as the value of the <tt>const</tt> quality); this is mainly documentary and not very well-defined for SDF as no process is defined that would add default values to an instance of some interaction data.</t> <t>Other qualities that are inspired by JSO are "<tt>$comment</tt>" and "<tt>description</tt>", both of which are also available in the information block.</t> <section anchor="type-number-type-integer"> <name>type "<tt>number</tt>", type "<tt>integer</tt>"</name> <t>The types "<tt>number</tt>" and "<tt>integer</tt>" are associated with floating point and integer numbers, as they are available in JSON. A type value of <tt>integer</tt> means that only integer values of JSON numbers can be used (note that <tt>10.0</tt> is an integer value, even if it is in a notation that would also allow non-zero decimal fractions).</t> <t>The additional data qualities "<tt>minimum</tt>", "<tt>maximum</tt>", "<tt>exclusiveMinimum</tt>", and "<tt>exclusiveMaximum</tt>" provide number values that serve as inclusive/exclusive lower/upper bounds for the number. (Note that the Boolean form of "<tt>exclusiveMinimum</tt>"/"<tt>exclusiveMaximum</tt>" found in earlier JSO drafts <xreftarget="JSO4V"/>target="I-D.fge-json-schema-validation"/> is not used.)</t> <t>The data quality "<tt>multipleOf</tt>" gives a positive number that constrains the data value to be an integer multiple of the number given. (Type "<tt>integer</tt>" can also be expressed as a "<tt>multipleOf</tt>" quality of value 1, unless another "<tt>multipleOf</tt>" quality is present.)</t> </section> <section anchor="type-string"> <name>type "<tt>string</tt>"</name> <t>The type "<tt>string</tt>" is associated with Unicode text stringvaluesvalues, as they can be represented in JSON.</t> <t>The length (as measured in characters, specifically Unicode scalar values) can be constrained by the additional data qualities "<tt>minLength</tt>" and "<tt>maxLength</tt>", which are inclusive bounds.</t> <t>(More specifically, Unicode text strings as defined in this specification are sequences of Unicode scalar values, the number of which is taken as the length of such a text string.</t> <t>The data quality "<tt>pattern</tt>" takes a string value that is interpreted as an <xref target="ECMA-262"/> regular expression in Unicode mode that constrains the string (note that these are not anchored by default, so unless <tt>^</tt> and <tt>$</tt> anchors are employed, ECMA-262 regular expressions match any string that <em>contains</em> a match). The JSO proposals acknowledge that regular expression support is rather diverse in various platforms, so the suggestion is to limit them to:</t> <!-- [rfced] Should "their complements" be placed on a separate bullet to follow the original pattern of this list? Original: * characters; * character classes in square brackets, including ranges; their complements; * simple quantifiers *, +, ?, and range quantifiers {n}, {n,m}, and {n,}; * grouping parentheses; * the choice operator |; * and anchors (beginning-of-input ^ and end-of-input $). Perhaps: * characters; * character classes in square brackets, including ranges; * their complements; * simple quantifiers *, +, ?, and range quantifiers {n}, {n,m}, and {n,}; * grouping parentheses; * the choice operator |; * and anchors (beginning-of-input ^ and end-of-input $). --> <ul spacing="compact"> <li> <t>characters;</t> </li> <li> <t>character classes in square brackets, including ranges; their complements;</t> </li> <li> <t>simple quantifiers <tt>*</tt>, <tt>+</tt>, <tt>?</tt>, and range quantifiers <tt>{n}</tt>, <tt>{n,m}</tt>, and <tt>{n,}</tt>;</t> </li> <li> <t>grouping parentheses;</t> </li> <li> <t>the choice operator <tt>|</tt>;</t> </li> <li> <t>and anchors (beginning-of-input <tt>^</tt> and end-of-input <tt>$</tt>).</t> </li> </ul> <t>Note that this subset is somewhat similar to the subset introduced by I-Regexps <xref target="RFC9485"/>, whichhoweverare anchored regularexpressions,expressions andwhichinclude certain backslash escapes for characters and character classes.</t> <t>The additional data quality "<tt>format</tt>" can take one of the following values. Note that, at an information model level, the presence of this data quality changes the type from being a simple text string to the abstract meaning of the format given (i.e., the format "date-time" is less about the specific syntax employed in <xref target="RFC3339"/> than about the usage as an absolute point in civil time).</t> <ul spacing="compact"> <li> <t>"<tt>date-time</tt>", "<tt>date</tt>", "<tt>time</tt>":An <xref target="RFC3339"/>A <tt>date-time</tt>, <tt>full-date</tt>, or<tt>full-time</tt>,<tt>full-time</tt> as defined in <xref target="RFC3339"/>, respectively.</t> </li> <li> <t>"<tt>uri</tt>", "<tt>uri-reference</tt>":An <xref target="STD66"/>A URI or URIReference,Reference as defined in <xref target="STD66"/>, respectively.</t> </li> <li> <t>"<tt>uuid</tt>":AnA Universally Unique Identifier (UUID) as defined in <xreftarget="RFC9562"/> UUID.</t>target="RFC9562"/>).</t> </li> </ul> </section> <section anchor="type-boolean"> <name>type "<tt>boolean</tt>"</name> <t>The type "<tt>boolean</tt>" can take the values "<tt>true</tt>" or "<tt>false</tt>".</t> </section> <section anchor="type-array"> <name>type "<tt>array</tt>"</name> <t>The type "<tt>array</tt>" is associated witharraysarrays, as they are available in JSON.</t> <t>The additional quality "<tt>items</tt>" gives the type that each of the elements of the array must match.</t> <t>The number of elements in the array can be constrained by the additional data qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>", which are inclusive bounds.</t> <t>The additional data quality "<tt>uniqueItems</tt>" gives a Boolean value that, if true, requires the elements to be all different.</t> </section> <section anchor="type-object"> <name>type "<tt>object</tt>"</name> <t>The type "<tt>object</tt>" is associated with maps, from strings to values, as they are available in JSON.</t> <t>The additional quality "<tt>properties</tt>" is a map the entries of which describe entries in the specified JSON map:Thethe key gives an allowable map key for the specified JSONmap,map and the value is a map with a named set of data qualities giving the type for the corresponding value in the specified JSON map.</t> <t>All entries specified in this way areoptional,optional unless they are listed in the value of the additional quality "<tt>required</tt>", which is an array of string values that give the key names of required entries.</t> <t>Note that the term "properties" as an additional quality for defining map entries is unrelated to sdfProperty.</t> <t>For example, to include information about the type of the event in the "overTemperatureEvent" of <xref target="example-req"/>, the sdfOutputData there could be defined as follows:</t> <figure anchor="example-obj-type"> <name>Usingobject typeObject Type with sdfOutputData</name> <sourcecode type="json"><![CDATA[ "sdfOutputData": { "type": "object", "properties": { "alarmType": { "sdfRef": "cap:#/sdfData/alarmTypes/quantityAlarms", "const": "OverTemperatureAlarm" }, "temperature": { "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData" } } } ]]></sourcecode> </figure> </section> <section anchor="implementation-notes"> <name>Implementationnotes</name>Notes</name> <t>JSO-based keywords are also used in the specification techniques of a number of ecosystems, but some adjustments may be required.</t> <t>For instance, <xref target="OCF"/> is based on Swagger2.02.0, which appears to be based on "draft-4" <xreftarget="JSO4"/><xref target="JSO4V"/>target="I-D.zyp-json-schema"/> <xref target="I-D.fge-json-schema-validation"/> (also called draft-5, but semantically intended to be equivalent to draft-4). The "<tt>exclusiveMinimum</tt>" and "<tt>exclusiveMaximum</tt>" keywords use the Boolean form there, so on import toSDFSDF, their values have to be replaced by the values of the respective "<tt>minimum</tt>"/"<tt>maximum</tt>" keyword, which arethemselvesthen removed; the reverse transformation applies on export.</t> </section> </section> <section anchor="composition-examples"> <name>Composition Examples</name> <t>This informative appendix contains two examples illustrating different composition approaches using the <tt>sdfThing</tt> quality.</t> <section anchor="outlet-strip-example"> <name>Outlet Strip Example</name> <figure anchor="exa-sdfthing-outlet-strip"> <name>Outlet Strip Example</name> <sourcecode type="json" name="example-sdfthing-outlet-strip.sdf.json"><![CDATA[ { "sdfThing": { "outlet-strip": { "label": "Outlet strip", "description": "Contains a number of Sockets", "sdfObject": { "socket": { "description": "An array of sockets in the outlet strip", "minItems": 2, "maxItems": 10 } } } } } ]]></sourcecode> </figure> </section> <section anchor="fridge-freezer-example"> <name>Refrigerator-Freezer Example</name> <figure anchor="exa-sdfthing-fridge-freezer"> <name>Refrigerator-Freezer Example</name> <sourcecode type="json" name="example-sdfthing-refrigerator-freezer.sdf.json"><![CDATA[ { "sdfThing": { "refrigerator-freezer": { "description": "A refrigerator combined with a freezer", "sdfProperty": { "status": { "type": "boolean", "description": "Indicates if the refrigerator-freezer is powered" } }, "sdfObject": { "refrigerator": { "description": "A refrigerator compartment", "sdfProperty": { "temperature": { "sdfRef": "#/sdfProproperty/temperature", "maximum": 8 } } }, "freezer": { "label": "A freezer compartment", "sdfProperty": { "temperature": { "sdfRef": "#/sdfProproperty/temperature", "maximum": -6 } } } } } }, "sdfProperty": { "temperature": { "description": "The temperature for this compartment", "type": "number", "unit": "Cel" } } } ]]></sourcecode> </figure> </section> </section> <section anchor="earlier"> <!-- [rfced] Does "earlier drafts" refer to earlier drafts of the I-D that became this RFC or earlier versions of SDF (defined elsewhere)? Perhaps this can be clarified? Current: Appendix E. Some Changes From Earlier Drafts --> <name>Some Changes From Earlier Drafts</name> <t>This appendix is informative.</t> <t>The present document provides the SDF base definition. Previous revisions of SDF have been in use for several years, and both significant collections of older SDF models and older SDF conversion tools are available today. This appendix provides a brief checklist that can aid in upgrading these to the standard.</t> <ul spacing="normal"> <li> <t>The quality <tt>unit</tt> was previously called <tt>units</tt>.</t> </li> <li> <t><tt>sdfType</tt> was developed out of a concept previously called <tt>subtype</tt>.</t> </li> <li> <t><tt>sdfChoice</tt> is the preferred way to represent JSO <tt>enum</tt> (only a limited form of which isretained),retained) and also the way to represent JSO <tt>anyOf</tt>.</t> </li> <li><t>the<t>The length of text strings (as used with <tt>minLength</tt>/<tt>maxLength</tt> constraints) was previously defined in bytes. It now is defined as the number of characters (Unicode scalar values, to be exact); a length in bytes is not meaningful unless bound to a specific encoding, which might differ from UTF-8 in some ecosystem mappings and protocol bindings.</t> </li> </ul> </section> <section numbered="false" anchor="list-of-figures"> <name>List of Figures</name> <dl spacing="compact" indent="11"> <dt><xref target="example1"/>:</dt> <dd> <t><xref format="title" target="example1"/></t> </dd> <dt><xref target="fig-class-2"/>:</dt> <dd> <t><xref format="title" target="fig-class-2"/></t> </dd> <dt><xref target="exobject"/>:</dt> <dd> <t><xref format="title" target="exobject"/></t> </dd> <dt><xref target="example-req"/>:</dt> <dd> <t><xref format="title" target="example-req"/></t> </dd> <dt><xref target="exa-sdfref"/>:</dt> <dd> <t><xref format="title" target="exa-sdfref"/></t> </dd> <dt><xref target="example-obj-type"/>:</dt> <dd> <t><xref format="title" target="example-obj-type"/></t> </dd> <dt><xref target="exa-sdfthing-outlet-strip"/>:</dt> <dd> <t><xref format="title" target="exa-sdfthing-outlet-strip"/></t> </dd> <dt><xref target="exa-sdfthing-fridge-freezer"/>:</dt> <dd> <t><xref format="title" target="exa-sdfthing-fridge-freezer"/></t> </dd> </dl> </section> <section numbered="false" anchor="list-of-tables"> <name>List of Tables</name> <dl spacing="compact" indent="11"> <dt><xref target="infoblockqual"/>:</dt> <dd> <t><xref format="title" target="infoblockqual"/></t> </dd> <dt><xref target="nssec"/>:</dt> <dd> <t><xref format="title" target="nssec"/></t> </dd> <dt><xref target="tbl-common-qualities"/>:</dt> <dd> <t><xref format="title" target="tbl-common-qualities"/></t> </dd> <dt><xref target="sdfdataqual2"/>:</dt> <dd> <t><xref format="title" target="sdfdataqual2"/></t> </dd> <dt><xref target="sdftype1"/>:</dt> <dd> <t><xref format="title" target="sdftype1"/></t> </dd> <dt><xref target="sdfobjqual"/>:</dt> <dd> <t><xref format="title" target="sdfobjqual"/></t> </dd> <dt><xref target="sdfpropqual"/>:</dt> <dd> <t><xref format="title" target="sdfpropqual"/></t> </dd> <dt><xref target="sdfactqual"/>:</dt> <dd> <t><xref format="title" target="sdfactqual"/></t> </dd> <dt><xref target="sdfevqual"/>:</dt> <dd> <t><xref format="title" target="sdfevqual"/></t> </dd> <dt><xref target="sdfthingqual"/>:</dt> <dd> <t><xref format="title" target="sdfthingqual"/></t> </dd> <dt><xref target="mediatypereg"/>:</dt> <dd> <t><xref format="title" target="mediatypereg"/></t> </dd> <dt><xref target="contentformatreg"/>:</dt> <dd> <t><xref format="title" target="contentformatreg"/></t> </dd> <dt><xref target="tab-quality-names"/>:</dt> <dd> <t><xref format="title" target="tab-quality-names"/></t> </dd> </dl> </section> <section numbered="false" anchor="acknowledgements"> <name>Acknowledgements</name> <t>This specification is based on work by the One Data Model group.</t> </section> <section anchor="contributors" numbered="false" toc="include" removeInRFC="false"> <name>Contributors</name> <contact initials="J." surname="Romann" fullname="Jan Romann"> <organization>Hochschule Emden/Leer</organization> <address> <postal> <country>Germany</country> </postal> <email>jan.romann@hs-emden-leer.de</email> </address> </contact> <contact initials="W." surname="van der Beek" fullname="Wouter van der Beek"> <organization>Cascoda Ltd.</organization> <address> <postal> <street>Threefield House</street> <street>Threefield Lane</street> <city>Southampton</city> <country>United Kingdom</country> </postal> <email>w.vanderbeek@cascoda.com</email> </address> </contact> </section> </back> <!--##markdown-source: H4sIAAAAAAAAA+y9+3rbVpYv+D+eAkP3TKgUSVmy7NhyqjqKbHepy5e0rZxU V3VOESRBCmUSYABQl8ju75s3OX+cJ5nzJvMks657rw2AkuwkNWfmO/66KxQJ 7Ovaa6/rbw2Hw+j8MH4QTYtZli8O4009Hz6O7sXV+WKYzYbTZZrkm/VhXJeb NIrOH1yulvvlfHoYxXGdTJbp3yZFOUvL6jBeZouzOorqrF6mh/Ef4IF36SrJ 62waP0vnWZ7VWZHHL4pyldRx/92zFzvxvCjjZ0mdxEk+i0/yOi2TKT5VxcU8 Pj2DAVVRMpmUKQwRXoC3tra4E82KaZ6soOtZmczrYZbCTJJqNh/i/y+TOq3q aAr/WRTl1WFc1TOYc16lebWpZHrVZrLKqgoara/W0NDJ89MXUZSUaXIYH63X ywxex9FFF0X5flEWuC5HMK7ofXoFX80OeQ55Wg+f4RhgvdJ8k+JaxbE+f9Oq 3GE94j72uENNrpJseRjjHL/B2Y6KcsFdZfXZZnIY0xJcLGgVdnGcUbKpz4oS BzSMebFeZdOzJF3Gfyoq6I5eh2YO4z+dHsfHsBBlsYyPvqXvq7pM0/ow3n9y sPcwPlrCtq+LLK/jt0UyoyemWQ1L++2ymL6vJptyMYiPj/iHYgZ9ffHk4cO9 gy/kmw00Dk9//44fWZ8VOTzT+93e8Kv7Xw0f3t8fPtx78KhHP6Y81RUP9u/F Wf6exvvNAn8YTYsVPQaDhSbSWVYXpZnjcVLCw3n8La5ynvtJfp9n50C7Wf0/ /nsdf1umK3jo9C8n+kBSTbPMPJWkrad0Tb6D4cyT6Vn84MH9g4P7djXoBbMK z4b7jx88fBKuwr+kOLQruxK/O3gyPNjfG+7vPR4+evBkf8+uxDSZFN/UP2du z7dM/ajM4j+l5f/473lq5v28zKZVVeRmmP9alOdJZTfr/v7B/v3GZr3I8iXQ ph1JUmaj90Co0ME3qbRLGzJF6skmmzokuH9NciCYcB/+WEzPqunZZpnGz1ez NN99mQotSid/T/JRSS99c1YNU3xmuIRnRrN02zpqfz8UGyCU+EN8Dh0Dycbf pul73/UxbHIxS+KX9Wxkd5Q+D+HQwV/zLF3OYJCbKm1//RJmbtbxHXR3lqzW ta6uo3M46uks/hMc4pmQq0zuYgRDg5FNYGDfTHk8tIJRTmwBqA+Hc3L0+mgE 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[rfced] Please review each artwork element and let us know if any should be marked as sourcecode (or another element) instead. We updated Figure 5 from artwork to sourcecode. Please confirm that this is correct. In addition, please consider whether the "type" attribute of any sourcecode element should be set and/or has been set correctly. The current list of preferred values for "type" is available at <https://www.rfc-editor.org/rpc/wiki/doku.php?id=sourcecode-types>. If the current list does not contain an applicable type, feel free to suggest additions for consideration. Note that it is also acceptable to leave the "type" attribute not set. --> <!-- [rfced] We note that these terms appear both with and without <tt> tags. Please review each instance of the terms below and ensure that they appear in the document as desired. If these terms should be formatted consistently or follow a specific pattern, please let us know. <tt>absolute-URI</tt> <tt>array</tt> <tt>boolean</tt> <tt>curie</tt> <tt>date-time</tt> (also appears in quotes) <tt>defaultNamespace</tt> <tt>description</tt> <tt>enum</tt> <tt>false</tt> <tt>features</tt> (also appears in quotes) <tt>format</tt> <tt>info</tt> <tt>integer</tt> <tt>items</tt> <tt>json-schema.org</tt> <tt>label</tt> <tt>length</tt> <tt>named-sdq</tt> <tt>namespace</tt> <tt>null</tt> <tt>number</tt> <tt>object</tt> (also appears in quotes) <tt>pattern</tt> (also appears in quotes) <tt>properties</tt> (also appears in quotes) <tt>referenceable-name</tt> (also appears in quotes) <tt>required</tt> <tt>sdfAction</tt> <tt>sdfChoice</tt> <tt>sdfData</tt> <tt>sdfEvent</tt> <tt>sdfObject</tt> <tt>sdfOutputData</tt> <tt>sdfProperty</tt> <tt>sdfRef</tt> <tt>sdfRequired</tt> (also appears in quotes) <tt>sdfThing</tt> <tt>sdf</tt> <tt>sdfType</tt> <tt>string</tt> <tt>toggle</tt> (also appears in quotes) <tt>true</tt> <tt>type</tt> <tt>unit(s)</tt> <tt>value</tt> --> <!-- [rfced] Please review the following terms and let us know if/how we should update for consistency. a) Capitalization affordance vs. Affordance boolean vs. Boolean CURIE vs. curie JSON pointer vs. JSON Pointer Properties vs. properties quality names vs. Quality Names SDF model vs. SDF Model b) Spacing data qualities vs. dataqualities data quality vs. data quality c) Other base SDF vs. SDF base --> <!-- [rfced] FYI - We have added expansions for abbreviations upon first use per Section 3.6 of RFC 7322 ("RFC Style Guide"). Please review each expansion in the document carefully to ensure correctness. --> <!-- [rfced] Please review the "Inclusive Language" portion of the online Style Guide <https://www.rfc-editor.org/styleguide/part2/#inclusive_language> and let us know if any changes are needed. Updates of this nature typically result in more precise language, which is helpful for readers. Note that our script did not flag any words in particular, but this should still be reviewed as a best practice. --> </rfc>