开发者中心

QuarkIoE的领域模型

概述

QuarkIoE收集设备和资产在物联网上的所有相关信息,如下图所示。

领域模型
  • 设备清单储存所有与设备、设备的配置和连接相关的主数据。并且还包括所有相关的资产信息(例如,车辆、机器、建筑物)和架构。
  • 测量值包括来自设备传感器(例如,温度读书)或基于设备信息计算得来的数值数据(例如,某个设备的服务可用性)。
  • 事件包括来自传感器网络的其他实时信息,例如,大门传感器的触发。也可以是系统用户或操作人员必须要解决的报警事件(例如,一次停电)。另外,与安全相关的事件也会显示为审核日志。
  • 操作与发送至设备处进行执行或处理的数据有关,例如,在电表里进行继电器的切换或向自动售卖机发送信用信息。
  • QuarkIoE最大创新之一是,它既具有通用的设备和传感器的标准化表示,还具有对该表示进行灵活扩展和更改概念。例如,QuarkIoE自带温度传感器、智能表具、追踪器等设备的详细概念。但如果你拥有一个不同的智能表具或完全新型的传感器,则很容易进行表示扩展以便收集数据,例如,在一个表具里进行不同类型的计费。
  • 这样的结果是,你可以为特定设备编写高度独立的物联网应用程序,这些设备可以被应用于下层传感器网络和网络内的连接。但你也可以编写支持非常特殊应用案例的应用程序,比如,为特定制造商的特定设备型号进行页面的配置。

下面的内容将带你查看以上所有的概念,描述相关的内容并给出例子。此处的示例将在JavaScript object notation (JSON),该格式应用在QuarkIoE的REST API中。对于Java,JavaScript和其他环境的使用,请参考开发者指南。更多详细的信息请在参考指南中查找。

设备清单

设备清单存储物联网解决方案有关的设备和其他资产。我们称它们为"托管对象"。 这些被管理对象可以是现有的"智能对象",比如,智能电表、家庭自动化网关和GPS设备等。也可以是你希望监测的资产,比如,安装了传感器的房间、或是拥有GPS设备的汽车。也可以是其他相关业务的对象,比如,家庭环境或行车路线。

下列的JSON代码展示了设备清单中被管理对象的最小案例, 该案例为一个简单的开关。

                          
{
    "id": "47635",
    "type": "ge_45609",
    "c8y_Relay" : 
    {
        "relayState" : "OPEN"
    },
    ...
}
                          
                      

在设备清单中存储的另一个资产的案例,可以是安装了开关的房间。(比较开关"id"属性和"被管理对象"的内容。)

                          
{
    "id": "47636",
    "type": "resortenergymgmt_Room",
    "name": "Sauna",
    "childAssets": {
        "references" : [
            { "managedObject": { "id": "47635", ... },
            ...
            } 
        ]
    },
    "resortenergymgmt_RoomProperty": {
        "size": 56,
        ...
    }
}
                          
                      

总的来说,每个被管理对象都包括

  • 一个可以用于可靠地引用被管理对象的唯一的识别符。
  • 一个可以定义被管理对象最特定类型的类型字符串。
  • 一个最后一次更新的时间标识。
  • 附加的称之为片段的东西。

片段

片段被用于定义被管理对象的功能。例如,你想要描述来自不同供应商的电表。根据电表的不同,它可能有一个继电器,它可以进行单相或三相的测量。这些功能都是通过存储每个如下功能的一个片段来确定的:

                          
{
    "id": "47635",
    "type": "elstermetering_AS220",
    "lastUpdated": "2010-11-13T18:28:36.000Z",
    "c8y_Position": {
        "alt": 67,
        "lng": 6.15173,
        "lat": 51.211977
    },
    "c8y_ThreePhaseElectricitySensor": {},
    "c8y_Relay": {
        "state": "CLOSED"
    }
}
                          
                      

在这个例子中,片段"c8y_ThreePhaseElectricitySensor"定义了一个三相电表。此外,该装置还包括一个继电器,该继电器可用于打开和关闭电源。

