2

よろしく、

私たちの問題は、GE 実装の Orion Context Broker に関連する「アプリオリ」です。私たちのバージョン Orion Context Broker: 0.14.0.

実装した Web サービスがあり、多数のディスポジティブによって収集されたデータを、アカウントの Fi-ware プラットフォームにデプロイしたマシンに送信します。私たちに提示された問題は、設定している属性の 1 つがタイプ属性「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} は識別キー (一意で null ではない)。

詳しくは、

1) まず、次のペイロードを持つ新しいエンティティを挿入します。リテラル {0} はエンティティの ID です。たとえば、id(entity) = 30000000000002 です。リテラル {1} は、エンティティ ID の温度の現在の値です。たとえば、温度(エンティティ) = 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

これは 0.14.0 (およびそれ以前) の問題のようです。幸いなことに、この問題には 2 つの簡単な回避策があります。

  1. UPDATE の代わりに APPEND を使用します (既存のコンテキスト要素に対する APPEND は、UPDATE と同じ意味を持つことに注意してください)。
  2. 属性を場所として定義すると、その場所として保存され、さらに updateCoxtext リクエストでメタデータを「繰り返す」必要がないため、 for 場所を削除し<metadata>...</metadata>ます (queryContext で確認できます)。

次のリリース (0.14.1) で修正を実装します。フィードバックをお寄せいただきありがとうございます!

于 2014-07-03T16:39:19.640 に答える