とある研究プロジェクトの関係で W3C Web of Things (WoT) が実際どういうものなのかをざっくり把握する必要があったので調べたときのメモです。2017年12月6日に w3.org で公開されているドラフトをベースにしていますので、正式版では変更されている可能性が大いにあります。 Thing Description というのはどんなものか知りたかったので、WoT 全体から見ると抜けがありますが、そこはご愛嬌ということで。

WoT とは

WoT の目的

アーキテクチャのドキュメント の Abstract にはこう書いてあります。

The W3C Web of Things (WoT) is intended to enable interoperability across IoT Platforms and application domains. Primarily, it provides mechanisms to formally describe IoT interfaces to allow IoT devices and services to communicate with each other, independent of their underlying implementation, and across multiple networking protocols. Secondarily, it provides a standardized way to define and program IoT behavior.

つまり、IoT プラットフォームやアプリケーションの相互接続性を高める目的で作られたもので、具体的には IoT デバイスやサービスのインターフェイスを定義したり、IoT の振る舞い (ってなんだ?) を定義したりプログラムしたりする標準化された方法を提供するもののようです。

実際に想定されるユースケースは アーキテクチャのドキュメント に書いてあります。

WoT の Building Block

WoT でどのように Thing を表現するのか、というのがアーキテクチャのドキュメントWoT Building Blocks の章で述べられています。

Conceptual Architecture of the WoT Building Blocks (Web of Things (WoT) Architecture の Figure 10 より引用)

  • WoT Binding Templates: Thing にどのように接続するかを指定するもの (プロトコル、プラットフォーム、メッセージフォーマットなど)。
  • Interaction Model: Thing がどのような機能を提供するかを定めるもの (どのようなセンサーのデータを提供するか、どのような処理を行う事ができるか、など)。
  • WoT Scripting API: Thing を拡張したり改変したりするスクリプトを書くための API。例えば、提供するセンサーのデータの種類を追加したり (単位を変えるとか)、実行できる処理を追加するスクリプトにおいて Thing に実装されている機能にアクセスしたりするために使う。Web ブラウザで JavaScript からいろんなブラウザの機能にアクセスするために API が定められているのと同じようなもの。

一つの Thing がどのように構成されるか (どの Binding Template を用いて、どのような Interaction Model を持っているか) を記述したものは Thing Description と呼ばれます。

ここでは WoT Binding Templates と WoT Scripting API についてはこれ以上触れませんが、W3C WoT のページからアクセスできるそれぞれの仕様を読むとより詳しい情報が得られます。

Thing Description

Thing Description は、前述のように、一つの Thing がどのように構成されるか (どの Binding Template を用いて、どのような Interaction Model を持っているか) を記述したものです。標準では JSON-LD でエンコードされます。

例えば、仕様 の Example 1 では "MyLampThing" という Thing が記述されています。

{
  "@context": ["http://w3c.github.io/wot/w3c-wot-td-context.jsonld"],
  "@type": ["Thing"],
  "name": "MyLampThing",
  "interaction": [
      {
          "@type": ["Property"],
          "name": "status",
          "outputData": {"type": "string"},
          "writable": false,
          "link": [{
              "href": "coaps://mylamp.example.com:5683/status",
              "mediaType": "application/json"
          }]
      },
      {
          "@type": ["Action"],
          "name": "toggle",
          "link": [{
              "href": "coaps://mylamp.example.com:5683/toggle",
              "mediaType": "application/json"
          }]
      },
      {
          "@type": ["Event"],
          "name": "overheating",
          "outputData": {"type": "string"},
          "link": [{
              "href": "coaps://mylamp.example.com:5683/oh",
              "mediaType": "application/json"
          }]
      }
  ]
}

トップレベルに書いてある name などはそれぞれ以下の位置付け、または意味を持ちます。