使用这种方法,设备建模可分为将基本传感器和控制作为片段建模,和将整个设备作为传感器、控制和可能的设备特性的整体建模。

该方法还可以开发通用的应用组件。例如,一旦某个被管理对象拥有位置片段("c8y_Position"),它就能在地图中显示。一旦它拥有一个继电器,就可以应用相关的设备控制命令(参考下文)进行开关控制。

片段命名约定

片段都使用命名约定来避免不同部分之间的片段信息,类似于在Java和其他编程语言里使用的方式。

在上述例子中,("c8y_Position")是c8y("QuarkIoE"的缩写)、下划线和"Position"的结合。标准片段在传感器库中定义,同时也在设备管理库中定义。

请注意,QuarkIoE遵循的是以文件为导向的方法来储存数据。某个对象的所有功能都可以根据对象本身的数据,从文档中推断出来。有没有明确单独的元数据模型,需要进行配置和管理。然而,应用程序可以在设备清单中添加自己的元数据并进行储存。例如,一个自动售卖机的应用程序可以维持设备清单中多个售卖机类型插槽配置的元数据。

对象识别

每一个在设备清单中的被管理对象在创建的时候,都有一个由QuarkIoE综合生成的,属于自己的"global"标识符。无论何时,该标识符都可以对对象进行可靠地引用,例如,网络的重建或硬件部分的更换。

设备和企业IT系统通常都有自己的识别设备和资产的概念。网关和设备通常使用某种形式的技术标识符来引用设备。例如,一个智能表具可以由技术计数,通过是否它从一个网关处到达来识别。一个客户关系管理(CRM)系统可以使用客户已经安装了表具的ID。同时企业资产管理系统可以通过粘贴在设备上的资产标签追踪同一个表具。同时,资产管理系统还可以追踪当前表具的ID和客户的ID。

身份识别服务

为了从识别符的多样性上保护应用程序,QuarkIoE具有为一个资产注册所有标识符的身份识别服务,这些标识符可以被应用在QuarkIoE以外的地方,并且将这些识别符映射到可以被应用程序使用的唯一全球识别符上。该服务可以被代理(注册外部识别符)和涉及重组和设备变更的商业流程(更改外部识别符的映射到全球识别符)所使用。

为了说明这一点,假设一个智能电表故障,一个新的具有其他计数的电表和资产标签需要被安装在放家里。在身份认证服务中,替换故障硬件的业务流程现在只是更新与一个客户有关资产标签和电表ID。随后,之前收集的数据和新的电表读书都会和正确的客户相关联。

更多信息可在参考指南中身份识别查找

对象层次结构

设备清单模型支持两种默认的对象层次结构。通信层次结构("子设备")和资产层次结构("子资产")

从通信点的角度,通信层次结构追踪设备怎样被连接到M2M平台上。通用的通信层次结构在下图中有展示:代理连接传感器网络到QuarkIoE。它们经常通过网关设备或调制解调器与设备网络进行通信。网关,反过来,连接传感器网络的设备。

通信层级示例

资产层级将通过M2M设备对远程监测和管理的设备进行分层。因此,它是与M2M应用程序最密切相关的。

举例说,一个楼宇管理资产层级可以是大楼里拥有的房间。大楼将被连接在网关上,与QuarkIoE进行连接,同时房间可以被连接到传感器和控制器上。可在下图查看该示例层级。

资产层级示例

层级结构中的子对象

上述的两种层级受到设备清单接口 和客户端库的明确支持,在层级中提供增加和删除子设备方法。层级本身由客户应用程序构建。通信层级由代理进行构建,资产层级由顶层的应用程序进行添加。

请注意,对象层级不需要组成一棵树,举例来说,同样的设备可以是多个母设备的子设备。这使应用程序可以创建额外的,有可能地对象用户定义组,比如工作组或虚拟网络。此外,应用程序也可以使用片段来定义任意的替代层级。

对象生命周期

