Skip to main content

CoAP High-Level State Option Extension
draft-mietz-core-coap-state-option-00

The information below is for an old version of the document.
Document Type
This is an older version of an Internet-Draft whose latest revision state is "Expired".
Author Richard Mietz
Last updated 2013-06-09
Replaces draft-mietz-coap-state-option
RFC stream (None)
Formats
Stream Stream state (No stream defined)
Consensus boilerplate Unknown
RFC Editor Note (None)
IESG IESG state I-D Exists
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-mietz-core-coap-state-option-00
core                                                            R. Mietz
Internet-Draft                                     University of Luebeck
Intended status: Standards Track                           June 10, 2013
Expires: December 12, 2013

                 CoAP High-Level State Option Extension
                 draft-mietz-core-coap-state-option-00

Abstract

   CoAP is a RESTful application protocol for constrained devices which
   are often equipped with sensors measuring a physical phenomenon such
   as temperature on a precise scale.  These sensor values are made
   available by a resource on the CoAP endpoint.  However, for many
   applications it is not necessary to have the full precision a sensor
   can provide.  It's often even enough to only have some high-level
   states instead of raw values.  This document presents a new option
   for CoAP to dynamically create new resources for a sensor which
   provides user-defined high-level states instead of raw sensor values.

Status of this Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at http://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on December 12, 2013.

Copyright Notice

   Copyright (c) 2013 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect

Mietz                   Expires December 12, 2013               [Page 1]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
     1.1.  Motivation . . . . . . . . . . . . . . . . . . . . . . . .  3
     1.2.  Terminology  . . . . . . . . . . . . . . . . . . . . . . .  4
   2.  High-Level State Option Extension  . . . . . . . . . . . . . .  4
     2.1.  High-level State Option Definition . . . . . . . . . . . .  4
     2.2.  Using the High-level State Option  . . . . . . . . . . . .  5
       2.2.1.  Creating State Resources . . . . . . . . . . . . . . .  5
       2.2.2.  Querying State Resources . . . . . . . . . . . . . . .  9
       2.2.3.  Deleting States Resources  . . . . . . . . . . . . . . 10
   3.  Examples of Usage  . . . . . . . . . . . . . . . . . . . . . . 10
     3.1.  Example 1  . . . . . . . . . . . . . . . . . . . . . . . . 10
     3.2.  Example 2  . . . . . . . . . . . . . . . . . . . . . . . . 13
   4.  Security Considerations  . . . . . . . . . . . . . . . . . . . 15
   5.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 16
   6.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 16
   7.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 16
     7.1.  Normative reference  . . . . . . . . . . . . . . . . . . . 16
     7.2.  Informative Reference  . . . . . . . . . . . . . . . . . . 16
   Appendix A.  XML Schema for XML Serialization of One State
                Resources . . . . . . . . . . . . . . . . . . . . . . 16
   Appendix B.  XML Schema for XML Serialization of Multiple
                State Resources . . . . . . . . . . . . . . . . . . . 18
   Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 19

Mietz                   Expires December 12, 2013               [Page 2]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

1.  Introduction

   This document adds a new option to the Constrained Application
   Protocol (CoAP): High-Level State.

