QuarkIoE - 更新managedObject的片段

时间:2017-02-22 16:35:49

标签: cumulocity

在我们的应用程序中,当我们通过API创建新对象时,我们会在c8y_Mobile片段中发送与SIM和GSM模块相关的信息。该对象为具有有限功能的嵌入式设备建模,因此我们直接使用HTTPS API。

PUT /inventory/managedObjects/myid HTTP/1.1
Host: mytenant.cumulocity.com
Authorization: Basic ....
Content-Type: application/vnd.com.nsn.cumulocity.managedObject+json
Accept: application/vnd.com.nsn.cumulocity.managedObject+json

{
    "c8y_Mobile": {
        "imei": 1234567890123456,
        "imsi": 23456789011234567890,
        "iccid": 01234567890123456789
        ... 
    }
}

托管对象按预期显示新片段:

   ...
   "c8y_IsDevice": {},
   "c8y_Mobile": {
        "imei": 1234567890123456,
        "imsi": 23456789011234567890,
        "iccid": 01234567890123456789
        ... 
    },
    ...

当用户更改嵌入式设备上的SIM卡时,应在managedObject c8y_Mobile片段中更新IMSI和ICCID属性。但是如果我们只发送那些属性,则覆盖整个片段:

PUT /inventory/managedObjects/myid HTTP/1.1
Host: mytenant.cumulocity.com
Authorization: Basic ....
Content-Type: application/vnd.com.nsn.cumulocity.managedObject+json
Accept: application/vnd.com.nsn.cumulocity.managedObject+json

{
    "c8y_Mobile": {
        "imsi": 23456789011234567890,
        "iccid": 01234567890123456789
    }
}

所以托管对象显示了这个:

   ...
   "c8y_IsDevice": {},
   "c8y_Mobile": {
        "imsi": 23456789011234567890,
        "iccid": 01234567890123456789
    },
    ...

请注意, imei 属性和其他属性已丢失且在托管对象中不再存在。

为了保存数据和最小化事务,我想知道是否有更新片段的方法,而无需再次发送所有需要的属性。

我尝试使用HTTP POST代替PUT,但这会给我一个method not allowed错误,如文档中所述。

1 个答案:

答案 0 :(得分:1)

没有直接的方法可以做到这一点(但是一种解决方法)。 通常,当您对任何对象执行PUT时,它将仅在JSON的根级别上合并,这意味着如果您的PUT包含c8y_Mobile,它将替换当前的c8y_Mobile(无论包含什么)。

以下是您可以做的事情:

首先,您要创建用作临时片段的新片段:

PUT /inventory/managedObjects/myid HTTP/1.1
Host: mytenant.cumulocity.com
Authorization: Basic ....
Content-Type: application/vnd.com.nsn.cumulocity.managedObject+json
Accept: application/vnd.com.nsn.cumulocity.managedObject+json

{
    "c8y_Mobile_imsi": "23456789011234567890",
    "c8y_Mobile_iccid": "01234567890123456789"
}

此外,您创建了一个事件处理规则,当您更新时,例如" c8y_Mobile_imsi"它会将此值合并到现有的c8y_Mobile片段中(保留其他子片段)。

重要

您要么将PUT作为瞬态发送(因此这些值不会持久存储在设备对象中),或者您的规则会立即删除临时片段(在与c8y_Mobile合并的相同更新操作中)。 这很重要,因为在CEP中,当您收听ManagedObjectUpdated时,您不知道哪个片段已更新。因此,如果您将临时片段保留在设备对象中,则规则将在无限循环中触发(这将导致自动取消部署规则)。