よろしく、
私たちの問題は、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) ここで、正しく導入したこのデータの更新を試みますが (確認方法)、エラーが発生します。