之前描述的识别和层级机制形成了一个非常灵活的可以适应大多数业务流程的设备生命周期机制。首先,当一个设备第一次启动时,它既不与系统进行连接,也不同某个资产连接。而是将设备连接到通信层级的(也有可能是间接地通过网关)Agent上,这样就表示设备被连接上了。只有连接的设备可以远程控制。利用资产层级将设备连接到某个资产上,可以用来表示该设备已经在物理上被安装了。

断开和卸载一个设备不一定说明该设备已经别移除,必须在系统中进行删除。也可能说明该设备被退回仓库,并且后续会被安装在其他地方。这取决于使用情况和业务流程是否需要设备保存或删除数据。要物理上从设备清单中删除设备,意味着该设备收集的所有数据将丢失——通常只有在需要完全清除以往数据的情况下才执行。要保存已经删除设备的数据,可以从识别服务中移除标识符的映射。如果需要在原来设备的位置安装一个新的设备,则一个新的"全球"标识符将被生成。

当设计代理时,合适地定位设备的生命周期是非常重要的。例如,连接设备的代理不应当承担,在设备不能被连接时,从设备清单中删除它们的功能。同意的方式,一个对接CRM系统的代理不能承担,当设备从CRM系统中被移除时,删除该设备的功能。

使用设备清单

更多使用设备清单的例子可在设备清单参考中找到.

事件

事件通常是通过QuarkIoE发送的实时信息。一般有三种类型:

— 当某些情况发生时产生的一个基本事件信号,比如,当一个开关打开或关闭时,一个事件就会被触发。

— 一个报警会产生一个需要手动操作的事件,比如,当某个表具被进行了篡改或某个冰箱的温度高于一个特点的阈值时。

— 一个审计记录储存与安全有关的事件,并存储为审计记录。比如,当一个用户登录到网关时,一个审核日志就会生成。

事件有一个类型(在已描述过的命名约定中),当事件发生时的时间和描述事件的文本。一个事件指的是设备清单中的源管理对象。以下是一个事件的举例:

                          
{
    "type": "c8y_LocationUpdate",
    "time": "2010-11-13T18:28:36.000Z",
    "text": "Location updated",
    "source": { "id": "47634", ... },
    "c8y_Position": {
        "alt": 67,
        "lng": 6.15173,
        "lat": 51.211977
    }
}
                          
                      
                          
{
    "type": "c8y_LocationUpdate",
    "time": "2010-11-13T18:28:36.000Z",
    "text": "Location updated",
    "source": { "id": "47634", ... },
    "c8y_Position": {
        "alt": 67,
        "lng": 6.15173,
        "lat": 51.211977
    }
}
                          
                      

任何针对上述管理对象的事件都可以按照同样的方式进行扩展。在这个例子中,我们不仅表示了一个移动的对象,还包括该对象在"c8y_Position" 片段形式中的新位置。

审计记录可以以下方式扩展一个事件

  • 一个用户进行活动的用户名称
  • 一个用来进行活动的应用程序
  • 当前的活动
  • 严重程度

以下是一个审计记录的结构案例:

                          
{
    "type": "c8y_SecurityEvent",
    "time": "2010-11-13T18:28:36.000Z",
    "text": "Gateway login failed",
    "user": "vvirtanen",
    "application": "Resort energy management",
    "activity": "login",
    "severity": "MINOR",
    "source": { "id": "47633", ... },
    ...
}
                          
                      

报警可以通过以下方式扩展事件

  • 显示报警是否为激活或清除的状态。
  • 报警最后一次更新的时间戳
  • 临界、严重、轻微和警告的程度
  • 在审计记录形式中的事件变化的历史记录

以下是一个报警被清除的例子

                          
{
    "type": "c8y_UnavailabilityAlarm",
    "time": "2010-11-13T19:28:36.000Z",
    "text": "No communication with device since 2013-11-05T15:23:55.284+01:00",
    "status": "CLEARED",
    "severity": "MINOR",
    "source": { "id": "47633", ... },
    "history": {
        "auditRecords": [ {
            "activity": "Alarm updated",
            "application": "devicemanagement",
            "user": "vvirtanen",
            "time": "2013-11-05T16:37:48.494+01:00",
            "changes": [ {
                "attribute": "status",
                "newValue": "CLEARED",
                "previousValue": "ACTIVE",
                "type": "com.cumulocity.model.event.CumulocityAlarmStatuses"
            } ],
            ...
        } ]
        ...
    } 
    ...
}
                          
                      

