Cumulocity - managedObject 的更新片段
Cumulocity - update fragment of managedObject
在我们的应用程序中,当我们通过 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
错误,如文档中所述。
没有直接的方法(但有解决方法)。
通常,当您对任何对象执行 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 时,您不知道更新了哪个片段。因此,如果您将临时片段保留在设备对象中,规则将在无限循环中触发(这将导致规则自动取消部署)。
在我们的应用程序中,当我们通过 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
错误,如文档中所述。
没有直接的方法(但有解决方法)。 通常,当您对任何对象执行 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 时,您不知道更新了哪个片段。因此,如果您将临时片段保留在设备对象中,规则将在无限循环中触发(这将导致规则自动取消部署)。