1.1.  Motivation

   The Constrained Application Protocol [I-D.ietf-core-coap] (CoAP) is a
   lightweight efficient variant of the well-known Hypertext Transfer
   Protocol specifically designed for devices with limited resources
   such as small memory, little processing power, and constrained energy
   capacities.  The main area of operation of CoAP is on wireless sensor
   nodes, i.e., wireless devices equipped with sensors to monitor
   environmental parameters such as temperature, air quality, or
   humidity.  Hence, not only static metadata but also sensor values are
   retrieved by users via CoAP.  The change frequency of measured sensor
   values depends on the one hand on the accuracy of the sensor but on
   the other hand on the (physical) property the sensor measures.  It
   therefore may vary from milliseconds up to minutes, hours, or even
   days.  A user interested in a parameter needs to request the current
   value periodically to keep track of changes.  However, periodic
   querying can consume a good portion of the total amount of energy
   available and results in the quick depletion of a device's energy.
   Additionally, many requests might be unnecessary because the sensor
   value did not change compared to the last request.  For that reason,
   CoAP observe [I-D.ietf-core-observe] introduces a mechanism to
   register interest in a resource much like with publish-subscribe
   systems.  A CoAP server then only sends a response whenever the
   sensor value changes.  As a result, only a reduced number of messages
   are required to keep track of the sensor readings.

   Although the CoAP observe option can save resources, it might happen
   that the number of messages and thus, resource consumption even
   increases.  This happens if the sensor value changes very often
   resulting in frequent update messages.  Besides that, some clients
   may not be interested in raw precise sensor values but in a range a
   sensor values falls into.  We call this range a high-level state
   because it categorizes the sensor value.  So, instead of being
   interested if a room has 21.9 oC or 22.1 oC, the user might only want
   to know if it is "warm" in that room.  The number of states for an
   environmental parameter is typically low.  Accordingly, states change
   with much lower frequency as the underlying raw sensor values.
   Consequently, this leads to fewer responses when using CoAP observe.

   The High-Level State option allows creating, querying and deleting
   high-level state resources for sensor resources on CoAP servers with
   the known CoAP request methods GET, POST, and DELETE.  The user can
   define which sensor values are mapped to which high-level state.

Mietz                   Expires December 12, 2013               [Page 3]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   Additionally, he can retrieve descriptions of already existing high-
   level state resources to reuse them.

1.2.  Terminology

   The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in RFC 2119 [RFC2119].

   This document uses terms of the Constrained Application Protocol as
   defined in the terminology section of [I-D.ietf-core-coap].

   Additionally, this specification defines the following terms:

   High-level state:

      In contrast to a raw sensor reading a high-level state combines a
      number of sensor outputs under a new descriptive term given as a
      string.

   High-level state resource:

      A CoAP resource, which returns different high-level states.  State
      resource will be used synonymously with the term high-level state
      resource.

2.  High-Level State Option Extension

2.1.  High-level State Option Definition

   +------+---+---+---+---+------------+--------+----------+---------+
   | Type | C | U | N | R |   Name     | Format |  Length  | Default |
   +------+---+---+---+---+------------+--------+----------+---------+
   | TBD  | - | - | - | x | High-Level | (see   |  1-257 B | (none)  |
   |      |   |   |   |   |   State    | below) |          |         |
   +------+---+---+---+---+------------+--------+----------+---------+

               Figure 1: High-Level State Option Definition

   The High-Level State Option is "elective" and "proxy-safe".  It is
   "repeatable".  Hence, the High-Level State Option can occur more than
   once.  The use of repetition will be described in the following
   sections.

   This Option can only be present in requests.  Additionally, it has
   different semantics when used with different request methods.  These

Mietz                   Expires December 12, 2013               [Page 4]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   are described in the following sections.

   The value carried in the Option has the following general format:

                           0 1 2 3 4 5 6 7
                          +-+-+-+-+-+-+-+-+
                          | T |     -     |
                          +-+-+-+-+-+-+-+-+
                          |    Optional   |
                          +     Values    +
                                 ...
                          + (0-257 bytes) +
                          |               |
                          +-+-+-+-+-+-+-+-+

                         Figure 2: General format

   T (TYPE): The value of the TYPE field is a 2 bit integer.  If used in
   POST requests, it indicates the value format after the first byte.
   If used in GET requests, it specifies what representation a client
   expects in response to that request.  Further details are discussed
   in Section 2.2.1 and Section 2.2.2 about the creation respectively
   querying of state resources.

   The bits 2-7 are unused and MUST be ignored by the server.

2.2.  Using the High-level State Option

   The semantics of the Option depend on the used CoAP request method.
   In short, POST and DELETE create and remove state resources while GET
   is used to retrieve the state or a description of existing state
   resources.