キー 説明
@context JSON-LD でどの context に従って書かれたものかを指定するもの。今回は Thing Description なので http://w3c.github.io/wot/w3c-wot-td-context.jsonld 固定。他に追加してもよい。
@type JSON-LD でデータのタイプを指定するもので、どんなデバイスなのかを指定するようです。今回は単に Thing としているが、Thing 以外でもよい (らしい)
name Thing Description で記述される Thing の名前
base JSON-LD でエンコードされたもので、Property などを取得するときの URI として相対パスが指定されたときに base として用いる URI
interaction Interaction Pattern

Interaction Pattern

Interaction Pattern は Thing が Thing の外との間で何ができるのかを記述したものです。Property, Event, Action のサブクラスを持ちます。また、InteractionPattern のサブクラスは以下の属性を持つことができます。

キー 説明
name それぞれの Interaction Pattern につけられる名前
link それぞれの Interaction Pattern にアクセスする URL。相対パスの場合は base からの相対パスを書く

link はさらにhrefmediaType の2つのキーを持つことができますhref はアクセスできる URL、mediaType は InteractionPattern にアクセスする際に用いるデータのエンコーディング方式です。

Property

読み書きできるデータを記述します。例えば、センサーであればセンサーの値などが該当します。例だと、status がランプの状態(点灯、消灯など?)を示す Property です。

Property は InteractionPattern のキーに加えて、以下の属性を持つことができます。

キー 説明
outputData どのようなデータをこの Property で提供するか
writable 値を書き込めるかどうかを Boolean で

Action

Thing で実行できる処理を記述します。例だと、toggle がランプの状態を変更する? Action です。他にも、ランプの明るさを変化させる、ロボットを動かす、コーヒーを入れる、などの処理が考えられます。

Action は InteractionPattern のキーに加えて、以下の属性を持つことができます。

キー 説明
outputData この Action で出力するデータ
inputData 処理を実行させる際に必要な入力データ

例えば、以下の Action (仕様 の Example 6 より引用) は、ランプを明るくするまでにかける時間 (あるいは明るさの程度かもしれない。integer を input として受け取るけどそれが何を意味するのかは不明) を input として受け取り、また、この Action を実行させるには CoAP で mytemp.example.com:5683/in にアクセスし、データを json 形式で渡すということが記述されています。

{
  "@type": ["Action"],
  "name": "fadeIn",
  "inputData": { "type": "integer" },
  "link": [{
      "href" : "coap://mytemp.example.com:5683/in",
      "mediaType": "application/json"
  }

Event

何かの条件を満たした時に Thing から通知させることができるものを記述します。例だと、overheating がランプが熱くなりすぎたとき?に通知する Event です。(個人的には条件をここで記述する必要があるのではないかと思うのですが、例には出ていないようです)

Event は InteractionPattern のキーに加えて、以下の属性を持つことができます。

キー 説明
outputData この Event で通知されるデータ

まとめ

WoT では、Thing がどのようなものかは Property (値)、Action (実行できる処理)、Event (通知できる状態変更) で主に定義されるようです。

Event がどうなるかとか、Binding Template との関係とか、値の意味をどうある程度共通の仕様で記述するか (例えばこれは摂氏の温度であるというのを Thing ごとにバラバラに定義していては interoperability がない) とか、仕様を読んでも分からないことはたくさんありましたが、きっと標準化の過程で整理されていくことを期待しています。

参考文献


PGA: Using Graphs to Express and Automatically Reconcile Network Policies を読む

2015-12-18 by Daisuke Kotani

この記事はシステム系論文紹介 Advent Calendar 2015 18日目の記事です。

Chaithan Prakash, Jeongkeun Lee, Yoshio Turner, Joon-Myung Kang, Aditya Akella, Sujata Banerjee, Charles Clark …

read more

Ubuntu 14.04.1 をシリアルコンソールからインストールする方法

2015-02-19 by Daisuke Kotani

Ubuntu 14.04.1 Server install image をシリアルコンソールしかないマシンにインストールするときにどうするかという自分用のメモ。BIOS で Serial Console Redirection が設定されている前提。

ググると、インストールイメージの isolinux.cfg や txt …

read more

博士課程一問一答

2014-12-18 by Daisuke Kotani

国立情報系D3 (10月進学) の場合の博士課程生活について

Q1. 博士課程ってなんですか

A1. 博士の学位を取りに研究しに行くところ。 学部 (学士) → 大学院修士課程 (修士) → 大学院博士課程 (博士)

Q2. なんで博士課程に進学するんですか

A2. 研究がしたかったから。学士と修士だけでは満足できそうになかったから。 それに、将来的に研究者 …

read more

SDN の研究開発

2014-12-14 by Daisuke Kotani

この記事は SDN Advent Calendar 2014 の14日目の記事です。

ある日、@yyasuda 先生から

おっ。小谷くん Advent Calendar よろしくねー。(^_^)

というメッセージがfacebookで飛んできたので、OpenFlow や SDN に関する研究開発について書いてみようと思います …

read more

Ubuntu 14.04.1 で NIC を Bonding して Tagged VLAN を通す設定

2014-11-13 by Daisuke Kotani

Ubuntu 14.04.1 Server install image をインストールした直後の状態で、NIC を Bonding して Tagged VLAN を通すのに便利なまとめがなかったので自分用のメモです。

パッケージのインストール

ifenslave と vlan のパッケージが必要なのですが …

read more

JAL SKY Wi-Fi@JL118 on 2014/10/04

2014-10-07 by Daisuke Kotani

10月4日に東京に行くために乗ったJL118 (ITM→HND) で JAL SKY Wi-Fi (国内線) が提供されていたので、簡単に調べてみました。

IP アドレス

内部は 172.19.131.0/24 でした。デフォルトゲートウェイまでの …

read more

PXE boot + Kickstart でインストーラに自動でドライバイメージを読み込ませる方法

2014-04-19 by Daisuke Kotani

大量の物理サーバをセットアップするときに、PXE でブートして Kickstart を使ってインストールを自動化するノウハウはググればたくさん出てくるのですが、インストーラにドライバイメージを読み込ませないといけないときに自動で読み込ませるノウハウがなかなか出てこなかったので、メモ。 対象は CentOS 6.5 です。

例えば、HP DL320e Gen8 で HP …

read more

Heartbleed + DNS Poisoning の合わせ技がやばい

2014-04-15 by Daisuke Kotani

OpenSSLのHeartbleedで証明書の秘密鍵が盗まれた可能性のあるサービスがたくさんあるようで、すぐに失効と再発行の手続きをしようというアナウンスがありました。

でも、ちゃんと証明書が失効されたことがブラウザまで伝わっているかというとそれは嘘で、Chrome は標準で証明書の失効のチェックをしないし、Firefox はOCSPはチェックするけどCRLは見ないようなんですよね。手元のクリーンな環境にFirefoxを入れてOCSP非対応の証明書を使っているページにアクセスするとCRLを取りに行くようなパケットが流れていなかったので、本当っぽいです(ちゃんと検証したわけじゃないけど)。

ちなみに、証明書の失効のチェックがCRLのみのものにはGPKI …

read more

石狩データセンターに行ってきた

2013-11-26 by Daisuke Kotani

第2回 さくら石狩DC見学ツアーに当選したので行ってきました。 飛行機で北海道に行って、石狩DCに行ってすすきので飲んで石狩DCに行って帰ってくる、とても楽しいツアーでした。

北海道まで行ってなんでデータセンターしか行かんの?という質問はなしです。データセンターの視察が観光のようなものです。

個人的に「おぉ〜」って思ったポイントをまとめておきます。

データセンターのモニタリング

PUE低っ(公開OKの写真に含まれていたものです。念のため。)

PUE Monitoring Display

いろんなところにセンサーがついてて(各ラックに複数個、その他にも)、すごい細かくモニタリングされているようで …

read more