更多参考指南请在事件报警审计中查找。

测量值

测量值通常表示从传感器中获取的读数和统计数据。测量值包括当测量值被读取时的时间,测量值来源的唯一标识符,以及一个片段列表。以下是一个测量值的例子:

                          
{
    "time": "2011-01-02T03:04:00.000Z",
    "source": { "id": "1235", ... },
    "c8y_ThreePhaseElectricityMeasurement": {
        "A+": { "value": 435, "unit": "kWh" },
        "A-": { "value": 23, "unit": "kWh" },
        "P+": { "value": 657, "unit": "W" },
        "P-": { "value": 0, "unit": "W" },
        "A+:1": { "value": 123, "unit": "kWh" },
        "A-:1": { "value": 2, "unit": "kWh" },
        "P+:1": { "value": 56, "unit": "W" },
        "P-:1": { "value": 0, "unit": "W" },
        "A+:2": { "value": 231, "unit": "kWh" },
        "A-:2": { "value": 23, "unit": "kWh" },
        "P+:2": { "value": 516, "unit": "W" },
        "P-:2": { "value": 2, "unit": "W" },  
        ...
    },
    ...
}
                          
                      

类似于设备清单的模型,片段通常被用来确定特定设备的功能。在上面的例子中,一个三相电表发送了不同的电相位读数。针对实际的数值和测量值的单位,每一个这样的片段都映射着单个读数的名称(比如该例子中的"A+"、"A-")。

此外,测量值可以被扩展到保存应用程序可能需要的任意的额外信息。更多的信息请参见参考指南中的测量值

设备的远程控制

操作

设备需要被远程控制和管理。

例如:

  • 设备控制:设置开关,调节加热控制。
  • 设备配置:在一个智能表具里设置的计费表
  • 设备维护:请求一个网关下载和安装新的固件。

在QuarkIoE中,这些使用案例都是通过发送操作到一个设备来执行的。下面的代码片段显示了一个通过设置继电器ID"42"到"打开"状态的操作。

                         
{
  "deviceId": "42",
  "c8y_Relay": {
  "relayState": "OPEN"
   }
}
                        
                    

就像数据的其他类型,操作也是通过传感器库被标准化的,以便简化应用程序的开发(见下文)。比如,设置一个开关应当与设置所有开关是相同的,无论它是怎么构造的。

操作的模型化类似于设备清单模型中的片段(见上文),因此相同的扩展性概念也可以适用。任意供应商专有的扩展内容可以适用于标准的操作,并且不会以任何方式被QuarkIoE解读。

发送操作到设备

QuarkIoE利用一个可靠的排队机制通过任意网络向设备发送操作。这种排队机制是根据物联网网络的限制和安全要求而制定:

  • 设备往往被连接到可能只是偶尔可用的不可靠、低带宽链接上。例如,设备可以为了使指令被执行,一天内只进行一次网络拨号。因此,QuarkIoE与设备间进行异步通信。
  • 设备协议通常不是为了互联网上安全通信而设计的。 它们可能无法通过NAT网络、防火墙和Web代理。它们在互联网上公开披露可能不是足够安全。因此,QuarkIoE提供了作为HTTPS客户连接这些设备的可能性。
  • 它甚至不可能从互联网上到达某个移动设备处。因此,QuarkIoE使用推送技术,发送操作到设备上。

从应用程序发送操作到设备,是一个需要多步骤的过程,如下图所示。假设用户通过一个应用程序向设备发送了一个远程操作(例如,设备重启)。应用程序即在QuarkIoE上创建了这个操作(步骤"1")。QuarkIoE则将会对该操作的执行进行排队,并且立即将控制权返还给应用程序。

在某个时间点上,负责该设备的代理将为它管理的设备请求正在排队的操作(步骤"2")。该步骤会通过QuarkIoE的推送机制立刻发生,或通过定期和规划的时间间隔发生。