2.2.1.  Creating State Resources

   To create a new state resource for a sensor resource, the client has
   to POST a request to the Uri-Path of the sensor.  The server MUST
   create the state resource as a subresource of the sensor resource.

   The output of most sensors is on a continuous numerical scale.
   However, some sensors output string or Boolean data types (true/
   false respectively 1/0).  The client should be able to map each of
   these data types to high-level states.  For numerical values, the
   client should be able to specify mappings from intervals to states
   and for strings it should be able to map one or several different
   strings to a state.  Boolean values can be easily mapped by using
   either the string mapping if the output is true or false or the
   numerical mapping if the output is 1 or 0.  Hence, two formats for

Mietz                   Expires December 12, 2013               [Page 5]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   the Option are available.

   The used format is indicated by the TYPE field.  Figure 3 shows the
   data types of a sensor output along with the integer used for the
   TYPE field and the format which is assumed to follow.  Boolean is not
   listed because, as argued before, it can be mapped with the integer
   or string type.

                  +-----------+------+--------+
                  | Data type | TYPE | Format |
                  +-----------+------+--------+
                  | integer   |   0  |   1    |
                  | float     |   1  |   1    |
                  | string    |   2  |   2    |
                  +-----------+------+--------+

                          Figure 3: Format types

   The number of bytes used for values in the different Option formats
   is given in Figure 4.  Floats are encoded in Single-precision
   floating-point format as defined in [IEEE754].  One Option defines
   one state.  Therefore, by repeating the High-Level State Option
   several states can be defined.

                  +-----------+----------------+
                  | Data type | Length (bytes) |
                  +-----------+----------------+
                  | integer   |       2        |
                  | float     |       4        |
                  | string    |     0-128      |
                  +-----------+----------------+

                        Figure 4: Data type lengths

Mietz                   Expires December 12, 2013               [Page 6]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   Format 1 is used for a mapping of an interval of numerical values to
   a state.  It consists of a numerical lower and a numerical upper
   bound as well as a string giving the state name.  The lower bound is
   inclusive while the upper bound is exclusive.  This allows defining
   consecutive, continuous, non-intersecting intervals.

                           0 1 2 3 4 5 6 7
                          +-+-+-+-+-+-+-+-+
                          | T |     -     |
                          +-+-+-+-+-+-+-+-+
                          |  Lower Bound  |
                          +    (incl.)    +
                                 ...
                          +  (2-4 bytes)  +
                          |               |
                          +-+-+-+-+-+-+-+-+
                          |  Upper Bound  |
                          +    (excl.)    +
                                 ...
                          +  (2-4 bytes)  +
                          |               |
                          +-+-+-+-+-+-+-+-+
                          |               |
                          +     State     +
                                 ...
                          + (0-128 bytes) +
                          |               |
                          +-+-+-+-+-+-+-+-+

             Figure 5: Format 1: Used for an interval mapping

Mietz                   Expires December 12, 2013               [Page 7]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   Format 2 is to map a string to a state.  Whenever the string output
   of the sensor matches the string which is given as the first
   parameter the string given as the second parameter is the current
   state.

                          0 1 2 3 4 5 6 7
                          +-+-+-+-+-+-+-+-+
                          | T |     -     |
                          +-+-+-+-+-+-+-+-+
                          |               |
                          +     Output    +
                                 ...
                          + (0-128 bytes) +
                          |               |
                          +-+-+-+-+-+-+-+-+
                          |               |
                          +     State     +
                                 ...
                          + (0-128 bytes) +
                          |               |
                          +-+-+-+-+-+-+-+-+

               Figure 6: Format 2: Used for a string mapping

   The server MUST ignore payload enclosed in the request.

   If the server successfully created the state resource serving the
   defined states, it MUST send a response with response code 2.01
   (Created) and the Location-Path Option which gives the relative Uri-
   Path for the newly created resource.  The Uri-Path of the created
   resource can be an arbitraly allowed string.  However, it is
   RECOMMENDED to use short Uri-Paths.

   As already mentioned, by repeating the Option, several states can be
   defined.  However, if the Option is repeated with different values
   for the TYPE field, the server MUST NOT process the request, and MUST
   send a response with response code 4.02 (Bad Option).

   If the upper bound of an interval is smaller than or equal the lower
   bound of that interval, the server MUST NOT process the request, and
   MUST send a response with response code 4.02 (Bad Option).

   Due to ambiguity, it is forbidden to define different states for the
   same value.  Hence, if a numerical mapping is used and if at least
   one intersection of any two intervals is non-empty, the server MUST
   NOT process the request, and MUST send a response with response code
   4.02 (Bad Option).  The same holds, if a string mapping is used and
   the same string is mapped to different states.

Mietz                   Expires December 12, 2013               [Page 8]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   In the case that a client requests creation of a state resource with
   exactly same mappings and states as an already existing one, the
   server SHOULD send a response with response code 2.05 (Content) with
   the Uri-Path of the existing state resource as payload instead of
   creating another resource with the same semantics.  Implementers must
   be aware that state resources can be deleted anytime.  Accordingly,
   if a state resource is used by several clients and one deletes it,
   the other clients are not aware of that.  Contrary, creating state
   resources with same semantics for each client, consumes more
   resources.

   If the server is not able to create the state resource for the given
   sensor resource, e.g., because of insufficient resources, it MUST
   send a response with response code 5.03 (Service Unavailable).  The
   server SHOULD include a payload indicating the reason for not
   creating the state resource.

   If a client requests to create a state resource for a non-sensor
   resource, the server MUST NOT process the request and MUST send a
   response with response code 4.03 (Forbidden).

   If the TYPE of a request is not matching the data type outputted by
   the sensor, the server SHOULD reject the request and SHOULD send a
   response with response code 4.02 (Bad Option).

2.2.2.  Querying State Resources

   The current state of a state resource can be retrieved by a normal
   GET-request without the High-Level State Option present in the
   request.  However, by including the Option, the client can control
   the data which should be returned.  The type of data that the server
   should return is indicated by the TYPE field in the request.
   Figure 7 gives an overview of all available T values.

                         +--------------+-----+
                         |       T      | No. |
                         +--------------+-----+
                         | State        |  0  |
                         | State Number |  1  |
                         | Description  |  2  |
                         +--------------+-----+

                         Figure 7: Response types

   If T = 0, the server MUST return the current state.  With T = 1 an
   integer representing the state MUST be returned by the server.  The
   integer is determined as follows: in each state resource creation

Mietz                   Expires December 12, 2013               [Page 9]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   process upon a POST-request the states MUST be enumerated starting
   with 0 by their order of appearance in the High-Level State Options.
   If T = 2 the server MUST return a description of the state resource
   describing the mappings and the appropriate states.  An XML Schema
   for the XML format is given in Appendix A.  If there is no defined
   state for a sensor value, i.e., there is no mapping for this value,
   the server MUST return the state "undefined" if T = 0 and -1 if T =
   1.

   A list of all available state resource of a sensor resources can be
   retrieved by sending a GET-request with High-Level-State Option to
   the sensor resource with T = 2 included.  The xml format the server
   MUST return is defined by the XML Schema in Appendix B.  All other
   requests with the High-Level State Option to a sensor resource SHOULD
   be ignored by the server.

2.2.3.  Deleting States Resources

   If a client wants to remove a state resource, it has to send a DELETE
   message to the state resource.  The server MUST delete the state
   resource and a "2.02 (Deleted) response code SHOULD be used on
   success or in case the resource did not exist before the request" as
   stated in Section 5.8.4 in [I-D.ietf-core-coap].

3.  Examples of Usage

   In the following sections two examples show how the high-level state
   option is used to create, query, and delete state resources.

3.1.  Example 1

   Consider four users who want to retrieve data from a temperature
   sensor.  However, they are not interested in the raw values but high-
   level states.  Hence, they want to create state resources on the
   server.  The parameters of the High-Level State Option in the
   examples are T and the appropriate optional values as described in
   Section 2.2.

