此致
我们的问题是与GE实施Orion Context Broker相关的'先验'。我们的版本Orion Context Broker:0.14.0。
我们已经实施了一项Web服务,将由多个dispositives收集的数据发送到我们在我们的帐户Fi-ware平台中部署的计算机。我们提出的问题是我们设置的属性之一是类型属性“coords”,当我们尝试更新实体时,不允许我们更新该属性,并给出以下内容错误(见下文,响应的一部分)。我们还想更新此字段。
</contextAttribute>
<contextAttribute>
<name>android_version</name>
<type />
<contextValue />
</contextAttribute>
<contextAttribute>
<name>date</name>
<type />
<contextValue />
</contextAttribute>
<contextAttribute>
<name>position</name>
<type>coords</type>
<contextValue />
<metada>
<contextMetadata>
<name>location</name>
<type>string</type>
<value>WSG84</value>
</contextMetadata>
</metada>
</contextAttribute>
</contextAttributeList>
</contextElement>
<statusCode>
<code>472</code>
<reasonPhrase>request parameter is invalid/not allowed</reasonPhrase>
<details>action:UPDATE - entity: (300000000000008, dispositivo) - offending attribute: position - location attribute has to be defined at creation time, with APPEND</details>
</statusCode>
</contextElementResponse>
我们正在为ContextBroker设置的REST请求是:
public static String payloadUpdateTemplate =
@"<updateContextRequest>
<contextElementList>
<contextElement>
<entityId type='dispositivo' isPattern='false'>
<id>{0}</id>
</entityId>
<contextAttributeList>
<contextAttribute>
<name>temperature</name>
<type>Cº</type>
<contextValue>{1}</contextValue>
</contextAttribute>
<contextAttribute>
<name>latitude</name>
<type>φ</type>
<contextValue>{2}</contextValue>
</contextAttribute>
<contextAttribute>
<name>longitude</name>
<type>λ</type>
<contextValue>{3}</contextValue>
</contextAttribute>
<contextAttribute>
<name>altitude</name>
<type>m</type>
<contextValue>{4}</contextValue>
</contextAttribute>
<contextAttribute>
<name>acceleration</name>
<type>m/s²</type>
<contextValue>{5}</contextValue>
</contextAttribute>
<contextAttribute>
<name>android_version</name>
<type></type>
<contextValue>{6}</contextValue>
</contextAttribute>
<contextAttribute>
<name>date</name>
<type></type>
<contextValue>{7}</contextValue>
</contextAttribute>
<contextAttribute>
<name>position</name>
<type>coords</type>
<contextValue>{2}, {3}</contextValue>
<metadata>
<contextMetadata>
<name>location</name>
<type>string</type>
<value>WSG84</value>
</contextMetadata>
</metadata>
</contextAttribute>
</contextAttributeList>
</contextElement>
</contextElementList>
<updateAction>UPDATE</updateAction>
</updateContextRequest>";
是的,我们之前使用带有APPEND操作类型的updateContext操作创建了我们尝试更新的实体。我们用于创建实体的有效负载是:
public static String payloadInsertTemplate =
@"<updateContextRequest>
<contextElementList>
<contextElement>
<entityId type='dispositivo' isPattern='false'>
<id>{0}</id>
</entityId>
<contextAttributeList>
<contextAttribute>
<name>temperature</name>
<type>Cº</type>
<contextValue>{1}</contextValue>
</contextAttribute>
<contextAttribute>
<name>latitude</name>
<type>φ</type>
<contextValue>{2}</contextValue>
</contextAttribute>
<contextAttribute>
<name>longitude</name>
<type>λ</type>
<contextValue>{3}</contextValue>
</contextAttribute>
<contextAttribute>
<name>altitude</name>
<type>m</type>
<contextValue>{4}</contextValue>
</contextAttribute>
<contextAttribute>
<name>acceleration</name>
<type>m/s²</type>
<contextValue>{5}</contextValue>
</contextAttribute>
<contextAttribute>
<name>android_version</name>
<type></type>
<contextValue>{6}</contextValue>
</contextAttribute>
<contextAttribute>
<name>date</name>
<type></type>
<contextValue>{7}</contextValue>
</contextAttribute>
<contextAttribute>
<name>position</name>
<type>coords</type>
<contextValue>{2}, {3}</contextValue>
<metadata>
<contextMetadata>
<name>location</name>
<type>string</type>
<value>WSG84</value>
</contextMetadata>
</metadata>
</contextAttribute>
</contextAttributeList>
</contextElement>
</contextElementList>
<updateAction>APPEND</updateAction>
</updateContextRequest>";
我们正在使用REST Web服务。有效负载中的文字{0}标识上下文的每个实体。例如,如果dispositivo的ID是1111,则文字{0}将是1111.另一方面,如果传感器的代码是2222,则文字{0}将是2222.文字{0}是识别密钥(唯一且非空)。
更多信息,
1)首先,我们插入一个具有以下有效负载的新实体。文字{0}是实体的ID,例如,id(entity)= 30000000000002.文字{1}是实体Id的当前温度值,例如,temperature(entity)= 30,0
public static String payloadInsertTemplate =
@"<updateContextRequest>
<contextElementList>
<contextElement>
<entityId type='dispositivo' isPattern='false'>
<id>{0}</id>
</entityId>
<contextAttributeList>
<contextAttribute>
<name>temperature</name>
<type>Cº</type>
<contextValue>{1}</contextValue>
</contextAttribute>
.
.
.
.
<contextAttribute>
<name>position</name>
<type>coords</type>
<contextValue>{2}, {3}</contextValue>
<metadata>
<contextMetadata>
<name>location</name>
<type>string</type>
<value>WSG84</value>
</contextMetadata>
</metadata>
</contextAttribute>
</contextAttributeList>
</contextElement>
</contextElementList>
<updateAction>APPEND</updateAction>
</updateContextRequest>";
2)插入操作的结果如下。
<updateContextResponse>
<contextResponseList>
<contextElementResponse>
<contextElement>
<entityId type="dispositivo" isPattern="false">
<id>30000000000002</id>
</entityId>
<contextAttributeList>
<contextAttribute>
<name>temperature</name>
<type>Cº</type>
<contextValue />
</contextAttribute>
.
.
.
.
<contextAttribute>
<name>position</name>
<type>coords</type>
<contextValue />
<metadata>
<contextMetadata>
<name>location</name>
<type>string</type>
<value>WSG84</value>
</contextMetadata>
</metadata>
</contextAttribute>
</contexAttributeList>
</contextElement>
<statusCode>
<code>200</code>
<reasonPhrase>OK</reasonPhrase>
</statusCode>
</contextElementResponse>
</contextResponseList>
</updateContextResponse>
3)我们进行查询,我们可以检查使用有效负载创建的新值。
<queryContextRequest>
<entityIdList>
<entityId type='dispositivo' isPattern='false'>
<id>{0}</id>
</entityId>
</entityIdList>
<attributeList/>
</queryContextRequest>
4)然后我们得到了我们引入的价值。
<queryContextResponse>
<contextResponseList>
<contextElementResponse>
<contextElement>
<entityId type="dispositivo" isPattern="false">
<id>30000000000002</id>
</entityId>
<contextAttributeList>
<contextAttribute>
<name>temperature</name>
<type>Cº</type>
<contextValue>30,0</contextValue>
</contextAttribute>
.
.
.
.
<contextAttribute>
<name>position</name>
<type>coords</type>
<contextValue>36.723804, -4.417518</contextValue>
<metadata>
<contextMetadata>
<name>location</name>
<type>string</type>
<value>WSG84</value>
</contextMetadata>
</metadata>
</contextAttribute>
</contextAttributeList>
</contextElement>
<statusCode>
<code>200</code>
<reasonPhrase>OK</reasonPhrase>
</statusCode>
</contextElementResponse>
</contextResponseList>
5)现在我们尝试更新我们已正确引入的数据(如何检查),并给出错误。
答案 0 :(得分:1)
此块意味着您无法更新在创建时未定义的属性值。
行动:更新 - 实体:(300000000000008,dispositivo) - 违规属性:必须定义位置 - 位置属性 在创建时,使用APPEND
如果在创建时未定义location属性,则应使用APPEND操作在实体中创建该新属性,如果此实体之前已创建过该属性。
使用APPEND代替UPDATE,您可以将新属性附加到先前创建的实体。
在此之后,请确保您将所有大括号替换为正确的值。
答案 1 :(得分:1)
这似乎是0.14.0(以及之前)的问题。幸运的是,这个问题有两个简单的解决方法:
<metadata>...</metadata>
的位置,因为一旦您将属性定义为存储位置,并且您不需要在进一步的updateCoxtext请求中“重复”元数据(您可以使用queryContext检查它) )。我们将在下一个版本(0.14.1)中实现修复。感谢您的反馈!