该代理将在它管理的设备上执行操作(步骤"3"),并且会根据执行的结果更新QuarkIoE(步骤"4")。代理管理的设备将直接或间接地成为该代理的子设备。

最后,应用程序可以查询操作的结果(步骤"5")。审计记录将根据运行设备控制操作的原始请求,和已经开始运行操作的确认,而生成。

设备控制架构

请注意,连接一个操作的结果(步骤"4"和"5")能通过不同于设备控制接口的信道额外产生。例如,当一个开关状态发生改变,该代理有可能需要通过新的开关状态来更新设备清单,同时应用程序需要更新其相应的用户接口。再例如,如果在发送操作到设备的过程中通信出现问题,则该代理就可能会发出报警。

还要注意的是,在发送操作到设备和获得响应之间有可能出现任意的延迟。根据可用性的原因,这仅仅是在假设该操作将被发送的设备,并且被检测时只报送错误的情况下才有意义。

针对可靠性设计操作

操作应尽可能的被设计为幂等。幂等意味着无论你怎么频繁地执行操作,其结果都是一样的。

比如,一个设置开关在某个状态下的操作为幂等。无论如何频繁地将开关设置为"开",则其以后都会是"开"。如果一个切换开关的操作不是幂等——则结果将取决于运行操作次数是偶数还是奇数。

幂等性在错误的情况下是非常有用的。如果一个操作在设备上被执行,其结果是错误的,则操作可以被简单地进行重试。因此,将操作设计为幂等始终是一个选项。这就是说,不是总有可能性:如果一个相机被要求拍照,但由于某些原因失败了,重试就会经常导致不同的结果。

更多的信息可以在 设备控制的参考指南中找到。

传感器库

基于上述从设备接收数据和控制它们的基础,QuarkIoE包括一个将特定传感器和跨设备产品控制功能建模的传感器库

  • 什么设备被安装来测量电力?
  • 电力读数是多少?
  • 一个特定电力表是否含有我可以进行关闭的电源开关?

它涵盖了基本的传感器和控制器,并且通过QuarkIoE的客户库进行支持。这样不仅简化了开发功能,更重要的是,它可以编写强大的通用物联网软件插件。根据上述的例子,你可以在多个相关应用场景实现一个能源插件的使用(比如,家庭自动化、智能计量和企业能源管理),并且适用于不同的设备中。

从技术上来讲,传感器库为设备清单、测量值、事件和设备控制定义了标准的片段,并遵循上文中提到的命名约定。下面将展示两个被使用在一个电表上的片段。

                         
{
    "id" : "1",
    "type" : "com_kamstrup_382",
    "c8y_SinglePhaseElectricityMeasurement": {},
    "c8y_Relay" : { "state": "OPEN" }
}
                         
                      

对于Java开发者来说,查看设备"mo"的开关状态时是这样:

                         
ManagedObject mo = ...;
Relay relay = mo.get(Relay.class);
RelayState state = relay.getRelayState();
                         
                      

对于一个JavaScript开发者来说,查看同样的内容时是这样:

                         
var state = mo.c8y_Relay.relayState
                         
                      

更多详细信息可以在参考指南下的"传感器库"中查看。

QuarkIoE团队欢迎你为传感器库做出贡献。如果你希望整合任何设备、控制器、传感器或其他对象,并且你发现你的模型片段在你使用案例或设备上具备更全面应用性,我们鼓励你联系我们,将你的发现贡献在QuarkIoE上。这样也可以使其他人完成他们设备的整合,以便他们也可以支持你的应用程序;同样的也可以其他人完成他们的应用程序,以便他们支持你的设备。

综述

QuarkIoE为管理和控制物联网系统,提供一个参考模型,包括:

  • 设备清单中的物联网设备、网络和资产的集中表示,
  • 设备的配置,
  • 传感器的读数,
  • 控制器的操作
  • 实时事件的处理。

该模型的目的是尽可能多的水平整合设备供应商,同时也尽量涵盖不同设备和应用程序的任何细节及特殊功能。