Mietz                   Expires December 12, 2013              [Page 10]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   User 1 is the first to communicate with the CoAP server.  He wants to
   have two states, namely a "cold" and a "warm" state, where the first
   is defined as temperature between -50 oC and 20 oC and the second all
   values which are between 20 oC and 50 oC.  For that, a POST-request
   with the bounds is send to the server:

          Client Server
            |      |
            |      |
            +----->|           Header: POST
            | POST |            Token: 0x06
            |      |         Uri-Path: "temp"
            |      | High-Level State: "1 -50.0 20.0 cold"
            |      | High-Level State: "1 20.0 50.0 warm"
            |      |
            |<-----+           Header: 2.01 Created
            | 2.01 |            Token: 0x06
            |      |    Location-Path: x42y
            |      |

        Figure 8: User 1 creating a state resource with two states

   The server answers with a response code of 2.01 (Created) and a
   Location-Path indicating that a state resource, which can serve the
   two desired high-level states, is now available under the given path.

   Second, the next user wants to have four states ("cold", "moderate",
   "warm", and "hot") with bounds of -50 oC, 0 oC, 10 oC, 25 oC, and 50
   oC.  The communication to create these states looks as follows:

          Client Server
            |      |
            |      |
            +----->|           Header: POST
            | POST |            Token: 0x09
            |      |         Uri-Path: "temp"
            |      | High-Level State: "1 -50.0 0.0 cold"
            |      | High-Level State: "1 0.0 10.0 moderate"
            |      | High-Level State: "1 10.0 25.0 warm"
            |      | High-Level State: "1 25. 50 hot"
            |      |
            |<-----+           Header: 2.01 Created
            | 2.01 |            Token: 0x09
            |      |    Location-Path: 1ee7
            |      |

             Figure 9: User 2 creating another state resource

Mietz                   Expires December 12, 2013              [Page 11]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   Afterwards, the server has two state resources for the sensor
   resource.  The one serves two states and the other one which serves
   four states.

   Also the third user wants to create a high-level resource.  By
   chance, he requests the same states and bounds as the first user
   which can be seen in the POST-request:

          Client Server
            |      |
            |      |
            +----->|           Header: POST
            | POST |            Token: 0x19
            |      |         Uri-Path: "temp"
            |      | High-Level State: "1 -50.0 20.0 cold"
            |      | High-Level State: "1 20.0 50.0 warm"
            |      |
            |<-----+           Header: 2.05 Content
            | 2.05 |            Token: 0x19
            |      |    Location-Path: x42y
            |      |

      Figure 10: Creation of a State Resource with Same Semantics as
                      Already Existing State Resource

   Consequently, the response is different too the one sent to user 1.
   The response code is 2.04 (Changed) and the Location-Path Option
   gives the path of the already existing resource.

   The last user finally sends his POST-request to create another
   resource with three states:

          Client Server
            |      |
            |      |
            +----->|           Header: POST
            | POST |            Token: 0x83
            |      |         Uri-Path: "temp"
            |      | High-Level State: "1 -60.0 12.3 cold"
            |      | High-Level State: "1 12.3 21.9 medium"
            |      | High-Level State: "1 21.9 72.0 warm"
            |      |
            |<-----+           Header: 5.03 Service Unavailable
            | 5.03 |            Token: 0x83
            |      |          Payload: "Already too many resources"
            |      |

    Figure 11: Failing of State Resource Creation due to Low Resources

Mietz                   Expires December 12, 2013              [Page 12]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   Unfortunately, the server rejected to create a new resource due to
   insufficient resources which is indicated by the response.  Because
   of that the user sent another request to retrieve a list of already
   available state resources:

          Client Server
            |      |
            |      |
            +----->|           Header: GET
            | GET  |            Token: 0x84
            |      |         Uri-Path: "temp"
            |      |           Accept: application/json
            |      | High-Level State: 2
            |      |
            |      |
            |<-----+           Header: 2.05 Content
            | 2.05 |            Token: 0x84
            |      |          Payload: "{res:{r:[{
            |      |                    p:'x42y',
            |      |                    num:[{l:-50,h:20,s:'cold'},
            |      |                       {l:20,h:50,s:'warm'}]},{
            |      |                    p:'1ee7',
            |      |                    num:[{l:-50,h:0,s:'cold'},
            |      |                       {l:0,h:10,s:'moderate'},
            |      |                       {l:10,h:25,s:'warm'},
            |      |                       {l:25,h:50,s:'hot'}]}]}}"
            |      |

          Figure 12: Retrieving List of Existing State Resources

   With this list of JSON-encoded state resource the user has the
   ability to decide if he wants to use one of the existing state
   resources.

