OCF技术原理及物联网程序开发指南
上QQ阅读APP看书,第一时间看更新

3.5 设备类型及资源接口

设备类型是设备的类。定义的每个设备类型将包括该设备类型实现的最小资源类型列表。设备可能会暴露超出最小列表的额外标准和供应商定义的资源类型。设备类型用于资源发现。像资源类型一样,设备类型可以使用在资源类型公共属性中或资源类型参数的链接中。设备类型可以由制造商、最终用户、设备的开发人员进行预定义或自定义,设备类型及其定义的详细信息可能用其他方式交互(如文档中)。

对于OCF规范的接口,它首先提供了资源内部的一个视图,然后根据资源的视图定义允许的请求和响应,是由接口提供的视图定义了对这个资源请求和响应的上下文。因此,对于一个资源的相同请求,针对不同的接口时会产生不同的响应。

资源的接口可以由OCF规范定义(即核心接口),也可以由OCF垂直域规范来定义(即垂直接口),还可以由制造商、终端用户或设备的开发人员来定义(即供应商定义的接口)。

资源的接口属性列出了该资源支持的所有接口。任何的资源至少有一个接口。默认接口应由OCF规范定义,并且从资源类型的定义中继承。在OCF规范定义中,与资源类型相关的默认接口,应该是在资源类型中定义的、可用枚举类型内首先被列出的支持接口。在一个OCF规范中指定的所有默认接口都应该是强制的。

除OCF规范定义的接口之外,所有的资源都应该支持基准接口(“oic.if.baseline”)。当请求选择使用一个接口时,在请求消息的资源URI中,该接口应该被指定为查询参数。如果没有指定查询参数,就会使用默认的接口。如果选择的接口不是资源所允许的接口,那么选择该接口就是错误的。

一个接口可以接收多个媒体类型,也可以用多个媒体类型来响应。被接收的媒体类型可以不同于响应的媒体类型。在传输协议中,媒体类型是使用合适的头参数来指定。需要注意的是该特征必须合理使用,并且允许在线上优化表示,每个接口都应该至少有一种媒体类型。

3.5.1 接口属性

一个资源所支持的接口应该使用接口公共属性(如表3-6所示)进行声明,格式为“if=<接口数组>”。一个接口属性值应该是一个分段的小写字符串,各段之间用“.”分隔开。当接口属性的第一段中使用“oic”时,该接口就被保留为OCF定义的接口。接口属性值也可以是对一个权威的引用,这样的引用可以用于找到一个接口的定义,一个资源类型应该支持一个或多个接口。

表3-6 资源接口属性定义

3.5.2 接口方法

本节主要介绍接口的定义、基准接口、链路列表接口、批处理接口、执行器接口、传感器接口、只读接口、读写接口。

1. 概述

在OCF规范中,定义的接口如表3-7所示。

表3-7 OCF规范中定义的接口

2. 基准接口

资源的所有属性表示,包括公共属性,对于基准接口是可见的。基准接口是为所有的资源类型定义的,即所有的资源都应该支持基准接口。

通过将“if=oic.if.baseline”添加到目标资源的URI的查询参数中,就选择了基准接口,例如GET/oic/res?if=oic.if.baseline。

1)检索的使用

基准接口可以用来检索资源的所有属性。当一个客户端检索一个资源的所有属性时,就会使用基准接口。客户端将“?if=oic.if.baseline”加入到一个检索请求中,服务器端接收到请求时,会将此时所有属性的表示加到响应中。如果服务器端不能返回所有资源的表示,就会回复一个错误信息;也就是说,服务器端不会返回部分资源表示。

一个使用了基准接口的检索请求示例响应如下所示。

    {
    "rt":["oic.r.temperature"],
    "if":["oic.if.a","oic.if.baseline"],
    "temperature":20,
    "units":"C",
    "range":[0,100]
    }

2)更新的使用

使用基准接口,并且在更新请求中有属性及其期望值的列表时,一个资源的所有属性都可以被修改。

3. 链路列表接口

链路列表接口提供了一个集合(资源)中链路列表的一个视图。通过该接口可见的表示只有链路,该链路在属性值中定义。因此,该接口用于与一个集合中的链路列表进行操作或交互。通过使用该接口,可以检索到链路列表,接口定义和语义如下。

(1)链路列表接口名称应该是“oic.if.ll”。

(2)如果请求中有定义的话(通常在请求头中),响应中的序列化应采用请求定义的预期格式。

(3)在链路列表接口检索请求的响应中,被引用资源的URI应该作为一个URI引用被返回。

(4)如果在一个资源中显示没有链路,则返回一个空列表。

(5)由该接口视图定义的表示只包括链路属性值。

(6)关于链路列表接口示例,即一个集合的请求表示,例如,检索在房间中链路的请求,链路可能引用灯、风扇和电插座等,如GET oic://<devID>/a/room/1?if=oic.if.ll。

4. 批处理接口

批处理接口通过使用一个(相同的)请求与资源集合进行交互。批处理接口支持集合链路中的资源方法,并且可以使用一个资源表示来检索或更新被链接的资源属性。

批处理接口选择了一个集合链接的视图,将请求发送到该视图中所有的链路,并包含可能修改的链路参数。批处理接口定义如下。

(1)批处理接口名称应该是“oic.if.b”。

