2

问候,

我们的问题是与 GE 实施 Orion Context Broker 相关的“先验”问题。我们的 Orion Context Broker 版本:0.14.0。

我们有一个我们已经实现的 Web 服务,它将由许多决定收集的数据发送到我们在我们的帐户 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)现在我们尝试更新我们正确引入的数据(如何检查)并且它给出了错误。

4

2 回答 2

1

此块意味着您无法更新在创建时未定义的属性的值。

行动:更新 - 实体:(300000000000008,dispositivo) - 违规属性:位置 - 位置属性必须在创建时定义,附加

如果在创建时未定义位置属性,您应该使用 APPEND 操作在您的实体中创建该新属性,如果该实体之前已经创建过也是如此。

使用 APPEND 而不是 UPDATE,您将能够将新属性附加到先前创建的实体。

之后,请确保您将所有花括号替换为正确的值。

于 2014-06-27T17:33:58.490 回答
1

这似乎是 0.14.0(及之前)的问题。幸运的是,这个问题有两种简单的解决方法:

  1. 使用 APPEND 而不是 UPDATE(请注意,现有上下文元素上的 APPEND 与 UPDATE 具有相同的语义)。
  2. 删除<metadata>...</metadata>for 位置,因为一旦您将属性定义为位置,它就会按原样存储,并且您不需要在进一步的 updateCoxtext 请求中“重复”元数据(您可以使用 queryContext 进行检查)。

我们将在下一个版本 (0.14.1) 中实施修复。感谢您的反馈!

于 2014-07-03T16:39:19.640 回答