3.2.  Example 2

   In the second example, we consider a sensor which outputs strings
   describing the current weather and a user who first wants to use a
   string mapping to create a state resource for the weather sensor.
   Afterwards, he queries the state resource and finally deletes it.
   The output range of the sensor is "rainy", "cloudy", "sunny", and
   "foggy".

Mietz                   Expires December 12, 2013              [Page 13]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   The client sends a POST-request with a string mapping to create the
   two states "home" and "beach".

          Client Server
            |      |
            |      |
            +----->|           Header: POST
            | POST |            Token: 0x06
            |      |         Uri-Path: "weather"
            |      | High-Level State: "2 rainy home"
            |      | High-Level State: "2 cloudy home"
            |      | High-Level State: "2 foggy home"
            |      | High-Level State: "2 sunny beach"
            |      |
            |<-----+           Header: 2.01 Created
            | 2.01 |            Token: 0x06
            |      |    Location-Path: mr21
            |      |

               Figure 13: The User Creates a State Resource

   After creation of the state resource, he retrieves the current state
   by sending a GET-request.

          Client Server
            |      |
            |      |
            +----->|           Header: GET
            | GET  |            Token: 0x09
            |      |         Uri-Path: "weather/mr21"
            |      | High-Level State: "0"
            |      |
            |<-----+           Header: 2.05 Content
            | 2.05 |            Token: 0x83
            |      |          Payload: "beach"
            |      |

              Figure 14: The User Retrieves the Current State

Mietz                   Expires December 12, 2013              [Page 14]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   Because it is good weather, the user decides to go to the beach.  But
   before, he releases the resources on the server by deleting the state
   resource.

          Client Server
            |        |
            |        |
            +------->|           Header: DELETE
            | DELETE |            Token: 0x09
            |        |         Uri-Path: "weather/mr21"
            |        |
            |<-------+           Header: 2.02 Deleted
            |  2.05  |            Token: 0x83
            |        |

              Figure 15: The User Retrieves the Current State

4.  Security Considerations

   PUT operations, often used for updates, in conjunction with the High-
   Level State Option are forbidden.  Hence, the server MUST NOT process
   such requests and MUST respond with a response code of 4.05 (Method
   not allowed).  Updates of state resources can lead to unexpected
   behavior of clients if several clients use the same state resource.
   If one client is updating mappings or states of a state resource,
   other clients which are not aware of the update could end up in
   abnormal behavior because they cannot handle the unexpected results.
   For the same reason, a server SHOULD NOT reuse Uri-Paths of deleted
   state resources.

   Depending on the implementation and the remaining resources of the
   server, creation of state resources can consume a considerable amount
   of resources.  However, this is true for all resource creations and
   not limited to the presented new High-Level State Option.  Anyway,
   implementers SHOULD be aware of this fact and consider
   countermeasures such as limiting the number of state resources which
   can be created, limiting the number of state resource creation
   requests per client, or to introduce a duration after a successful
   state resource creation in which further requests are rejected.

Mietz                   Expires December 12, 2013              [Page 15]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

5.  IANA Considerations

   The IANA is requested to add the following "CoAP Option Numbers"
   entry as per Section 12.2 of [I-D.ietf-core-coap]:

   +--------+------------------+-----------------------------+
   | Number | Name             | Reference                   |
   +--------+------------------+-----------------------------+
   |  TBD   | High-Level State | Section 2 of this document  |
   +--------+------------------+-----------------------------+

6.  Acknowledgements

   Thanks to Lukas Ruge, Dennis Pfisterer, Kay Roemer and Philipp
   Abraham for proof-reading, helpful comments and discussions that have
   helped to shape this document.

7.  References