(2)具有批处理接口的资源会有很多链路,这些链路会有资源的引用,这些引用可能是URI(对远程资源完全适用)或者是相对引用(用于本地资源)。

(3)如果一个资源的链接并没有指明使用哪个接口(使用“bp”链接参数),则该请求会被转发到被引用资源的默认接口。如果“bp”使用“q”关键字指明了一个查询,则该查询会被应用在URI的查询参数中(该URI是由引用形成的),以选择在目标资源中的接口。

(4)如果要针对资源链接中的每个对象修改原始请求以创建新的请求,则需要将原始请求的URI替换为链接中目标资源的URI。新请求中的有效荷载可以直接复制原始请求中的有效荷载。

(5)来自链接资源的所有响应都应集中到单个响应中,发送到服务器端。服务器端会根据时间窗口判断响应是否超时,如果时间窗口已经跟客户端进行了协商,则服务器端不会在时间窗口内超时;如果没有协商好的时间窗口,服务器端会根据情况选择合适的窗口。如果目标资源不能处理新的请求,就会返回空响应或错误响应。这些空的/错误的响应会包含在集中响应中,返回到原始客户端。

(6)集合响应是对象的集合,每个对象都是单独的响应。集合中的每个响应包含至少两项:完全限定的URI,表示为“href”:<URI>;在响应中声明的表示,使用关键字“rep”,即“rep”:{<在单个响应中的表示>}。

(7)通过向原始批处理接口请求处理的集合URI中添加一个过滤器,客户端可以限制请求转发的链接列表。

(8)在特定链路请求表示,可能与目标资源上接口暴露的表示不匹配。在这种情况下,使用PUT方法的更新操作通常会失败,使用POST方法比较合适。在这种情况下,如果请求中的属性与暴露的资源视图属性相匹配,那么子集语义就会应用于目标资源中可以修改的属性,当然,属性可以修改的前提是该属性是可写的。

(9)如果一个设备支持批处理接口,那么该设备应该既实现客户端角色,又实现服务器端角色。

一个批处理接口的例子如表3-8所示。

表3-8 批处理接口的例子

续表

续表

表3-9更进一步展示了链路列表和批处理接口。

表3-9 链路列表和批处理接口示例

5. 执行器接口

执行器接口是用于查看可以被驱动的资源接口,即改变由资源抽象出来的某个实体内的值或状态。

(1)执行器接口的名称应该是“oic.if.a”。

(2)执行器接口在资源表示中暴露所有强制属性,属性由可用的JSON定义;执行器接口会暴露可选属性,它由目标设备中实现的、可用的JSON Schema定义。

加热器资源如下所示,“prm”是参数属性的名称。

    /a/act/heater
    {
    "rt":["acme.gas"],
    "if":["oic.if.baseline","oic.if.r","oic.if.a"],
    "prm":{"sensitivity":5,"units":"C","range":"0..10"},
    "settemp":10,
    "currenttemp":7
    }

根据加热器资源,执行器接口说明如下。

(1)检索一个驱动器的值。

    Request:GET/a/act/heater?if="oic.if.a"
    Response:
    {
    "prm":{"sensitivity":5,"units":"C","range":"0..10"},
    "settemp":10,
    "currenttemp":7
    }

(2)驱动器的正确使用。

    Request:POST/a/act/heater?if="oic.if.a"
    {
    "settemp":20
    }
    Response:
    {
    Ok
    }

(3)驱动器的不正确使用。

(4)使用该接口的检索请求,会返回符合可能存在的资源表示,这些资源表示可以针对任何查询和过滤器参数。

(5)使用该接口的更新请求,会提供一个有效荷载或者是包体,其中包含目标资源可能或需要更新的属性。

(6)如果一个资源使用了该接口,会返回使用一个媒体类型的表示,并使用CBOR(Concise Binary Object Representation,简明二进制对象表示)编码,如IETF RFC 7049中所定义的。未来可能会定义其他的媒体类型,以修改在返回值中的细节。

6. 传感器接口

传感器接口用于资源检索被测量的、被感知的或者是特定能力的信息,主要包括:

(1)传感器接口的名称是“oic.if.s”。

(2)传感器接口会在资源表示中,暴露所有强制属性,由可应用的JSON定义;传感器接口也会暴露由目标设备实现的可选属性,也由JSON定义。

(3)使用该接口的检索请求,会返回符合可能存在的资源表示,它可以相对于任何查询和过滤器参数。

(4)如果一个资源使用了该接口,会返回使用一个媒体类型的表示,并使用CBOR编码,如IETF RFC 7049中所定义的,未来可能会定义其他的媒体类型,以修改在返回值中的细节。

传感器接口主要包括如下几方面。

(1)检索一个传感器的值。

(2)传感器的不正确使用。

(3)传感器的不正确使用。

7. 只读接口

只读接口暴露可能会被“读”的属性,包括“只读”属性、“读写”属性等,但却不包括“只写”属性和“只设置”属性。能够使用的方法只有检索,客户端如果想尝试检索之外的方法,就会被拒绝,还会产生错误响应代码。

8. 读写接口

读写接口只会暴露可能会被“读”和“写”的属性。这表明,“只读”属性不会包含在读写接口的表示中。可应用的方法只有检索和更新。同样地,客户端如果想尝试其他的方法请求会被拒绝,会产生错误响应代码。