Copyright © 2017-2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 Web of Things(WoT) Thing Description(TD), 버전 2.0을 위한 형식적 정보 모델과 공통 표현을 설명한다. Thing Description은 사물의 메타데이터와 인터페이스를 설명하며, 여기서 사물은 Web of Things에 상호작용을 제공하고 참여하는 물리적 또는 가상 엔터티의 추상화이다. Thing Description은 다양한 장치를 통합하고 다양한 애플리케이션이 상호 운용될 수 있게 하는 작은 어휘를 기반으로 한 상호작용 집합을 제공한다. Thing Description은 기본적으로 JSON 형식으로 인코딩되며, 이 형식은 JSON-LD 처리도 허용한다. 후자는 기계가 이해할 수 있는 방식으로 사물에 대한 지식을 표현하기 위한 강력한 기반을 제공한다. Thing Description 인스턴스는 사물 자체에서 호스팅될 수도 있고, 사물에 리소스 제한(예: 제한된 메모리 공간)이 있거나 Web of Things 호환 레거시 장치에 Thing Description을 개조하여 적용하는 경우 외부에서 호스팅될 수도 있다. 또한 이 문서는 Thing Model을 도입하며, 이는 작성자가 Internet of Things(IoT) 엔터티의 모델 또는 클래스만을 설명할 수 있게 한다. Thing Model은 Thing Description 인스턴스를 위한 템플릿으로 볼 수 있지만, 특정 통신 메타데이터에 대한 요구사항이 없거나 적은 등 더 완화된 제약을 가진다.
이 명세는 [WOT-THING-DESCRIPTION11]의 작업을 계속하며, 하위 호환성은 보장하지 않는다. 하위 호환성이 없는 경우, 구현자가 새 버전으로 마이그레이션하기 위한 구체적인 지침이 제공될 것이다.
이 섹션은 이 문서가 게시된 시점의 문서 상태를 설명한다. 현재 W3C 간행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.
이 문서는 Web of Things Working Group이 권고안 트랙을 사용하여 최초 공개 작업 초안으로 게시했다.
최초 공개 작업 초안으로 게시되었다는 사실이 W3C 및 그 회원의 승인을 의미하지는 않는다.
이 문서는 초안 문서이며 언제든지 업데이트, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.
이 문서는 W3C Patent Policy에 따라 운영되는 그룹이 작성했다. W3C는 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개 지침도 포함되어 있다. 개인이 자신이 알고 있는 특허가 필수 청구항을 포함한다고 믿는 경우, 그 개인은 W3C Patent Policy의 섹션 6에 따라 정보를 공개해야 한다.
이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.
이 섹션은 비규범적이다.
WoT Thing Description(TD)은 W3C Web of Things(WoT)의 중심 구성 요소이며, Thing의 진입점으로 간주할 수 있다(웹 사이트의 index.html과 매우 유사하다). TD 인스턴스에는 다섯 가지 주요 구성 요소가 있다. Thing 자체에 대한 텍스트 메타데이터, Interaction Affordance들의 집합, Thing을 어떻게 사용할 수 있는지 나타내는 것, 기계 이해 가능성을 위해 Thing과 교환되는 데이터의 스키마, 상호작용에 사용해야 하는 보안 메커니즘에 대한 메타데이터를 제공하는 Security Definition, 그리고 마지막으로 다른 Thing이나 웹상의 문서와의 공식적 또는 비공식적 관계를 표현하는 웹 링크이다.
W3C WoT의
Interaction Model은
세 가지 유형의 Interaction
Affordance를 정의한다. Properties(PropertyAffordance
클래스)는 현재 값을 가져오거나 동작 상태를 설정하는 것과 같은
감지 및 제어 매개변수에 사용할 수 있다.
Actions(ActionAffordance 클래스)는
물리적(따라서 시간이 걸리는) 프로세스의 호출을 모델링하지만,
기존 플랫폼의 RPC와 유사한 호출을 추상화하는 데에도 사용할 수 있다.
Events(EventAffordance 클래스)는
알림, 개별 이벤트 또는 값의 스트림이 수신자에게 비동기적으로
전송되는 통신의 push 모델에 사용된다. 자세한 내용은
[wot-architecture11]을
참조하라.
일반적으로 TD는 URI 스킴 [RFC3986]으로
식별되는 서로 다른
Protocol Binding에 대한 메타데이터를 제공한다.
(예: http, coap 등
[IANA-URI-SCHEMES]),
미디어 타입 [RFC2046]에
기반한 콘텐츠 타입
(예: application/json,
application/xml, application/cbor,
application/exi 등 [IANA-MEDIA-TYPES]), 그리고 보안
메커니즘(인증, 권한 부여, 기밀성 등)에 대한 것이다. TD 인스턴스의 직렬화는
JSON [RFC8259]을
기반으로 하며, JSON 이름은 이 명세 문서에서 정의된
TD 어휘의 용어를 가리킨다. 또한 TD의 JSON 직렬화는
확장과 풍부한 의미론적 처리를 가능하게 하기 위해
JSON-LD 1.1 [JSON-LD11]의 구문을
따른다.
예 1은 TD 인스턴스를 보여 주며, 제목이 MyLampThing인 램프 Thing을 설명함으로써 Properties, Actions, Events가 포함된 Interaction Model을 보여 준다.
이 TD 예로부터 제목이
status인 하나의 Property affordance가
존재함을 알 수 있다. 또한 이 Property가 URI
https://mylamp.example.com/status에서 GET 메서드를 사용하는
HTTP 프로토콜의 (보안 형식)을 통해 접근 가능하며
(forms 구조 안에서
href 멤버로 알림),
문자열 기반 상태 값을 반환한다는 정보가 제공된다.
GET 메서드의 사용은 명시적으로 언급되어 있지 않지만,
이 문서에서 정의하는 기본 가정 중 하나이다.
유사한 방식으로, POST 메서드를 사용하여
https://mylamp.example.com/toggle 리소스에서
스위치 상태를 토글하는 Action
affordance가 지정되어 있으며,
여기서도 POST는 Actions 호출에 대한 기본 가정이다.
Event affordance는
Thing이
비동기 메시지를 보낼 수 있게 하는 메커니즘을 제공한다. 여기서는
HTTP와 그 long polling 하위 프로토콜을
https://mylamp.example.com/oh에서 사용하여
램프의 가능한 과열 이벤트에 대한 알림 구독을 얻을 수 있다.
이 예는 접근에 사용자 이름과 비밀번호를 요구하는
basic 보안 스킴도 지정한다. 보안 스킴은 먼저
securityDefinitions에서 이름이 부여되고, 그런 다음
security 섹션에서 그 이름을 지정하여 활성화된다는 점에
유의하라. HTTP 프로토콜의 사용과 결합하여 이 예는
HTTP Basic Authentication의 사용을 보여 준다.
최상위 수준에서 하나 이상의 보안 스킴을 지정하는 것은
필수이며, 모든 리소스에 대한 기본 접근 요구사항을 제공한다.
그러나 보안 스킴은 form별로도 지정할 수 있으며, form 수준에서
제공된 구성은 Thing 수준에서 제공된 구성을 재정의하므로
세밀한 접근 제어의 지정을 가능하게 한다. 접근 제어 메커니즘이
사용되지 않음을 나타내기 위해 특수한 nosec
보안 스킴을 사용할 수도 있다. 추가 예는 나중에 제공된다.
Thing Description은 어떤 네임스페이스 안에
컨텍스트 정의를 추가할 수 있는 가능성을 제공한다.
이 메커니즘은 주어진 네임스페이스 아래에서 애플리케이션의
특정 도메인에 대한 논리 규칙과 같은 형식적 지식을 찾을 수 있는 경우,
Thing Description 인스턴스의 콘텐츠에 추가 의미론을
통합하는 데 사용할 수 있다. 컨텍스트 정보는
forms 필드에 선언된 기반 통신 프로토콜의
일부 구성과 동작을 지정하는 데에도 도움이 될 수 있다. 예 2는
@context에 두 번째 정의를 도입하여
접두사 saref가 Smart Appliance Reference Ontology인
SAREF를 참조한다고
선언함으로써 예 1의 TD 샘플을 확장한다
[SMARTM2M].
이 IoT 온톨로지는 @type 필드의 값으로 설정할 수 있는
의미론적 레이블로 해석되는 용어들을 포함하며,
Things와 그 Interaction
Affordance들의 의미론을 제공한다. 아래 예에서
Thing은
saref:LightSwitch로 레이블링되고,
status
Property는
saref:OnOffState로, 그리고
toggle Action은
saref:ToggleCommand로 레이블링된다.
어떤 @context 내부의 선언 메커니즘은
JSON-LD에 의해 지정된다. TD 인스턴스는 그 명세의 버전 1.1을
준수한다
[json-ld11].
따라서 TD 인스턴스는 RDF 문서로도 처리될 수 있다
(의미론적 처리에 대한 자세한 내용은
부록 D. JSON-LD Context
Usage 및 네임스페이스 IRI 아래의 문서,
예: https://www.w3.org/2019/wot/td를
참조하라).
Thing Description의 주요 의도 중 하나는 Consumer가 Thing과 성공적으로 상호작용하는 데 필요한 모든 세부 정보를 제공하는 것이다. 일부 IoT 애플리케이션 시나리오에서는 예를 들어 통신 메타데이터가 포함된 완전히 상세한 Thing Description이 필요하지 않거나(예: IoT 생태계가 통신을 별도로 암묵적으로 처리할 수 있음), 새 엔터티가 아직 배포되지 않았기 때문에 사용할 수 없을 수 있다 (예: IP 주소가 아직 알려지지 않음). 때로는 생성되는 모든 인스턴스에서 사용 가능해야 하는 기능 정의를 강제하는 일종의 클래스 정의가 필요하기도 하다(예: 새 장치의 대규모 생산).
위에서 언급한 시나리오나 다른 시나리오를 다루기 위해, Thing Model을 사용할 수 있으며, 이는 주로 Things의 Properties, Actions 및/또는 Events 안의 데이터 모델 정의를 제공하고, Thing Description 인스턴스를 생성하기 위한 템플릿으로 잠재적으로 사용될 수 있다. 다음에는 예 1의 Thing Description 인스턴스의 모델로 볼 수 있는 샘플 Thing Model이 제시된다.
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Lamp Thing Model",
"properties": {
"status": {
"description": "current status of the lamp (on|off)",
"type": "string",
"readOnly": true
}
},
"actions": {
"toggle": {
"description": "Turn the lamp on or off"
}
},
"events": {
"overheating": {
"description": "Lamp reaches a critical temperature (overheating)",
"data": {"type": "string"}
}
}
}
Thing
Model 정의는 "@type":
"tm:ThingModel"로 식별된다. 예가 보여 주듯이,
통신 및 보안 메타데이터가 없기 때문에 단일
Thing 인스턴스에
대한 세부 정보를
제공하지 않는다. 이 명세는 이러한
Thing
Model 정의로부터
유효한 Thing
Description 인스턴스를 파생하는 메커니즘을 제시한다.
또한 기존 Thing Model
정의를 재정의, 확장 및 재사용하는 방법을 포함한
다른 설계 개념도 지정된다.
비규범적으로 표시된 섹션뿐 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예 및 참고는 비규범적이다. 이 명세의 나머지 모든 것은 규범적이다.
이 문서의 키워드 MAY, MUST, MUST NOT, RECOMMENDED, SHOULD, 그리고 SHOULD NOT은 여기에 표시된 것처럼 모두 대문자로 나타날 때에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.
Thing Description 인스턴스는 Thing Description 직렬화와 관련하여 5. TD Information Model 및 6. TD Representation Format의 규범적 문장을 따르는 경우 이 명세를 준수한다.
Thing Description 인스턴스를 검증하기 위한 JSON Schema [JSON-SCHEMA]는 부록 B. TD 인스턴스 검증을 위한 JSON Schema에 제공된다.
이 섹션은 비규범적이다.
Thing, Consumer, Producer, Thing Description (TD), Partial TD, Thing Model (TM), Interaction Model, Interaction Affordance, IoT Platform, Property, Action, Event, Data Schema, Content Type, Protocol Binding, Servient, Vocabulary, Term, Vocabulary Term, WoT Interface, 그리고 WoT Runtime와 같은 기본 WoT 용어는 WoT Architecture 명세 [wot-architecture11]의 섹션 3에서 정의된다.
또한 이 명세는 다음 정의를 도입한다:
@type 멤버를 사용하고,
콜론(:)을 사용하는 문자열 접두사를 통해
이를 달성할 수 있다.
Thing 클래스의
Instance Relation에 대한
제약을 만족할 수 없는 Thing Description을
감지하기 위해 검증 단계를 따를 수 있다. 이를 위해
TD Processor는
가능한 모든 Default Value가
할당된 Thing Description의
형식을 채워 넣어 계산할 수 있다. TD
Processor는 일반적으로 WoT Runtime의 하위 시스템이다.
TD Processor의 구현은 TD 문서로 직렬화할 수 있는 TD
producer이거나,
TD 문서로부터 역직렬화할 수 있는 TD consumer이거나,
또는 둘 다일 수 있다.
@context와 같은 용어가 정의되는
TD의 루트는 Thing level이고, forms는 Affordance level
내에서 정의되며, type, maximum은
Data Schema level 내에서 정의되고, href는
Forms level 내에서 정의된다. 정의되어 있지 않더라도,
Links level과 같은 다른 수준을 사용할 수 있다.
href가
http:// 또는
https://로 시작하는 Form이다.
이러한 정의는 5.2 예비 정의에서 더 발전된다.
이 명세의 5. TD Information Model에서 정의된 TD Information Model의 버전은 다음 IRI로 식별된다:
https://www.w3.org/ns/wot-next/td
이 IRI [RFC3987]는 URI [RFC3986]이기도 하며, JSON-LD context 파일을 얻기 위해 역참조될 수 있다 [json-ld11]. 이를 통해 TD Document의 압축 문자열을 전체 IRI 기반 Vocabulary Term으로 확장할 수 있다. 그러나 이 처리는 JSON 기반 TD Document를 RDF로 변환할 때만 요구되며, 이는 TD Processor 구현의 선택적 기능이다.
이 네임스페이스는 명세가 권고안 상태에 도달할 때까지 임시라는 점에 유의하라. 그 시점에 영구 네임스페이스가 할당될 것이다. 임시 네임스페이스를 사용하는 모든 문서는 명세의 git 저장소의 main 브랜치를 가리키므로 안정적이지 않다.
현재 명세에서 Vocabulary Term은 항상 압축 형식으로 제시된다. 그 확장 형식은 해당 용어가 속한 Vocabulary의 네임스페이스 IRI 아래에서 접근할 수 있다. 이러한 네임스페이스는 5.3 Class Definitions의 구조를 따른다. TD Information Model에서 사용되는 각 Vocabulary는 다음과 같이 자체 네임스페이스 IRI를 가진다:
| Vocabulary | Namespace IRI |
|---|---|
| Core |
https://www.w3.org/ns/wot-next/td-ontology
|
| Data Schema |
https://www.w3.org/ns/wot-next/json-schema-ontology
|
| Security |
https://www.w3.org/ns/wot-next/security-ontology
|
| Hypermedia Controls |
https://www.w3.org/ns/wot-next/security-ontologyy
|
Thing Model 정의에 추가로 사용되는 모든 vocabulary는 다음 네임스페이스 IRI를 가진다:
| Vocabulary | Namespace IRI |
|---|---|
| Thing Model |
https://www.w3.org/ns/wot-next/tm-ontology
|
Vocabulary들은 서로 독립적이다.
이들은 다른 W3C
명세에서 재사용되고 확장될 수 있다. 어떤
Vocabulary의 설계에서
모든 중단적 변경은 새로운 연도 기반 네임스페이스 URI의
할당을 요구한다. TD
Information Model의
일반적인 일관성을 유지하기 위해, 관련 JSON-LD context 파일은
각 버전이 자체 URI(v1, v1.1,
v2, ...)를 가지도록 버전 관리되며, 특히 새로운
Term의 추가와 같은
비중단적 변경도 식별한다는 점에 유의하라.
어떤 네임스페이스 IRI 아래의 Vocabulary는 비중단적 변경만 겪을 수 있으므로, 그 콘텐츠는 애플리케이션에서 안전하게 캐시하거나 포함할 수 있다. 네임스페이스 IRI 아래에 비교적 정적인 콘텐츠를 노출하는 한 가지 장점은 제약된 장치 간에 교환되는 메시지의 페이로드 크기를 최적화하는 것이다. 또한 사설 네트워크에서 공개적으로 사용 가능한 vocabulary에 접근하는 장치로 인해 발생하는 개인정보 유출도 방지한다(또한 12. 개인정보 보호 고려사항 참조).
이 섹션은 TD Information Model을 소개한다. TD Information Model은 Thing Description의 처리와 직렬화를 위한 개념적 기반 역할을 하며, 이는 6. TD Representation Format에서 별도로 설명된다.
TD Information Model은 다음의 독립적인 Vocabulary를 기반으로 구축된다:
이러한 각 Vocabulary는 본질적으로 데이터 구조를 구축하는 데 사용할 수 있는 Term의 집합이며, 전통적인 객체 지향적 의미에서 객체로 해석된다. 객체는 클래스의 인스턴스이며 속성을 가진다. W3C WoT의 맥락에서 이들은 Thing과 그 Interaction Affordance를 나타낸다. 객체의 형식적 정의는 5.2 예비 정의에 제공된다. 그런 다음 TD Information Model의 주요 요소는 5.3 Class Definitions에 제시된다. Default Value가 존재하는 경우, 특정 객체 속성은 TD에서 생략될 수 있다. 기본값 목록은 5.4 Default Value Definitions에 제공된다.
다음에 표시된 UML 다이어그램은
TD
Information Model의 개요를 제공한다.
이 다이어그램은 모든 클래스를 표로 나타내고,
Thing 클래스에서 시작하여
클래스 간에 존재하는 연관을 방향 화살표로 나타낸다.
가독성을 위해 이 다이어그램은 네 가지 기반
Vocabulary 각각에 대해
네 부분으로 나뉘었다.
트리 기반 문서에 대한 단순한 규칙(즉, 원시 JSON 처리)과 풍부한 Semantic Web 도구(즉, JSON-LD 처리) 모두에서 쉽게 처리될 수 있는 모델을 제공하기 위해, 이 문서는 TD Information Model을 그에 맞게 구성하기 위한 다음의 형식적 예비 정의를 정의한다.
이 섹션의 모든 정의는 집합을 참조하며, 집합은 직관적으로 그 자체가 집합일 수 있는 요소들의 모음이다. 임의로 복잡한 모든 데이터 구조는 집합의 관점에서 정의될 수 있다. 특히 Object는 다음과 같이 재귀적으로 정의된 데이터 구조이다:
이 정의는 Object가 동일한 이름을 가진 여러 이름-값 쌍을 포함하는 것을 막지는 않지만, 이 명세에서는 일반적으로 이를 고려하지 않는다. 요소들이 이름으로 숫자만 가지는 Object는 Array라고 한다. 마찬가지로, 요소들이 이름으로 어떤 Vocabulary에도 속하지 않는 Term만을 가지는 Object는 Map이라고 한다. Map의 어떤 이름-값 쌍에 나타나는 모든 이름은 Map의 범위 내에서 고유하다고 가정한다.
또한 Object는 어떤 Class의 인스턴스일 수 있다. Vocabulary Term으로 표시되는 Class는 먼저 Signature라고 불리는 Vocabulary Term의 집합으로 정의된다. Signature가 비어 있는 Class는 Simple Type이라고 한다.
Class의
Signature는
Class를 더 정의하는
두 함수를
구성할 수 있게 한다: Assignment Function과 Type Function.
Class의
Assignment Function은
해당 Class의
Signature에 속한
Vocabulary Term을 입력으로 받아
출력으로 true 또는 false를 반환한다.
직관적으로 Assignment Function은
Class를 인스턴스화할
때
Signature의 요소가
필수인지 선택사항인지를 나타낸다. Class의
Type Function도
해당 Class의
Signature에 속한
Vocabulary Term을 입력으로 받아
출력으로 또 다른 Class를 반환한다.
이러한 함수는 부분 함수이다. 그 정의역은 정의 중인
Class의
Signature로 제한된다.
이 두 함수를 기반으로, Object와 Class로 구성된 쌍에 대해 Instance Relation을 정의할 수 있다. 이 관계는 만족되어야 하는 제약으로 정의된다. 즉 Object는 다음 두 제약이 모두 만족될 때 Class의 인스턴스이다:
true를 반환하는 모든 Term에 대해,
Object가 그
Vocabulary Term을 이름으로 하는
이름-값 쌍을 포함하는 경우.
위의 정의에 따르면, Object는 그 구조와 상관없이
모든 Simple
Type의 인스턴스가 될 것이다. 대신,
Simple
Type에 대해서는 Instance Relation의
또 다른 정의가 도입된다. Object는
주어진 어휘 형식을 가진 Term인 경우
Simple Type의
인스턴스이다
(예: boolean 타입의 경우 true, false,
unsignedInt 타입의 경우 1, 2,
3, ... 등).
또한 Parameterized Classes라고 불리는 추가 Class는 일반적인 Map 및 Array 구조로부터 파생될 수 있다. Object는, 그것이 포함하는 모든 이름-값 쌍의 값이 어떤 Class의 인스턴스가 되도록 하는 Map인 경우, 어떤 Class의 Map, 즉 어떤 Class로 매개변수화된 Map 타입의 인스턴스이다. 동일한 내용은 Array에도 적용된다.
마지막으로, Class는 전자의 모든 인스턴스가 후자의 인스턴스이기도 한 경우, 어떤 다른 Class의 Subclass이다.
위의 모든 정의를 바탕으로, TD Information Model은
Class 정의의
집합으로
이해되어야 하며, 여기에는 Class 이름
(Vocabulary Term),
Signature
(Vocabulary Term의 집합),
Assignment Function,
그리고 Type
Function이 포함된다. 이러한 Class
정의는 5.3 Class Definitions의 표로
제공된다.
각 표에서 assignment 열의 값 "mandatory"(각각 "optional")는
Assignment Function이
대응하는 Vocabulary Term에 대해
true(각각 false)를 반환함을 나타낸다.
관례상 Simple Type은
소문자로 시작하는 이름으로 표시된다.
TD Information Model은
XML Schema [XMLSCHEMA11-2-20120405]에
정의된 다음 Simple Type을 참조한다:
string, anyURI,
dateTime, integer,
unsignedInt, double, 그리고
boolean. 이들의 정의(즉, 어휘 형식의 명세)는
TD
Information Model의 범위를 벗어난다.
또한 TD
Information Model은
Vocabulary Term의 쌍에 대한
전역 함수를 정의한다. 이 함수는 입력으로
Class 이름과
또 다른 Vocabulary Term을 받아
Object를
반환한다.
반환된 Object가
null과 다르면, 이는 입력
Class의
인스턴스에서
입력 Vocabulary Term에 대한
어떤 할당의 Default Value를 나타낸다.
이 함수는 위에서 정의한 Assignment Function에 대한
제약을 완화할 수 있게 한다. 즉,
Object는
모든 필수 할당을 포함하거나 또는 누락된 할당에 대해
Default Value가
존재하는 경우
Class의
인스턴스이다. 모든 Default Value는
5.4 Default Value
Definitions의 표에 제공된다. 5.3
Class Definitions의 각 표에서
assignment 열은 TD
Information
Model의
Class와 Vocabulary Term의
대응 조합에 대해 Default Value를
사용할 수 있는 경우 "with default" 값을 포함한다.
여기서 도입된 형식화는 추상 데이터 구조로서의 Object와 Thing과 같은 물리 세계 객체 사이의 가능한 관계를 고려하지 않는다. 그러나 TD Information Model에 관련된 모든 Vocabulary Term을 RDF 리소스로 재해석하여 물리 세계의 더 큰 모델(온톨로지)에 통합할 수 있는 가능성에 주의를 기울였다. 의미론적 처리에 대한 자세한 내용은 D. JSON-LD Context Usage와 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라.
TD Processor는 5.3.1 핵심 어휘 정의, 5.3.2 데이터 스키마 어휘 정의, 5.3.3 보안 어휘 정의, 그리고 5.3.4 하이퍼미디어 제어 어휘 정의에서 정의된 모든 Class에 대한 Class 인스턴스화 제약을 MUST 만족해야 한다.
특히 모든 어휘 용어와 값은 대소문자를 구분한다는 점에 유의하라. 이는 정보 모델의 직렬화에도 해당된다(섹션 6. TD 표현 형식).
메타데이터와 인터페이스가 WoT Thing Description으로 설명되는 물리적 또는 가상 엔터티의 추상화이며, 여기서 가상 엔터티는 하나 이상의 Things의 조합이다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
@context |
TD 문서 전체에서 사용되는 terms라고 불리는 축약 이름을 정의하는 JSON-LD 키워드. | 필수 |
anyURI 또는 Array
|
@type |
객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드. | 선택사항 |
string 또는 Array of
string
|
id |
URI 형식의 Thing 식별자 [RFC3986] (예: 안정적인 URI, 임시 및 변경 가능한 URI, 로컬 IP 주소를 가진 URI, URN 등). | 선택사항 |
anyURI
|
title |
기본 언어를 기반으로 사람이 읽을 수 있는 제목을 제공한다(예: UI 표현을 위한 텍스트 표시). | 필수 |
string
|
titles |
다국어 사람이 읽을 수 있는 제목을 제공한다 (예: 다른 언어로 UI 표현을 위한 텍스트 표시). MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
description |
기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. | 선택사항 |
string
|
descriptions |
다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
version |
버전 정보를 제공한다. | 선택사항 |
VersionInfo
|
created |
TD 인스턴스가 생성된 시점에 대한 정보를 제공한다. | 선택사항 |
dateTime
|
modified |
TD 인스턴스가 마지막으로 수정된 시점에 대한 정보를 제공한다. | 선택사항 |
dateTime
|
support |
TD 유지관리자에 대한 정보를 URI 스킴으로 제공한다
(예: mailto
[RFC6068],
tel [RFC3966],
https [RFC9112]).
|
선택사항 |
anyURI
|
base |
TD 문서 전체에서 모든 상대 URI 참조에 사용되는
기본 URI를 정의한다. TD 인스턴스에서 모든 상대 URI는
[RFC3986]에
정의된 알고리즘을 사용하여 기본 URI에 상대적으로
해석된다.base는 @context에서 사용되는
URI와 TD 인스턴스에 의미론적 처리가 적용될 때 관련되는
Linked Data [LINKED-DATA]
그래프 안에서 사용되는 IRI에 영향을 주지 않는다.
|
선택사항 |
anyURI
|
properties |
Thing의 모든 Property 기반 Interaction Affordance. | 선택사항 |
Map of PropertyAffordance
|
actions |
Thing의 모든 Action 기반 Interaction Affordance. | 선택사항 |
Map of ActionAffordance
|
events |
Thing의 모든 Event 기반 Interaction Affordance. | 선택사항 |
Map of EventAffordance
|
links |
지정된 Thing Description과 관련된 임의의 리소스에 대한 Web links를 제공한다. | 선택사항 |
Array of Link
|
forms |
작업을 수행하는 방법을 설명하는 form 하이퍼미디어 제어의 집합. Forms는 Protocol Bindings의 직렬화이다. Thing level forms는 interaction affordances 그룹에 대한 엔드포인트를 설명하는 데 사용된다. | 선택사항 |
Array of Form
|
security |
securityDefinitions에서 정의된 것들 중에서
선택된 보안 정의 이름의 집합. 리소스 접근을 위해
이들은 모두 만족되어야 한다. |
필수 |
string 또는 Array of
string
|
securityDefinitions |
이름이 지정된 보안 구성의 집합(정의만 해당).
이름이 security 이름-값 쌍에서 사용되지 않는 한
실제로 적용되지 않는다. |
필수 |
Map of SecurityScheme
|
profile |
이 Thing Description과 해당 Thing 구현이 따르는 WoT Profile 메커니즘을 나타낸다. | 선택사항 |
anyURI 또는 Array of
anyURI
|
schemaDefinitions |
이름이 지정된 데이터 스키마의 집합.
AdditionalExpectedResponse
객체 안의 schema 이름-값 쌍에서 사용된다.
|
선택사항 |
Map of DataSchema
|
uriVariables |
DataSchema 선언을 기반으로 한 컬렉션으로
[RFC6570]에 따른 URI 템플릿
변수를 정의한다. Thing
level
uriVariables는 Thing
level
forms 또는 Interaction Affordances에서 사용할 수 있다.
개별 변수 DataSchema는 ObjectSchema나 ArraySchema일 수 없다.
각 변수는 작업 실행 시 href 안에서 문자열로
직렬화되어야 하기 때문이다. 동일한 변수가
Thing level
uriVariables와 Interaction Affordance level 모두에
선언된 경우, Interaction Affordance level 변수가 우선한다.
|
선택사항 |
Map of DataSchema
|
다음 @context URL 규칙에 대한 목록 항목은
큰 변경을 거치게 될 것이다.
@context에 대해 다음 규칙이
Thing Description
인스턴스에 대해 정의된다:
@context 이름-값 쌍은 문서를 TD 1.1로
식별하여 Consumers가 새로
도입된 terms를 사용할 수 있도록 하기 위해 anyURI
https://www.w3.org/2022/wot/td/v1.1를
포함해야 MUST 한다.https://www.w3.org/2019/wot/td/v1가
첫 번째 항목이어야 MUST 하며,
https://www.w3.org/2022/wot/td/v1.1는
두 번째 항목이어야 MUST
한다.@context가 Array인 경우, anyURI
https://www.w3.org/2022/wot/td/v1.1 뒤에는
임의의 순서로 anyURI 타입 또는
Map 타입의 요소가
올 수 MAY 있지만,
@context Array 안의
모든 이름-값 쌍을 포함하는 하나의 Map만 포함하는 것이
RECOMMENDED된다.@context
Array에 포함된
Maps는 이름-값 쌍을
포함할 수 MAY 있으며,
이때 값은 anyURI 타입의 네임스페이스 식별자이고
이름은 해당 네임스페이스를 나타내는
Term 또는 접두사이다.@context
Array에 포함된 하나의
Map은
Thing Description의 기본 언어를 정의하는 이름-값 쌍을
포함해야 SHOULD 하며,
여기서 이름은 Term @language이고
값은 [BCP47]에서
정의한 올바른 형식의 언어 태그이다
(예: en, de-AT,
gsw-CH, zh-Hans,
zh-Hant-HK,
sl-nedis).Thing Description과 Thing Model 인스턴스의 사람이 읽을 수 있는 모든 텍스트의 기본 방향을 결정하기 위해, 이 명세는 기본 방향 메타데이터를 연결하는 내장 메커니즘이 없을 때 [STRING-META] 가이드라인의 문자열별 방향 정보를 따를 것을 권장한다.
TD Processors는 양방향 텍스트를 처리할 때 특정 특수 사례를 인식해야 한다. TD Processors는 특히 주변 텍스트에 삽입할 때(예: Web 사용자 인터페이스) 사용자에게 문자열을 표시할 때 bidi isolation을 사용하도록 주의해야 SHOULD 한다. 혼합 방향 텍스트는 언어가 올바르게 식별된 경우에도 어떤 언어에서든 발생할 수 있다.
TD producers는 단순한 사용자 에이전트가 성공적으로 표시할 수 있는 방식으로 혼합 방향 문자열을 제공하려고 시도해야 SHOULD 한다. 예를 들어, RTL 문자열이 LTR 런(예: 숫자 또는 라틴 문자로 된 브랜드나 상표명)으로 시작하는 경우, 문자열 시작 부분에 RLM 문자를 포함하거나 반대 방향 런을 bidi controls로 감싸면 올바른 표시를 도울 수 있다.
Strings on the Web: Language and Direction Metadata [string-meta]는 양방향 텍스트를 사용할 때의 여러 함정을 설명하고 지침을 제공한다.
properties,
actions, 그리고 events Maps에서
명시적으로 제공되는 Interaction
Affordance 외에도, Thing은
선택적 forms Array 안의
Form 인스턴스로 표시되는 meta-interactions도 제공할 수 있다.
Thing 인스턴스의
forms Array가
Form 인스턴스를 포함하는 경우, 이는 op 멤버를
포함해야 MUST 하며,
이름 op에 할당된 문자열 값은 직접 또는
Array 안에서
다음 operation
types 중 하나여야 MUST 한다:
readallproperties,
writeallproperties,
readmultipleproperties,
writemultipleproperties,
observeallproperties,
unobserveallproperties,
queryallactions,
subscribeallevents, 또는
unsubscribeallevents. (Thing 인스턴스에서
form을 사용하는 예는 예를
참조하라.)
각 property meta-interaction의 데이터 스키마는
각 PropertyAffordance 인스턴스의 데이터 스키마를
단일 ObjectSchema 인스턴스 안에 결합하여 구성되며,
여기서 ObjectSchema 인스턴스의
properties Map은 대응하는
PropertyAffordances 인스턴스의 이름으로 식별되는
각 PropertyAffordances의 데이터 스키마를 포함한다.
달리 지정되지 않는 한(예: TD Context
Extension을 통해), readmultipleproperties
작업의 요청 데이터는 의도한 PropertyAffordances
인스턴스 이름을 포함하는 Array이며,
Form 인스턴스가 지정한 콘텐츠 타입으로 직렬화된다.
가능한 선택지를 Consumers에게 보여 주어, Consumers가 Thing과 상호작용할 수 있는 방법을 제안하는 Thing의 메타데이터. 잠재적인 affordance에는 여러 유형이 있지만, W3C WoT는 세 가지 유형의 Interaction Affordances를 정의한다: Properties, Actions, Events.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
@type |
객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드. | 선택사항 |
string 또는 Array of
string
|
title |
기본 언어를 기반으로 사람이 읽을 수 있는 제목을 제공한다(예: UI 표현을 위한 텍스트 표시). | 선택사항 |
string
|
titles |
다국어 사람이 읽을 수 있는 제목을 제공한다 (예: 다른 언어로 UI 표현을 위한 텍스트 표시). MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
description |
기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. | 선택사항 |
string
|
descriptions |
다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
forms |
작업을 수행하는 방법을 설명하는 form 하이퍼미디어 제어의 집합. Forms는 Protocol Bindings의 직렬화이다. 배열은 비어 있을 수 없다. | 필수 |
Array of Form
|
uriVariables |
DataSchema 선언을 기반으로 한 컬렉션으로
[RFC6570]에 따른 URI 템플릿
변수를 정의한다. 개별 변수 DataSchema는 ObjectSchema나
ArraySchema일 수 없다. 각 변수는 작업 실행 시
href 안에서 문자열로 직렬화되어야 하기 때문이다.
동일한 변수가 Thing level
uriVariables와 Interaction Affordance level 모두에
선언된 경우, Interaction Affordance level 변수가 우선한다.
|
선택사항 |
Map of DataSchema
|
InteractionAffordance 클래스는 다음
하위 클래스를 가진다:
Thing의 상태를 노출하는 Interaction Affordance. 이 상태는 검색(읽기)되거나 업데이트(쓰기)될 수 있다. Things는 변경 후 새 상태를 push함으로써 Properties를 관찰 가능하게 만들 수도 있다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
observable |
Thing을 호스팅하는 Servients와 Intermediaries가 이
Property에 대해 observeproperty 및
unobserveproperty 작업을 지원하는
Protocol Binding을 제공해야 하는지를 나타내는 힌트.
|
기본값 있음 |
boolean
|
Property 인스턴스는
DataSchema 클래스의
인스턴스이기도 하다. 따라서 다른 것들 중에서도
type, unit,
readOnly, writeOnly
멤버를 포함할 수 있다.
PropertyAffordance는
InteractionAffordance Class와
DataSchema Class의
Subclass이다.
PropertyAffordance
인스턴스 안에 Form 인스턴스가 있는 경우,
op에 할당된 값은
readproperty, writeproperty,
observeproperty,
unobserveproperty 중 하나이거나 이러한 terms의
조합을 포함하는 Array여야
MUST 한다.
프로토콜이 암시적 구독 해지 메커니즘(예:
연결 손실을 감지하기 위한 heartbeat)을 지원하지 않는 한,
각 observeproperty에 대응하는
unobserveproperty가 있는 것이 좋은 관행으로
간주된다.
상태를 조작하거나(예: 램프 켜기/끄기 토글) Thing에서 프로세스를 트리거하는(예: 시간이 지남에 따라 램프를 어둡게 하기) Thing의 함수를 호출할 수 있게 하는 Interaction Affordance.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
input |
Action의 입력 데이터 스키마를 정의하는 데 사용된다. | 선택사항 |
DataSchema
|
output |
Action의 출력 데이터 스키마를 정의하는 데 사용된다. | 선택사항 |
DataSchema
|
safe |
Action이 안전한지(=true) 아닌지를 신호한다. Action을 호출할 때 내부 상태(cf. 리소스 상태)가 변경되지 않는지를 신호하는 데 사용된다. 이 경우 응답은 예를 들어 캐시될 수 있다. | 기본값 있음 |
boolean
|
idempotent |
Action이 멱등인지(=true) 아닌지를 나타낸다. 존재하는 경우 동일한 입력을 기반으로 Action을 반복해서 호출해도 동일한 결과를 얻을 수 있는지를 알려 준다. | 기본값 있음 |
boolean
|
synchronous |
action이 동기식인지(=true) 아닌지를 나타낸다. 동기식 action은 action의 응답이 action 결과에 대한 모든 정보를 포함하며, action 상태에 대한 추가 조회가 필요하지 않음을 의미한다. 이 키워드가 없으면 action의 동기성에 대해 어떤 주장도 할 수 없다. | 선택사항 |
boolean
|
ActionAffordance는
InteractionAffordance Class의
Subclass이다.
ActionAffordance
인스턴스 안에 Form 인스턴스가 있는 경우, op에 할당된 값은
invokeaction,
queryaction, cancelaction 중 하나이거나
이러한 terms의 조합을 포함하는
Array여야
MUST 한다.
이벤트 데이터를 Consumers에게 비동기적으로 push하는 이벤트 소스를 설명하는 Interaction Affordance (예: 과열 경고).
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
subscription |
구독 시 전달해야 하는 데이터(예: Webhooks 설정을 위한 필터 또는 메시지 형식)를 정의한다. | 선택사항 |
DataSchema
|
data |
Thing이 push하는 Event 인스턴스 메시지의 데이터 스키마를 정의한다. | 선택사항 |
DataSchema
|
dataResponse |
데이터 메시지에 대한 응답으로 consumer가 보내는 Event 응답 메시지의 데이터 스키마를 정의한다. | 선택사항 |
DataSchema
|
cancellation |
구독을 취소하기 위해 전달해야 하는 모든 데이터 (예: Webhook을 제거하기 위한 특정 메시지)를 정의한다. | 선택사항 |
DataSchema
|
EventAffordance는
InteractionAffordance Class의
Subclass이다.
EventAffordance
인스턴스 안에 Form 인스턴스가 있는 경우,
op에 할당된 값은
subscribeevent,
unsubscribeevent 중 하나이거나
Array 안에 두 terms 모두여야
MUST 한다.
프로토콜이 암시적 구독 해지 메커니즘(예:
연결 손실을 감지하기 위한 heartbeat)을 지원하지 않는 한,
각 subscribeevent에 대응하는
unsubscribeevent가 있는 것이 좋은 관행으로
간주된다.
EventAffordances는 Thing 자체가 관심 있는 Consumers에게
상태 변경을 알린다는 점에서 observable PropertyAffordances와
유사하다. 그러나 EventAffordances의 주요 차이점은
관련 리소스의 모든 변경이 이벤트 메시지를 발생시킬 필요는
없다는 것이다. 예를 들어 숫자 값의 임계 임계값이 있을 수 있다.
또한 EventAffordances는 subscription,
dataResponse, 그리고 cancellation
DataSchema 정의를 통해 더 복잡한 구독 및 구독 해지 메커니즘을
허용한다. 하지만 모든 프로토콜이 이러한 더 고급 메커니즘을
지원하는 것은 아닐 수 있으므로, 일부 시나리오에서는 events가
observable PropertyAffordances와 매우 유사할 수 있다. 이러한 경우
Affordance를 모델링하기 위해 Property와 Event 중 무엇을 선택할지는
기반 리소스의 의미론을 기반으로 결정해야 한다. 예를 들어
affordance의 상태가 Consumer에 의해 읽히거나 쓰여야 한다면,
Property가 가장 적절한 선택일 가능성이 높다.
TD 문서에 대한 버전 정보를 제공하는 Thing의 메타데이터. 필요한 경우 펌웨어 및 하드웨어 버전과 같은 추가 버전 정보 (TD 네임스페이스 외부의 term 정의)는 TD Context Extension 메커니즘을 통해 확장할 수 있다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
instance |
이 TD의 버전 표시자를 제공한다. | 필수 |
string
|
model |
기반 TM의 버전 표시자를 제공한다. | 선택사항 |
string
|
VersionInfo Class의
instances 및 model 안의 값은
점으로 구분된 세 숫자의 시퀀스가 각각 주 버전, 부 버전,
패치 버전을 나타내는 semantic versioning 패턴을 따르는 것이
권장된다. 자세한 내용은
[SEMVER]를
참조하라.
[BCP47]에 설명된 언어 태그로 식별되는 여러 언어의 사람이 읽을 수 있는 텍스트 집합을 제공하는 Map. Thing Description 인스턴스에서 이 컨테이너를 사용하는 예는 6.3.2 사람이 읽을 수 있는 메타데이터를 참조하라.
MultiLanguage Map의 각 이름은
[BCP47]에서
정의한 언어 태그여야 MUST 한다.
MultiLanguage Map의 각 값은
string 타입이어야 MUST
한다.
데이터 스키마는 데이터 형식에 포함된 데이터에 대한 추상 표기법이다.
데이터 스키마 어휘 정의는 JSON Schema [JSON-SCHEMA]에서 정의된 terms의 매우 일반적인 부분집합을 반영한다. JSON Schema draft 7용 JSON Schema [JSON-SCHEMA] processor는 데이터 스키마를 소비할 수 있다. Thing Description 인스턴스 안의 데이터 스키마 정의는 이 정의된 부분집합에 제한되지 않으며, 7. TD Context Extensions에서 설명한 대로 추가 terms를 위한 TD Context Extension을 사용하여 JSON Schema에서 찾을 수 있는 추가 terms를 사용할 수 있다. 그렇지 않으면 이러한 terms는 TD Processors에 의해 의미론적으로 무시된다 (의미론적 처리에 대한 자세한 내용은 D. JSON-LD Context Usage와 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라).
TD에서 구체적인 데이터 형식은 콘텐츠 타입을 사용하여
Forms( 5.3.4.2 Form 참조)에
지정된다. Form 인스턴스의 콘텐츠 타입 값이
application/json이면, 데이터 스키마는 JSON Schema
processors가 직접 처리할 수 있다. 그렇지 않으면
Web of Things(WoT) Binding Registry
[WOT-BINDING-REGISTRY]의
항목이 데이터 스키마에서 XML [xml]과
같은 다른 콘텐츠 타입으로의 사용 가능한 매핑을 정의한다.
Form 인스턴스의 콘텐츠 타입이 application/json이 아니고
해당 콘텐츠 타입에 대한 매핑이 정의되어 있지 않은 경우,
데이터 스키마를 지정하는 것은 그 콘텐츠 타입에 의미가 없다.
다음 표는 페이로드의 구조를 설명하기 위해 데이터 스키마를 사용할 수 MAY 있는 콘텐츠 타입을 포함한다.
| 형식 | 콘텐츠 타입 |
|---|---|
| JSON/CBOR | application/jsonapplication/ld+jsonapplication/senml+jsonapplication/cborapplication/senml+cbor |
| XML/EXI | application/xmlapplication/senml+xmlapplication/exiapplication/senml-exi |
사용되는 데이터 형식을 설명하는 메타데이터. 검증에 사용할 수 있다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
@type |
객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드 | 선택사항 |
string 또는 Array of
string
|
title |
기본 언어를 기반으로 사람이 읽을 수 있는 제목을 제공한다(예: UI 표현을 위한 텍스트 표시). | 선택사항 |
string
|
titles |
다국어 사람이 읽을 수 있는 제목을 제공한다 (예: 다른 언어로 UI 표현을 위한 텍스트 표시). MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
description |
기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. | 선택사항 |
string
|
descriptions |
다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
const |
상수 값을 제공한다. | 선택사항 | any type |
default |
기본값을 제공한다. 값은 그것이 위치한 데이터 스키마에 대해 검증되어야 SHOULD 한다. | 선택사항 | any type |
unit |
예를 들어 국제 과학, 공학 및 비즈니스에서 사용되는 단위 정보를 제공한다. 고유성을 보존하기 위해, unit 값은 의미론적 정의를 가리키는 것이 권장된다 (섹션 Semantic Annotations도 참조). | 선택사항 |
string
|
oneOf |
데이터가 배열에 지정된 스키마 중 하나에 대해 유효한지 보장하는 데 사용된다. 여러 입력 또는 출력 스키마를 설명하는 데 사용할 수 있다. | 선택사항 |
Array of DataSchema
|
enum |
배열로 제공되는 제한된 값 집합. | 선택사항 | Array of any type |
readOnly |
property interaction / value가 읽기 전용인지(=true) 아닌지(=false)를 나타내는 힌트인 Boolean 값. | 기본값 있음 |
boolean
|
writeOnly |
property interaction / value가 쓰기 전용인지(=true) 아닌지(=false)를 나타내는 힌트인 Boolean 값. | 기본값 있음 |
boolean
|
format |
"date-time", "email", "uri" 등과 같은 format 패턴을 기반으로 한 검증을 허용한다. (아래도 참조.) | 선택사항 |
string
|
type |
JSON Schema와 호환되는 JSON 기반 데이터 타입의 할당(boolean, integer, number, string, object, array 또는 null 중 하나). | 선택사항 |
anyURI (object, array,
string, number,
integer, boolean, 또는
null 중 하나)
|
DataSchema 클래스는 다음 하위 클래스를
가진다:
format 문자열 값은 알려진 고정 값 집합과
[JSON-SCHEMA]에
정의된 해당 format 규칙(특히 섹션 7.3 Defined Formats)에서
알려져 있다. Servients는
그에 따라 추가 검증을 수행하기 위해 format
값을 사용할 수 MAY 있다.
알려진 값 집합에서 찾을 수 없는 값이 format에
할당된 경우, 그러한 검증은 성공해야
SHOULD 한다.
any type (e.g.,
const, default) follow data
types compatible with JSON Schema (boolean, integer,
number, string, object, array, or null).
format term은 JSON Schema 도구에서
널리 구현되어 있지 않다. 또한 format term은
JSON Schema 표준화 커뮤니티에서 논의 중이며, 향후
JSON Schema 버전에서 다른 메커니즘으로 대체되거나
제거될 수 있다.
Array
타입의 데이터를
설명하는 메타데이터. 이 Subclass는
DataSchema 인스턴스에서 type에
할당된 array 값으로 표시된다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
items |
배열의 특성을 정의하는 데 사용된다. | 선택사항 |
DataSchema
또는 Array of DataSchema
|
minItems |
배열에 있어야 하는 최소 항목 수를 정의한다. | 선택사항 |
unsignedInt
|
maxItems |
배열에 있어야 하는 최대 항목 수를 정의한다. | 선택사항 |
unsignedInt
|
boolean 타입의 데이터를 설명하는 메타데이터.
이 Subclass는
DataSchema 인스턴스에서 type에
할당된 boolean 값으로 표시된다.
number 타입의 데이터를 설명하는 메타데이터.
이 Subclass는
DataSchema 인스턴스에서 type에
할당된 number 값으로 표시된다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
minimum |
포함 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
double
|
exclusiveMinimum |
배타 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
double
|
maximum |
포함 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
double
|
exclusiveMaximum |
배타 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
double
|
multipleOf |
multipleOf 값 숫자를 지정한다. 값은 0보다 엄격히 커야 한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
double
|
integer 타입의 데이터를 설명하는 메타데이터.
이 Subclass는
DataSchema 인스턴스에서 type에
할당된 integer 값으로 표시된다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
minimum |
포함 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
integer
|
exclusiveMinimum |
배타 하한을 나타내는 최소 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
integer
|
maximum |
포함 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
integer
|
exclusiveMaximum |
배타 상한을 나타내는 최대 숫자 값을 지정한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
integer
|
multipleOf |
multipleOf 값 숫자를 지정한다. 값은 0보다 엄격히 커야 한다. 관련 number 또는 integer 타입에만 적용된다. | 선택사항 |
integer
|
Object 타입의 데이터를
설명하는 메타데이터. 이 Subclass는
DataSchema 인스턴스에서 type에
할당된 object 값으로 표시된다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
properties |
중첩된 데이터 스키마 정의. | 선택사항 |
Map of DataSchema
|
required |
object 타입의 어떤 멤버가 필수인지, 즉 전송될
payload에서 어떤 멤버가 필수인지(예:
invokeaction,
writeproperty의 입력) 그리고 수신되는
payload에서 어떤 멤버가 확실히 전달될 것인지(예:
invokeaction,
readproperty의 출력)를 정의한다.
|
선택사항 |
Array of
string
|
string 타입의 데이터를 설명하는 메타데이터.
이 Subclass는
DataSchema 인스턴스에서 type에
할당된 string 값으로 표시된다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
minLength |
문자열의 최소 길이를 지정한다. 관련 string 타입에만 적용된다. | 선택사항 |
unsignedInt
|
maxLength |
문자열의 최대 길이를 지정한다. 관련 string 타입에만 적용된다. | 선택사항 |
unsignedInt
|
pattern |
문자열 값의 제약을 표현하기 위한 정규 표현식을 제공한다. 정규 표현식은 [ECMA-262] 방언을 따라야 한다. | 선택사항 |
string
|
contentEncoding |
[RFC2045] (섹션 6.1) 및 [RFC4648]에 지정된 대로 콘텐츠를 저장하는 데 사용되는 인코딩을 지정한다. | 선택사항 |
string (예: 7bit,
8bit, binary,
quoted-printable,
base16, base32, 또는
base64)
|
contentMediaType |
[RFC2046]에 설명된 대로 문자열 값 콘텐츠의 MIME 타입을 지정한다. | 선택사항 |
string (예:
image/png, 또는
audio/mpeg)
|
문자열의 길이(즉,
minLength와 maxLength)는
[RFC8259]에서
정의한 Unicode code point의 수로 정의된다.
일부 사용자가 인식하는
문자는
둘 이상의 Unicode code point로 구성된다는 점에 유의하라.
임의의 인덱스 값은 이러한 grapheme 경계에 위치하지 않을 수
있으므로, maxLength에 따른 잘라내기는 문자열의
외형이나 의미를 변경할 수 있다.
null 타입의 데이터를 설명하는 메타데이터.
이 subclass는 DataSchema 인스턴스에서
type에 할당된 null 값으로 표시된다.
이 Subclass는 오직 하나의 허용 가능한 값, 즉
null만을 설명한다. null이 값의
부재를 의미하지 않는다는 점에 유의하는 것이 중요하다.
이는 JavaScript의 null, Python의
None, Java의 null, Ruby
프로그래밍 언어의 nil과 유사하다.
이는 oneOf 선언의 일부로 사용할 수 있으며,
데이터가 null일 수도 있음을 나타내는 데
사용된다.
이 명세는 W3C WoT의 Protocol Bindings로 적합한 프로토콜에 직접 내장되어 있거나 해당 프로토콜과 함께 널리 사용되는, 잘 정립된 보안 메커니즘의 선택을 제공한다. 현재 HTTP 보안 스킴 집합은 부분적으로 OpenAPI 3.0.1을 기반으로 한다([OPENAPI]도 참조). 그러나 이 명세에서 제공되는 HTTP 보안 스킴, Vocabulary, 그리고 구문은 OpenAPI와 많은 유사점을 공유하지만, 호환되지는 않는다.
일반적으로 보안 스킴이 효과적이려면 TLS 또는 DTLS와 같은 어떤 형태의 보안 전송이 필요하다. 보안 전송 사용에 대한 요구사항은 이 문서의 섹션 11. 보안 고려사항과 [wot-architecture11]의 보안 고려사항 섹션에 제공된다.
보안 메커니즘의 구성을 설명하는 메타데이터.
이름
scheme에 할당된 값은
Thing Description에 포함된
Vocabulary 안에서
정의되어야 MUST 하며,
이는 § 5.
TD
Information Model에서 정의된 표준
Vocabulary 안이거나
TD Context
Extension 안이어야 한다.
모든 보안 스킴에 대해, 접근을 직접 제공하는 키, 비밀번호 또는 기타 민감한 정보는 TD에 저장되어서는 MUST NOT 안 되며, 대신 다른 메커니즘을 통해 대역 외에서 공유되고 저장되어야 한다. TD의 목적은 Consumer가 이미 권한을 가진 경우에만 Thing에 접근하는 방법을 설명하는 것이며, 그 권한을 부여하는 데 사용되도록 의도된 것이 아니다.
TD에서 사용되는 각 보안 스킴 객체는 접근이 허용되기 전에 충족되어야 하는 요구사항 집합을 정의한다. 우리는 모든 요구사항이 충족될 때 보안 스킴이 만족된다고 말한다. 어떤 경우에는 접근이 허용되기 전에 여러 보안 스킴의 요구사항이 충족되어야 할 수도 있다.
보안 스킴은 일반적으로 비밀번호나 키와 같은 추가 인증
매개변수를 요구할 수 있다. 이 정보의 위치는 이름
in과 연결된 값으로 표시되며, 종종
name과 연결된 값과 함께 사용된다.
in과 연결된 값은 다음 값 중 하나를
취할 수 있다:
header:name 값으로 제공된다.query:name으로
제공된다.body:name으로
제공된다. body 보안 정보
위치의 문맥에서 사용될 때, name의 값은
그것이 사용되는 각 상호작용에 대한 입력
DataSchema의 루트에 상대적인 JSON pointer
[RFC6901]
형식이어야 MUST 한다.
이 값은 fragment identifier가 아니며 TD의 루트에 상대적인
것이 아니라 보안 스킴이 바인딩되는 데이터 스키마에
상대적이므로, #로 시작해서는 안 된다.
이는 “순수한” JSON pointer이다. 이 값은 fragment identifier가
아니므로 특수 문자를 URL 인코딩할 필요도 없다. 대상
요소는 참조된 object 또는 array schema의 지정된 위치에
이미 존재할 수도 있고 존재하지 않을 수도 있다(따라서
이 메커니즘은 simple types에는 적용되지 않는다). 존재하지
않으면 삽입된다. 이는 모든 상호작용의 데이터 스키마에서
정의를 중복해야 하는 일을 피하게 한다.
body locator에
표시된 JSON pointer가 나타내는 데이터 스키마 요소가
표시된 스키마에 아직 존재하지 않는 경우, pointer가
나타내는 위치에 해당 요소를 삽입할 수 있어야
MUST 한다.
body locator에서 사용되는
JSON pointer는 기존 배열의 마지막 요소 뒤에 요소를
삽입해야 할 때 존재하지 않는 배열 요소를 나타내기 위해
"-" 문자를 사용할 수
MAY 있다.
body 보안 정보
위치가 참조하거나 생성하는 요소는 필수이며
"string" 타입이어야
MUST 한다.
name이 주어지지 않으면 전체 본문이 보안
매개변수로 사용되는 것으로 간주된다.
cookie:name 값으로 식별되는 쿠키에
저장된다.uri:name 값으로
정의된 URI 템플릿 변수를 사용하여 관련 상호작용에서
인코딩된다. 이는 query 메커니즘보다 더
일반적이지만 더 복잡하다.
보안 스킴에서
이름 in에 대한 값으로 uri는
query가 적용되지 않는 경우에만 지정되어야
SHOULD 한다.
in의 값으로
uri를 사용하는 보안 스킴이 있는
상호작용에서 제공되는 URI는 정의된 변수를 포함하는
URI 템플릿이어야 MUST
한다.
auto:SecurityScheme의
in 필드에 auto 값이 설정된 경우,
name 필드는 설정되지 않아야
SHOULD
NOT 한다. 이 경우
SecurityScheme의 적용은 주어진 프로토콜에 대한
각각의 명세를 따른다(예: HTTP와 함께
BasicSecurityScheme을 사용할 때
[RFC8288]).
보안 스킴에 여러 매개변수가 필요한 경우, 각 매개변수에 대해
보안 스킴 정의를 반복하고 combo 보안 스킴과
allOf를 사용하여 결합한다. 어떤 경우에는
매개변수가 실제로 비밀이 아닐 수 있지만, 사용자가 개인정보
보호를 돕기 위해 이를 TD에서 제외하고자 할 수 있다.
예를 들어 일부 보안 메커니즘은 클라이언트 식별자와 비밀
키를 모두 요구한다. 이론적으로 클라이언트 식별자는 공개되어
있지만 업데이트하기 어려울 수 있고 추적 위험을 야기할 수
있다. 이러한 경우 TD에 나타나지 않도록 추가 보안 매개변수로
제공할 수 있다.
SecurityScheme에서 선언된 URI 변수의 이름은
TD에서 선언된 다른 모든 URI 변수와 구별되어야
MUST 한다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
@type |
객체에 semantic tags (또는 types)를 레이블링하는 JSON-LD 키워드. | 선택사항 |
string 또는 Array of
string
|
description |
기본 언어를 기반으로 추가적인(사람이 읽을 수 있는) 정보를 제공한다. | 선택사항 |
string
|
descriptions |
다른 언어로 (사람이 읽을 수 있는) 정보를 지원하는 데 사용할 수 있다. MultiLanguage도 참조하라. | 선택사항 |
Map of MultiLanguage
|
proxy |
이 보안 구성이 접근을 제공하는 프록시 서버의 URI. 주어지지 않으면 해당 보안 구성은 endpoint에 대한 것이다. | 선택사항 |
anyURI
|
scheme |
구성되는 보안 메커니즘의 식별. | 필수 |
string (예:
nosec, combo,
basic, digest,
bearer, psk,
oauth2, apikey, 또는
auto)
|
SecurityScheme 클래스는 다음 하위 클래스를
가진다:
Vocabulary Term
nosec로 식별되는 보안 구성
(즉, "scheme":
"nosec")으로, 리소스에 접근하기 위해 인증이나
기타 메커니즘이 필요하지 않음을 나타낸다.
term auto로 식별되는 자동 인증 보안 구성
(즉, "scheme": "auto"). 이 스킴은
보안 매개변수가 런타임에 기반 프로토콜에 의해 협상되며,
주어진 프로토콜에 대한 각각의 명세를 따른다는 것을 나타낸다
(예: HTTP를 사용할 때 Basic Authentication에 대해
[RFC8288]).
Vocabulary Term
combo로 식별되는 다른 보안 스킴의 조합
(즉, "scheme":
"combo"). 이 스킴의 요소들은
securityDefinitions에 정의된 다른 이름 있는 스킴들,
다른 ComboSecurityScheme
정의를 포함하여, 새로운 스킴 정의를 만들기 위해 결합되는
다양한 방식을 정의한다. oneOf 또는
allOf vocabulary terms 중 정확히 하나가
포함되어야 MUST 한다.
함께 사용할 수 있는 보안 스킴 정의만 allOf와
결합할 수 있다. 예를 들어 하나가 프록시에 적용되고 다른
하나가 endpoint에 적용되는 경우가 아니면, 일반적으로
서로 다른 OAuth 2.0 flows를 allOf로 함께 결합하는
것은 불가능하다. 여러 이름 있는 보안 스킴 정의가
security 필드에 나열된 경우, allOf
조합과 동일한 의미론이 적용된다는 점에 유의하라(허용 가능한
조합에 대한 동일한 제한도 적용된다). oneOf 조합은
그 외에는 동일한 forms에서 서로 다른 보안 스킴을 사용하는 것과
동등하다. 이런 의미에서 oneOf 스킴은 필수적인 기능은
아니지만, 그러한 경우 중복을 피할 수 있게 한다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
oneOf |
다른 이름 있는 보안 스킴 정의를 식별하는 두 개 이상의 문자열 배열이며, 그중 어느 하나라도 만족되면 접근이 허용된다. 사용을 위해 하나만 선택될 수 있다. | 필수 |
Array of
string
|
allOf |
다른 이름 있는 보안 스킴 정의를 식별하는 두 개 이상의 문자열 배열이며, 접근을 위해 모두 만족되어야 한다. | 필수 |
Array of
string
|
암호화되지 않은 사용자 이름과 비밀번호를 사용하는,
Vocabulary Term
basic (즉, "scheme":
"basic")으로 식별되는 Basic Authentication
[RFC7617]
보안 구성.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
name |
query, header, cookie 또는 uri 매개변수의 이름. | 선택사항 |
string
|
in |
보안 인증 정보의 위치를 지정한다. | 기본값 있음 |
string (
header, query,
body, cookie, 또는
auto 중 하나)
|
Vocabulary Term
digest (즉, "scheme":
"digest")로 식별되는 Digest Access Authentication
[RFC7616]
보안 구성. 이 스킴은 basic authentication과 유사하지만
man-in-the-middle attacks를 피하기 위한 추가 기능을 가진다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
name |
query, header, cookie 또는 uri 매개변수의 이름. | 선택사항 |
string
|
in |
보안 인증 정보의 위치를 지정한다. | 기본값 있음 |
string (
header, query,
body, cookie, 또는
auto 중 하나)
|
qop |
보호 품질. | 기본값 있음 |
string (
auth, 또는 auth-int 중 하나)
|
Vocabulary Term
apikey (즉, "scheme":
"apikey")로 식별되는 API key authentication 보안 구성.
이 스킴은 access token이 불투명한 경우, 예를 들어 클라우드
서비스 제공자가 알 수 없거나 독점적인 형식의 키를 제공하는
경우 사용된다. 이 경우 키는 표준 token 형식을 사용하지
않을 수 있다. 이 스킴은 서비스 제공자가 제공한 키가
"in" 필드가 나타내는 메커니즘을 사용하여
서비스 요청의 일부로 제공되어야 함을 나타낸다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
name |
query, header, cookie 또는 uri 매개변수의 이름. | 선택사항 |
string
|
in |
보안 인증 정보의 위치를 지정한다. | 기본값 있음 |
string (
header, query,
body, cookie,
uri, 또는 auto 중 하나)
|
bearer tokens가 OAuth2와 독립적으로 사용되는 상황을 위한,
Vocabulary Term
bearer (즉, "scheme":
"bearer")로 식별되는 Bearer Token
[RFC6750]
보안 구성. oauth2 스킴이 지정된 경우, 이것이
암시되므로 일반적으로 이 스킴을 함께 지정할 필요는 없다.
format에 대해, 값 jwt는
[RFC7519] 준수를 나타내고,
jws는
[RFC7797]
준수를 나타내며,
cwt는
[RFC8392] 준수를 나타내고,
jwe는
[RFC7516] 준수를 나타내며,
alg의 값은 이러한 표준과 일관되게 해석된다.
bearer tokens에
대한 다른 형식과 알고리즘은 vocabulary extensions에서
지정될 수 MAY 있다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
authorization |
authorization server의 URI. | 선택사항 |
anyURI
|
name |
query, header, cookie 또는 uri 매개변수의 이름. | 선택사항 |
string
|
in |
보안 인증 정보의 위치를 지정한다. | 기본값 있음 |
string (
header, query,
body, cookie, 또는
auto 중 하나)
|
alg |
인코딩, 암호화 또는 digest 알고리즘. | 기본값 있음 |
string (예:
ES256, 또는 ES512-256)
|
format |
보안 인증 정보의 형식을 지정한다. | 기본값 있음 |
string (예: jwt,
cwt, jwe, 또는
jws)
|
Vocabulary Term
psk (즉, "scheme": "psk")로 식별되는
pre-shared key authentication 보안 구성.
이는 TLS-PSK [RFC4279]와
같은 pre-shared keys에 표준이 사용되며, 키에 사용되는
ciphersuite가 프로토콜 협상 중에 설정된다는 것을
식별하기 위한 것이다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
identity |
선택 또는 확인에 사용할 수 있는 정보를 제공하는 식별자. | 선택사항 |
string
|
[RFC6749] 및
[RFC8252]를
준수하는 시스템을 위한 OAuth 2.0 authentication 보안 구성으로,
Vocabulary Term
oauth2 (즉, "scheme":
"oauth2")로 식별된다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
authorization |
authorization server의 URI. | 선택사항 |
anyURI
|
token |
token server의 URI. | 선택사항 |
anyURI
|
refresh |
refresh server의 URI. | 선택사항 |
anyURI
|
scopes |
배열로 제공되는 authorization scope 식별자 집합.
이들은 authorization server가 반환한 tokens에 제공되고,
클라이언트가 어떤 리소스에 어떻게 접근할 수 있는지를
식별하기 위해 forms와 연결된다. form과 연결된 값은
해당 form에서 활성인 OAuth2SecurityScheme에
정의된 것 중에서 선택되어야
SHOULD 한다.
|
선택사항 |
string 또는 Array of
string
|
flow |
Authorization flow. | 필수 |
string (예: code,
또는 client)
|
code
flow의 경우 authorization 및
token vocabulary terms가
모두 포함되어야 MUST 한다.
client flow의 경우 token
vocabulary term이
포함되어야 MUST 한다.
client flow의 경우 authorization
vocabulary term은
포함되어서는 MUST NOT 안 된다.
각 flow의 필수 요소는 다음 표에 요약되어 있다:
| 요소 | code |
client |
|---|---|---|
authorization |
필수 | 생략 |
token |
필수 | 필수 |
refresh |
선택사항 | 선택사항 |
현재 모델은 Thing이 노출하는 (타입이 지정된)
Web links와 Web forms에 대한 표현을 제공한다.
Link 클래스 정의는 Web Linking
[RFC8288]에서 정의된 terms의 매우
일반적인 부분집합을 반영한다. 정의된 terms는 예를 들어
Lamp Thing이 Switch Thing에 의해 제어되는 것처럼
다른 Thing과의
관계를 설명하는 데 사용할 수 있다. Form 클래스는
Things
(및 다른 Web resources)의 상태를 조작하기 위해 새로 도입된
hypermedia control 형식에 해당한다.
link는 "link context가 link target에 relation type 리소스를 가진다"라는 형식의 문장으로 볼 수 있으며, 선택적 target attributes는 리소스를 추가로 설명할 수 있다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
href |
link의 대상 IRI 또는 form의 제출 대상. | 필수 |
anyURI
|
type |
link를 역참조한 결과의 media type [RFC2046]이 무엇이어야 하는지 나타내는 힌트를 제공하는 target attribute. | 선택사항 |
string
|
rel |
link relation type은 link의 의미론을 식별한다. | 선택사항 |
string
|
anchor |
link context(기본적으로 자체 id로 식별되는
Thing 자체)를 주어진 URI 또는 IRI로 재정의한다. |
선택사항 |
anyURI
|
sizes |
참조된 아이콘의 하나 이상의 크기를 지정하는 target attribute. relation type "icon"에만 적용된다. 값 패턴은 {Height}x{Width}를 따른다(예: "16x16", "16x16 32x32"). | 선택사항 |
string
|
hreflang |
hreflang 속성은 연결된 문서의 언어를 지정한다. 이 값은 유효한 언어 태그여야 한다 [BCP47]. | 선택사항 |
string 또는 Array of
string
|
이 버전의 명세에서는 hreflang 속성이
string 또는 array가 되는 것을
허용한다. [LINKSET-MEDIA-TYPES]의
결과에 따라 hrefLang의 값은
array로만 제한될 수 있다.
Link relations는 다른 Things와의 관계(예: Switch Thing이 Lamp Thing을 제어함), 특정 종류의 Thing Models와의 관계 (예: Thing Description이 특정 Thing Model의 인스턴스임), 또는 추가 문서 정보(예: Thing의 장치 설명서)를 설명하는 데 사용할 수 있다. 기존의 확립된 IANA의 Link Relation 정의를 재사용하는 것이 권장된다.
다음에서는 WoT Thing Description 또는 Thing Model 인스턴스 안에서 사용할 것을 권장하는 best practice relation type 표를 소개한다.
| 값 | 발생 | 설명 | 값 출처 |
|---|---|---|---|
icon |
0..* | Thing과 연결된 아이콘을 가져온다(예: UI 목적). | IANA Link Relation |
service-doc |
0..* | (사람이 읽을 수 있는) 문서 또는 설명을 제공하는 리소스와의 관계. | IANA Link Relation |
alternate |
0..* | Thing의 대체 표현을 가리킨다(예: RDF-Turtle, 사람이 읽을 수 있는 HTML 문서, ...). | IANA Link Relation |
type |
0..1 | Thing이 Thing Model과 같은 대상 리소스의 인스턴스임을 나타낸다. | IANA Link Relation |
tm:extends |
0..1 | Thing Model과 같은 대상 리소스의 기존 정의를 확장한다. Thing Model 정의에만 적용된다. | W3C WoT Thing Model |
tm:submodel |
0..* | 하나 이상의 Thing Models를 구성하는 데 사용된다. Thing Model 정의에만 적용된다. | W3C WoT Thing Model |
manifest |
0..* | 예를 들어 사용자가 Thing과 상호작용할 수 있는 사용자 인터페이스를 제공하는 web application의 web app manifest를 가리킨다([APPMANIFEST]도 참조). | IANA Link Relation |
proxy-to |
0..* |
대상 리소스가 프록시 주소를 제공한다.
추가 보안 메타데이터는 SecurityScheme의
proxy 필드를 사용하여 제공할 수 있다.
|
W3C WoT Security 및 WoT Binding Template |
collection |
0..1 | Things의 collection을 가리킨다. | IANA Link Relation |
item |
0..* | 현재 Thing collections의 구성원인 Thing을 가리킨다. | IANA Link Relation |
predecessor-version |
0..1 | 이전 Thing Description 또는 Thing Model 버전을 가리킨다. | IANA Link Relation |
controlledBy |
0..* | context Thing을 제어하는 Thing을 참조한다. | W3C Thing Description |
form은 " form context에서 operation type 작업을 수행하려면, submission target에 request method 요청을 하라"라는 문장으로 볼 수 있으며, 선택적 form fields는 필요한 요청을 추가로 설명할 수 있다. Thing Descriptions에서 form context는 Properties, Actions, Events와 같은 주변 Object이거나 meta-interactions의 경우 Thing 자체이다.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
href |
link의 대상 IRI 또는 form의 제출 대상. | 필수 |
anyURI
|
contentType |
media type [RFC2046]에
대한 media type(예: text/plain) 및 잠재적
매개변수(예: charset=utf-8)를 기반으로
콘텐츠 타입을 할당한다.
|
선택사항 |
string
|
contentCoding |
Content coding 값은 표현에 적용되었거나 적용될 수 있는 인코딩 변환을 나타낸다. Content codings는 주로 표현이 그 기반 media type의 정체성을 잃지 않고, 정보 손실 없이 압축되거나 유용하게 변환될 수 있게 하는 데 사용된다. content coding의 예에는 "gzip", "deflate" 등이 포함된다. | 선택사항 |
string
|
security |
securityDefinitions에서 정의된 것들 중에서
선택된 보안 정의 이름의 집합. 리소스 접근을 위해
이들은 모두 만족되어야 한다. |
선택사항 |
string 또는 Array of
string
|
scopes |
배열로 제공되는 authorization scope 식별자 집합.
이들은 authorization server가 반환한 tokens에 제공되고,
클라이언트가 어떤 리소스에 어떻게 접근할 수 있는지를
식별하기 위해 forms와 연결된다. form과 연결된 값은
해당 form에서 활성인
OAuth2SecurityScheme에 정의된 것 중에서
선택되어야 SHOULD 한다.
|
선택사항 |
string 또는 Array of
string
|
response |
예를 들어 출력 통신 메타데이터가 입력 메타데이터와 다를 경우(예: 출력 contentType이 입력 contentType과 다름) 사용할 수 있는 선택적 term. response 이름은 primary response messages에만 유효한 메타데이터를 포함한다. | 선택사항 |
ExpectedResponse
|
additionalResponses |
오류 보고와 같이 추가 예상 응답이 가능할 경우 사용할 수 있는 선택적 term. 각 추가 응답은 어떤 방식으로든 다른 응답과 구별되어야 하며(예: 프로토콜별 오류 코드를 지정), 자체 데이터 스키마를 가질 수도 있다. | 선택사항 |
Array of AdditionalExpectedResponse
|
subprotocol |
주어진 프로토콜에 여러 옵션이 있을 때 상호작용이
수행될 정확한 메커니즘을 나타낸다. 예를 들어 HTTP와
Events의 경우 long polling(longpoll),
WebSub [websub]
(websub), Server-Sent Events
(sse) [html] (EventSource라고도 함)와 같은
비동기 알림에 사용해야 하는 여러 사용 가능한 메커니즘 중
어느 것을 사용해야 하는지 나타낸다. subprotocol 선택에는
제한이 없으며 다른 메커니즘도 이 subprotocol term으로
알릴 수 있다는 점에 유의하라. |
선택사항 |
string (예:
longpoll, websub, 또는
sse)
|
op |
form이 설명하는 작업(들)을 수행하는 의미론적 의도를 나타낸다. 예를 들어 Property interaction은 get 및 set 작업을 허용한다. protocol binding은 get 작업을 위한 form과 set 작업을 위한 다른 form을 포함할 수 있다. op 속성은 어떤 form이 어떤 작업을 위한 것인지 나타내며, 클라이언트가 필요한 작업에 맞는 올바른 form을 선택할 수 있게 한다. op에는 각각 작업의 의미론적 의도를 나타내는 하나 이상의 interaction verb(s)를 할당할 수 있다. | 기본값 있음 |
string 또는 Array of
string (
readproperty,
writeproperty,
observeproperty,
unobserveproperty,
invokeaction,
queryaction,
cancelaction,
subscribeevent,
unsubscribeevent,
readallproperties,
writeallproperties,
readmultipleproperties,
writemultipleproperties,
observeallproperties,
unobserveallproperties,
subscribeallevents,
unsubscribeallevents, 또는
queryallactions 중 하나)
|
contentCoding property에 가능한 값은 예를 들어
IANA HTTP content coding registry에서 찾을 수 있다.
form의 가능한 operation types 목록은 고정되어 있다. 이 명세의 현재 버전 기준으로, [wot-architecture11]에 설명된 WoT interaction model을 구현하는 데 필요한 잘 알려진 types만 포함한다. 표준의 향후 버전은 이 목록을 확장할 수 있지만, operations types는 아래 표의 값으로 제한되어야 MUST 한다.
| Operation Type | 설명 |
|---|---|
| readproperty | 대응하는 데이터를 검색하기 위한 Property Affordances의 읽기 작업을 식별한다. |
| writeproperty | 대응하는 데이터를 업데이트하기 위한 Property Affordances의 쓰기 작업을 식별한다. |
| observeproperty | Property가 업데이트될 때 새 데이터로 알림을 받기 위한 Property Affordances의 관찰 작업을 식별한다. |
| unobserveproperty | 대응하는 알림을 중지하기 위한 Property Affordances의 관찰 해지 작업을 식별한다. |
| invokeaction | 대응하는 action을 수행하기 위한 Action Affordances의 호출 작업을 식별한다. |
| queryaction | 대응하는 action의 상태를 얻기 위한 Action Affordances의 조회 작업을 식별한다. |
| cancelaction | 진행 중인 대응하는 action을 취소하기 위한 Action Affordances의 취소 작업을 식별한다. |
| subscribeevent | event가 발생할 때 Thing으로부터 알림을 받기 위한 Event Affordances의 구독 작업을 식별한다. |
| unsubscribeevent | 대응하는 알림을 중지하기 위한 Event Affordances의 구독 해지 작업을 식별한다. |
| readallproperties | 단일 상호작용에서 모든 Properties의 데이터를 검색하기 위한 Thing의 readallproperties 작업을 식별한다. |
| writeallproperties | 단일 상호작용에서 모든 쓰기 가능한 Properties의 데이터를 업데이트하기 위한 Thing의 writeallproperties 작업을 식별한다. |
| readmultipleproperties | 단일 상호작용에서 선택된 Properties의 데이터를 검색하기 위한 Thing의 readmultipleproperties 작업을 식별한다. |
| writemultipleproperties | 단일 상호작용에서 선택된 쓰기 가능한 Properties의 데이터를 업데이트하기 위한 Thing의 writemultipleproperties 작업을 식별한다. |
| observeallproperties | 어떤 Property든 업데이트될 때 새 데이터로 알림을 받기 위한 Properties의 observeallproperties 작업을 식별한다. |
| unobserveallproperties | 단일 상호작용에서 모든 Properties로부터의 알림을 중지하기 위한 Properties의 unobserveallproperties 작업을 식별한다. |
| queryallactions | 단일 상호작용에서 모든 Actions의 상태를 얻기 위한 Thing의 queryallactions 작업을 식별한다. |
| subscribeallevents | 단일 상호작용에서 모든 Events의 알림을 구독하기 위한 Events의 subscribeallevents 작업을 식별한다. |
| unsubscribeallevents | 단일 상호작용에서 모든 Events의 알림을 구독 해지하기 위한 Events의 unsubscribeallevents 작업을 식별한다. |
WoT producer의 Thing Description은 Consumer가 지원할 수 있는, 예를 들어 서로 다른 프로토콜 및/또는 콘텐츠 타입 선언을 가진 여러 forms entries를 가질 수 있다. 이 경우 Consumer는 자신에게 작동하는(예: 프로토콜과 콘텐츠 타입이 지원되는) 어떤 form entry든 선택할 수 있다. 하나의 form이 선택되면, Consumer는 WoT producer와의 모든 새로운 상호작용에서 가능한 한 오랫동안 그것을 계속 사용할 것으로 기대된다.
이 섹션은 비규범적이다.
TD와 함께 사용할 수 있는 프로토콜은 request-response 또는
eventing 메커니즘을 따른다. affordance의 Data
Schema는 일반적으로 forms에서 사용되는
op 키워드와 상관관계를 가진다.
아래 표는 op 키워드와 함께 사용 가능한
데이터 스키마 관련 terms를 정보 제공적으로 요약한다.
| Operation Type | Consumer to Thing DataSchema 상관관계 | Thing to Consumer DataSchema 상관관계 |
|---|---|---|
| readproperty | 상관관계 없음. | "writeOnly":true가 없는 Property Affordance의
모든 필드.
|
| writeproperty | "readOnly":true가 없는 Property Affordance의
모든 필드.
|
상관관계 없음.
additionalResponses는 form level에서 사용할 수 있다.
|
| observeproperty | 상관관계 없음. | "writeOnly":true가 없는 Property Affordance의
모든 필드.
|
| unobserveproperty | 상관관계 없음. | 상관관계 없음. |
| invokeaction | input 키의 값. |
output 키의 값. |
| queryaction | 상관관계 없음. | 상관관계 없음.
additionalResponses는 form level에서 사용할 수 있다.
|
| cancelaction | 상관관계 없음. | 상관관계 없음.
additionalResponses는 form level에서 사용할 수 있다.
|
| subscribeevent | "readOnly":true가 없는 모든 필드를 포함하는
subscription 키의 값
|
"writeOnly":true가 없는 모든 필드를 포함하는
subscription 키의 값
|
| unsubscribeevent | "readOnly":true가 없는 모든 필드를 포함하는
subscription 키의 값
|
"writeOnly":true가 없는 모든 필드를 포함하는
subscription 키의 값
|
property에 쓰는 것이 반드시 해당 property를 관찰하는 Consumer에게 새 값이 전송된다는 것을 의미하지는 않는다. 이는 프로토콜과 구현에 따라 달라진다.
readallproperties와 같은 meta
operations의 매핑뿐 아니라, operations를 data schemas에
매핑하는 방법에 대한 추가 명세는
[WOT-BINDING-TEMPLATES]의
해당 프로토콜 명세에서 찾을 수 있다.
선택적 response 이름-값 쌍은 예상되는
response message에 대한 메타데이터를 제공하는 데 사용할 수
있다. core vocabulary에서는 콘텐츠 타입 정보만 포함할 수
있지만, TD Context Extensions가 적용될 수 있다.
response 이름-값 쌍이
제공되지 않으면, response의 콘텐츠 타입은 Form 인스턴스에
할당된 콘텐츠 타입과 같다고 가정해야
MUST 한다.
ExpectedResponse Class 안의
contentType에는
Default Value가 없다는 점에 유의하라.
어떤 경우에는 추가 응답이 가능할 수 있다. 이에 대한 한 가지
예는 오류 응답이지만, 어떤 경우에는 추가적인 성공 응답도
있을 수 있다. 이 경우 response 이름-값 쌍은
여전히 primary response에 사용되지만, additionalResponses도
제공될 수 있으며, 그 값은 AdditionalExpectedResponse
객체의 배열이다. 각 추가 응답은 contentType 또는
오류 코드 헤더 값과 같은 프로토콜별 설정을 통해 primary
response와 어떤 방식으로든 구별되어야 한다. 각 추가 응답은
상호작용의 일반 출력 데이터 스키마와 다를 수 있는 자체
데이터 스키마도 가질 수 있다.
일부 사용 사례에서는 입력 및 출력 데이터가 서로 다른 형식으로
표현될 수 있다. 예를 들어 JSON을 받지만 이미지를 반환하는
Action이 있을 수 있다. 이러한 경우 선택적 response
키-값 쌍은 예상되는 response의 콘텐츠 타입을 설명할 수 있다.
정의된 기본값이 없으므로 다음 assertion이 적용된다:
response 객체에 contentType 값이
정의되어 있지 않은 경우,
Consumer는 해당
response가 payload를 포함하지 않는다고 예상해야
MUST 한다.response 객체에 content type이 정의된 경우,
Consumer는
해당 형식의 payload를 포함하는 response를 예상해야
MUST 한다. 예를 들어
image/jpeg의 경우 이미지이다.유사한 고려사항은 additional responses에도 적용된다:
Form 인스턴스는 이름
additionalResponses와 연결된 배열에 항목을
포함해야 MUST 한다.contentType 값이 정의되어 있지 않은 경우,
Consumer는
해당 response가 payload를 포함하지 않는다고 예상해야
MUST 한다.Form은 이름 additionalResponses와
연결된 배열에 이름 schema에 대한 값을 포함하는
항목을 포함해야 MUST 한다.contentType이 없을 때 additional expected
response 객체의 schema는 정의되어서는
MUST NOT 안 된다.request와 response의 변형에 관한 여러 경우는 위에서 설명했다. C. Thing Descriptions에서 contentType 사용의 표는 이러한 경우를 간결하게 요약한다.
primary response에 대한 예상 response message를 설명하는 통신 메타데이터.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
contentType |
media type [RFC2046]에
대한 media type(예: text/plain) 및 잠재적
매개변수(예: charset=utf-8)를 기반으로
콘텐츠 타입을 할당한다.
|
선택사항 |
string
|
additional responses에 대한 예상 response message를 설명하는 통신 메타데이터.
| 어휘 용어 | 설명 | 할당 | 타입 |
|---|---|---|---|
success |
additional response가 오류로 간주되어서는 안 되는지 신호한다. | 기본값 있음 |
boolean
|
schema |
additional response가 기본 출력 데이터 스키마와 다른 경우
그 출력 데이터 스키마를 정의하는 데 사용된다.
DataSchema 객체가 아니라
schemaDefinitions map에 주어진 이전 정의의
이름을 사용해야 한다.
|
선택사항 |
string
|
contentType |
media type [RFC2046]에
대한 media type(예: text/plain) 및 잠재적
매개변수(예: charset=utf-8)를 기반으로
콘텐츠 타입을 할당한다.
|
선택사항 |
string
|
TD에서 할당이 누락된 경우, TD Processor는 Default Value Definitions의 표에 표현된 Default Value 할당을 따라야 MUST 한다.
다음 표는 TD Information Model에서 정의된 모든 Default Values를 제공한다.
| Class | Vocabulary Term | Default Value | 주석 |
|---|---|---|---|
PropertyAffordance |
readOnly |
false |
이 vocabulary term의 기본값은
PropertyAffordance 수준 정의에만
적용된다. DataSchema 정의와 같은
다른 문맥에서는 이 vocabulary term이 선택사항이다.
|
PropertyAffordance |
writeOnly |
false |
이 vocabulary term의 기본값은
PropertyAffordance 수준 정의에만
적용된다. DataSchema 정의와 같은
다른 문맥에서는 이 vocabulary term이 선택사항이다.
|
PropertyAffordance |
observable |
false |
|
ActionAffordance |
safe |
false |
|
ActionAffordance |
idempotent |
false |
|
AdditionalExpectedResponse |
success |
false |
|
Form |
contentType |
application/json |
|
Form |
op |
Array of
string with the elements
readproperty and
writeproperty when readOnly
and writeOnly are set to
false or Array of
string with the element
readproperty when readOnly
is set to true or Array of
string with the element
writeproperty when
writeOnly is set to
true. |
PropertyAffordance의 인스턴스 안에서
정의된 경우
|
Form |
op |
invokeaction |
ActionAffordance의 인스턴스 안에서
정의된 경우
|
Form |
op |
Array of
string with the elements
subscribeevent and
unsubscribeevent
|
EventAffordance의 인스턴스 안에서
정의된 경우
|
BasicSecurityScheme |
in |
header |
|
DigestSecurityScheme |
in |
header |
|
DigestSecurityScheme |
qop |
auth |
|
APIKeySecurityScheme |
in |
query |
|
BearerSecurityScheme |
in |
header |
|
BearerSecurityScheme |
alg |
ES256 |
|
BearerSecurityScheme |
format |
jwt |
추가로, 기본값 사용에는 다음 고려사항이 적용된다:
forms 항목이
여러 op 값을 가지는 경우, form은 Consumer가 보낼 수 있는
메시지를 하나의 작업으로만 제한해서는 MUST NOT
안 된다. 예를 들어 "op":["readproperty",
"writeproperty"]가 있는 form은
htv:methodName을 포함할 수 없다. 일반적으로
TD Processor는
내부적으로 여러 op 값을 별도의 forms
항목으로 확장하고, 각 작업을 기본 가정을 사용하여 구체적인
프로토콜 요청과 연결한다. 주소 정보(예: href)와
기타 메타데이터는 확장된 버전으로 전달된다. HTTP Binding의
예를 참조하라.
@context에 정의되지 않은 접두사가 있는 항목이 포함된 경우
의미론적 처리를 가능하게 하기 위해,
TD Processor는
[WOT-BINDING-REGISTRY]에
정의된 bindings에 따라 해당 접두사의 정의를 추가하여
@context를 확장해야 SHOULD
한다.
이는 TD Processor가 TD에서
사용되는 접두사를 알고 있어야 함을 요구한다. 이는 일반적으로
TD Processor가 특정 프로토콜과
데이터 형식 집합을 지원하도록 구현된 경우에 해당한다.
예 4도
참조하라.
기본값과 확장 메커니즘은 순차적으로 적용될 수 있다는 점에
유의하라. 예를 들어 "readOnly"와
"writeOnly"가 없다는 것은
표 31에 따라 두 항목 모두에
기본값 false가 적용됨을 의미하며, 이는 다시
"op"의 기본값이
["readproperty", "writeproperty"]임을 의미한다.
protocol binding의 기본 methods를 사용하면, 이는
"GET"과 "PUT"이 각각
"readproperty"와 "writeproperty"에
대응한다는 뜻이다. 그러나
여러 operations 확장 메커니즘에
따라 내부적으로 두 개의 별도 forms가 생성되며, 각각 하나의
operation과 기본 method를 나타낸다. 그런 다음
기본 context expansion
메커니즘이 적용되어 htv 접두사의 정의를
@context에 추가한다. 아래 예는 모든 기본값과
확장 메커니즘을 적용한 후의 초기 TD와 완전히 확장된 TD를
보여 준다.
WoT Thing Description은 Things를 표현하며
5. TD
Information Model을 기반으로 모델링되고 구조화된다.
이 섹션은 TD
Information Model에서 정의한
Class
Thing의 인스턴스 직렬화인,
Things를
위한 JSON 기반 표현 형식을 정의한다.
TD Processor는 6.1 JSON 타입으로의 매핑 및 6.3 정보 모델 직렬화에 명시된 규칙에 따라, Thing Descriptions을 JSON 형식 [RFC8259]으로 직렬화하거나, 해당 형식으로부터 Thing Descriptions을 역직렬화할 수 있어야 MUST 한다.
TD Information Model의 JSON 직렬화는 의미론적 평가를 간소화하기 위해 JSON-LD 1.1 [json-ld11]의 구문과 정렬되어 있다. 따라서 TD 표현 형식은 원시 JSON으로 처리할 수도 있고 JSON-LD 1.1 processor로 처리할 수도 있다 (의미론적 처리에 대한 자세한 내용은 D. JSON-LD Context Usage와 네임스페이스 IRI 아래의 문서, 예: https://www.w3.org/2019/wot/td를 참조하라).
상호 운용 가능한 국제화를 지원하기 위해, TD는 open ecosystems에 대해 RFC8259 [RFC8259] 섹션 8.1에 정의된 요구사항에 따라 직렬화되어야 MUST 한다. 요약하면 이는 다음을 요구한다:
TD Information Model은 모델 Objects와 JSON 타입 사이에 쉬운 매핑이 있도록 구성되어 있다. 모든 Class 인스턴스는 JSON 객체로 매핑되며, 여기서 Class 인스턴스의 각 이름-값 쌍은 JSON 객체의 멤버가 된다.
5.3
Class Definitions에서 언급한 모든
Simple
Type
(즉, string, anyURI,
dateTime, integer,
unsignedInt, double, 그리고
boolean)은 아래에 나열된 규칙에 따라
primitive JSON type(string, number, boolean)으로 매핑된다.
이러한 규칙은 이름-값 쌍의 값에 적용된다:
string 또는
anyURI 타입의 값은 JSON strings로 직렬화되어야
MUST 한다.dateTime
타입의 값은 [RFC3339]에서
지정한 "date-time" 형식을 따르는 JSON strings로
직렬화되어야 MUST 한다.
예에는 2019-05-24T13:12:45Z와
2015-07-11T09:32:26+08:00이 포함된다.
dateTime 타입의 값은
offset 대신 UTC 시간대를 나타내는 literal Z를
사용하는 것이 SHOULD 좋다.
integer
또는 unsignedInt 타입의 값은 fraction 또는
exponent 부분이 없는 JSON numbers로 직렬화되어야
MUST 한다.double
타입의 값은 JSON number로 직렬화되어야
MUST 한다.boolean
타입의 값은 JSON boolean으로 직렬화되어야
MUST 한다.TD Information Model의 모든 복합 타입(즉, Arrays, Maps, 그리고 Class 인스턴스)은 아래에 나열된 규칙에 따라 structured JSON type(array 및 object)으로 매핑된다:
Thing Description 직렬화는 5.4 기본값 정의에 제공된 표에 나열된 것처럼 Default Values가 정의된 Vocabulary Term을 생략할 수 있다.
다음 예는 예 1의 TD 인스턴스를 보여 주며, Default Values가 있는 멤버를 함께 포함할 수 있는 체크박스를 제공한다 (=checkbox checked). 이러한 멤버는 TD 직렬화를 단순화하기 위해 생략할 수 있다(=checkbox unchecked). TD Processor는 이렇게 생략된 멤버를 주어진 Default Value와 함께 명시적으로 존재하는 것과 동일하게 해석한다는 점에 유의하라.
사용되는 Protocol Binding에 따라 추가적인 프로토콜별 Vocabulary Terms가 적용될 수 있다는 점에 유의하라. 이들에는 관련 Default Values도 있을 수 있으므로, 이 하위 섹션에서 설명한 것처럼 생략할 수도 있다. 자세한 정보는 8.1.1 Protocol Bindings에서 확인할 수 있다.
Thing Description은 Thing 타입의
Object를
루트로 하는 데이터 구조이다. 다시 말해 Thing Description의
JSON 직렬화는 TD
Information Model로부터 구성된 구문 트리의 루트인
JSON 객체이다.
TD Serialization의 루트
요소는 @context라는 이름의 멤버와
https://www.w3.org/ns/wot-next/td와 같거나 이를
포함하는 문자열 또는 배열 타입의 값을 포함하는 JSON 객체여야
MUST 한다.
일반적으로 이 URI는 이 명세에서 정의한 TD 표현 형식 버전을
식별하는 데 사용된다. JSON-LD 처리
[json-ld11]의 경우, 이 URI는
Thing Description context 파일을 지정한다.
배열 타입의 @context는 TD Context Extensions를
나타낸다(자세한 내용은 7. TD
Context
Extensions 참조).
{
"@context": "https://www.w3.org/ns/wot-next/td",
// ...
}
Thing의
인스턴스에 있는 모든 이름-값 쌍 중, 이름이
Thing의 Signature에 있는
Vocabulary Term인 것은
루트 객체의 JSON 멤버로 직렬화되어야
MUST 한다.
모든 필수 및 선택적 멤버를 포함하는 직렬화된 루트 객체의 TD 스니펫은 아래에 제공된다:
{
"@context": "https://www.w3.org/ns/wot-next/td",
"@type": "Thing",
"id": "urn:uuid:1b37933b-3212-4dad-9c2c-74c6042c3e2b",
"title": "MyThing",
"titles": {/*...*/},
"description": "Human readable information.",
"descriptions": {/*...*/},
"support": "mailto:support@example.com",
"version": {/*...*/},
"created": "2018-11-14T19:10:23.824Z",
"modified": "2019-06-01T09:12:43.124Z",
"securityDefinitions": {/*...*/},
"security": /*...*/,
"base": "https://servient.example.com/",
"properties": {/*...*/},
"actions": {/*...*/},
"events": {/*...*/},
"links": [...],
"forms": [...]
}
Class
Thing의 인스턴스에서
version, securityDefinitions,
descriptions, schemaDefinitions,
uriVariables, properties,
actions, 그리고 events에 할당된 모든
값은 JSON 객체로 직렬화되어야
MUST 한다.
Class Thing의
인스턴스에서 links와
forms에 할당된 모든 값은 각각
6.3.8
links 및 6.3.9
forms에서 정의한 JSON 객체를 포함하는
JSON 배열로 직렬화되어야 MUST
한다.
Class Thing의
인스턴스에서 security에 할당된 값은
JSON 문자열 또는 요소가 JSON 문자열인 JSON 배열로
직렬화되어야 MUST 한다.
title 및
description이라는 이름의 JSON 멤버는
TD 문서 안에서 사람이 읽을 수 있는 메타데이터를 제공하는 데
사용된다. TD 문서를 살펴보는 개발자를 위한 주석이나
사용자 인터페이스의 표시 텍스트로 사용할 수 있다.
5.3.1.1
Thing에서 정의한 것처럼, 사람이 읽을 수 있는
메타데이터를 표시하는 데 사용되는 기본 텍스트 방향은
first-strong 규칙과 같은 휴리스틱을 사용하여 추정하거나
언어 정보에서 추론할 수 있다. TD 문서에서 기본 언어는
@context 안의 @language에 할당된
값으로 정의되며, 필요하다면 script subtag와 함께 기본 텍스트
방향을 결정하는 데 사용할 수 있다. 그러나
사람이 읽을 수 있는 텍스트를 해석할 때, 사람이 읽을 수 있는
각 문자열 값은 독립적으로 처리되어야
MUST 한다. 즉,
TD Processor는
한 문자열에서 다른 문자열로 방향 변경을 이어받을 수 없으며,
TD의 다른 곳에 있는 한 문자열로부터 다른 문자열의 방향을
추론할 수도 없다.
title과
description을 사용하는 TD 스니펫은 아래에 표시된다.
기본 언어는 @context 배열 안의 JSON 객체 내
@language 멤버 정의를 통해 en으로
설정된다.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{ "@language": "en" }
],
"title": "MyThing",
"description": "Human readable information.",
// ...
"properties": {
"on": {
"title": "On/Off",
"type": "boolean",
"forms": [...]
},
"status": {
"title": "Status",
"type": "object",
// ...
"forms": [...]
}
},
// ...
}
Strings on the Web [STRING-META]는
문자열 값의 base
direction을 결정하기 위해 메타데이터 사용을 권장한다.
Thing Description 형식이
JSON-LD 1.1 [json-ld11]을 기반으로 한다는 점을 고려할 때,
문자열 값 "ltr", "rtl" 및 null 값
null을 가지는 @direction은
전체 TD 문서 안의 사람이 읽을 수 있는 문자열에 대한
기본 텍스트 방향을 나타내기 위해 @context 안에서
사용될 수 MAY 있다.
@direction과 같은 메타데이터가 없을 때,
TD Consumers는 fallback으로
first-strong detection을 사용해야
SHOULD 한다.
MultiLanguage
Map의
경우, TD Consumers는 개별 문자열의 언어 태그로부터
base
direction을 추론할 수 MAY
있다. 이는 TD에서 제공되는 정보를 기반으로
TD Consumers가 구현할 수 있는 아래 단계로 요약될 수 있다.
@context에서 찾은 @direction 값을 사용한다.
@language 값을 사용한 다음 텍스트의 방향을 추정한다
dir=auto를
사용하는 것과 동등하다.문자열별 방향 메타데이터는 현재 버전의 명세에서는 가능하지 않다는 점에 유의하라. 워킹 그룹은 이를 가능하게 하는 메커니즘을 작업 중이다. 그 이후에는 그것이 TD Consumers에서 텍스트 방향을 처리하는 선호 방식이 될 것이다.
또한 아래 예는 @direction 및
@language terms의 사용을 보여 준다. 더 자세한 정보는
[json-ld11] 및 [string-meta]를
참조하라.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"@language": "ar-EG",
"@direction": "rtl"
}
],
"title": "شيء يخصني يقيس درجة الحرارة",
"description": "شيء يقيس درجة الحرارة و يظهر حالته",
// ...
"properties": {
"temp": {
"title": "درجة الحرارة",
"type": "boolean",
"forms": [...]
},
"status": {
"title": "حالة",
"type": "object",
// ...
"forms": [...]
}
},
// ...
}
titles 및
descriptions라는 이름의 JSON 멤버는
하나의 TD 문서 안에서 여러 언어의 사람이 읽을 수 있는
메타데이터를 제공하는 데 사용된다.
MultiLanguage
Map의 모든
이름-값
쌍은 JSON 객체의 멤버로 직렬화되어야
MUST 하며, 여기서 이름은
[BCP47]에서 정의한
유효한 언어 태그이고(
W3C I18N Glossary도 참조),
값은 해당 태그가 나타내는 언어의 사람이 읽을 수 있는 문자열이다.
자세한 내용은 5.3.1.7
MultiLanguage를 참조하라. TD 문서 안의 모든
MultiLanguage 객체는 동일한 언어 멤버 집합을
포함해야 SHOULD 한다.
서로 다른 수준에서 titles와
descriptions를 사용하는 TD 스니펫은 아래에 제공된다:
{
"@context": "https://www.w3.org/ns/wot-next/td",
"title": "MyThing",
"titles": {
"en": "MyThing",
"de": "MeinDing",
"ja": "私の物",
"zh-Hans": "我的东西",
"zh-Hant": "我的東西"
},
"descriptions": {
"en": "Human readable information.",
"de": "Menschenlesbare Informationen.",
"ja": "人間が読むことができる情報",
"zh-Hans": "人们可阅读的信息",
"zh-Hant": "人們可閱讀的資訊"
},
// ...
"properties": {
"on": {
"titles": {
"en": "On/Off",
"de": "An/Aus",
"ja": "オンオフ",
"zh-Hans": "开关",
"zh-Hant": "開關" },
"type": "boolean",
"forms": [...]
},
"status": {
"titles": {
"en": "Status",
"de": "Zustand",
"ja": "状態",
"zh-Hans": "状态",
"zh-Hant": "狀態" },
"type": "object",
// ...
"forms": [...]
}
},
// ...
}
TD 인스턴스는
title 및 description의 사용을
titles 및 descriptions와 결합할 수도 있다.
title과
titles, 또는 description과
descriptions가 같은 JSON 객체 안에 존재하는 경우,
title과 description의 값은
기본 텍스트로 볼 수 MAY 있다.
TD 문서에
title과 titles, 또는
description과 descriptions가
존재하는 경우, 각 title 및
description 멤버는 각각 대응하는
titles 및 descriptions 멤버를
가져야 SHOULD 한다.
기본 텍스트의 언어는 기본 언어로 표시되며, 이는 보통
Thing Description 인스턴스 작성자가 설정한다.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{ "@language": "de" }
],
"title": "MeinDing",
"titles": {
"en": "MyThing",
"de": "MeinDing",
"ja": "私の物",
"zh-Hans": "我的东西",
"zh-Hant": "我的東西"
},
"description": "Menschenlesbare Informationen.",
"descriptions": {
"en": "Human readable information.",
"de": "Menschenlesbare Informationen.",
"ja": "人間が読むことができる情報",
"zh-Hans": "人们可阅读的信息",
"zh-Hant": "人們可閱讀的資訊"
},
// ...
"properties": {
"on": {
"title": "An/Aus",
"titles": {
"en": "On/Off",
"de": "An/Aus",
"ja": "オンオフ",
"zh-Hans": "开关",
"zh-Hant": "開關" },
"type": "boolean",
"forms": [...]
},
"status": {
"title": "Zustand",
"titles": {
"en": "Status",
"de": "Zustand",
"ja": "状態",
"zh-Hans": "状态",
"zh-Hant": "狀態" },
"type": "object",
// ...
"forms": [...]
}
},
// ...
}
기본 언어를 설정하는 또 다른 가능성은 HTTP의
Accept-Language 헤더 필드와 같은 언어 협상
메커니즘을 통하는 것이다.
기본 언어가
협상된 경우, 협상의 결과와 반환된 콘텐츠의 해당 기본
언어를 나타내기 위해 @language 멤버가 존재해야
MUST 한다.
기본 언어가
성공적으로 협상된 경우, TD 문서는 titles 및
descriptions 멤버의 MultiLanguage
객체보다 title 및 description
멤버에 적절하게 일치하는 값을 포함하는 것이
SHOULD 좋다.
그러나 Things는
그러한 동적으로 생성된 TD를 지원하지 않거나 언어 협상을
지원하지 않도록 선택할 수 MAY
있다는 점에 유의하라(예: 리소스 제약 때문에).
TD의 문자열이 HTML 렌더링 문맥에서 표시된다는 보장은 없다. 실제로 11.5 Script Injection에 설명된 XSS 보안 위험을 완화하기 위해, TD에서 가져온 문자열에 포함된 HTML 태그는 이러한 문자열을 웹 페이지나 웹 애플리케이션에 삽입하는 애플리케이션에서 sanitize되어야 한다(따라서 HTML로 해석되지 않아야 한다). 그러므로 문자열 안에 삽입된 HTML은 텍스트 렌더링 방향을 지정하기 위한 적절한 메커니즘이 아니다.
VersionInfo의 인스턴스에 있는 모든
이름-값 쌍 중, 이름이 VersionInfo의
Signature에 포함된
Vocabulary Term인 것은,
그 Vocabulary Term을
이름으로 하는 JSON 멤버로 직렬화되어야
MUST 한다.
버전 정보 객체의 TD 스니펫은 아래에 제공된다:
{
// ...
"version": { "instance": "1.2.1" },
// ...
}
version 멤버는
TD Context Extensions를 기반으로
추가적인 애플리케이션 및/또는 장치별 버전 정보를 위한
컨테이너로 의도된다. 자세한 내용은
7.1 Semantic
Annotations를 참조하라.
Thing 인스턴스에서
securityDefinitions에 할당된 값은
SecurityScheme 인스턴스들의
Map이다.
SecurityScheme 인스턴스들의
Map에
있는 모든 이름-값 쌍은 그
Map을
직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야
MUST 한다. 쌍의 이름은 JSON 문자열로
직렬화되어야 MUST 하며,
쌍의 값인 SecurityScheme 인스턴스는
JSON 객체로 직렬화되어야
MUST 한다.
SecurityScheme의
Subclasses 중 하나의
인스턴스에 있는 모든 이름-값 쌍 중, 이름이 그
Subclass의
Signature 또는
SecurityScheme의
Signature에 포함된
Vocabulary Term인 것은,
SecurityScheme
Subclass의
인스턴스를 직렬화한 결과인 JSON 객체의 멤버로,
그 Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다.
다음 TD 스니펫은 헤더에서 basic 사용자 이름/비밀번호
authentication을 지정하는 간단한 보안 구성을 보여 준다.
in에 주어진 값은 실제로
Default Value
(header)이며 생략할 수도 있다.
이름이 지정된 보안 구성(basic_sc)은
securityDefinitions map에 주어진다. 이 예에서
그 정의는 security 멤버 안에 그 JSON 이름을
포함함으로써 활성화된다.
{
// ...
"securityDefinitions": {
"basic_sc": {
"scheme": "basic",
"in": "header"
}
},
"security": "basic_sc",
// ...
}
TD의 보안 구성은 필수이다.
적어도 하나의 보안 정의가
Thing level
(즉, TD 루트 객체)에서 security 멤버를 통해
활성화되어야 MUST 한다.
이 구성은 Thing과 상호작용하는 데 필요한
기본 보안 메커니즘으로 볼 수 있다.
보안 정의는 form 객체에
security 멤버를 포함함으로써
form elements 수준에서도 활성화될 수
MAY 있으며, 이는
Thing
level에서 활성화된 모든 정의를 재정의한다
(즉, 완전히 대체한다).
nosec 보안 스킴은 보안이 필요하지 않은 경우를 위해
제공된다. Thing의 최소 보안 구성은
다음 예에 표시된 것처럼 Thing level에서
nosec 보안 스킴을 활성화하는 것이다:
{
"@context": "https://www.w3.org/ns/wot-next/td",
"id": "urn:uuid:e9ecb6ad-cd4c-481b-96ce-5b4c57ddb844",
"title": "MyThing",
"description": "Human readable information.",
"support": "https://servient.example.com/contact",
"securityDefinitions": { "nosec_sc": { "scheme": "nosec" }},
"security": "nosec_sc",
"properties": {/*...*/},
"actions": {/*...*/},
"events": {/*...*/},
"links": [/*...*/]
}
좀 더 복잡한 예를 들면,
하나를 제외한 모든
Interaction
Affordances가 basic authentication을 요구하고,
그 하나에는 authentication이 필요하지 않은
Thing이 있다고 가정하자.
status Property와 toggle
Action의 경우 basic authentication이 필요하며
Thing level에서 정의된다.
그러나 overheating Event의 경우 authentication이
필요하지 않으므로, 보안 구성이 form level에서 재정의된다.
{
// ...
"securityDefinitions": {
"basic_sc": {"scheme": "basic"},
"nosec_sc": {"scheme": "nosec"}
},
"security": "basic_sc",
// ...
"properties": {
"status": {
// ...
"forms": [{
"href": "https://mylamp.example.com/status"
}]
}
},
"actions": {
"toggle": {
// ...
"forms": [{
"href": "https://mylamp.example.com/toggle"
}]
}
},
"events": {
"overheating": {
// ...
"forms": [{
"href": "https://mylamp.example.com/oh",
"security": "nosec_sc"
}]
}
}
}
TD는 보안 스킴의 조합도 지정할 수 있다.
아래는 proxy에서 digest authentication을 사용하고,
Thing에서 bearer token
authentication을 결합한 TD 스니펫이다.
digest 스킴에서 in의
Default Value
(즉, header)는 생략되지만 여전히 적용된다.
성공적으로 상호작용하려면 username/password 및 tokens와 같은
해당 비공개 보안 구성이 Consumer에서
구성되어야 한다는 점에 유의하라. 여러 보안 정의를
활성화할 때, security 멤버는 배열이 된다.
{
// ...
"securityDefinitions": {
"proxy_sc": {
"scheme": "digest",
"proxy": "https://portal.example.com/"
},
"bearer_sc": {
"scheme": "bearer",
"in": "header",
"format": "jwt",
"alg": "ES256",
"authorization": "https://servient.example.com:8443/"
}
},
"security": ["proxy_sc", "bearer_sc"],
// ...
}
그러나
security 요소에서 여러 요소를 가진 배열을
사용하여 보안 스킴을 결합하는 것은 이제 deprecated되었으며,
대신 ComboSecurityScheme을
사용해야 SHOULD 한다.
다음 예는 위 예와 정확히 동일하며, 이를 보여 준다:
{
// ...
"securityDefinitions": {
"proxy_sc": {
"scheme": "digest",
"proxy": "https://portal.example.com/"
},
"bearer_sc": {
"scheme": "bearer",
"in": "header",
"format": "jwt",
"alg": "ES256",
"authorization": "https://servient.example.com:8443/"
},
"combo_sc": {
"scheme": "combo",
"allOf": ["proxy_sc", "bearer_sc"]
}
},
"security": "combo_sc",
// ...
}
보안 구성은 같은
Interaction
Affordance 안의 서로 다른 forms에 대해서도 지정할 수 있다.
이는 예를 들어 HTTP와 CoAP
[RFC7252]처럼
서로 다른 보안 메커니즘을 지원하는 여러 프로토콜을 지원하는
장치에 필요할 수 있다. 대체 authentication 메커니즘이
허용될 때도 유용하다. 다음은 Property affordance를 활성화하는
세 가지 가능한 방법, 즉 basic authentication이 있는 HTTPS,
digest authentication, bearer token authentication을 보여 주는
TD 스니펫이다. 다시 말해, 여러 forms 안에서 서로 다른
보안 구성을 사용하는 것은 보안 메커니즘을 "OR" 방식으로
결합하는 방법을 제공한다. 반대로 같은 security
멤버 안에 여러 보안 구성을 넣으면, 그 경우
Interaction
Affordance의 활성화를 허용하기 위해 그것들이 모두
만족되어야 하므로 "AND" 방식으로 결합된다.
Thing level에서
하나의 (기본) 구성을 활성화하는 것은 여전히 필수임에
유의하라.
{
// ...
"securityDefinitions": {
"basic_sc": { "scheme": "basic" },
"digest_sc": { "scheme": "digest" },
"bearer_sc": { "scheme": "bearer" }
},
"security": "basic_sc",
// ...
"properties": {
"status": {
// ...
"forms": [{
"href": "https://mylamp.example.com/status"
}, {
"href": "https://mylamp.example.com/status",
"security": "digest_sc"
}, {
"href": "https://mylamp.example.com/status",
"security": "bearer_sc"
}]
}
},
// ...
}
이 경우 중복을 피하기 위해, 예를 들어
form 요소의 세부 정보를 반복하는 대신,
oneOf가 있는
ComboSecurityScheme을
사용할 수 있다.
{
// ...
"securityDefinitions": {
"basic_sc": { "scheme": "basic" },
"digest_sc": { "scheme": "digest" },
"bearer_sc": { "scheme": "bearer" },
"combo_sc": {
"scheme": "combo",
"oneOf": [ "basic_sc", "digest_sc", "bearer_sc" ]
}
},
"security": "combo_sc",
// ...
"properties": {
"status": {
// ...
"forms": [{
"href": "https://mylamp.example.com/status"
}]
}
},
// ...
}
또 다른 더 복잡한 예로, OAuth 2.0은 scopes를 사용한다.
이는 tokens 안에 나타날 수 있는 식별자이며, 해당 리소스
(또는 W3C WoT의 경우
Interaction
Affordance)에 대한 접근을 허용하려면 리소스의
대응 식별자와 일치해야 한다. 예를 들어 다음에서
status Property는 scope limited를
포함하는 bearer tokens를 사용하는
Consumers가 읽을 수 있지만,
configure Action은 special scope를
포함하는 token으로만 호출될 수 있다. Scopes는 roles와
동일하지 않지만 종종 관련된다. 예를 들어 아마도
administrative role에 있는 사람만 "special" 상호작용을
수행할 권한을 가질 수 있다. Tokens는 둘 이상의 scope를
가질 수 있으며, 전용 web services가 사용자에게 발급한다.
이 예에서 관리자는 limited와 special
scope를 모두 가진 tokens를 발급받을 수 있고, 일반 사용자는
limited scope를 가진 tokens를 제공받을 수 있다.
{
// ...
"securityDefinitions": {
"oauth2_sc": {
"scheme": "oauth2",
"flow": "client",
"token": "https://example.com/token",
"scopes": ["limited", "special"]
}
},
"security": "oauth2_sc",
// ...
"properties": {
"status": {
// ...
"forms": [{
"href": "https://scopes.example.com/status",
"scopes": ["limited"]
}]
}
},
"actions": {
"configure": {
// ...
"forms": [{
"href": "https://scopes.example.com/configure",
"scopes": ["special"]
}]
}
},
// ...
}
Thing은 Consumer가 Thing과 상호작용하기 위해 API key를 요구하게 되는 onboarding 프로세스를 요구할 수 있다. 이 API key는 API key 스킴이 지정하는 여러 방식으로 Thing에 대한 요청에 포함될 수 있다. 아래는 Consumer가 HTTPS 요청을 보낼 때 URI 안에서 API key를 대체해야 하는 URI template으로 API key를 사용할 수 있는 방법의 예이다.
{
// ...
"securityDefinitions": {
"apikey_key": {
"scheme": "apikey",
"in": "uri",
"name": "adminKey"
}
},
"security": "apikey_key",
"properties": {
"status": {
// ...
"forms": [{
"href": "https://example.com/{adminKey}/status",
// ...
}]
}
},
// ...
}
위에 표시된 URI templates 예에 더해
ComboSecurityScheme 사용의
또 다른 예를 들면, client ID와 cloud service provider가
제공하는 "secret" key가 모두 URL 안에 삽입되어야 하는
보안 스킴이 있다고 가정하자. 기술적으로는 key만 실제로
secret이며 out-of-band로 처리되어야 하고, secret이 아닌
client ID는 TD에 삽입될 수도 있다. 그러나 client ID를 쉽게
교체할 수 없다면 개인정보 보호를 강화하기 위해 TD에
삽입하는 것을 피하고 싶을 수 있다. 이 경우
in 위치 지정자에 대해 모두 uri 값을
사용하는 APIKeySecurityScheme
두 인스턴스를 결합하여 두 개의 URI 변수를 선언할 수 있다.
그런 다음 이 변수들은 보안 스킴이 활성인 Form의
href에서 사용될 수 있다(사실 반드시 사용되어야 한다).
예는 다음과 같다:
{
// ...
"securityDefinitions": {
"apikey_key": {
"scheme": "apikey",
"in": "uri",
"name": "secKey"
},
"apikey_id": {
"scheme": "apikey",
"in": "uri",
"name": "secClientID"
},
"apikey_combo": {
"scheme": "combo",
"allOf": ["apikey_key","apikey_id"]
}
},
"security": "apikey_combo",
// ...
"properties": {
"status": {
// ...
"forms": [{
"href": "https://example.com/{secClientID}/status/{secKey}",
// ...
}]
}
},
// ...
}
이 예에는 표시되어 있지 않지만,
uriVariables를 사용하여 추가 URI template
변수를 선언하고 같은 URI template에 포함하는 것은 적법하다.
다만 이름은 보안 스킴에서 선언된 이름과 충돌할 수 없다.
위 예에서처럼 보안 스킴에서 선언된 URI 변수에 특정
접두사를 사용하면 이름 충돌을 피하기가 더 쉬워질 수 있다.
본문 안의 API Key: 일부 시스템에서는 보안 매개변수가
payload와 함께 포함될 수도 있다. 예를 들어 어떤 시스템이
모든 payload가 auth라는 이름의 멤버를 포함하는
JSON 객체여야 하며, 그 값은 access key를 포함하는
key라는 멤버를 가진 객체여야 한다고 요구한다고
가정하자. 그러나 상호작용에 따라 JSON 객체의 다른 요소들은
달라질 수 있다. 이러한 상황은 body 보안 정보
위치를 사용하여 처리할 수 있다. 이 위치의 경우
name 매개변수는 실제로, 바인딩되는 각
상호작용에 대한 DataSchema의 루트에 상대적으로
평가되는 JSON pointer이므로, 다른 측면에서 달라지는
payload와 함께 사용할 수 있다는 점에 유의하라. 예로,
밝기와 색상을 설정하는 property와 켜기 및 끄기를 위한
두 개의 별도 actions가 있는 조명이 있다고 하자.
이러한 actions의 JSON payload가 서로 다르더라도
/auth/key 요소는 같은 상대 위치에 나타나므로
단일 JSON pointer를 사용할 수 있다. 참고: 보안 key가 서로
일관되지 않은 다른 위치에 나타나는 경우, 여러 보안 스킴
정의를 사용해야 한다.
{
// ...
"securityDefinitions": {
"apikey_body": {
"scheme": "apikey",
"in": "body",
"name": "/auth/key"
}
},
"security": "apikey_body",
// ...
"properties": {
"color": {
// ...
"type": "object",
"properties": {
"brightness": {
"type": "number",
// ...
},
"rgb": {
"type": "array",
// ...
},
"auth": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": ["key"]
}
},
"required": ["brightness", "rgb", "auth"],
"forms": [{
"href": "https://example.com/color",
// ...
}]
}
},
"action": {
"on": {
// ...
"input": {
"auth": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": ["key"]
}
},
"required": ["auth"],
"forms": [{
"href": "https://example.com/on",
// ...
}]
},
"off": {
// ...
"input": {
"auth": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": ["key"]
}
},
"required": ["auth"],
"forms": [{
"href": "https://example.com/off",
// ...
}]
}
},
// ...
}
body 위치에서
JSON pointer가 참조하는 위치가 존재하지 않을 경우 자동으로
삽입되는 기능을 사용하면 이 예를 단순화할 수 있다.
이 경우 위 예는 다음과 같이 단순화될 수 있다. 실제로는
보안 정보만 담기 위해 on 및 off
actions에 대한 data schema가 효과적으로 생성된다는 점에
유의하라.
{
// ...
"securityDefinitions": {
"apikey_body": {
"scheme": "apikey",
"in": "body",
"name": "/auth/key"
}
},
"security": "apikey_body",
// ...
"properties": {
"color": {
// ...
"type": "object",
"properties": {
"brightness": {
"type": "number",
// ...
},
"rgb": {
"type": "array",
// ...
}
},
"required": ["brightness", "rgb"],
"forms": [{
"href": "https://example.com/color",
// ...
}]
}
},
"action": {
"on": {
// ...
"required": ["auth"],
"forms": [{
"href": "https://example.com/on",
// ...
}]
},
"off": {
// ...
"forms": [{
"href": "https://example.com/off",
// ...
}]
}
},
// ...
}
Thing 인스턴스에서
properties에 할당된 값은
PropertyAffordance 인스턴스들의
Map이다.
PropertyAffordance 인스턴스들의
Map에
있는 모든 이름-값 쌍은 그
Map을
직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야
MUST 한다. 쌍의 이름은 JSON 문자열로
직렬화되어야 MUST 하며,
쌍의 값인 PropertyAffordance 인스턴스는
JSON 객체로 직렬화되어야 MUST 한다.
PropertyAffordance의 인스턴스에 있는 모든
이름-값 쌍 중, 이름이
PropertyAffordance,
InteractionAffordance 또는
DataSchema의
Signatures 중 하나에 포함된
Vocabulary Term인 것은,
PropertyAffordance 인스턴스를 직렬화한 결과인
JSON 객체의 멤버로, 그
Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다. DataSchema
인스턴스 직렬화에 대한 자세한 내용은 6.3.10 Data
Schemas를 참조하라.
PropertyAffordance의 인스턴스에서
forms에 할당된 값은
6.3.9
forms에서 정의된 하나 이상의 JSON 객체
직렬화를 포함하는 JSON 배열로 직렬화되어야
MUST 한다.
두 개의 Property affordances에 대한 스니펫은 아래에 제공된다:
Thing 인스턴스에서
actions에 할당된 값은
ActionAffordance 인스턴스들의
Map이다.
ActionAffordance 인스턴스들의
Map에
있는 모든 이름-값 쌍은 그
Map을
직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야
MUST 한다. 쌍의 이름은 JSON 문자열로
직렬화되어야 MUST 하며,
쌍의 값인 ActionAffordance 인스턴스는 JSON
객체로 직렬화되어야 MUST 한다.
ActionAffordance의 인스턴스에 있는 모든
이름-값 쌍 중, 이름이
ActionAffordance 또는
InteractionAffordance의
Signatures 중 하나에 포함된
Vocabulary Term인 것은
ActionAffordance 인스턴스를 직렬화한 결과인
JSON 객체의 멤버로, 그
Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다.
ActionAffordance의 인스턴스에서
input 및 output에 할당된 값은
JSON 객체로 직렬화되어야 MUST 한다.
이들은 Class
DataSchema에 의존하며,
그 직렬화는 6.3.10
Data
Schemas에서 정의된다.
ActionAffordance의 인스턴스에서 forms에
할당된 값은 6.3.9
forms에서 정의된 하나 이상의 JSON 객체
직렬화를 포함하는 JSON 배열로 직렬화되어야
MUST 한다.
Action affordance의 TD 스니펫은 아래에 제공된다:
Thing 인스턴스에서
events에 할당된 값은
EventAffordance 인스턴스들의 map이다.
EventAffordance 인스턴스들의
Map에
있는 모든 이름-값 쌍은 그
Map을
직렬화한 결과인 JSON 객체의 멤버로 직렬화되어야
MUST 한다. 쌍의 이름은 JSON 문자열로
직렬화되어야 MUST 하며,
쌍의 값인 EventAffordance 인스턴스는
JSON 객체로 직렬화되어야 MUST
한다.
EventAffordance의 인스턴스에 있는 모든
이름-값 쌍 중, 이름이
EventAffordance 또는
InteractionAffordance의
Signatures 중 하나에 포함된
Vocabulary Term인 것은
EventAffordance 인스턴스를 직렬화한 결과인
JSON 객체의 멤버로, 그
Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다.
EventAffordance의 인스턴스에서
subscription, data, 그리고
cancellation에 할당된 값은
JSON 객체로 직렬화되어야 MUST
한다. 이들은
Class DataSchema에
의존하며, 그 직렬화는 6.3.10 Data
Schemas에서 정의된다.
EventAffordance의 인스턴스에서
forms에 할당된 값은
6.3.9
forms에서
정의된 하나 이상의 JSON 객체 직렬화를 포함하는 JSON 배열로
직렬화되어야 MUST 한다.
Event 객체의 TD 스니펫은 아래에 제공된다:
Event affordances는 기존의(예: WebSub
[websub]) 또는
고객 지향 event 메커니즘(예: Webhooks)을 채택하기 위해
유연한 방식으로 정의되어 있다. 이런 이유로
subscription과 cancellation은
원하는 메커니즘에 따라 정의할 수 있다. 자세한 내용은
[WOT-BINDING-TEMPLATES]에서
확인할 수 있다.
예 A.3 Webhook Event
Example는 Events가 Webhooks를 설명하기 위해
subscription과 cancellation을
사용하는 방법을 보여 준다.
Link의 인스턴스에 있는 모든 이름-값 쌍 중,
이름이 Link의
Signature에 포함된
Vocabulary Term인 것은,
Link 인스턴스를 직렬화한 결과인 JSON 객체의
멤버로, 그
Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다.
섹션 5.3.4.1
Link에 제공된 link relation 값을 따르는 것이
권장된다. 아래 제공된 예는 서로 다른 link relation type의
사용을 보여 준다.
기반 unit(예: lamp)을 제어하는
Thing
(예: controller)을 가리키는 참조를 제공할 수 있다. 이를 위해
controlledBy를 사용할 수 있다:
Thing의
개발자 문서를 가리키기 위해서는
service-doc 값을 사용할 수 있다:
{
// ...
"links": [{
"rel": "service-doc",
"href": "https://example.com/howTo",
"type": "application/pdf",
"hreflang": "en"
}]
// ...
}
상위 Thing은 Things 그룹을 모아
item 값을 사용하여 이를 참조할 수 있다:
{
"title": "Electric Drive",
// ...
"links": [{
"rel": "item",
"href": "coaps://motor1.example.com",
"type": " application/td+json"
},
{
"rel": "item",
"href": "coaps://motor2.example.com",
"type": " application/td+json"
}]
// ...
}
Thing은 collection 값을 사용하여 자신이 포함된
그룹을 참조한다:
{
"title": "Electric Motor 1",
"base": "coaps://motor1.example.com",
// ...
"links": [{
"rel": "collection",
"href": "coaps://drive.example.com",
"type": " application/td+json"
}]
// ...
}
Form의 인스턴스에 있는 모든 이름-값 쌍 중,
이름이 Form의
Signature에 포함된
Vocabulary Term인 것은,
Form 인스턴스를 직렬화한 결과인 JSON 객체의
멤버로, 그
Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다.
필요한 경우, form 객체는 접두사로 식별되는 프로토콜별 Vocabulary Terms로 보완될 수 MAY 있다. 8.1.1 Protocol Bindings도 참조하라.
forms 배열 안의 form 객체에 대한 TD 스니펫은
아래에 제공된다:
href는
http://example.org/weather/?lat=35&lon=139의
lat 및 lon과 같은 동적 변수를 포함하는
URI를 담을 수도 있다. 이 경우 URI는
[RFC6570]에 정의된
template으로 정의될 수 있다:
http://example.org/weather/{?lat,long}.
그러한 경우,
URI Template 변수는 Thing level 또는
Interaction Affordance level에서 관련된(고유한) 변수 이름을
JSON 이름으로 사용하여 JSON 객체 기반
uriVariables 멤버에 수집되어야
MUST 한다.
Form의 인스턴스에서 uriVariables에
할당된 map의 각 값의 직렬화는
Class DataSchema에 의존해야
MUST 하며, 그 직렬화는
6.3.10
Data
Schemas에서 정의된다.
query parameters를 위한 URI Template과 Interaction
Affordance level의 uriVariables를 사용하는
TD 스니펫은 아래에 제공된다:
{
"@context": ["https://www.w3.org/ns/wot-next/td", {
"htv": "http://www.w3.org/2011/http#"
}],
// ...
"properties": {
"weather": {
// ...
"uriVariables": {
"lat": {
"type": "number",
"minimum": 0,
"maximum": 90,
"description": "Latitude for the desired location in the world" },
"long": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude for the desired location in the world" }
},
"forms": [{
"href": "http://example.org/weather/{?lat,long}",
"htv:methodName": "GET"
}]
},
// ...
},
// ...
}
또는 [RFC6570]에 정의된 것처럼,
uriVariables는 href 구조를
대체하는 데 사용할 수 있다. 콜롬비아 보고타의 예보를
가져오기 위한 유효한 요청이
http://example.org/weather/bogota에 대한 HTTP GET
요청이 되는 TD 예가 아래에 제공된다:
{
"@context": ["https://www.w3.org/ns/wot-next/td", {
"htv": "http://www.w3.org/2011/http#"
}],
// ...
"properties": {
"weather": {
// ...
"uriVariables": {
"city": {
"type": "string",
"description": "City name to find the weather information for"
}
},
"forms": [{
"href": "http://example.org/weather/{city}",
"htv:methodName": "GET"
}]
},
// ...
},
// ...
}
아래 두 예는 동일한 uriVariables 기능을
사용하면서 결합될 수도 있다.
http://example.org/weather/bogota/?unit=Celsius에
대한 HTTP GET 요청은 다음과 같이 설명될 수 있다:
{
"@context": ["https://www.w3.org/ns/wot-next/td", {
"htv": "http://www.w3.org/2011/http#"
}],
// ...
"properties": {
"weather": {
// ...
"uriVariables": {
"city": {
"type": "string",
"description": "City name to find the weather information for"
},
"unit": {
"type": "string",
"enum": ["fahrenheit_value","celsius_value"],
"description": "Desired unit for the temperature value"
}
},
"forms": [{
"href": "http://example.org/weather/{city}/{?unit}",
"htv:methodName": "GET"
}]
},
// ...
},
// ...
}
uriVariables는 주로 properties와 events를 위한
것이다. 기존 시스템을 개조할 때는 actions에
uriVariables를 사용해야 할 수도 있다.
일반적으로 새로운 WoT 기반 시스템을 설계할 때는
uriVariables 사용을 가능한 한 피하는 것이
권장된다.
contentType 멤버는 ; 문자로
구분된 attribute-value 쌍으로 media type parameters를 포함하는
media type [RFC2046]을
할당하는 데 사용된다. 예:
{
// ...
"contentType": "text/plain; charset=utf-8",
// ...
}
일부 사용 사례에서
Interaction
Affordance의 form metadata는 request를 설명할 뿐 아니라
예상 response에 대한 metadata도 제공한다. 예를 들어
Action takePhoto는 request payload에 JSON을
사용하여 카메라의 parameter settings(aperture priority,
timer 등)를 제출하기 위한 input schema를
정의한다(즉, "contentType":
"application/json"). 이 action의 output은 촬영된
사진이며, 예를 들어 JPEG 형식으로 제공된다. 이러한 경우
response 멤버는 response payload의 표현 형식을
나타내는 데 사용된다(예: "contentType":
"image/jpeg"). 여기서는 content type이 표현 형식을
완전히 지정하므로 output schema가 필요하지 않다.
위에서 설명한 takePhoto Action을 기반으로
response 멤버가 있는 form 스니펫은
아래에 표시된다:
{
// ...
"actions": {
"takePhoto": {
// ...
"forms": [{
"op": "invokeaction",
"href": "http://camera.example.com/api/snapshot",
"contentType": "application/json",
"response": {
"contentType": "image/jpeg"
}
}]
}
},
// ...
}
responses가 payload를 포함할 것으로 예상되지 않으며 따라서
contentType도 없는 경우, 빈
response 객체를 사용하여 이 정보를 전달할 수 있다.
{
// ...
"actions": {
"brewCoffee": {
"description": "Invoking this action does not return a payload.",
"input": {
"type": "object",
"properties": {
"coffeeType": {
"enum": [
"espresso",
"americano",
"cappuccino",
"latte"
]
},
"useOatMilk": {
"type": "boolean",
"default": false
}
},
"required": [
"coffeeType"
]
},
"forms": [{
"op": "invokeaction",
"href": "http://coffee-maker.example.com/brew-coffee",
"contentType": "application/json",
"response": {}
}]
}
},
// ...
}
어떤 경우에는 Interaction
Affordance의 일부로 Thing으로부터 받은 message가
여러 이유로 달라질 수 있다. 그러한 이유에는 오류 사례나
유효한 response에 대한 대체 responses가 포함될 수 있다.
이러한 경우 additionalResponses terms를 사용하여
이 동작을 설명할 수 있다.
예를 들어 자동차 엔진을 켜는 Action Affordance는 악천후 조건이나 엔진에 유지보수가 필요한 경우 작동하지 않을 수 있다. 그러한 경우 Thing은 일반적으로 사용되지 않는 payload로 응답해야 한다.
Action Affordance 안에 additionalResponses
멤버가 있는 TD 스니펫은 아래에 표시된다.
첫 번째 요소는 output에 설명된 것과 다른 payload로
error response를 보낼 수 있는 위에서 언급한 경우를 보여 준다.
값이 false인 success는 이 payload가
오류 사례를 가리킨다는 사실을 나타내며, schema는
schemaDefinitions에서 사용된 payload 설명에
연결할 수 있게 한다. additionalResponses 안의
두 번째 요소도 error response를 설명하지만, 이번에는 response에
payload가 없다.
{
// ...
"schemaDefinitions": {
"actionErrorPayload": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"enum": ["cold","hot","maintenance"]
},
"timeStamp": {
"description": "UNIX time in numbers indicating when the error happened",
"type": "number"
}
}
}
},
// ...
"actions": {
"startEngine": {
"output": {
"type": "string"
},
"forms": [{
"op": "invokeaction",
"href": "http://mycar.example.com/api/engine",
"contentType": "application/json",
"additionalResponses": [
{
"success": false,
"contentType": "application/json",
"schema": "actionErrorPayload"
},
{
"success": false
},
]
}]
}
},
// ...
}
additionalResponses term은 오류가 아닌 경우에도
사용할 수 있다. 이 경우 success는
true로 설정되고, 다른 schema를 사용하여
payload를 설명할 수 있다.
어떤 경우에는 binary data가 text-based values 안에 삽입된다.
예를 들어 JSON string-based value가 base64로 인코딩된 이미지를
포함할 수 있다. contentMediaType 및
contentEncoding terms는 이러한 이름-값 쌍의
문맥과 인코딩 형식을 명확히 하는 데 사용할 수 있다.
contentMediaType 및
contentEncoding의 사용 샘플은 아래에 표시된다:
{
// ...
"properties": {
"image": {
"description": "Provides latest image",
"type": "string",
"contentMediaType": "image/png",
"contentEncoding": "base64",
"forms": [{
"op": "readproperty",
"href": "coaps://mylamp.example.com/lastPicture",
"cov:methodName": "GET",
"contentType": "application/json"
}]
}
},
// ...
}
forms가 top level에 존재할 때, 이는
Thing이 제공하는 meta interactions를
설명하는 데 사용할 수 있다. 예를 들어 operation types
readallproperties 및
writeallproperties는
Consumers가 모든 properties를
한 번에 읽거나, 쓰거나, 관찰할 수 있게 하는
Thing과의 meta interactions를
위한 것이다. 아래 예에서 forms 멤버는 TD 루트
객체에 포함되어 있으며, Consumer는 submission target
https://mylamp.example.com/properties를 사용하여
단일 프로토콜 transaction 안에서 Thing의 모든 Properties
(즉, on, brightness, 그리고
timer)를 읽거나 쓸 수 있다.
{
// ...
"properties": {
"on": {
"type": "boolean",
"forms": [...]
},
"brightness": {
"type": "number",
"forms": [...]
},
"timer": {
"type": "integer",
"forms": [...]
}
},
// ...
"forms": [{
"op": "readallproperties",
"href": "https://mylamp.example.com/properties",
"contentType": "application/json",
"htv:methodName": "GET"
},
{
"op": "writeallproperties",
"href": "https://mylamp.example.com/properties",
"contentType": "application/json",
"htv:methodName": "PUT"
}]
}
Thing-level uriVariables는 여기서 operation에
추가 변수를 제공하거나 readmultipleproperties
operation을 위한 Property Affordance 이름 목록을 지정하는 데
사용할 수 있다. 아래 예에서 properties의 unit은 그러한
변수를 통해 설정할 수 있으며, 원하는 properties 목록도
설정할 수 있다:
{
// ...
"properties": {
"temperature": {
"type": "number",
"forms": [...]
},
"brightness": {
"type": "number",
"forms": [...]
},
"humidity": {
"type": "integer",
"forms": [...]
}
},
"uriVariables": {
"propertyNames": {
"type": "string",
"description": "Comma separated list of property names to select."
},
"unitSystem": {
"type": "string",
"enum": ["metric","imperial","uscustomary"],
"description": "System of Measurement that will be used for the values"
}
},
"forms": [{
"op": "readallproperties",
"href": "https://mything.example.com/properties{?unitSystem}",
"contentType": "application/json",
"htv:methodName": "GET"
},
{
"op": "readmultipleproperties",
"href": "https://mylamp.example.com/properties{?propertyNames,unitSystem}",
"contentType": "application/json",
"htv:methodName": "GET"
}]
}
readmultipleproperties operation의 경우,
URI
https://mylamp.example.com/properties?propertyNames=humidity,temperature&unitSystem=metric에
대한 HTTP GET 요청 예는 metric System of Measurement와
함께 humidity 및 temperature
Property Affordances의 값을 반환할 것이다.
operation type writeallproperties의 경우,
Consumer가 모든 쓰기 가능한
(non readOnly) properties와 (새로) 할당된 값을
제공할 것으로 기대된다(예: payload 안에서). 마찬가지로
writemultipleproperties operation type의 경우,
Consumer가 쓰기 가능한
(non readOnly) properties를 제공할 것으로 기대된다.
Thing 측에서는,
Thing이
readmultipleproperties 및
readallproperties operation types의 경우 읽을 수 있는
(non writeOnly) properties를 반환할 것으로 기대된다.
DataSchema
Class를
통해 정의된 WoT Thing Description의 data schemas는
JSON Schema terms [JSON-SCHEMA]의
부분집합을 기반으로 한다.
따라서 TD data schemas의 직렬화는
Things와
교환되는 데이터를
검증하기 위해 JSON Schema validator 구현에 직접 전달될 수 있다.
Data schema serialization은
PropertyAffordance 인스턴스,
ActionAffordance 인스턴스에서
input 및 output에 할당된 값,
EventAffordance 인스턴스에서
subscription, data, 그리고
cancellation에 할당된 값, 그리고
Subclasses of
InteractionAffordance의 인스턴스에서
uriVariables에 할당된 값(form object가
URI Template을 사용할 때)에 적용된다.
DataSchema의
Subclasses 중 하나의
인스턴스에 있는 모든 이름-값 쌍 중, 이름이 그
Subclass의
Signature 또는
DataSchema의
Signature에 포함된
Vocabulary Term인 것은
DataSchema
Subclass의
인스턴스를 직렬화한 결과인 JSON 객체의 멤버로, 그
Vocabulary Term을
이름으로 하여 직렬화되어야 MUST
한다.
ObjectSchema의 인스턴스에서
properties에 할당된 값은
JSON 객체로 직렬화되어야 MUST 한다.
DataSchema의 인스턴스에서
enum, required, 그리고
oneOf에 할당된 값은 JSON 배열로
직렬화되어야 MUST 한다.
ArraySchema의 인스턴스에서
items에 할당된 값은 JSON 객체 또는 JSON 객체를
포함하는 JSON 배열로 직렬화되어야
MUST 한다.
Data schema 멤버의 TD 스니펫은 아래에 제공된다. 주변 객체는
data schema object(예: input 및
output의 경우)일 수도 있고, 추가 멤버를 포함하는
Property object일 수도 있다는 점에 유의하라.
readOnly 및
writeOnly terms는 읽기 상호작용(즉,
Property를 읽을 때)에서 어떤 데이터 항목이 교환되고, 쓰기
상호작용(즉, Property를 쓸 때)에서 어떤 데이터 항목이
교환되는지를 신호하는 데 사용할 수 있다. 이는 기존 장치나
서비스를 Thing Description으로 보강할 때처럼, 관례적이지 않은
Thing의
Properties가 읽기와
쓰기에 대해 서로 다른 데이터를 나타내는 경우 workaround로
사용할 수 있다.
readOnly 및
writeOnly의 사용을 보여 주는 TD 스니펫은
아래에 제공된다:
{
// ...
"properties": {
"status": {
"description": "Read or write On/Off status.",
"type": "object",
"properties": {
"latestStatus": {
"type": "string",
"enum": ["on_value", "off_value"],
"readOnly": true
},
"newStatusValue": {
"type": "string",
"enum": ["on_value", "off_value"],
"writeOnly": true
}
},
"forms": [...]
}
}
// ...
}
status Property를 읽을 때, status data는
payload 안의 latestStatus 멤버를 사용하여 반환된다.
status Property를 업데이트하려면, 새 값이
payload 안의 newStatusValue 멤버를 통해 제공되어야
한다.
추가 기능으로, Thing Description 인스턴스는 data schemas 안에서
unit 멤버 사용을 허용한다. 이는 데이터 항목에
측정 단위를 연결하는 데 사용할 수 있다. 그 문자열 값은
자유롭게 선택할 수 있다. 그러나 잘 알려진
Vocabularies에 정의된
단위를 선택하는 것이 권장된다. 예는 7.
TD Context Extensions를
참조하라.
Thing Descriptions의 JSON 기반 직렬화는
media type application/td+json
또는 CoAP Content-Format ID 432로 식별된다
(13.
IANA 고려사항 참조).
여러 문맥에서 Thing Description의 JSON 기반 직렬화에 대한 자동 검증은 유용하다. 형식적으로, 유효한 TD는 이 명세의 모든 assertions를 만족하지만, 모든 assertions를 JSON 직렬화만으로 검증할 수 있는 것은 아니다. 예를 들어, TD를 그것이 설명하는 Thing의 동작과 관련짓는 9. 동작 Assertions 아래에 나열된 assertions가 그렇다. Extensions도 문제가 될 수 있는데, extension을 검증하기 위한 형식적 metadata가 제공되더라도 deployment에서 이 metadata를 동적으로 가져오는 것은 개인정보 보호 위험을 초래할 수 있기 때문이다. 따라서 이 섹션에서는 서로 다른 문맥에 적합한 다양한 검증 수준을 이름 붙이고 정의한다.
이 검증 수준은 이 문서의 규범 표에서 암시되는 모든 assertions와, TD 자체만을 살펴봄으로써 확인할 수 있는 assertions를 포함한다.
최소 검증은 검증이 자체 완결적이어야 하는 경우 (예: 격리된 네트워크의 장치)에 적합하다. 이는 context extensions와 vocabularies를 검증하려고 시도하지 않는다.
실제로 이러한 assertions는 JSON Schema와 몇 가지 spot check를 함께 사용하여 검증할 수 있다. 예를 들어 security schema 이름에 일치하는 정의가 있는지 확인하는 것이다.
이 검증 수준은 6.5.1 최소 검증에서 다루는 모든 것뿐 아니라 semantic definitions의 기본 검증도 포함한다.
기본 검증은 network access가 가능하고 개인정보 보호 위험을 초래하지 않으며, 비교적 제약이 적은 computing requirements를 가진 상황에 적합하다. 예를 들어 gateways에는 적합하지만 endpoints에는 적합하지 않다. semantic processing이 필요하기 때문이다. 이는 extensions의 기본 검증, 구체적으로 사용된 vocabulary가 정의되어 있는지 검증할 수 있다.
이 경우 context definition files와 SHACL definitions를 사용하여 추가 assertions를 검증하고 TD의 semantic consistency를 확인할 수 있다. 또한 extension vocabularies에 대한 context definitions와 SHACL constraints를 가져올 수 있다면, 이를 사용하여 extensions를 검증할 수 있다.
전체 검증은 TD가 그것이 설명하는 Thing과 일관됨을 확인하는 9. 동작 Assertions에 제공된 assertions를 포함하여, 이 문서의 모든 assertions가 만족되는지를 확인한다.
이 검증 수준은 개발 중, release 전, 그리고 가능하다면 installation 이후에 적합하다. 개발 중 검증은 test Things에서 이루어져야 한다. 그러한 Things의 인스턴스를 실제로 설치하려면 적절한 per-instance identifiers와 URLs로 TD를 업데이트해야 하므로, 최대한의 보장을 위해 현장 검증은 installation 이후에 이루어져야 한다.
이 섹션은 비규범적이다.
5. TD Information Model의 표준 Vocabulary 정의에 더해, WoT Thing Description은 추가 namespace로부터 context knowledge를 추가할 가능성을 제공한다. 이 메커니즘은 Thing Description 인스턴스를 추가적인(예: domain-specific) semantics로 풍부하게 하는 데 사용할 수 있다. 또한 향후 추가 Protocol Bindings 또는 새로운 security schemes를 가져오는 데도 사용할 수 있다.
이러한 TD
Context
Extensions를 위해 Thing Descriptions는 JSON-LD
[json-ld11]에서 알려진
@context 메커니즘을 사용한다.
TD
Context
Extensions를 사용할 때,
Class
Thing의 @context 값은
JSON-LD context files를 식별하는 anyURI 타입의
추가 요소 또는 5.3.1.1 Thing에서
정의한 namespace IRIs를 포함하는
Map이 있는 Array이다.
6.1 JSON 타입으로의 매핑에서
complex types에 대한 직렬화 규칙은 확장된
@context 이름-값 쌍의 직렬화를 정의한다.
TD
Context Extensions가 있는
스니펫은 아래에 제공된다:
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"eg": "http://example.org/iot#",
"cov": "http://www.example.org/coap-binding#"
},
"https://schema.org/"
],
// ...
}
TD
Context Extensions는 Thing Description 인스턴스에서 추가
Vocabulary Terms의 사용을
허용한다. 포함된 namespaces가 RDF Schema 또는 OWL이 제공하는 것과
같은 Class
definitions를 기반으로 하는 경우, Thing Description의 모든
Class 인스턴스를
그러한 외부
Class
definition과 연결하여 semantic하게 annotate하는 데 사용할 수 있다.
이는 Class 이름을
@type 이름-값 쌍에 할당하거나, 여러
associations/annotations를 위해 그 Array 값에
Class 이름을
포함함으로써 수행된다. 6.1 JSON
타입으로의 매핑의 직렬화 규칙에 따르면, @type은
JSON string 또는 JSON array로 직렬화된다. @type은
node의 type을 설정하는 데 사용되는 JSON-LD keyword
[json-ld11]이다.
TD Context Extensions는 또한 Thing Description의 모든 Class 인스턴스 안에 추가 이름-값 쌍과 잘 정의된 값을 포함하는 것도 허용한다. 이러한 쌍과 값은 포함된 Vocabulary Terms를 통해 정의되며, 각각 대응하는 JSON 객체의 추가 멤버 또는 기존 멤버의 값으로 직렬화된다. 예로는 Thing의 추가 version metadata 또는 data items의 측정 단위가 있다.
다음 하위 섹션은 Thing Descriptions에서 서로 다른 종류의 ontologies를 사용하는 몇 가지 샘플을 보여 준다.
아래 샘플 TD 스니펫은 @context에 제공된 것처럼
서로 다른 외부 context files의 추가 metadata terms를 제공한다.
version information container는 사용된 software에 대한
추가 version information(s:softwareVersion)을 추가하여
확장된다. schema.org는
Thing의
serial number 및 company name과 같은 organisation information을
제공하는 데 사용된다. SAREF
ontology는 Thing의 semantic context
(saref:TemperatureSensor)를 제공하는 데 사용되며,
temperature property의 unit assignment에는
Ontology of Units of Measure (OM)가 사용된다.
이러한 Vocabularies와 ontologies는 예로 사용된 것임에 유의하라. application domain과 use case에 따라 다른 것을 사용할 수 있다.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"saref": "https://w3id.org/saref#",
"om": "http://www.ontology-of-units-of-measure.org/resource/om-2/",
"schema": "https://schema.org"
}
],
"version": {
"instance": "1.2.1",
"schema:softwareVersion": "1.0.1"
},
"schema:serialNumber": "4CE0460D0G",
"schema:manufacturer": {"name": "CompanyName"},
// ...
"@type": "saref:TemperatureSensor",
"properties": {
"temperature": {
"description": "Temperature value of the weather station",
"type": "number",
"minimum": -32.5,
"maximum": 55.2,
"unit": "om:degreeCelsius",
"forms": [...]
},
// ...
},
// ...
}
많은 경우, TD Context Extensions는 interaction 중 교환되는 data(예: response의 payload)에 의해 표현되는 physical world object의 state information을 semantic하게 처리할 수 있도록, data schema의 일부를 annotate하는 데 사용될 수 있다. 예를 들어 이 state information의 semantic description을 RDF로 TD Document에 삽입할 수 있으며, data schema의 일부를 physical world object의 RDF로 모델링된 state의 특정 부분을 참조하도록 개별적으로 annotate할 수 있다.
아래 TD 스니펫은 lamp의 state를 설명하기 위해 SAREF를 사용한다.
SSN,
Semantic Sensor Network Ontology [VOCAB-SSN]에서 가져온
외부 Vocabulary Term
ssn:forProperty는
status Property의 data schema를
physical world object의 실제 on/off state와 연결하는 데 사용된다.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"saref": "https://w3id.org/saref#",
"ssn": "http://www.w3.org/ns/ssn/"
}
],
"id": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4",
"@type": "saref:LightSwitch",
"saref:hasState": {
"@id": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4/state",
"@type": "saref:OnOffState"
},
// ...
"properties": {
"status": {
"ssn:forProperty": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4/state",
"type": "string",
"forms": [{"href": "https://mylamp.example.com/status"}]
},
"fullStatus": {
"ssn:forProperty": "urn:uuid:67c9122b-2680-4e1a-b41c-5af07edba1f4/state",
"type": "object",
"properties": {
"statusString": { "type": "string" },
"statusCode": { "type": "number" },
"statusDescription": { "type": "string" }
},
"forms": [{"href": "https://mylamp.example.com/status?full=true"}]
},
// ...
},
// ...
}
예 2에서
Thing의
state는 status affordance 자체에 의해
주어지고, 가능한 state changes는 toggle
affordance에 의해 주어진다. 다시 말해 physical world object의
state가 Thing의
Interaction
Affordances를 직접 제공한다. 이 설계는 단순한 경우에는
만족스럽다. 그러나 더 정교한 경우에는 동일한 physical state에
대해 여러 affordances가 사용 가능할 수 있다. 위 예에서
fullStatus Property는 lamp state에 대한
대안적이고 더 장황한 표현을 제공한다.
building, agriculture 또는 smart city와 같은 많은 사용 사례에서는 location based data가 필요하다. 이 정보는 Thing Description에서 다양한 방식으로 제공될 수 있으며, 목적(예: indoor, outdoor)에 따라 서로 다른 종류의 location ontologies(예: [w3c-basic-geo], schema.org)에 의존할 수 있다. [sdw-bp]도 참조하라.
아래 TD 스니펫은 [w3c-basic-geo]
ontology의 lat 및 long을 사용하여
Thing의 top level에서 static latitude 및 longitude metadata를
제공한다.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"geo": "http://www.w3.org/2003/01/geo/wgs84_pos#"
}
],
"@type": "Thing",
"geo:lat": "26.58",
"geo:long": "297.83",
// ...
"properties": {
// ...
}
}
어떤 사용 사례에서는 location based metadata가 interaction level에서
제공되어야 한다. 예를 들어 schema.org를 기반으로 최신
longitude, latitude, 그리고
elevation 값을 반환하는
Property로 제공될 수 있다:
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"schema": "https://schema.org#"
}
],
// ...
"properties": {
"position": {
"type": "object",
"@type": "schema:GeoCoordinates",
"properties": {
"longitude": { "type": "number" },
"latitude": { "type": "number" },
"elevation": { "type": "number" }
},
"forms": [{"href": "https://robot.example.com/position"}]
},
// ...
},
// ...
}
data model에서 예를 들어 longitude,
latitude, 그리고 elevation에 대해
다른 이름이 필요한 경우,
jsonld:context를 사용하여 terms를 ontology의
특정 vocabulary에 연결할 수 있다
([JSON-SCHEMA-ONTOLOGY],
Section 3.3 Defining a JSON-LD context for data
instances도 참조):
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"schema": "https://schema.org#"
}
],
// ...
"properties": {
"position": {
"jsonld:context": {
"schema": "https://schema.org/",
"long": "schema:longitude",
"lat": "schema:latitude",
"height": "schema:elevation"
},
"type": "object",
"properties": {
"long": { "type": "number" },
"lat": { "type": "number" },
"height": { "type": "number" }
}
}
},
// ...
}
Thing Description의 TD
Context Extensions를 통해, communication metadata는
WoT Binding Registry
[WOT-BINDING-REGISTRY]의
Binding
Specifications를 통해 보완될 수 있으며,
이는 Form 인스턴스를 나타내는 JSON 객체로 직렬화되는
추가 Vocabulary Terms를 통해 추가된다.
자세한 정보는 8. Bindings를
참조하라.
마지막으로,
5.3.3 Security
Vocabulary
Definitions에 포함되지 않은 새로운 security schemes는
TD
Context Extension
메커니즘을 사용하여 가져올 수 있다. 이 예는
[RFC9200]를
기반으로 하는 가상의 ACE security scheme를 사용하며, 이 예에서는
http://www.example.org/ace-security#에 있는 namespace로
정의된다.
추가 security schemes는
SecurityScheme
Class의
Subclasses여야
MUST 한다.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"cov": "http://www.example.org/coap-binding#",
"ace": "http://www.example.org/ace-security#"
}
],
// ...
"securityDefinitions": {
"ace_sc": {
"scheme": "ace:ACESecurityScheme",
// ...
"ace:as": "coaps://as.example.com/token",
"ace:audience": "coaps://rs.example.com",
"ace:scopes": ["limited", "special"],
"ace:cnonce": true
}
},
"security": ["ace_sc"],
"properties": {
"status": {
// ...
"forms": [{
"op": "readproperty",
"href": "coaps://rs.example.com/status",
"contentType": "application/cbor",
"cov:methodName": "GET",
"ace:scopes": ["limited"]
}]
}
},
"actions": {
"configure": {
// ...
"forms": [{
"op": "invokeaction",
"href": "coaps://rs.example.com/configure",
"contentType": "application/cbor",
"cov:methodName": "POST",
"ace:scopes": ["special"]
}]
}
},
// ...
}
5.3.3 Security Vocabulary Definitions에서 정의된 모든 security schemes는 이미 TD context의 일부이며, TD Context Extension을 통해 포함할 필요가 없다는 점에 유의하라.
Consumer에서 Thing으로, 그리고 다시 Thing에서 Consumer로 전송되는 모든
message는 WoT가 제공하는 Property–Action–Event 추상화에도 불구하고
network protocol을 통해 이동해야 한다. Forms level의 operations는
message가 network 상에서 어떤 형태여야 하는지에 바인딩되어야 한다.
따라서 WoT Thing Description의 모든 form은 Form에 표시된 것처럼
href 멤버로 주어지는 submission target을 가져야 한다.
예를 들어 target이 http 또는 https로 시작하면,
Consumer는
Thing이
HTTP 기반 Protocol Binding을
구현한다고 추론할 수 있으며, 이 form의 인스턴스에서 HTTP-specific terms를
기대해야 한다. 더 자세한 설명과 예는
8.1.1 Protocol Bindings를
참조하라.
또한 Affordance Level의
Data
Schema가 설명하는 payload는
data format으로 직렬화되어 network protocol로 전송되어야 한다.
operations가 protocol messages에 바인딩되는 방식과 유사하게,
Data
Schema는
Form에 제공된 contentType 또는
protocol-specific terms가 나타내는 data format에 바인딩된다. 이러한
terms로부터 Consumer는
필요한 serialization method를 추론하고 application-level data를
network protocol로 전송할 data로 변환할 수 있다. 마찬가지로
Thing에서 오는
messages에 대해,
Consumer는
data를
deserialize하고 application level에 제공할 수 있다. 예를 들어
Python으로 구현된 Consumer는
contentType의 값으로 application/json을 읽고,
Python dictionary data structure를 JSON 객체로 직렬화할 수 있다.
더 자세한 설명과 예는 8.1.2 Payload Bindings를
참조하라.
위 메커니즘은 Web of Things에서 Bindings라고 불리며,
구체적인 예는 HTTP 및 JSON Bindings가 있는 robot arm의 TD 일부와 함께
그림 5에 설명되어 있다. 여기서 Consumer는
robot arm을 x가 12이고 y가 100인 위치로 이동시키기 위해
robot arm의 action(goTo)을 호출하려고 한다. 이를 위해
올바른 payload를 만들고, 이를 직렬화한 뒤, 올바른 protocol options를
사용하여 전송한다. Thing은 network를 통해 message를 받고, 자신의 TD에
대응하는 message로 응답한다. 다른 protocols, payload formats 및/또는
그 조합도 가능하며, 이는 8.1 Binding
Mechanisms에서 설명된다.
요약하면, Bindings는 Thing Description이 특정 protocol, data payload formats 또는 둘 모두에 특정 방식으로 맞게 조정될 수 있게 한다. 이는 URI Schemes, 추가 descriptive vocabularies, Thing Models, 그리고 Things와 Consumers의 구현자를 모두 안내하는 것을 목표로 하는 예를 통해 수행된다. 이 섹션은 전체 메커니즘을 설명하고 새로운 Bindings를 만드는 데 대한 기본 지침을 제공한다. [WOT-BINDING-REGISTRY]는 기존 Bindings의 registry(목록)와 registry에 새 entries를 등록하기 위해 따라야 할 requirements를 포함한다.
특정 IoT device를 위한 TD를 생성할 때, 해당 Binding을 사용하여 Thing Description에 제공되어야 하는 communication metadata를 찾아볼 수 있다. 그림 6은 Bindings가 어떻게 사용되는지 보여 준다. protocol 또는 media type을 기반으로 TD가 생성된다. TD를 처리하는 Consumer는 TD에 존재하는 필요한 Bindings를 구현하며, 이를 위해 해당 protocol stack과 media type encoder/decoder를 포함하고, messages의 serialization format 및 header options와 같이 TD에 주어진 정보에 따라 stack(또는 그 messages)을 구성한다.
이 명세의 편집자들은 [WOT-ARCHITECTURE]의 관련 장들, 예를 들어 WoT Binding Templates Building Block, Hypermedia Controls, Protocol Bindings 및 Media Types를 읽는 것도 권장한다.
[WOT-THING-DESCRIPTION]는
readproperty, invokeaction 및
subscribeevent와 같은 abstract operations를 정의하며,
이는 Thing Description의 form이
설명하는 operation을 수행할 때 의도된 semantics를 설명한다.
operations가 affordance에서 수행되려면, operation을 protocol에
바인딩해야 한다. 다시 말해 form은 Consumer가 예를 들어 form 안의
protocol로 property를 읽기 위해 필요한 모든 정보를 포함해야 한다.
대부분의 protocols는 message type, 즉 message의 semantic intention을
정의하는 비교적 작은 method 집합을 가진다. REST 및 PubSub
architecture patterns는 서로 다른 methods를 가진 서로 다른
protocols를 초래한다. 각 target protocol은 유사한 operations에 대해
서로 다른 method names를 지정할 수 있으며, 서로 다른 protocols의
유사한 method names 사이에는 semantic differences가 있을 수 있다.
또한 Things는
특정 WoT operation을 수행하기 위해 서로 다른 methods를 사용할 수 있다.
예를 들어 한 Thing에서는 writeproperty operation에
HTTP POST request가 사용될 수 있지만, 다른 Thing에서는 HTTP PUT이
사용될 수 있다. 이러한 이유로 Thing Descriptions는 operation별로
사용할 method를 지정할 수 있어야 한다.
REST 및 PubSub protocols에서 흔히 발견되는 methods는
GET, PUT, POST, DELETE, PUBLISH, 그리고 SUBSCRIBE이다. Binding
specifications는 이러한 기존 methods와 관련 vocabularies가
Thing Description에서
WoT operations에 바인딩하기 위해 어떻게 사용될 수 있는지 설명한다.
이는 protocol의 URI scheme을 정의하고, protocol methods를
readproperty, invokeaction 및
subscribeevent와 같은 abstract WoT operations에 매핑함으로써
수행된다. 어떤 경우에는 protocol usage의 서로 다른 경우에
vocabulary terms를 어떻게 사용해야 하는지 설명하기 위한 추가
지침이 제공된다.
아래 예들은 HTTP 및 Modbus protocols에 대한
readproperty operation의 binding instances를 보여 준다.
이는 예시일 뿐이며, 관련 vocabulary terms와 그 값을 알아보려면
항상 해당 binding specification을 참조해야 한다는 점에 유의하라.
|
예 53:
readproperty operation을 HTTP에 바인딩한 instance
|
예 54:
readproperty operation을 Modbus에 바인딩한 instance
|
위 예의 form elements는 다음 statements를 전달한다:
80의 host
example.com에 있는 resource
props/temperature에 HTTP GET request를 수행하여
대상 Property Affordance의 readproperty를 수행한다
(Port 80은 [RFC2616]에
따라 가정된다).
127.0.0.1을 가진 장치의
port 60000에서 unitID 1의 coil
4에 대해 Modbus의 readCoil function을
사용하여 대상 Property Affordance의 readproperty를
수행한다.
이러한 binding instances와 그 statements는 다른 operations와
protocols에도 가능하다. 아래는 invokeaction 및
subscribeevent의 예이다:
|
예 55:
invokeaction operation을 HTTP에 바인딩한 instance
|
예 56:
subscribeevent operation을 MQTT에 바인딩한 instance
|
위 예의 form elements는 다음 statements를 전달한다:
8081의 host
192.168.1.32에 있는 resource
example/levelaction에 HTTP POST request를 수행하여
대상 Action Affordance의 invokeaction을 수행한다.
iot.platform.com의 MQTT broker와
port 8088에 연결한 다음 topic
thing1/events/overheating을 구독하여
대상 Event Affordance의 subscribeevent를 수행한다.
어떤 경우에는 header options 또는 protocols의 다른 parameters가
포함되어야 한다. 이것들은 protocol에 매우 의존적이므로,
Web of
Things (WoT) Binding Registry에 나열된 bindings를
참조하라. 또한 protocols에는 일부 interaction types에 사용할 수
있는 Subprotocols가 정의되어 있을 수 있다. 예를 들어 HTTP를 사용하여
asynchronous notifications를 받기 위해, 일부 servers는 long polling
(longpoll), WebSub
[WebSub]
(websub) 및 Server-Sent Events
[eventsource]
(sse)를 지원할 수 있다.
[WOT-ARCHITECTURE]에
정의된 것처럼, subprotocol은 protocol에 대한 extension mechanism이다.
subprotocol은 protocol messages의 sequence 또는 message payloads의
특정 구조를 요구할 수 있으며, 이는 해당 subprotocol 안에서
자체 semantics를 가질 수 있다. subprotocol의 사용은
[WOT-THING-DESCRIPTION]에
정의된 subprotocol field로 표현된다. 이는 form
instance에서 이러한 protocols 중 하나의 사용, 예를 들어 HTTP의
특수한 사용을 가진 long polling을 나타내는 데 사용할 수 있다:
{
"op": "subscribeevent",
"href": "https://mylamp.example.com/overheating",
"subprotocol": "longpoll"
}
subprotocol term이 가질 수 있는 값은
[WOT-THING-DESCRIPTION]에
의해 제약되지 않는다. 서로 다른 protocols는 서로 다른
subprotocols를 가질 수 있기 때문이다. 이에 따라 subprotocols는
자신이 확장하는 protocol과 연결되며, forms의 href
(또는 base)에 표시된 protocol과 함께 이해되어야 한다.
WebSockets의 경우 IANA-registered Websocket Subprotocols
[iana-web-socket-registry]를
사용할 수 있다. CoAP의 경우
"subprotocol":"cov:observe"를 사용하여
[RFC6741]에
정의된 asynchronous observation operations를 설명할 수 있다.
subprotocols는 protocol binding
specification의 일부로 정의되고 설명될 수 있다.
Protocol Binding Specifications는 [WOT-THING-DESCRIPTION]에 있는 vocabulary를 확장하는 vocabularies를 포함한다. 이는 TD가 소비되는 방식과 Thing과의 interactions가 그러한 vocabularies에 맞게 조정된다는 뜻이다. 아래 단계는 이 process가 일반적으로 어떤 모습인지 설명한다.
href 멤버와 base(존재하는 경우)를
보고 protocol을 식별하는 것이 SHOULD 좋다.
subprotocol 또는 protocol binding이 도입한
다른 vocabulary terms와 같은 서로 다른 form terms를 사용하여
지정된다. Thing과 교환되는 interaction affordance data는 TD에
존재하는 Data Schema 및
Content Type에 따르는 것이
SHOULD 좋다. operation에 해당하는
Data Schema는 표 표 28에서
찾을 수 있다.
따라서 다음 requirements가 Things와 Consumers에 적용된다:
href 멤버의
URI scheme [RFC3986]이
나타내는 Protocol Binding의
requirements를 따라야 MUST 한다.[WOT-THING-DESCRIPTION]는
어떤 protocol을 통한 message의 payload가 어떤 모습일 수 있는지 설명하기 위해
두 가지 메커니즘을 정의한다. 첫째, media types
[IANA-MEDIA-TYPES]는
protocol로 data를 보내고 받을 때 사용되는 serialization을 설명한다.
이들은 각 Interaction Affordance에 필수인 TD의 Forms 안의
contentType으로 표현된다. 둘째, messages의 구조를
설명하기 위해 Data Schema 개념을 정의하며, 이는 media types와
함께 사용된다. 이 둘의 조합은 어떤 message든 TD에서 설명할 수
있게 하여, Thing과 Consumers가 messages를 올바르게 serialization 및
deserialization할 수 있게 한다.
이 섹션의 나머지 부분인 8.1.2.1 Content Types 및 8.1.2.2 Data Schemas에서는 payload bindings가 어떤 모습일 수 있는지에 대한 예를 찾을 수 있다.
Content type은 media type과 media type에 대한 잠재적 parameters를 포함하며, 직렬화된 documents의 적절한 processing을 가능하게 한다. 이 방식으로 messages는 어떤 format으로도 교환될 수 있고, application의 upper layers가 서로 다른 formats에 적응할 수 있다. images, videos 또는 임의의 unstructured data와 같은 경우에는 content type만으로 payload를 설명하기에 충분하지만, JSON ([RFC8259])과 같은 경우에는 보통 8.1.2.2 Data Schemas에서 설명한 것처럼 Data Schema가 제공된다.
예를 들어 number payload는 JSON 또는 XML로 직렬화될 수 있으며,
forms의 contentType에서 각각
application/json 또는
application/xml로 표시될 수 있다. plus
(+) 또는 semicolon (;) notation을 통해
추가 parametrization이 가능하다.
아래 예에서는 JSON 및 추가 parameters가 있는 plain text에 대한
content types를 가진 form elements를 찾을 수 있다. 이 특정
경우 forms는 http 또는 coap로 이
property를 읽으면 서로 다른 content types가 결과로 나온다고
설명한다. structured media types의 경우, Data Schema는 일반적으로
8.1.2.2 Data
Schemas 및 5.3.2 Data Schema
Vocabulary Definitions에서 설명한 것처럼 affordance level에
제공된다. 그러나 images 및 videos와 같은 unstructured data의
경우, Data Schema는 일반적으로 사용할 수 없다.
{
"forms":[
{
"href": "http://example.com/properties/temperature",
"op": "readproperty",
"contentType": "application/json"
},
{
"href": "coap://example.com/properties/temperature",
"op": "readproperty",
"contentType": "text/plain;charset=utf-8"
}]
}
다른 content types도 TDs에서 표현될 수 있다. 아래 목록에서는 서로 다른 content type variations의 예를 찾을 수 있다. 이러한 content types는 예 58의 것들을 대체할 수 있다.
image/jpeg: JPEG imagevideo/mp4: MP4 Videoapplication/octet-stream: Generic
binary stream5.3.2 Data Schema Vocabulary Definitions에서 설명한 것처럼 Data Schema는 media types와 함께 사용되는 messages의 구조를 설명한다. JSON Schema [json-schema]에서 크게 영감을 받았지만, [XML], string-encoded images, integers의 bit representations 등 다른 payload types를 설명하는 데도 사용할 수 있다. Data Schema는 media types에 더해 사용되는 것이 SHOULD 좋다.
경우에 따라 messages의 구조는 단순한 number부터 여러 단계로 중첩된 arrays 또는 objects까지 무엇이든 될 수 있다. 기존 IoT Platforms와 Standards에는 data가 구조화되는 방식에 variations가 있는 특정 payload formats가 있다. 5.3.2 Data Schema Vocabulary Definitions에서 설명한 것처럼, Data Schema는 TD에서 다음 위치 중 하나에 사용할 수 있다:
input 및
output vocabulary terms는 input parameters와 함께
Action Affordance를 호출하고 status information을 받는 경우처럼
양방향으로 data가 교환될 때 두 개의 서로 다른 schemas를
제공하는 데 사용된다.
data,
dataResponse, subscription
및 cancellation은 각각 event data가 Exposed
Thing에 의해 전달될 때의 payload, event deliveries에 대해
회신할 payload, event에 subscribe하는 데 필요한 payload,
그리고 Exposed Thing으로부터 event data 수신을 cancel하는 데
필요한 payload를 설명하는 데 사용된다.
uriVariables는 request URI 안에 string으로
제공되어야 하는 data를 설명할 수 있다.
아래는 해당 Data Schema가 있는 간단한 JSON object payload의 예이다. 다양한 IoT Platforms 및 Standards의 예는 E. IoT Platforms 및 Standards의 Payloads와 Data Schemas 예에서 찾을 수 있다.
|
예
59: 단순 JSON Object
Payload
|
예 60: 단순 JSON
Object Payload를 위한 DataSchema
|
IoT platforms 또는 OPC-UA나 BACnet과 같은 standards의 경우, protocol, media type 및 data structure가 지정될 수 있다. 이러한 경우 그 binding specification은 8.1.1 Protocol Bindings 및 8.1.2 Payload Bindings의 집합에 의존하거나, protocol, media type 및 data structure를 동시에 지정할 수 있다.
IoT platforms에서는 HTTP를 특정 JSON payload structures와 함께 사용하는 것에 대한 requirement가 있을 수 있다. 따라서 해당 binding specification은 여러 bindings의 semantic grouping을 허용하는 Thing Models와 TDs의 예를 제공한다. 이를 위해서는 우선 HTTP와 JSON에 대한 binding specification이 있어야 한다.
OPC-UA 또는 BACnet과 같은 standards에서는 binding specification이 protocol 및 media type, 그리고 가능하다면 data structure에 대한 requirements를 포함한다. 따라서 binding specification 자체만으로도 binding instance가 어떤 모습이어야 하는지 지정하기에 충분하다.
Web of Things는 구현 노력을 줄일 수 있는 profiling mechanism도 정의한다. Profiles는 TDs의 유연성을 제약함으로써 기존 Bindings 위에 구축된다. 이러한 constraints는 bindings, semantic contexts, link relations, security schemes 및 discovery mechanisms일 수 있다. 이러한 constraints를 통해 profiles는 bindings보다 추가적인 interoperability guarantees를 제공한다.
[WOT-PROFILES]에서 현재 지정된 profiling mechanism은 위에서 언급한 메커니즘을 정확히 따르지는 않는다. 그러나 profiling mechanism의 미래에 대해서는 합의가 있다. profiling mechanism이 업데이트되면, 이 섹션도 그에 맞게 업데이트될 것이다.
예를 들어 profile은 readproperty operations에 대해
HTTP GET Method의 사용을 제약하고, payloads가 항상 JSON으로
serialized되어야 한다고 요구할 수 있다. profile의 사용은 TD의
profile term으로 표시되며, 이는 profile definition을
가리키는 URI이다. Consumer가 profile을 어떻게 사용할 수 있는지는
[WOT-PROFILES]
specification의 Profiling
Mechanism 섹션에서 설명된다.
다음 assertions는 TD의 표현 또는 정보 모델과는 달리 WoT system의 구성 요소들의 동작과 관련된다. 그러나 TD는 descriptive하며, 특히 이미 존재하는 network interfaces를 설명하는 데 사용될 수 있다는 점에 유의하라. 이러한 경우에는 그러한 기존 interfaces의 동작을 제약하는 assertions를 만들 수 없다. 대신 assertions는 그러한 interfaces를 정확히 표현하도록 TD에 대한 제약으로 해석되어야 한다.
안전한 상호운용을 가능하게 하려면, security configurations는 Thing의 requirements를 정확히 반영해야 한다:
일부 security protocols는 필요한 encoding 또는 encryption schemes를 포함하여 authentication information을 동적으로 요청할 수 있다. 위의 한 가지 결과는, protocol이 Thing Description에 선언되지 않은 security credentials의 형태나 encoding 또는 encryption scheme을 요청하는 경우 Thing Description은 invalid로 간주되어야 한다는 것이다.
TD에 제공된 data schemas는 TD에 지정된 interactions에서 설명된 Thing이 반환하고 수락하는 data payloads를 정확히 표현해야 한다. 일반적으로 Consumers는 data schemas를 엄격히 따라야 하며, WoT Thing Description에 주어지지 않은 것은 생성하지 않아야 하지만, WoT Thing Description에 명시적으로 주어지지 않은 Thing의 추가 data는 수락해야 한다. 일반적으로 Things는 WoT Thing Descriptions에 의해 described되지만, Consumers는 Things와 상호작용할 때 WoT Thing Descriptions를 따르도록 constrained된다.
ObjectSchema 및 ArraySchema
(items가 DataSchema의 Array인 경우)에 적용된다.
이는 [JSON-SCHEMA]에
정의된 것처럼 "additionalProperties":true 또는
"additionalItems":true처럼 동작한다.
ObjectSchema 및 ArraySchema
(items가 DataSchema의 Array인 경우)에 적용된다.
이는 [JSON-SCHEMA]에
정의된 것처럼 "additionalProperties":true 또는
"additionalItems":true처럼 동작한다.
아래 그림은 Thing Model과 Thing Description의 관계를 보여 준다. Thing Model은 주로 Properties, Actions, 그리고 Events와 같은 interaction affordances 및 공통 metadata를 설명한다. Thing Descriptions가 Thing Model에 의존하여 instantiated되는 경우, 그것은 해당 Thing Model에 따라 valid인 것이 SHOULD 좋다. 이 paradigm은 object-oriented programming에서 objects(~Thing Descriptions)를 만들기 위한 abstract class 또는 interface definition(~Thing Model)과 비교될 수 있다.
Thing Model은 Thing의 Properties, Actions, 그리고 Events와의 interface 및 가능한 interaction에 대한 logical description이다. 그러나 이는 concrete protocol usage(예: IP address), 또는 serial number와 GPS location 같은 Thing instance-specific information을 포함하지 않는다. 그러나 Thing Models는 예를 들어 model이 설명하는 전체 인스턴스 class에 적용된다면 security schemes를 포함할 수 있다. 이러한 schemes는 생략되거나 (templates로) parameterized되어야 할 수 있는 URLs(예: token servers와 같은)를 가질 수 있지만, 많은 경우에는 이러한 URLs도 제공될 수 있다.
Thing
Model은 Thing Description과 동일한 JSON 기반 format으로
serialized될 수 있으며, 이는 JSON-LD processing도 허용한다.
일부 mandatory terms가 없기 때문에 Thing
Model은 Thing
Description instances와 같은 방식으로 검증될 수 없다는 점에
유의하라. 이는 placeholder type을 사용하지 않는 모든 term이 여전히
TD Information
Model에 선언된 types를 사용한다는 뜻이다. 예를 들어
placeholder가 사용되지 않는 한, minimum의 값은
integer여야 한다.
JSON으로 serialized된 TM instances를 검증하기 위해 the JSON Schema를 사용할 수 있다.
Thing
Model은 top level @type으로 인식된다.
Thing Model definitions는
top level에서 keyword @type을 사용해야
MUST 하며, tm:ThingModel과 같거나
이를 포함하는 string 또는 array 타입의 값을 사용해야 한다.
또한 JSON-LD document로 식별하기 위해
Thing Model definitions는
Thing Description과 동일한 규칙으로 top level에서 keyword
@context를 사용해야 MUST 한다.
prefix tm은 Thing Descriptions의
context 안에 정의되며, 4. Namespaces에
정의된 Thing Model namespace를
가리킨다. tm context의 vocabulary는
Thing
Model definitions에서만 사용되고, Thing Descriptions가
생성될 때 제거되거나 대체되는 것으로 의도된다
(10.4
Thing Description Instances의
Derivation도 참조).
Thing Model은 endpoint addresses와 같은 instance specific Protocol Binding 및 security information을 포함하지 않을 수 MAY 있다. 따라서 Thing Model definitions는 forms, base, securityDefinitions, 그리고 security와 같은 JSON members가 없더라도 valid하다. Thing Models는 이러한 JSON members가 (예: template으로) 사용되더라도 valid하지만, href와 같은 nested mandatory members는 생략된다.
예 3은 protocol 및 security information이 없는 valid한 sample lamp Thing Model을 보여 준다.
Thing Model definitions의 context에서는 Thing modelling에 사용할 수 있는 특정 features가 도입된다.
Thing Model
definitions가 시간이 지나며 변경되는 경우, 이는 version container에
반영되는 것이 SHOULD 좋다.
string-based term model은 [SEMVER]와 같은
versioning information을 제공하기 위해 version container 안에서
사용된다. 다음 snippet은 Thing Model instance에서 model의
사용을 보여 준다.
{
// ...
"@type": "tm:ThingModel",
"title": "Lamp Thing Model",
"description": "Lamp Thing Description Model",
"version" : {"model": "1.0.0"},
// ...
}
Thing Model의 정의로 인해,
term instance는 version
container 안에서 생략되어야 MUST
한다.
Thing Models가 업데이트되어 새 version을 가지면, 이는 extension 및 import features를 사용하는 다른 Thing Models에 영향을 줄 수 있다(Section 10.3.2 Extension and Import 참조). 어떤 경우에는 새 version을 file name 및/또는 version을 식별하는 해당 URL에 반영하는 것도 유용하다.
Thing
Model은 links 정의에 발표된
tm:extends 메커니즘을 사용하여 기존
Thing Model을
확장할 수 있다: Thing Model이
다른 Thing Model을 확장할 때, 확장될
Thing Model을 대상으로 하는
"rel":
"tm:extends"가 있는 links entry를 적어도 하나
사용해야 MUST 한다.
Thing
Model은 확장된 Thing
Model의 모든 definitions를 상속한다. 기존 TD information model
(5. TD Information
Model)의 추가 JSON name-value pairs를 제공하거나 context extension
concept(7. TD Context
Extensions)을 사용하여
기존 definition을 추가 metadata로 확장할 기회가 있다.
Thing Model은
title(s) 및 maximum 등과 같은 기존
definitions를 overwrite할 수도 있다. 이를 위해 두 가지 제한이 있다:
Thing
Model은 확장된 Thing Model의
properties, actions, 그리고/또는
events Map 안에 정의된 JSON names를
overwrite하지 않는 것이 SHOULD NOT
좋다.
Definitions는 가능한
instance values가 origin extended definitions와 비교해 더 이상
valid하지 않게 되는 방식으로 overwritten되지 않는 것이
SHOULD NOT 좋다. 이러한 assertions는
확장된 Thing Model의
semantics를 전반적으로 보존한다. 예를 들어, extended
Thing
Model의 "minimum":2를 "minimum":0으로
overwrite하는 것은 허용되지 않는다. 반면 "minimum":5로
overwriting하는 것은 모든 instance values가 항상 extended
Thing Model의 restrictions를
충족하므로 가능하다(추가 설명은 Figure 그림
8도 참조).
다음 예에 제공된 것처럼 basic model description이 있다고 가정하자:
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Basic On/Off Thing Model",
"properties": {
"onOff": {
"type": "boolean"
}
}
}
이제 TD instances를 만들기 위한 template으로 사용될
'Smart Lamp Control'이라는 새 device class model이 설계된다.
이 model은 'Basic On/Off Thing Model'의 기존 definition을 재사용하고
이를 dim property로 확장한다:
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Smart Lamp Control with Dimming",
"links" : [{
"rel": "tm:extends",
"href": "http://example.com/BasicOnOffTM",
"type": "application/tm+json"
}],
"properties" : {
"dim" : {
"title": "Dimming level",
"type": "integer",
"minimum": 0,
"maximum": 100
}
}
}
title이 overwritten되며, TD instances가 생성될 때 사용될
것임에 유의하라(다음 하위 섹션
10.4 Thing Description
Instances의
Derivation도 참조).
tm:extends feature는 하나의
Thing Model의
모든 definitions를 상속하는 것만 허용한다. 그러나 많은 사용 사례에서는
하나 이상의 기존 Thing Models의
definitions 조각만 import하는 것이 바람직하다.
하나 이상의 기존
Thing
Models의 definitions 조각을 import하기 위해, 재사용되는 것이
SHOULD 좋은 기존 (sub-)definition의
location을 제공하는 tm:ref term이 도입된다.
tm:ref 값은
URI [RFC3986](Section
4.1))로서의 file location으로 시작하고, 그 뒤에 #
character가 오며, 그 뒤에 JSON Pointer [RFC6901]
definition이 오는 pattern을 따라야 MUST
한다. URI가 empty일 수도 있으며, 이는 same-document reference
[RFC3986](Section
4.4))를 나타낸다는 점에 유의하라. 이 경우 tm:ref는
relative reference로 해석되어야 한다. tm:ref가
사용될 때마다, referenced pre-definition과 그 dependencies(예:
context extension에 의한 것)는 새로 정의된 definition에서
assumed되어야 MUST 한다.
tm:ref 값의 일부는 사용 전에 URL
("percent") encoding이 필요한 non-ASCII characters를 포함할 수 있다.
tm:ref 값에 escapes를 적용하기 전에 implementations는
해당 값이 이미 encoded되어 있지 않은지 확인해야 한다.
다음 예는 예
62의 property onOff의 기존
definition을 새 property definition switch로 import하는
새 TM definition을 보여 준다.
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Smart Lamp Control",
"properties" : {
"switch" : {
"tm:ref": "http://example.com/BasicOnOffTM.tm.jsonld#/properties/onOff"
}
}
}
tm:ref를 사용한 relative imports의 예로, 다음 Thing
Model은 genericTemperature property를 두 개의 더 구체적인
properties에서 재사용하고 보강한다(아래 참조). 이 두 properties는
각각 inner 및 outer temperature value를 설명한다.
{
"@context": "https://www.w3.org/ns/wot-next/td",
"@type": "tm:ThingModel",
"title": "Multi Sensor",
"properties": {
"genericTemperature": {
"type": "number",
"unit": "C"
},
"innerTemperature": {
"tm:ref": "#/properties/genericTemperature",
"title": "The inner temperature",
"minimum": 10
},
"outerTemperature": {
"tm:ref": "#/properties/genericTemperature",
"title": "The outer temperature",
"description": "The outer temperature is measured in Kelvin",
"unit": "K"
}
},
"tm:optional": [
"/properties/genericTemperature"
]
}
"tm:ref"가 정의된 위치에는 추가 name-value pairs를 추가할 수 있다.
referenced definition의 name-value pairs를 override하는 것도 허용된다.
tm:ref의
기존 JSON name-value pair definition을 override하려는 의도라면,
새 값을 제공하는 tm:ref declaration의 같은 level에서
동일한 JSON name을 사용해야 MUST 한다.
overwrite process는
[RFC7396]에 정의된 JSON Merge Patch algorithm을 따라야
MUST 하며, referenced definition의
content가 새로 제공된 JSON name-value pairs로 patched된다.
values는 JSON object 또는 array를 기반으로
할 수도 있고, 단순히 null value일 수도 있다.
null은 target의 기존 JSON name-value pair 제거로
이어질 것이다.
tm:extends와
유사하게, semantic meaning을 유지하기 위해 definitions는 가능한
instance values가 origin referenced definition과 비교해 더 이상
valid하지 않게 되는 방식으로 overwritten되지 않는 것이
SHOULD NOT 좋다.
다음 예는 예
63의 기존 definitions를 overwrite(maximum),
enhance(unit), 그리고 remove(title)하는 새
TM definition을 보여 준다.
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Smart Lamp Control",
"properties" : {
"dimming" : {
"tm:ref": "http://example.com/SmartLampControlwithDimming.tm.jsonld#/properties/dim",
"title": null,
"maximum": 80,
"unit": "%"
}
}
}
JSON Merge Patch algorithm을 기반으로,
{"title": null,"maximum": 80,"unit": "%"}는
referenced origin content
{"title": "Dimming level", "type": "integer",
"minimum": 0, "maximum": 100}에 대한 patch로 작동할 것이다.
tm:extends와 tm:ref 기반 import mechanism은
TM definition에서 동시에 사용될 수도 있다. 다음 예는
예 62의
TM을 확장하고, 각각
예
3 및 예
63에서 status와
dim definitions를 import한다.
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Smart Lamp Control",
"links" : [{
"rel": "extends",
"href": "http://example.com/BasicOnOffTM",
"type": "application/tm+json"
}],
"properties" : {
"status" : {
"tm:ref": "http://example.com/LampTM.tm.jsonld#/properties/status"
},
"dimming" : {
"tm:ref": "http://example.com/LampWithDimmingTM.tm.jsonld#/properties/dim"
}
}
}
tm:extends 및 tm:ref 기반 import mechanism은
transitive extension(extensions의 hierarchy)을 명시적으로 지원한다.
예를 들어 TM "B"의 tm:extends를 정의하는 TM "A"가
있고, TM "B" 자체가 TM "C"의 tm:extends를 정의하는
3개의 TMs가 있다고 가정하면, 결과적으로 "A" TM은 "B"와 "C"의
모든 definitions를 확장한다.
infinite loop로
이어지는 recursive extensions는 정의되어서는 안
MUST NOT 된다.
다음 그림은 이 섹션에 제시된 extension 및 imports TM functions의
allowable override behaviour를 요약한다. 세 개의
Thing Models는 Smart Lamp Control
Thing Model의 TM definitions를
재사용하기 위해 tm:ref 또는 tm:extends
feature를 사용한다. 첫 번째 Thing
Model은 dimmer property 안에서 maximum
값을 120으로 import하고 overwrite한다. 그러나 이는 Smart
Lamp Control Thing Model의 dim definition에서 origin
dim definition의 0과 100 사이
범위에 속하지 않을 수 있는 가능한 instance values(at runtime)를
초래한다. 따라서 그러한 Thing Model definition은
허용되지 않는다. 두 번째 model은 property type 값을
number로 overwrite한다. 이 역시 Smart Lamp Control
Thing
Model의 origin dim type definition(integer)이
수락하지 않는 numeric dim values를 잠재적으로 초래할
것이다. 마지막 model은 올바른 방식으로 정의되어 있다. 새로운
dim ranges는 원래의 dim definition도 충족하는
potential instance values를 생성한다.
일부 applications에서는 기존
Thing
Model definitions를 재사용하고 이를 새 IoT system으로 compose하는 것이
유익하다. 예를 들어 새 Smart Ventilator가 두 개의 sub/child
Thing Model definitions로
구성되도록 설계되는 경우가 있을 수 있다. 예컨대 on/off와
adjustRpm capabilities를 제공하는 Ventilation
Thing Model, 그리고
dimmable 및 RGB capabilities를 제공하는
LED Thing Model이 그 예이다.
이러한 composition은 links container의 사용으로 도입될
수 있다. Thing Model이 하나
이상의
(sub-)Thing Models로 구성된다는 정보를
제공하려면, links entries는 (sub-)
Thing
Models를 대상으로 하는 "rel": "tm:submodel"을
사용해야 MUST 한다.
선택적으로 composed
(sub-) Thing
Model에 개별 이름을 연결하기 위해
instanceName을 제공할 수 MAY
있다. 이는 여러 유사한
Thing
Model definitions가 composed되고 구별되어야 할 때 유용하다.
composed Thing Model definitions로부터
Thing Descriptions를
생성하기 위해 서로 다른 strategies를 따를 수 있다. 기본 권장 사항은
각 parent 및 sub/child Thing Model에서 해당
Thing Descriptions를
생성하는 것이다(10.4
Thing
Description Instances의 Derivation도 참조). composition relation은
Thing Descriptions의 links
container 안에 있는 collection 및 item
relation types로 반영될 수 있다. Smart Ventilation을 기반으로 한
예는 다음과 같다:
top level/parent Thing Model의 interaction definitions와 모든 sub/child Thing Models의 모든 interaction definitions를 포함하는 단일 TD도 생성될 수 있다. 그때 generation process는 가능한 name collisions를 피해야 MUST 한다. 다음 예는 Smart Ventilator Thing Model에서 생성될 수 있는 potential (self-contained) Thing Description을 보여 준다.
{
"@context": "https://www.w3.org/ns/wot-next/td",
"title": "Smart Ventilator",
"securityDefinitions": {
"basic_sc": {
"scheme": "basic",
"in": "header"
}
},
"security": "basic_sc",
"links": [
{
"rel": "type",
"href": "./SmartVentilator.tm.jsonld",
"type": "application/tm+json"
}
],
"properties": {
"status": {
"type": "string",
"enum": [
"on_value",
"off_value",
"error_value"
],
"forms": [
{
"href": "http://127.0.13.232:4563/status"
}
]
},
"switch": {
"type": "boolean",
"description": "True=On; False=Off",
"forms": [
{
"href": "http://127.0.13.212:4563/switch"
}
]
},
"adjustRpm": {
"type": "number",
"minimum": 200,
"maximum": 1200,
"forms": [
{
"href": "http://127.0.13.212:4563/adjustRpm"
}
]
},
"R": {
"type": "number",
"description": "Red color",
"forms": [
{
"href": "http://127.0.13.211:4563/R"
}
]
},
"G": {
"type": "number",
"description": "Green color",
"forms": [
{
"href": "http://127.0.13.211:4563/G"
}
]
},
"B": {
"type": "number",
"description": "Blue color",
"forms": [
{
"href": "http://127.0.13.211:4563/B"
}
]
}
},
"actions": {
"fadeIn": {
"title": "fadeIn",
"input": {
"type": "number",
"description": "fadeIn in ms"
},
"forms": [
{
"href": "http://127.0.13.211:4563/fadeIn"
}
]
},
"fadeOut": {
"title": "fadeOut",
"input": {
"type": "number",
"description": "fadeOut in ms"
},
"forms": [
{
"href": "http://127.0.13.211:4563/fadeOut"
}
]
}
}
}
일부 경우에는 어떤 interaction affordances가 mandatory인지 강제하지
않고, Thing Description
instance에서 반드시 구현될 필요가 없게 하는 것이 바람직하다.
interaction models가
Thing Description
instance에서 구현되는 것이 mandatory가 아니라면,
Thing
Model definitions는 JSON member name
tm:optional을 사용해야 MUST
한다.
tm:optional은 top
level의 JSON array여야 MUST 한다.
tm:optional의
값은 required interaction model definitions에 대한 JSON Pointer
[RFC6901]
references를 제공해야 MUST 한다.
tm:optional의
JSON Pointers는 전체 interaction affordance Map definition으로
resolve되어야 MUST 한다.
다음 sample은 Event interaction
overheating에 대한 tm:optional의 사용을
보여 준다.
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Lamp Thing Model",
"description": "Lamp Thing Model Description",
"tm:optional": [
"/events/overheating"
],
"properties": {
"status": {
"description": "current status of the lamp (on|off)",
"type": "string",
"readOnly": true
}
},
"actions": {
"toggle": {
"description": "Turn the lamp on or off"
}
},
"events": {
"overheating": {
"description": "Lamp reaches a critical temperature (overheating)",
"data": {"type": "string"}
}
}
}
Event
overheating은 mandatory가 아니므로
Thing Description
instance에서 사용할 수 없을 수도 있다.
Thing Model definition의
optional definition은 tm:ref 사용을 통해 다른
Thing
Model에 의해 확장되는 경우 overwritten될 수 있다는 점에
유의하라:
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"title": "Lamp Thing Model (All Mandatory)",
"description": "Lamp Thing Model description expects all interaction affordances (status, toggle, and overheating)",
"links": [
{
"rel": "tm:extends",
"href": "./lampThingModel.tm.jsonld",
"type": "application/tm+json"
}
],
"events": {
"overheating": {
"tm:ref": "./lampThingModel.tm.jsonld#/events/overheating"
}
}
}
Thing
Model은 TD instance에서 어떤 terms가 사용되어야 하는지 지정할 수
있지만, 그 값은 구체적이지 않고 TD instantiation 중에 처음 알려진다.
TD instance terms는
미리 알려져 있지만 그 값은 알려져 있지 않은 경우, placeholder
labeling을 Thing Model에서 사용할 수 MAY
있다.
Thing Model에서 TD
instance가 생성될 때 placeholder labeling은 concrete value(예: JSON
number, JSON string, JSON object 등)로 대체되어야
MUST 한다.
placeholder의 string-based pattern은
regular expression {{2}[
-~]+}{2}에 기반한 valid pattern(예:
{{PLACEHOLDER_IDENTIFIER}})을
따라야 MUST 한다.
{{와 }} 사이의 characters는 placeholder의
identifier name으로 사용된다. identifier name은 substitution process에서
placeholder를 식별하는 데 사용될 수 있다.
placeholder는 JSON
name-value pair의 value 안에 적용되어야
MUST 한다.
JSON name-value pair의 non
string-based value가 placeholder를 가지는 경우, 그 value는
(temporarily) string으로 typed되어야 MUST
한다. placeholder를 대체한 후, 예를 들어 Thing Description
instance를 만들 때, original type은 해당 replaced value와 함께 적용된다.
다음 Thing Model 예는 여러 placeholders를 정의한다. placeholder map은 replacement를 적용하고 의도된 value type으로 transform하는 데 사용된다.
Thing Models는 Sections 5. TD Information Model 및 6. TD Representation Format에 정의된 restrictions를 기반으로 Thing Description을 생성하기 위한 templates로 사용될 수 있다. 이 process 중에는 valid한 Thing Description instances를 만들기 위해 communication 및 security metadata와 같은 누락된 data가 보완되어야 한다. Thing Model은 Section 5. TD Information Model 및 6. TD Representation Format에 설명된 requirements를 충족할 수 없는 Thing Description으로 이어지는 inconsistencies가 없도록 정의되어야 MUST 한다. Thing Model에서 Thing Description instance를 derive하는 TM-to-TD generator는 다음 단계에 따라 이를 Partial TD로 transform한다:
"rel":"tm:extends"가 있는 links element entry는
현재 Partial TD에서 제거되어야
MUST 한다.@type의 tm:ThingModel 값은
Partial
TD instance에서 제거되어야 MUST
한다.tm:optional에 나열되지 않은 것)는
Partial TD
instance로 가져와야 MUST 한다.tm:optional에 나열된 것)는
Partial TD
instance로 가져올 수 MAY 있다.마지막으로, TM-to-TD generator는 resulting Partial TD를 가져와 이 마지막 단계로 Thing Description으로 transform한다
securityDefinitions and
security 및/또는 6.3.9 forms를 기반으로
Thing Description
instance 안에 완료되어야 MUST 한다.Thing
Model의 id 값은 TD generation process를 위해
"id":
"urn:example:{{RANDOM_ID_PATTERN}}"와
같은 placeholder를 제공하는 것이 권장된다. id pattern에
metadata를 포함하지 않도록 하라.
Thing Description
instances는 Thing Model을 따르는 경우 어떤 type의
Thing Model에서 derived되었는지에 관한
information을 담을 수 있다. 이 context에서 linking concept은 다음 예에
표시된 것처럼 "rel": "type"과 함께 사용될 수 있다
(Section 5.3.4.1
Link도 참조):
TD는 한 번에 하나의 TM의 instance일 수만 있음에 유의하라.
즉 Thing Descriptions의 경우: links
array는 "rel": "type"이 있는 entry를 최대 한 번만
사용해야 MUST 한다. Thing Description에서
다른 Things와의 모든 relationships를 반영하고 싶다면, TMs의 composition
mechanism을 고려할 수 있다(Section 10.3.3 Composition 참조).
다음 Thing Model은
예
63에 표시된 model을 확장하고
dim property의 maximum 값을 overwrite한다
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "tm:ThingModel",
"links" : [{
"rel": "tm:extends",
"href": "http://example.com/SmartControlLampTM",
"type": "application/tm+json"
}],
"properties" : {
"dim" : {
"maximum": 200
}
}
}
이 Thing Model에서 derived되는 예상 Thing Description은 다음과 같다(HTTP Binding 및 basic security가 적용됨):
{
"@context": ["https://www.w3.org/ns/wot-next/td"],
"@type": "Thing",
"title": "Smart Lamp Control",
"securityDefinitions": {
"basic_sc": {"scheme": "basic", "in": "header"}
},
"security": "basic_sc",
"links" : [{
"rel": "type",
"href": "url/to/SmartLampControlModifiedDimTM",
"type": "application/tm+json"
}
],
"properties" : {
"onOff": {
"type": "boolean",
"forms": [{"href": "https://smartlamp.example.com/onoff"}]
},
"dim" : {
"type": "integer",
"minimum": 0,
"maximum": 200,
"forms": [{"href": "https://smartlamp.example.com/dim"}]
}
}
}
일반적으로 WoT system을 보호하기 위해 취해지는 security measures는 해당 system이 직면할 수 있는 threats와 attackers, 그리고 보호해야 할 assets의 가치에 따라 달라진다. 다양한 상황에 맞게 조정할 수 있는 threat model을 포함하여 Web of Things에 대한 security(및 privacy) considerations의 자세한 논의는 informative document [WOT-SECURITY-GUIDELINES]에 제시되어 있다. 많은 WoT Things는 web services와 유사하며 동일한 technologies를 사용한다. 아래의 특정 security considerations에 더해, web services를 위한 OWASP Top 10 [OWASP-Top-10]과 같은 guide에서 논의되는 security risks 및 mitigations도 평가해야 하며, 적용 가능한 경우 처리해야 한다. 이 섹션에서는 WoT Thing Description과 직접 관련된 security risks 및 possible mitigations만 논의한다.
WoT Thing Description은 secure 및 insecure network interfaces를 모두 설명할 수 있다. Thing Description이 기존 network interface에 retro-fitted되는 경우, network interface의 security status에는 변화가 없을 것으로 예상된다.
WoT Thing Description의 사용은 다음 섹션에 주어진 security risks를 도입한다. 각 risk 뒤에는 가능한 mitigations를 제안한다.
TDs를 가로채고 변조하는 것은 man-in-the-middle attacks를 시작하는 데 사용될 수 있다. 예를 들어 TDs의 URLs를 rewriting하여 accesses를 data를 capture하거나 manipulate할 수 있는 malicious intermediary로 redirect할 수 있다.
context definition files를 가로채고 변조하는 것은 vocabulary의 interpretation을 수정함으로써 attacks를 용이하게 하는 데 사용될 수 있다. HTTP와 같은 non-secure connections를 통해 Web에서 load되는 Context extensions(7. TD Context Extensions 참조)는 attacker에 의해 변경될 위험이 있으며, TD Information Model을 security를 compromise할 수 있는 방식으로 수정할 수 있다.
12.1 Context Fetching에서 권장된 것처럼, constrained implementations에서는 context definition files를 미리 설치하고 secure software update process를 사용해 관리해야 하며, context URLs는 known contexts를 식별하는 데만 사용하고 이를 가져오는 데 사용하지 않아야 한다. 따라서 이 consideration은 context definition files를 dynamically fetching하는 것이 그 외에는 피할 수 없는 경우에만 적용된다. 예를 들어 general semantic processing을 지원하는 directory service의 경우가 이에 해당한다.
일부 scenarios에서는 특정 users에 의한 Things 집합에 대한 access의 scope와 duration을 제한하는 것이 바람직할 수 있다. 예를 들어 A가 B의 집을 방문하는 경우, B는 A가 사용할 수 있도록 garage door opener와 car charger에 대해 temporary 및 limited access를 A에게 제공하고자 할 수 있다. 그러나 scope는 A가 이러한 Things의 특정 administrative functions에 access할 수 없도록 제한될 수 있다(예: garage door가 열린 상태로 유지될 수 있는 시간을 변경하거나 charging rate를 변경하는 것). 또한 access는 A가 떠났을 것으로 예상되는 시점 이후, 예를 들어 1주 후에는 expire되어야 한다.
예를 들어 WoT Discovery가 반환한 TDs처럼 TDs 집합에 access할 수 있는 attacker는 이 information을 사용하여 vulnerable devices를 식별하고 이에 대한 attacks를 계획할 수 있다.
auto security scheme을 사용할 수
MAY 있다.TDs에 주어진 많은 strings, 특히 title/titles 및
description/descriptions에 담긴 values는
human-readable이 되도록 의도된다. application은 그러한 strings를 가져와
user interface를 생성하는 데 사용할 수 있다. 예를 들어, 사용 가능한
Things 집합을 titles 및 descriptions와 함께 나열하는 web dashboard가
있다. 이러한 interface가 string substitution을 사용하여 naive하게
생성되는 경우, 예를 들어 final HTML을 만들기 위해 이러한 strings의
values를 HTML template의 표시된 위치에 삽입하는 경우, 원래 string 안의
HTML markup은 dashboard를 표시하는 browser의 context에서 해석된다.
attacker는 다양한 방식으로 scripts를 HTML에 embed하고, user interaction
시 또는 자동으로(예: page load 시 또는 의도적으로 발생시킬 수 있는
error 시) 이러한 scripts가 executed되도록 할 수 있다. string은 TD
producer에 의해 생성되고
dashboard는 다른 origin에 의해 생성되므로, 이는 cross-site-scripting
(XSS) attack의 한 형태이다.
RFC 8259,
section 12를 참조하라: JSON은 eval()을 사용하여
JavaScript로 parsed되어서는 안 된다. WoT Thing Description은 executable
content를 담기 위한 것이 아니라, Thing metadata를 위한 pure data exchange
format으로 의도된다. 그러나 (invalid) TD는 executed될 때 system의 security를
compromise하는 side effects를 가질 수 있는 JavaScript code를 포함할 수
있다.
eval()
function과 같은 code execution mechanism을 통과해서는 안
MUST NOT 된다.[WOT-DISCOVERY]에서
논의되는 추가 code injection risks가 있다. TDs의 다른 strings, 예를 들어
title 및 description에 주어진 values는
SQL, HTML 또는 기타 executable contexts의 templates에서 사용되기 전에
sanitized되어야 한다. 그러나 이 risk는 JSON을 parsing할 때의
Javascript injection risk에 특별히 관한 것이다.
JSON-LD processing은 일반적으로 short terms를 더 긴 IRIs [RFC3987]로 대체하는 것을 포함한다. 이러한 이유로 WoT Thing Descriptions는 JSON-LD 1.1 processor를 사용하여 processed될 때 상당히 expand될 수 있으며, 최악의 경우 resulting data가 recipient의 모든 resources를 consume하거나 exploitable buffer overflow를 유발할 수 있다.
Privacy risks는 identifiable people과 Things의 association, 그리고 그러한 association으로부터 이용 가능한 direct information 및 inferred information에 따라 달라진다. 다양한 상황에 맞게 조정할 수 있는 threat model을 포함하여 Web of Things에 대한 privacy(및 security) considerations의 자세한 논의는 informative document [WOT-SECURITY-GUIDELINES]에 제시되어 있다. 이 섹션에서는 WoT Thing Description과 직접 관련된 privacy risks 및 possible mitigations만 논의한다.
WoT Thing Description의 사용은 다음 섹션에 주어진 privacy risks를 도입한다. 각 risk 뒤에는 가능한 mitigations를 제안한다.
WoT Thing Descriptions는 JSON-LD 1.1 processor [json-ld11]로 평가될 수 있으며, 이는 일반적으로 remote contexts(즉, TD context extensions, 7. TD Context Extensions 참조)에 대한 links를 자동으로 따른다. 그 결과 각 파일에 대해 Consumer의 명시적 request 없이 files가 transfer된다. remote contexts가 third parties에 의해 served되는 경우, 그것들은 usage patterns 또는 유사한 information을 수집할 수 있으며, 이는 private information 또는 private information을 infer하는 데 사용될 수 있는 information의 disclosure로 이어질 수 있다. WoT의 경우 attacker는 그러한 fetches가 생성하는 network traffic도 observe할 수 있고, destination IP address와 같은 fetch의 metadata를 사용하여 device에 대한 information을 infer할 수 있다. 특히 domain-specific vocabularies가 사용되는 경우 그렇다. 이는 connection이 encrypted되어 있더라도 risk이며, DNS privacy leaks와 관련되어 있다. 관련 security risk이며 다음 mitigations로도 피할 수 있는 11.2 Context Interception and Tampering도 참조하라.
identifier(id)를 포함하는 Thing Description은 identifiable
person과 associated된 Thing을 설명할 수 있다. 이러한 identifiers는 tracking을
포함한 다양한 risks를 초래한다. 그러나 identifier도 immutable인 경우,
device가 다른 사람에게 sold 또는 given될 수 있고 알려진 ID가 그 사람을
track하는 데 사용될 수 있으므로 tracking risk는 증폭된다.
TD에서 사용되는 모든
identifiers는 mutable인 것이 SHOULD 좋으며,
특히 필요할 때 Thing의
id를 update하는 mechanism이 있는 것이
SHOULD 좋다.
구체적으로, Thing의
id는 hardware에 fixed되어서는 안 된다. 그러나 이는
identifiers가 fixed URIs라는 Linked Data ideal과 충돌한다. 그러나
policy의 문제로, configuration 또는 reinitialization에서 major changes가
있을 때 deployments가 identifiers를 update하는 것이 강력히
권장된다. configuration의 major changes의 예로는 Thing을 새 local
area network로 이동시키는 것, 새 domain name을 assigning하는 것,
또는 Thing을 한 hub에서 unregister하고 새 hub에 register하는 것이
있다. 일반적으로 ownership의 잠재적 변화를 나타내는 configuration
changes는 새 identifier가 생성되는 결과로 이어져야 한다. device의
operational phase 동안 더 frequent한 changes가 필요한 경우, change가
이루어질 때 authorized users에게만 identifier 변경을 notify하는
mechanism을 마련할 수 있다. 그러나 medical devices와 같은 일부
device classes는 일부 jurisdictions에서 법으로 immutable IDs를 요구할 수
있음에 유의하라. 이상적으로, required immutable identifiers는 property와
같은 affordances를 통해서만 제공되어야 하며, 그 value는 appropriate
authentication and authorization 후에만 획득될 수 있고 TD identifier와
별도로 managed되어야 한다. immutable identifier를 TD identifier로
사용해야 하는 경우, 그러한 immutable identifiers를 포함하는 Thing
Descriptions와 같은 files에 대한 secure access에 extra attention을
기울여야 한다.
위에서 언급했듯이 TD의 id member는 privacy risk를 초래할
수 있다. 그러나 tracking risk를 완화하기 위해 설명된 대로
id가 updated되더라도, fingerprinting을 통해 TD를 특정 physical
device와 associate하고, 거기에서 identifiable person과 associate하는 것이
여전히 가능할 수 있다.
특정 device instance를 fingerprinting을 통해 식별할 수 없더라도, interactions 집합과 같은 TD의 information으로부터 device의 type을 infer하고, 이 type을 사용하여 medical condition과 같은 identifiable person에 대한 private information을 infer하는 것이 가능할 수 있다.
id를 생략할 수 있다. Consumer가 자신의 use case에 특정
interactions를 필요로 하지 않는 경우, 그것들을 생략할 수 있다.
Consumer가 특정 interactions를 사용할 권한이 없다면, 마찬가지로
생략할 수 있다.
TD의 id field의 value는 full TD에 access할 수 없는 entities에게도
available해질 수 있다. id의 value가 device의 type 또는 owner와
같은 embedded metadata를 포함하는 경우, 이는 personal information을 infer하는
데 사용될 수 있다.
id
value는 Thing을 설명하는 metadata 또는 TD 자체의 metadata를
포함하지 않는 것이 SHOULD NOT 좋다.
TDs를 관리하기 위해
생성된 temporary ID, 예를 들어 database 또는 directory service의 ID는
Thing을 설명하는 metadata 또는 TD 자체의 metadata를 포함하지 않는 것이
SHOULD NOT 좋다.
12.5
Globally
Unique Identifiers에서 권장된 random UUIDs를 사용하는 것도 이
risk를 완화한다.
Globally unique identifiers는 이를 create하고 distribute하기 위해 centralized authority가 필요하다면 privacy risk를 초래한다. 그 경우 third party가 identifiers에 대한 knowledge를 가지기 때문이다.
id field는 의도적으로 globally unique일 필요가
없다. central registry를 요구하지 않고 distributed fashion으로 suitable
IDs를 generate할 수 있는 여러 cryptographic mechanisms(예: random UUIDs)이
available하다. 이러한 mechanisms는 보통 duplicate identifiers를 generate할
probability가 매우 낮으며, 이는 system design에서 고려되어야 한다. 예를
들어 duplicates를 detecting하고 necessary한 경우 IDs를 regenerating하는
방식이다. IDs의 scope도 global일 필요는 없다. home 또는 factory 내와
같은 특정 context에서만 Things를 distinguish하는 identifiers를 사용하는
것은 acceptable하다. TD
identifiers는 uniqueness의 높은 probability를 제공하는 UUIDs와 같은
distributed mechanism을 사용하여 generated되는 것이
SHOULD 좋다. TD
identifiers는 centralized authority를 사용하여 generated되지 않는 것이
SHOULD NOT 좋다.많은 locales에서 users의 privacy를 보호하기 위해 personally identifiable information, 즉 특정 person과 associated될 수 있는 information의 handling에 관한 legal requirements가 있다. 그러한 information은 물론 IoT devices에 의해 직접 generated될 수 있다. 그러나 IoT devices의 existence와 metadata (Thing Description에 저장되는 종류의 data)도 personally identifiable information을 포함하거나 이를 infer하는 데 사용될 수 있다. 이 information은 어떤 person이 특정 type의 device를 소유한다는 사실처럼 단순할 수 있으며, 이는 그 person에 대한 추가 inferences로 이어질 수 있다.
conforming 및 non-conforming content를 모두 processing하기 위한 rules는 이 specification에 정의되어 있다.
현재 IANA registration을 확인하라. 향후 .td.json 및 .td.jsonld도 허용될 수 있다.
conforming 및 non-conforming content를 모두 processing하기 위한 rules는 이 specification에 정의되어 있다.
IANA는 CoAP Content-Formats subregistry 안에서 media types에 대한 compact CoAP Content-Format IDs를 assign한다. 이 subregistry는 Constrained RESTful Environments (CoRE) Parameters registry [RFC7252] 안에 있다. WoT Thing Description의 Content-Format ID는 432이고, WoT Thing Model의 경우 - (tbd)이다.
이 섹션은 비규범적이다.
다음 TD 예는 HTTP, CoAP 및 MQTT Protocol
Bindings를 사용한다. 이러한 TDs에는
http://www.example.org/coap-binding# 및
http://www.example.org/mqtt-binding# namespaces를 통해 각각
접근할 수 있는 [HTTP-in-RDF10]와 유사한
CoAP-in-RDF 및 MQTT-in-RDF vocabularies가 있다고 가정하는
Context Extensions가 있다.
"https://www.w3.org/2022/wot/td/v1.1"의 TD context는 이미
[HTTP-in-RDF10]를
포함하므로, HTTP context extensions는 직접 사용할 수 있음에 유의하라.
각 Binding Specification은
최신 vocabulary terms 및 examples를 포함한다는 점에 유의하라.
아래에서 보는 context extensions는 TD Consumer에 대해 다음 지시사항을 가진다:
"htv:methodName" member는 어떤 HTTP method가
적용되어야 하는지를 Consumer에게 지시한다(예:
resource를 retrieve하기 위한 "GET" 또는
resource로 data를 보내기 위한 "POST").
"cov:method" member는 어떤 CoAP method가 적용되어야
하는지를 Consumer에게 지시한다(예: CoAP Method Code 0.01에 대한
"GET", CoAP Method Code 0.02에 대한 "POST",
또는 CoAP Method Code 0.07에 대한 iPATCH).
"mqv:controlPacket" member는 어떤 MQTT command가
적용되어야 하는지를 Consumer에게 지시한다(예:
topic을 subscribe하기 위한 "subscribe" 및
unsubscribe하기 위한 "unsubscribe").
먼저 single protocol을 가진 TDs를 보여 준다. 그런 다음, 각 interaction affordance가 하나의 protocol을 가진 하나의 form을 가지는 multiple protocols TDs를 소개한다.
Thing의 feature list:
Thing의 feature list:
192.168.1.187:1883 뒤에서 실행되는 MQTT broker를 통해
illuminance data(number는 text format으로 serialized됨)를
topic /illuminance에 자주 publishes한다.
MQTT Binding도 참조하라.
Thing의 feature list:
temperature를 제공한다. 여기서
Thing은
Consumer가 제공한
callback URI로 POST requests를 보낸다. 이를 설명하기 위해,
subscription member는
subscribeevent form을 통해 제출되어야 하는 write-only
parameter callbackURL을 정의한다.
read-only parameter subscriptionID는 subscription에 의해
반환된다. 그러면 TemperatureSensor는
data로 정의된 payload와 함께 이 callback URI로
주기적으로 POST한다. unsubscribe하려면,
Consumer는
cancellation에 설명된 것처럼 subscriptionID와 함께
unsubscribeevent form을 제출해야 한다. 또는
delete method로 호출해야 하는 URIs에 subscriptionID
string을 포함하도록 Consumer에게 알리는
uriVariables approach(tab 'With uriVariables' 참조)를
사용할 수 있다. 이러한 setup에서는 cancellation container를
생략할 수 있다. 일반적으로 이 예는 적절한
semantic
annotations를 포함하기 위해
TD
Context Extension을 사용함으로써 더 자동화할 수 있다.
Thing에 대한 periodic POST request 대신,
Consumer는 다음 POST request가
Thing에 의해 언제 제공되어야 하는지에 대한 information이 있는 response
data를 제공할 수 있다. 이는 dataResponse field를 사용하여
설명된다.
Thing의 feature list:
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"cov": "http://www.example.org/coap-binding#",
"mqv": "http://www.example.org/mqtt-binding#",
"htv": "http://www.w3.org/2011/http#"
}
],
"title": "LampThing",
"id": "urn:dev:ops:32473-WoTLamp-1234",
"securityDefinitions": {
"nosec_sc": {
"scheme": "nosec"
}
},
"security": ["nosec_sc"],
"properties": {
"switchState": {
"type": "boolean",
"readOnly": true,
"observable": false,
"forms": [
{
"href": "http://example.com/light/switchstate",
"op": "readproperty",
"contentType": "application/json",
"htv:methodName":"GET"
}
]
},
"brightness": {
"type": "number",
"readOnly": true,
"observable": false,
"forms": [
{
"href": "coap://example.com/light/brightness",
"op": "readproperty",
"contentType": "application/json",
"cov:method": "GET"
}
]
}
},
"actions": {
"switchLight": {
"input": {
"type": "boolean"
},
"forms": [
{
"href": "http://example.com/switch/state",
"op": "invokeaction",
"contentType": "application/json",
"htv:methodName":"POST"
}
]
},
"setBrightness": {
"input": {
"type": "number",
"maximum":255
},
"forms": [
{
"href": "coap://example.com/light/brightness",
"op": "invokeaction",
"contentType": "application/json",
"cov:method": "POST"
}
]
}
},
"events":{
"concentration": {
"title": "Gas Concentration Event Stream",
"data":{
"type": "integer",
"minimum": -1,
"maximum": 65535
},
"forms": [
{
"href": "mqtt://broker.com",
"contentType": "application/json",
"op": "subscribeevent",
"mqv:filter": "application/deviceid/sensor/concentration",
"mqv:controlPacket": "subscribe"
}
]
}
}
}
Thing의 feature list:
brightness property는 HTTP
및 CoAP를 통해 read될 수 있고, MQTT를 통해 observed될 수 있다.
concentration event는 CoAP 및 MQTT를 통해 subscribe될 수
있다. 이 경우 Consumer는 자신의 internal implementation에 기반하여,
예를 들어 CoAP protocol stack을 가지고 있는지 여부에 따라 자신이
support할 수 있는 form을 선택할 것이다.
HTTP Binding,
CoAP Binding, 그리고
MQTT Binding도 참조하라.
{
"@context": [
"https://www.w3.org/ns/wot-next/td",
{
"cov": "http://www.example.org/coap-binding#",
"mqv": "http://www.example.org/mqtt-binding#",
"htv": "http://www.w3.org/2011/http#"
}
],
"title": "Lamp",
"id": "urn:dev:ops:32473-WoTLamp-5678",
"securityDefinitions": {
"nosec_sc": {
"scheme": "nosec"
}
},
"security": ["nosec_sc"],
"properties": {
"switchState": {
"type": "boolean",
"readOnly": true,
"observable": false,
"forms": [
{
"href": "http://example.com/light/switchstate",
"op": "readproperty",
"contentType": "application/json",
"htv:methodName":"GET"
},
{
"href": "coap://example.com/light/switchstate",
"op": "readproperty",
"contentType": "application/json",
"cov:method": "GET"
}
]
},
"brightness": {
"type": "number",
"readOnly": true,
"observable": true,
"forms": [
{
"href": "http://example.com/light/switchstate",
"op": "readproperty",
"contentType": "application/json",
"htv:methodName":"GET"
},
{
"href": "coap://example.com/light/switchstate",
"op": "readproperty",
"contentType": "application/json",
"cov:method": "GET"
},
{
"href": "mqtt://broker.com",
"mqv:filter": "application/deviceid/sensor/brightness",
"op": "observeproperty",
"mqv:controlPacket": "subscribe"
}
]
}
},
"actions": {
"switchLight": {
"input": {
"type": "boolean"
},
"forms": [
{
"href": "http://example.com/switch/state",
"op": "invokeaction",
"contentType": "application/json",
"htv:methodName":"POST"
}
]
},
"setBrightness": {
"input": {
"type": "number",
"maximum":255
},
"forms": [
{
"href": "coap://example.com/light/brightness",
"op": "invokeaction",
"contentType": "application/json",
"cov:method": "POST"
}
]
}
},
"events":{
"concentration": {
"title": "Gas Concentration Event Stream",
"data":{
"type": "integer",
"minimum": -1,
"maximum": 65535
},
"forms": [
{
"href": "mqtt://broker.com",
"contentType": "application/json",
"op": "subscribeevent",
"mqv:filter": "application/deviceid/sensor/concentration",
"mqv:controlPacket": "subscribe"
},
{
"cov:method": "GET",
"href": "coap://example.com/sensor/gasconcentration",
"contentType": "application/json",
"op": "subscribeevent",
"subprotocol": "cov:observe"
}
]
}
}
}
이 섹션은 비규범적이다.
JSON 기반 형식으로 직렬화된 Thing Description instances를 구문적으로 검증하기 위한 JSON Schema [JSON-SCHEMA] document는 https://www.w3.org/ns/wot-next/td-schema에서 사용할 수 있다. 이 JSON Schema는 Default Values가 있는 terms가 존재할 것을 요구하지 않는다. 따라서 Default Values가 있는 terms는 optional이다. (5.4 Default Value Definitions도 참조)
이 문서에 의해 정의되는 Thing Description은 JSON-LD
[json-ld11]에서 알려진
@context mechanism을 사용하여 external vocabularies를
추가할 수 있게 하며, 그러한 external vocabularies의 terms는
5. TD Information
Model에 정의된 terms에
더해 사용될 수 있다. 이러한 이유로 아래 JSON schema는 그 점에서
의도적으로 non-strict하다. external vocabularies가 사용되지 않는 경우
더 엄격한 validation을 수행하기 위해 서로 다른 scopes/levels에서
additionalProperties schema property의 값
true를 false로 바꿀 수 있다.
이 섹션은 비규범적이다.
request와 response의 variation에 관한 여러 case는
5.3.4.2.2
Response-related
Terms Usage에서 설명된다. 아래 tables는 이러한 cases를
간결한 방식으로 요약한다. tables는 single contentType과 같은
더 단순한 cases에서 시작하여, multiple contentTypes와 같은
더 복잡한 cases로 나아간다. 모든 tables에서 messages는 Thing의 관점에서
본다. 여기서 input은 Consumer에서 Thing으로 보내는 messages(예: request)를
의미하고 output은 Thing에서 Consumer로 보내는 messages(예: response)를
의미한다.
cases에는 번호가 매겨져 있으며, 이는 tables 뒤의 examples와 연결하는 데 사용할 수 있다.
| Case | 필요한 Terms | 설명 | Consumer 동작 | Thing 동작 |
|---|---|---|---|---|
| Case 1A: Input 있음, output 없음 | form 안의 contentType |
contentType은 input만 가리킨다 |
|
|
| Case 1B: Input 없음, output 있음. | form 안의 contentType. |
contentType은 output만 가리킨다. |
|
|
Case 1C: Input과 output이 있으며, messages에 대해 같은
contentType.
|
form 안의 contentType. |
contentType은 input과 output 모두를 가리킨다. |
|
|
다음 table은 operation input이 서로 다른 contentTypes를
accept할 수 있거나 output이 서로 다른 contentTypes를
return할 수 있는 cases와 관련된 추가 variations를 고려한다. Interaction
Affordance가 multiple forms를 가지는 경우가 있을 수 있다. multiple forms가
있는 그러한 cases는 위와 아래 table의 cases 조합으로 처리되어야 한다.
| Case | 필요한 Terms | 설명 | Consumer 동작 | Thing 동작 |
|---|---|---|---|---|
Case 2A: Single input과 single output이 있으며,
messages에 대해 서로 다른 contentType. |
form 안의 contentType 및 response.
response는 다른 값을 가진
contentType을 가진다.
|
form level의 contentType은 input을 가리키고
response(response-level)의 contentType은
output을 가리킨다
|
|
|
Case 2B: Input과 multiple possible outputs가 있으며,
messages에 대해 같은 contentType |
form 안의 contentType 및
additionalResponses.
additionalResponses array items 안의
schema가 필요할 수 있다.
|
form level의 contentType은 input과 normal output을
가리킨다. default value rule이 적용되므로
additionalResponses에는 contentType이
필요하지 않다. 실제로 single contentType이 있으므로
이는 같은 case(Case 1C)이다. 그러나 output에서 서로 다른
Data Schemas가 전달될 수 있으므로, form 안의
additionalResponses 및 schema terms가
필요하다.
|
Case 1C 참조 | Case 1C 참조 |
Case 2C: Input과 multiple possible outputs가 있으며,
output messages에 대해 서로 다른 contentType |
form 안의 contentType,
additionalResponses 및 가능하다면
response.
additionalResponses는 서로 다른
contentTypes를 가진 output messages를 위해
contentType이 필요하다.
|
이는 TD에서 서로 다른 방식으로 설명될 수 있는 가장 복잡한
case이다. form level의 contentType은 input과,
output이 같은 contentType인 경우(case 1C처럼)
expected output을 가리킨다. response 안의
contentType은 output이 서로 다른
contentType인 경우(case 2A처럼) expected output을
가리킨다. additionalResponses 안의
contentType은 다른 possible outputs를 가리킨다.
|
|
|
이 섹션은 비규범적이다.
현재 specification은 TD Information Model을 서로 다른
Vocabularies, 즉
Vocabulary
Terms의 집합들에 대한 constraints의 집합으로 도입한다. 이 섹션은
TD document의 mandatory @context를 사용하여 이러한
constraints의 machine-readable definition을 client applications에 통합할 수 있는
방법을 간단히 설명한다.
TD document에서 TD Information Model에 접근하는 것은 두 단계로 이루어진다. 첫째, clients는 JSON strings에서 IRIs로의 mapping을 retrieve해야 한다. 이 mapping은 뒤에서 설명하는 것처럼 JSON-LD context로 정의된다. 둘째, clients는 이러한 IRIs를 dereferencing하여 그 IRIs에 정의된 constraints에 접근할 수 있다. Constraints는 RDF format의 logical axioms로 정의되며, client programs가 바로 interpret할 수 있다.
Vocabulary
Terms 중 5.
TD Information
Model에서 referenced되는 모든 terms는 TD document에서 (compact) JSON
strings로 serialized된다. 그러나 이러한 각 term은 첫 번째 Linked Data
principle [LINKED-DATA]에 따라
full IRI로 명확히 identified된다. JSON keys에서 IRIs로의 mappings가
TD의 @context value가 가리키는 것이다. 예를 들어,
다음 위치의 file은
https://www.w3.org/ns/wot-next/td
다음 mappings를 포함한다(그 밖에도 있음):
properties |
→ |
https://www.w3.org/2019/wot/td#hasPropertyAffordance
|
object |
→ |
https://www.w3.org/2019/wot/json-schema#ObjectSchema
|
basic |
→ |
https://www.w3.org/2019/wot/security#BasicSecurityScheme
|
href |
→ |
https://www.w3.org/2019/wot/hypermedia#hasTarget
|
| ... | ||
이 JSON file은 JSON-LD 1.1 syntax
[JSON-LD11]를 따른다.
수많은 JSON-LD libraries는 TD의 @context를 자동으로
process하고 그것이 포함하는 모든 JSON strings를 expand할 수 있다.
TD의 모든 Vocabulary Term이 IRI로 expanded되면, 두 번째 단계는 이 IRI를 dereferencing하여 해당 Vocabulary Term을 가리키는 TD Information Model의 fragments를 얻는 것이다. 예를 들어 IRI
https://www.w3.org/2019/wot/json-schema#ObjectSchema
를 dereferencing하면 term ObjectSchema가
Class이며, 더 정확히는
DataSchema의 sub-class라고 stating하는 RDF document가 나온다.
이러한 logical axioms는 다양한 complexity의 formalisms를 사용해 RDF로
represented된다. 여기서는 sub-class relations가 RDF Schema axioms
[RDF-SCHEMA]로 표현된다. 또한 이러한
axioms는 다양한 formats로 serialized될 수 있다. 여기서는 Turtle format
[TURTLE]으로 serialized된다:
<https://www.w3.org/2019/wot/json-schema#ObjectSchema>
a rdfs:Class .
<https://www.w3.org/2019/wot/json-schema#ObjectSchema>
rdfs:subClassOf <https://www.w3.org/2019/wot/json-schema#DataSchema> .
기본적으로 user agent가 content negotiation을 수행하지 않는 경우,
RDF document 대신 human-readable HTML documentation이 반환된다.
content를 negotiate하려면 clients는 request에 HTTP header
Accept: text/turtle를 포함해야 한다.
이 섹션은 비규범적이다.
8.1.2.2
Data Schemas의 extension으로서,
이 섹션은 서로 다른 payloads와 그에 대응하는
DataSchema의 examples를 모은다. 이들은 잘 알려진 IoT
Platforms 및 Standards에서 가져온 것이며, payload가 가질 수 있는 다양한
모습과 이를 Data Schema로 설명할 수 있는 방법을 보여 주는 것을 목표로
한다.
SenML [RFC8428]은 다음 construct를 사용할 수 있다:
|
예
82:
SenML Payload 예
|
예
83: SenML Payload 예를 위한
Data Schema
|
OCF[OCF]에 따른 Batch Collection은 다음과 같이 structured될 수 있다:
|
예
84: OCF
Batch 예
|
예 85: OCF Batch
Payload
예를 위한 Data Schema
|
그리고 LWM2M [LWM2M]의 IPSO Smart Object는 다음과 같을 수 있다:
|
예
86:
IPSO/LWM2M Payload 예
|
예 87: IPSO/LWM2M
Payload 예를 위한 Data Schema
|
contentType을 optional로
만들었다.편집자들은 contributions, guidance 및 expertise를 제공해 준 Cristiano Aguzzi, Thomas Jäckle, Jan Romann, Elodie Thiéblin, Michael Koster, Michael Lagally, Kazuyuki Ashimura, Daniel Peintner, Toru Kawaguchi, María Poveda, Dave Raggett, Kunihiko Toumura, Takeshi Yamada, Ben Francis, Manu Sporny, Klaus Hartke, Addison Phillips, Jose M. Cantera, Tomoaki Mizushima, Soumya Kanti Datta 및 Benjamin Klotz에게 특별히 감사하고자 한다.
또한 이 document의 improvements로 이어진 support, technical input 및 suggestions를 제공해 준 W3C staff와 W3C Web of Things Interest Group(WoT IG) 및 Working Group(WoT WG)의 현재 및 이전 active Participants 모두에게 깊이 감사한다.
마지막으로, WoT IG를 그 inception부터 2년 동안 이끌고 group이 Thing Description을 포함한 WoT building blocks의 concept을 마련하도록 guide한 Joerg Heuer에게 특별히 감사한다.
non-listed references와 관련된 temporary ReSpec fix: [RFC6068], [RFC3966], [html], [RFC6750], [RFC7519], [RFC7797], [RFC8392], [RFC7516], [LDML], [SEMVER], [RFC7617], [RFC7616]
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: