Skip to content

Instructions

Michael Koster edited this page Jan 22, 2016 · 40 revisions

Instructions and HATEOAS Discovery Tutorial

Live Demo instance of a light thing with a discovery index. Read-Only access to the demo, please.

http://104.131.134.13:8000/

The content formats used are application/link-format+json, application/senml+json (draft-01) and application/collection+senml+json.

link-format+json is used for link operations and senml+json is used for data items and form items. collection+senl+json is for constructing or inspecting items and links together as a collection.

An index has only links but allows adding links with POST and modifying links with PATCH according to CoRE Resource Directory

For example, you can do: GET http://104.131.134.13:8000/index?rt=thing (accept: application/link-format+json) and get a link to a thing:

[
  {
    "rt": [
      "light",
      "thing"
    ],
    "href": "/light/"
  }
]

Then you can use the relative reference returned to construct the URL for the next step"

GET http://104.131.134.13:8000/light/ (accept: application/link-format+json) and get links to its (subresource) capabilities:

[
  {
    "href": "",
    "rel": [
      "self"
    ]
  },
  {
    "rt": [
      "capability",
      "onoff"
    ],
    "href": "onOff",
    "rel": "sub"
  },
  {
    "rt": [
      "capability",
      "colorhs"
    ],
    "href": "colorHS",
    "rel": "sub"
  },
  {
    "rt": [
      "capability",
      "brightness"
    ],
    "href": "brightness",
    "rel": "sub"
  }
]

Then we can GET http://104.131.134.13:8000/light/onOff/ (accept: application/link-format+json) and receive the following representation which contains links to property subresources and a link which points to a form. The link describes it as a ["form" "item"] that can ["change" "action"] the context resource which is type onoff (self link should have the rt=onoff attrval)

[
  {
    "href": "",
    "rel": [
      "self"
    ]
  },
  {
    "rt": [
      "action",
      "change"
    ],
    "href": "change",
    "rel": [
      "form",
      "item"
    ]
  },
  {
    "rt": [
      "property",
      "currentstate"
    ],
    "href": "currentState",
    "rel": "sub"
  },
  {
    "rt": [
      "property",
      "targetstate"
    ],
    "href": "targetState",
    "rel": "sub"
  },
  {
    "rt": [
      "property",
      "delaytime"
    ],
    "href": "delayTime",
    "rel": "sub"
  }
]

If you use the schema, you might know ahead of time that you are looking for a "change" ;-) so you could just ask for it: GET http://104.131.134.13:8000/light/onOff/?rt=change and get the link you are seeking:

[
  {
    "rt": [
      "action",
      "change"
    ],
    "href": "change",
    "rel": [
      "form",
      "item"
    ]
  }
]

So then you GET the form (in SenML content type for now...): GET http://104.131.134.13:8000/light/onOff/change (accept: application/senml+json)

{
  "bn": "/light/onOff/",
  "e": [
    {
      "fv": {
        "rel": "action",
        "href": "actuation",
        "template": [
        ],
        "type": [
          "change",
          "action"
        ],
        "method": "POST",
        "ct": "application/collection+senml+json"
      },
      "n": "change"
    }
  ]
}

The form item retrieved describes how to change onoff; which is by performing a method=POST to the resource at href=actuation constructed according to a template (TBD) using the content format ct=application/collection+senml+json

Here is the entire "onOff" resource representation with links and items in collection format.

{
  "bn": "/light/onOff/",
  "e": [
    {
      "fv": {
        "rel": "action",
        "href": "actuation",
        "template": [     
        ],
        "type": [
          "change",
          "action"
        ],
        "method": "POST",
        "ct": "application/collection+senml+json"
      },
      "n": "change"
    }
  ],
  "l": [
    {
      "href": "",
      "rel": [
        "self"
      ]
    },
    {
      "rt": [
        "action",
        "change"
      ],
      "href": "change",
      "rel": [
        "form",
        "item"
      ]
    },
    {
      "rt": [
        "property",
        "currentstate"
      ],
      "href": "currentState",
      "rel": "sub"
    },
    {
      "rt": [
        "property",
        "targetstate"
      ],
      "href": "targetState",
      "rel": "sub"
    },
    {
      "rt": [
        "property",
        "delaytime"
      ],
      "href": "delayTime",
      "rel": "sub"
    }
  ]
}

There is a meta-catalog example at thingschema.org that has an entry pointing to this index to bootstrap the discovery:

{
  "href": "http://104.131.134.13:8000/index",
  "rt": "index",
  "ct": ["application/link-format+json", "application/collection+senml+json"]
  "comment": "hypermedia demonstrator discovery"
}

Machine Hypermedia Toolkit

The toolkit is written in python and is Apache 2 licenced. It can be downloaded from the github repository at:

[Machine Hypermedia Toolkit source repository and installation instructions] (https://github.com/connectIOT/MachineHypermediaToolkit)

Public resource at thingschema.org

There is a public resource for hosting the schema and JSON-LD context files. thingschema.org

The content of thingschema.org is stored at a github repository: thingschema-content

thingschema.org serves a standard JSON-LD context file that can be used by including "@context": "http://thingschema.org" in your JSON-LD file

In addition there is a WoT interaction model schema and a domain-specific schema for lighting.

In the examples directory there is a model for an instance of a light, and a meta-catalog file with pointers to other resources like IETF Resource Directories, W3C WoT Thingdescriptions, hypercats, or other discovery resources.

Context file: http://thingschema.org/context.jsonld

W3C Interaction Model : http://thingschema.org/wot.jsonld

Lighting domain model: http://thingschema.org/light.jsonld

Meta-catalog: http://thingschema.org/examples/catalogs.jsonld

Example light model: http://thingschema.org/examples/lightmodel.jsonld

Example IPSO Smart Object constructor: http://thingschema.org/examples/IPSO-rm.json

The JSON-LD Playground resource can be used to evaluate semantic graphs produced by these schemas and models. For example, to view a triples representation of the lighting model example, paste the URL for the light model example json file: http://thingschema.org/examples/lightmodel.jsonld into the URL box on the JSON-LD Playground page at: http://json-ld.org/playground/ and click the tab for N-Quads and the model is displayed. Note that this is the model for the live example above:

_:b0 <http://www.w3.org/2000/01/rdf-schema#Resource> _:b1 .
_:b0 <http://www.w3.org/2000/01/rdf-schema#Resource> _:b18 .
_:b0 <http://www.w3.org/2000/01/rdf-schema#label> "light" .
_:b1 <http://thingschema.org/name> "light" .
_:b1 <http://thingschema.org/schema#hasCapability> _:b2 .
_:b1 <http://thingschema.org/schema#hasCapability> _:b7 .
_:b1 <http://thingschema.org/schema#hasCapability> _:b9 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://thingschema.org/light> .
_:b10 <http://thingschema.org/name> "change" .
_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://thingschema.org/change> .
_:b11 <http://thingschema.org/name> "move" .
(...)
_:b9 <http://thingschema.org/schema#hasProperty> _:b15 .
_:b9 <http://thingschema.org/schema#hasProperty> _:b16 .
_:b9 <http://thingschema.org/schema#hasProperty> _:b17 .
_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://thingschema.org/brightness> .

(Home)

Clone this wiki locally