3.6 资源结构
在外部的可见性和资源属性的可操作快照以及在一个时间点上各自的值被称为资源表示。资源表示抓住了特定时间一个资源的状态。当资源进行交互时,资源表示在请求和响应中被交换。资源表示可以用于检索或更新一个资源的状态。资源表示不应该被数据连接协议和技术(例如,CoAP、UDP/IP或低功耗蓝牙)所操作。
在很多场景中,资源之间可能会有一个隐式或显式的结构。例如,一个结构可以是树、网格、扇出或扇入。框架提供了对这些结构、资源间的关系建模和映射方法。框架中资源结构的主要构件是集合。一个集合表示一个容器,该容器是可以扩展的,以便对复杂结构进行建模。
3.6.1 资源关系
资源关系表示为链接。链接包含并扩展了典型的Web链接概念,作为一种表示资源之间关系的方法。一个链接包含一系列参数,这些参数定义如下。
(1)一个上下文URI。
(2)一个目标URI。
(3)从上下文URI到目标URI的关系。
(4)提供关于目标URI、链接的关系或上下文元数据的元素。
除了目标URI是强制的外,链接中的其他项是可选的。链接中的附加项可能会根据不同上下文中链接的使用而被设置为强制的(例如,在集合中、发现中和桥接中等)。
链接的例子如下所示。
{"href":"/switch","rt":["oic.r.switch.binary"],"if":["oic.if.a",/room2"oic.if.baseline"],"p":{"bm": 3},"rel":"item"}
只要有一个参数不同,这两个链接就是不同的。例如,以下两个链接是不同的,可以在同一个链路列表中出现。
{"href":"/switch","rt":["oic.r.switch.binary"],"if":["oic.if.a","oic.if.baseline"],"p":{"bm":2}, "rel":"item"} {"href":"/switch","rt":["oic.r.switch.binary"],"if":["oic.if.a","oic.if.baseline"],"p":{"bm":2}, "rel":"activates"}
当需要特定的能力时,该规范可能要求很多参数和参数值。对于在“/oic/res”上的检索请求返回的所有链接,如果一个链接没有显式包括“rel”参数,则默认rel=hosts。hosts相关值是由IETF RFC 6690定义,并在用于链接关系的IANA(Internet Assigned Numbers Authority,互联网数字分配机构)进行注册,网址为http://www.iana.org/assignments/link-relations/link-relations.xhtml。
一个链接中上下文URI和目标URI之间的关系使用“rel”JSON元素进行声明,并且该元素的值指明了特定的关系。
链接的上下文URI应该隐式地成为包含链路资源(或者是一个集合)的URI,除非该链路指明了一个“anchor”参数。“anchor”用于改变一个链路的上下文URI——如果该参数被指明的话,与目标URI的关系是基于该参数URI的。该参数使用OIC 1.1链接的传输协议URI(如“anchor”:“coaps://[fe80::b1d6]:44444”)和OCF 1.0链接(如“anchor”“ocf://dc70373c-1e8d-4fb3-962e-017eaa863989”)。
在集合的上下文中使用“anchor”的例子如下。一层楼有很多房间,房间里有灯可能会作为链接被定义在房间中,但是这些链接应该有“anchor”参数,该参数被设置为包含该灯房间的URI(关系为包含关系)。这就允许一层楼上所有的灯同时被打开或关上,同时仍然有灯在定义时与包含它们的房间相关(灯也可以通过使用房间URI打开)。在链接中使用“anchor”的示例如下。
1. 参数
一个链接包含一系列参数,本节介绍“ins”(链接实例)参数、“p”(策略)参数、“type”(媒体类型)参数、“bp”(批处理接口)参数、“di”(设备ID)参数和“eps”参数。
1)“ins”参数
“ins”参数指明了一个链接列表中一个特定的链接实例。“ins”参数常被用于在一个链接列表中修改或删除一个特定的链接。当一个链接被拥有链接列表的OCF设备(服务)实例化时,“ins”参数的值被设置,一旦被设置,只要该链接是其列表的成员,“ins”参数就不会被修改。
2)“p”参数
策略参数定义了正确获取一个目标URI所引用资源的各种规则,策略规则是由一系列键值对配置的,策略参数“p”定义如下。
“bm”键:对应于一个整型值,该整型值被解释为一个8位掩码。位掩码中的每一位对应于一个特定的策略规则,为“bm”指定了规则,如表3-10所示。
表3-10 “bm”键指定规则
注意,如果“bm”中的所有比特值都置为0,则为提高效率,可以从“p”中将“bm”键完全省略。然而,如果有任何一比特值被置为1,则“p”就应该包含“bm”,所有的比特都应该被合适地定义。
“sec”和“port”仅在OIC 1.1有效载荷中使用。在OCF 1.0有效载荷中,不应使用“sec”和“port”,而是通过“eps”参数提供加密链接的信息。
“sec”键:对应于一个布尔值,该值定义了目标URI引用的资源是否是通过一种加密链接被获取到的。如果“sec”为真,则是通过加密链接访问资源,使用“port”规范(见下文);如果“sec”为假,则资源是通过未加密的链接或通过加密链接来访问资源(如果这样的链接是使用另一个资源的“port”设置进行的,“sec”为真)。
“port”键:对应于一个整型值,该值用于指明目标URI所引用的资源可以通过加密链接被获取到的端口号。
如果该资源只能通过加密链接访问(例如DTLS),那么“p”中应该包括“sec”的值并设为真。“p”中应包含“port”键,并且将“port”的值设置为用于获取资源的端口号。
如果资源不是通过加密链接访问的,那么“p”应该包括“sec”键,它的值应该为假。或者“p”应该省略“sec”键;默认的“sec”值为假。“p”应该省略“port”键。
若该资源既不是通过加密链接也不是通过非加密链接访问的,则遵循本节定义的补充方案。通过端口键指定端口上的资源访问应通过加密链接(例如“coaps://”)进行(请注意,在通过多播发现的单独端口上可能存在与资源的未加密链接)。
请注意,资源的访问由资源的接入控制列表控制,成功的加密链接不能确保所请求的操作成功。它是OCF安全访问控制的一部分。
例3-1:对于一个可以被发现但不可被观察,可以通过CoAPS端口33275进行认证访问的资源策略,参数示例如下。
"p":{"bm":1}
例3-2:如下展示一个自链接,例如,在自身内部的可以被发现和观察的“/oic/res”链接。
{ "href":"/oic/res", "rel":"self", "rt":["oic.wk.res"], "if":["oic.if.ll","oic.if.baseline"], "p":{"bm":3} }
3)“type”参数
“type”参数可以用于指明一个特定的目标资源所支持的各种媒体类型。当“type”元素被省略时,“application/cbor”类型的默认值会被使用。一旦一个客户端对每个资源都发现了该信息,那么在请求或响应合适的头部域内就会选择其中可使用的一个。
4)“bp”参数
“bp”参数用于指定对目标URI的修改,因为批处理请求是通过该链路转发的。值中的“q”元素定义了要附加到“href”的查询字符串以构成目标URI。“q”查询字符串可以包含在该上下文中有效的多个属性字符串。例如,给定一个集合如下。
下面是到“/room2”的批处理请求序列GET/room2?if=oic.if.b,当批处理请求通过链接被传播到目标“/switch”时,该请求被传输到GET/switch?if=oic.if.baseline。
5)“di”参数
“di”参数指定了承载“href”参数中定义目标资源的设备ID。设备ID可以用于限定在“href”中的相对引用或查找相对引用的端点信息。
6)“eps”参数
“eps”参数指出了目标资源的终端信息。“eps”用一个数组作为其值,每一个数组的“ep”和“pri”组合代表一个终端信息。“ep”是强制性的,“pri”是可选的。
多终端的“eps”示意如下。
当链接中存在“eps”时,可以使用它的终端信息来访问由“href”参数引用的目标资源。当“eps”存在时,最大时限信息决定了“eps”的存在时间。
2. 格式及链接列表
在JSON中,链接列表的格式是一个数组。资源中的链接列表将作为该资源的链路属性的值包括在该资源中。一个包含链接的资源是一个集合。具有链接列表的资源如下所示。
3.6.2 集合
一个包括一或多个引用其他的资源被称作一个集合。这些引用可能是相关的,也可能只是一个列表;并且该集合使用单个句柄来引用整个集合的方法。任何资源都可以通过建立资源间的链接和指向变成集合。集合可以使用在层次、序号、组别等创建、定义和具体化中。
在一个集合的生命周期中,最少需要固定一个资源类型和一个接口。在集合创建之初就需要将资源类型和接口绑定至这个资源,并且这些初始的变量可以用类似改写资源变量的方式进行改写。绑定后加入的资源类型和接口,则应该在集合生命周期中完成。
集合需要定义共有链路属性,这个属性的值应为一个包含零条或多条链接的数组。链接中的目标URI应该指向另一个集合或资源,其中,被指向的集合或资源可以与链接的发起方在同一台设备上,这样的链接称为本地指向;被指向的资源或集合也可以挂载在另一台设备上,此时的链接称作远程访问。在链路数组中代表链接的URI内容应该是(隐含)那些包含链路属性的集合。隐含的URI内容可以在之后通过链接中的“anchor”属性进行改写,这里的“anchor”属性值是链接的基础。
一个资源可以被多个集合链接,因此,这样的链接和指向关系并不能保证唯一确定的“父子”关系。在一个确定的集合与其指向的资源间并没有预先定义好的关系,例如,可以使用集合来展现一个具体的关系,但这些关系并不是自动定义或隐含的。集合的生命周期和所指向的资源生命周期也是相互独立的。
如果集合的“drel”属性已经定义,那么所有没有指定联系的链接则会继承在这个资源配置指令中的默认值。关系的默认值定义了链接中集合和目标URI之间隐含的关系。
链路属性表示集合中的链接列表。链路属性有一个条目数组,每个条目都是OCF的链接,如图3-2所示。
图3-2 集合和链接示例
集合可以预先定义,也可以被优先定义,并且在这个集合的生命周期中都是静态(稳定)的全局变量。这样的集合可以用于模型(此处指一个案例),例如,一个由多个设备或一些固定资源组成的应用可以实现固定功能。
一个集合若只能用于配置在这个OCF集合里的设备上,那么该集合称为这个设备的本地集合,这样的集合也可用作客户端上指向多个服务器端的简便形式。集中化的集合是指配置在一个OCF设备上,并能被其他OCF设备访问或更新的集合。宿主集合属于集中化集合,但由一个或多个代理服务器管理控制。
1. 集合的属性
集合中需要定义链路属性。除此之外,还需要通过资源类型定义多个其他的属性。一些强制的、推荐的集合公共属性如表3-11所示。当涉及的资源属性与作为资源定义的属性重复时,在集合中会重写这些属性。
表3-11 OCF集合的公共属性(作为公共属性的补充)
2. 默认资源类型
默认资源类型“oic.wk.co”在OCF集合中可用。这种资源类型只能用于集合中没有定义别的资源类型或在集合创建的时候没有声明资源类型的情况下。
默认资源类型支持公共属性和链路属性。在默认资源类型中,链路属性的值应该是一个简单的OCF链接构成的数组,不支持使用含有标记的链接。
默认资源类型需要支持基准接口和链路列表接口,默认的接口应该是链路列表接口。