1

在我们的应用程序中,当我们通过 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 卡时,IMSI 和 ICCID 属性应在 managedObject 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,
        "iccid": 01234567890123456789
    }
}

所以托管对象显示了这一点:

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

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

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

我尝试使用 HTTP POST 而不是 PUT,但这给了我一个method not allowed错误,如文档中所述。

4

1 回答 1

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 时,您不知道更新了哪个片段。因此,如果您将临时片段保留在设备对象中,则规则将在无限循环中触发(这将导致规则的自动取消部署)。

于 2017-02-22T20:25:06.437 回答