7.1.  Normative reference

   [I-D.ietf-core-coap]
              Shelby, Z., Hartke, K., and C. Bormann, "Constrained
              Application Protocol (CoAP)", draft-ietf-core-coap-16
              (work in progress), May 2013.

   [IEEE754]  Institute of Electrical and Electronics Engineers (IEEE),
              "754-2008  -  IEEE Standard for Floating-Point
              Arithmetic", August 2008.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

7.2.  Informative Reference

   [I-D.ietf-core-observe]
              Hartke, K., "Observing Resources in CoAP",
              draft-ietf-core-observe-08 (work in progress),
              February 2013.

Appendix A.  XML Schema for XML Serialization of One State Resources

Mietz                   Expires December 12, 2013              [Page 16]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

   <?xml version="1.0" encoding="utf-8"?>
   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns="http://www.example.com/state-option"
              targetNamespace="http://www.example.com/state-option"
              elementFormDefault="qualified"
              attributeFormDefault="unqualified">

    <!-- To describe a state resources -->
    <xs:element name="r" type="resource"/>

    <!-- To describe the mappings of a state resource along
         with the uri-path-->
    <xs:complexType name="resource">
     <xs:sequence>
      <xs:choice>
       <xs:element name="num" type="num_map" maxOccurs="unbounded"/>
       <xs:element name="str" type="string_map" maxOccurs="unbounded"/>
      </xs:choice>
     </xs:sequence>
    </xs:complexType>

   <!-- To describe a numerical mapping with lower bound,
        upper bound and state -->
    <xs:complexType name="num_map">
     <xs:sequence>
      <xs:sequence maxOccurs="unbounded">
       <xs:element name="l" type="xs:float"/>
       <xs:element name="h" type="xs:float"/>
      </xs:sequence>
      <xs:element name="s" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>

    <!-- To describe a string mapping with
         one or more strings and state -->
    <xs:complexType name="string_map">
     <xs:sequence>
      <xs:element name="str" type="xs:string" maxOccurs="unbounded"/>
      <xs:element name="s" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>

   </xs:schema>

Mietz                   Expires December 12, 2013              [Page 17]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

Appendix B.  XML Schema for XML Serialization of Multiple State
             Resources

   <?xml version="1.0" encoding="utf-8"?>
   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns="http://www.example.com/state-option"
              targetNamespace="http://www.example.com/state-option"
              elementFormDefault="qualified"
              attributeFormDefault="unqualified">

    <xs:element name="res" type="res"/>

    <!-- To describe one or more state resources -->
    <xs:complexType name="res">
     <xs:sequence>
      <xs:element name="r" type="resource" maxOccurs="unbounded"/>
     </xs:sequence>
    </xs:complexType>

    <!-- To describe the mappings of a state resource along
         with the uri-path-->
    <xs:complexType name="resource">
     <xs:sequence>
      <xs:element name="p" type="xs:normalizedString"/>
      <xs:choice>
       <xs:element name="num" type="num_map" maxOccurs="unbounded"/>
       <xs:element name="str" type="string_map" maxOccurs="unbounded"/>
      </xs:choice>
     </xs:sequence>
    </xs:complexType>

    <!-- To describe a numerical mapping with lower bound,
         upper bound and state -->
    <xs:complexType name="num_map">
     <xs:sequence>
      <xs:sequence maxOccurs="unbounded">
       <xs:element name="l" type="xs:float"/>
       <xs:element name="h" type="xs:float"/>
      </xs:sequence>
      <xs:element name="s" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>

    <!-- To describe a string mapping with
         one or more strings and state -->
    <xs:complexType name="string_map">
     <xs:sequence>

Mietz                   Expires December 12, 2013              [Page 18]
Internet-Draft   CoAP High-Level State Option Extension        June 2013

      <xs:element name="str" type="xs:string" maxOccurs="unbounded"/>
      <xs:element name="s" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>

   </xs:schema>

Author's Address

   Richard Mietz
   University of Luebeck
   Ratzeburger Allee 160
   Luebeck, Schleswig-Holstein  23562
   DE

   Phone: +49 451 500 5984
   Email: mietz@iti.uni-luebeck.de
   URI:   http://www.iti.uni-luebeck.de/

Mietz                   Expires December 12, 2013              [Page 19]