SmartREST 2.0
概要
このセクションでは、Things Cloud MQTT 実装で使用できる SmartREST 2.0 ペイロード形式について説明します。
SmartREST 2.0 は MQTT プロトコルを利用するように設計されているので、HTTP 経由の SmartREST 1.0 よりもペイロードを削減できる可能性があリます。
SmartREST 2.0 は MQTT 経由でのみ利用可能であり、主な通信のために次の MQTT トピックを提供しています。
メッセージをパブリッシュするには、
s/uc/<X-ID>
TRANSIENT モードでメッセージをパブリッシュするには、
t/uc/<X-ID>
QUIESCENT モードでメッセージをパブリッシュするには、
q/uc/<X-ID>
CEP モードでメッセージをパブリッシュするには、
c/uc/<X-ID>
TRANSIENT、QUIESCENT、および CEP データ処理の詳細については、処理モード を参照してください。
応答をサブスクライブするには、
s/dc/<X-ID>
テンプレートの作成に関するトピックは、MQTT 経由のテンプレート作成 で説明されています。
SmartREST 1.0 からの変更点
SmartREST 2.0 のベースは以前のバージョンと同じで、CSV に似たペイロード形式で、以前に作成されたテンプレートによってサポートされ、最終的にターゲットとする JSON 構造を作成します。
機能にいくつかの変更が加えられました。
- テンプレートには、オブジェクトの ID が含まれなくなりました(代わりに、ID は MQTT ClientId などによって解決されます)。
- マネージドオブジェクトは、External ID を使用して直接作成および取得できます。
- 要求テンプレートの作成で JSON パスが使用されるようになりました(応答テンプレートなど)。
- 応答リストのサポート
- パターンの一部だけが見つかった場合にもレスポンスが返されます。
- 接続のデフォルト X-ID の宣言
サポートされているテンプレート
SmartREST 2.0 では、次の一致する HTTP メソッドのテンプレートを作成できます。
API | GET | POST | PUT |
---|---|---|---|
インベントリ | ○ | ○ | ○ |
アラーム | ○ | ○ | |
イベント | ○ | ||
メジャーメント | ○ | ||
オペレーション | ○ |
さらに、レスポンスおよびオペレーションから特定の値を返すテンプレートを作成できます。
テンプレート コレクション
テンプレートコレクションは、デバイス通信プロトコルを指定する要求テンプレートと応答テンプレートのセットです。各コレクションは、一意のID(X-ID と呼ばれる)によって参照されます。
MQTT 経由のテンプレート作成
SmartREST 1.0 と同様に、コレクション内のすべてのテンプレートを 1 つのメッセージで渡す必要があります。テンプレート コレクションの作成後は、MQTT を使用して変更することはできなくなります。
テンプレートを作成する場合、クライアントは次のトピックにパブリッシュする必要があります。
s/ut/<X-ID>
テンプレートコレクションが存在するかどうかを確認するために、クライアントは次のトピックをサブスクライブできます。
s/dt
サブスクライブすると、クライアントは作成トピックに空のメッセージを送信し、この X-ID の作成ステータスに関する新しいメッセージをトリガーできます。
例
s/ut/myExistingTemplateCollection に空のパブリッシュを送信します。
20,myExistingTemplateCollection,<ID of collection>
s/ut/myNotExistingTemplateCollection に空のパブリッシュを送信します。
41,myNotExistingTemplateCollection
要求テンプレート
要求テンプレートには、次の基本フィールドが含まれます。
フィールド | データ型 | 値 | 必須 | 説明 |
---|---|---|---|---|
messageId | String | はい | コレクション内のテンプレートを参照する一意の ID | |
method | String | GET PUT POST |
はい | データを取得、更新、作成するかどうか |
api | String | INVENTORY MEASUREMENT ALARM EVENT OPERATION |
はい | Things Cloud API を使用 |
response | Boolean | true false |
いいえ | リクエストが応答テンプレートをトリガーするかどうか。 GET テンプレートの場合はデフォルトで true、それ以外の場合はデフォルトで false |
mandatoryValues | List<String> | はい | API の必須フィールドの値。 値は、テンプレートが使用する API およびメソッドによって異なる | |
customValues | List<CustomValue> | いいえ | オブジェクトに追加するカスタム値 |
要求テンプレートには、データの作成時または更新時に追加されるオブジェクト構造内のすべてのフラグメント(必須およびカスタム)がリストされます。
テンプレートに固定値を設定し、サーバーで置き換えることができます。テンプレートに値が設定されていない場合は、その値をパブリッシュメッセージに含める必要があります(これには mandatoryValues が含まれます)。
例
このようなメジャーメントを作成するためのテンプレートを作成します(メジャーメントには、type と time の 2 つの必須値があります)。
# 10,msgId,method,api,response,type,time,custom1.path,custom1.type,custom1.value
10,999,POST,MEASUREMENT,,c8y_MyMeasurement,,c8y_MyMeasurement.M.value,NUMBER,
このテンプレートでは、メジャーメントのカスタムプロパティを 1 つ追加定義します。テンプレート宣言の 2 つのフィールドを空のままにしているので(time とカスタムプロパティ)、テンプレートを使うためにクライアントはこれら 2 つの値を送信する必要があります。
999,2016-06-22T17:03:14.000+02:00,25
# We can also use server time by leaving the time empty
999,,25
次のセクションでは、さまざまなテンプレートの作成方法と使用方法について詳しく説明します。
GET テンプレート
インベントリの GET テンプレートには、必須またはカスタムの値は必要ありません。代わりに、2 つの異なるフィールドを使用します。
SmartREST 2.0 では、ID によってインベントリからオブジェクトを取得するか、External ID によってオブジェクトを直接取得するかを選択できます。したがって、mandatoryValues および customValues フィールドの代わりに、次の 2 つのフィールドが使用されます。
フィールド | データ型 | 値 | 必須 | 説明 |
---|---|---|---|---|
byId | Boolean | true false |
はい | GET を Things Cloud ID(= true)または External ID(= false)のどちらで実行するか |
externalIdType | String | いいえ | テンプレートが externalId によって呼び出された場合、固定 externalIdType を設定する |
これにより、次の3つの異なる方法でインベントリを照会することができます。
Things Cloud ID(マネージドオブジェクトID)
# Creation:
10,999,GET,INVENTORY,,true
# Usage:
999,123456
テンプレートに固定タイプを持つ External ID
# Creation:
10,999,GET,INVENTORY,,false,c8y_Serial
# Usage:
999,myDeviceImei
テンプレートに固定タイプがない External ID
# Creation:
10,999,GET,INVENTORY,,false
# Usage:
999,c8y_Serial,myDeviceImei
POST テンプレート
POST テンプレートには、APIに基づいて必須値の組み合わせが異なります。
API | 必須値 |
---|---|
メジャーメント | type, time |
イベント | type, text, time |
アラーム | type, text, status, severity, time |
インベントリ | externalIdType |
これにより、次の最小限のテンプレートが作成されます。
# Creation:
10,100,POST,MEASUREMENT,false,c8y_MyMeasurement,,c8y_MyMeasurement.M.value,NUMBER,
10,101,POST,EVENT,,c8y_CustomEvent,mytext,,
10,102,POST,ALARM,,c8y_CustomAlarm,mytext,ACTIVE,MAJOR,
# Usage:
100
101
102
インベントリでのデータの作成には、オプションでそのオブジェクトの externalId の作成が含まれます。これは、必須値 externalIdType によって制御されます。
# Creation:
10,100,POST,INVENTORY,,c8y_MySerial
# Usage:
# Create object with externalId c8y_MySerial/myImei
100,myImei
# Create object with externalId c8y_MySerial/myImei
101,myImei,c8y_MySerial
# This message will result in not creating an external ID
101,,c8y_MySerial
PUT テンプレート
インベントリの PUT テンプレートは GET テンプレートと同じロジックに従いますが、さらに PUT にカスタム値を使用することもできます。
# Creation:
# 10,msgId,method,api,response,byId,externalIdTyoe,custom1.path,custom1.type,custom1.value
10,999,PUT,INVENTORY,,false,c8y_Serial,c8y_MyCustomValue,STRING,
# Usage:
999,myDeviceImei,myValue
アラームの PUT テンプレートは、アラームのタイプを使用して、更新するアラームを見つけます。最初に ACTIVE アラームをチェックし、アクティブアラームがない場合は、ACKNOWLEDGED アラームをチェックします。
# Creation:
# 10,msgId,method,api,response,type,custom1.path,custom1.type,custom1.value
10,999,PUT,ALARM,,c8y_MyCustomAlarm,status,ALARMSTATUS
# Usage:
999,CLEARED
オペレーションの PUT テンプレートは、オペレーションのフラグメントを使用してオペレーションを見つけます。最初に EXECUTING オペレーションをチェックし、EXECUTING オペレーションがない場合は PENDING オペレーションをチェックします。
# Creation:
# 10,msgId,method,api,response,fragment,custom1.path,custom1.type,custom1.value
10,999,PUT,OPERATION,,c8y_MyOperation,status,OPERATIONSTATUS,SUCCESSFUL,c8y_Fragment.val,NUMBER,
# Usage:
999,24
カスタムプロパティの追加
すべての POST および PUT 値を使用すると、テンプレートの結果にカスタムプロパティを追加できます。
1 つのカスタムプロパティでは、テンプレートの作成に次の 3 つの値を追加する必要があります。
フィールド | 説明 |
---|---|
path | 設定する値の Json パス |
type | 値のオプションのデータ型。デフォルト:STRING |
value | 設定する値。このフィールドを空のままにすると、 クライアントはテンプレートを使用するときに値を送信する必要があります |
タイプ | 説明 |
---|---|
STRING | デフォルトの型。値の追加検証はありません |
DATE | ISO 8601 形式のタイムスタンプ。 日付を使用し、タイムスタンプを送信しないと、サーバー時刻が使用されます |
NUMBER | 整数または小数点以下の数字 |
INTEGER | 整数 |
UNSIGNED | 整数(正のみ) |
FLAG | 空のマップ(例:c8y_IsDevice: {})。 クライアントはこの値に対して何も送信する必要はありません |
SEVERITY | アラームの重大度。アラームの重大度フィールドを更新するために使用されます |
ALARMSTATUS | アラームの状態。アラームのステータスフィールドを更新するために使用します |
OPERATIONSTATUS | オペレーションの状態。 オペレーションのステータスフィールドを更新するために使用します |
例
追加のカスタムプロパティでアラームをクリアするためのテンプレート
# Creation:
10,999,PUT,ALARM,,c8y_MyCustomALarm,status,ALARMSTATUS,CLEARED,c8y_CustomFragment.reason,STRING,
# Usage:
999,Device resolved alarm on its own
カスタムメジャーメントを作成するためのテンプレート
# Creation:
10,999,POST,MEASUREMENT,,c8y_CustomMeasurement,,c8y_CustomMeasurement.custom.value,NUMBER,,c8y_CustomMeasurement.custom.unit,STRING,X
# Usage:
999,30.6
デバイスのプロパティを更新するためのテンプレート
# Creation:
10,999,PUT,INVENTORY,,false,c8y_Serial,c8y_MyCustomValue,STRING,
# Usage:
999,myDeviceImei,updatedValue
応答テンプレート
SmartREST 2.0応答テンプレートは、SmartREST 1.0と同じ構造を使用します。
フィールド | データ型 | 必須 | 説明 |
---|---|---|---|
messageId | String | はい | コレクション内のテンプレートを参照する一意の ID |
base | String | いいえ | すべてのパターンが使用する Json パスプレフィックス |
condition | String | いいえ | パターンを使用するためにオブジェクトに存在する必要がある Json パス |
pattern | List<String> | はい | オブジェクトから抽出されてデバイスに返される Json パスのリスト |
応答テンプレートはすべてのオペレーションと、true で応答フィールドを定義するすべての要求テンプレートに使用されます。いずれの場合も、サーバーは登録されたすべての応答テンプレートを試行するため、1 つのオペレーションまたは要求に対して複数の応答行がある場合があります。
SmartREST 2.0 は、条件が真(または条件が定義されていない)の場合、常に応答テンプレートを返します。解決されなかったパターンは、空の文字列として返されます。
条件フィールドを使用して、応答テンプレートを返すタイミングを制御する必要があります。
次の例では、データのクエリ方法とカスタムオペレーションの解析方法を示します。
デバイス オブジェクトからのクエリデータ
デバイス オブジェクト:
{
"id": "12345",
"type": "myMqttDevice",
"c8y_IsDevice": {},
"c8y_Configuration": "val1=1\nval2=2"
}
テンプレート作成:
10,999,GET,INVENTORY,,true
11,888,,c8y_IsDevice,type,c8y_Test,c8y_Configuration
クライアントからのパブリッシュ:
999,12345
クライアントへの受信情報:
888,myMqttDevice,,"val1=1\nval2=2"
カスタムオペレーションの解析
オペレーションオブジェクト:
{
"id": "12345",
"deviceId": "67890",
"agentId": "67890",
"status": "PENDING",
"c8y_CustomConfiguration": {
"val1": "1",
"val2": "2",
"customValues": ["a", "b", "c"]
},
"description": "Send custom configuration"
}
テンプレート作成:
11,111,c8y_CustomConfiguration,deviceId,val1,val2,customValues[*]
11,222,,deviceId,c8y_CustomConfiguration.val1,c8y_CustomConfiguration.val2
11,333,,deviceId,val1,val2,customValues[*]
11,444,c8y_CustomConfiguration,c8y_CustomConfiguration.val3,val1,val2,customValues[*]
クライアント受信情報(ClientId が「myMqttTestDevice」であると仮定):
111,myMqttTestDevice,1,2,a,b,c
222,myMqttTestDevice,1,2
333,myMqttTestDevice,,,
条件がオペレーションと一致しないため、テンプレート 444 は返されません。
複数のオブジェクトを持つキーを含むデバイスオブジェクトからのクエリデータ
デバイスオブジェクト:
{
"id": "12345",
"name": "test",
"type": "c8y_MQTTdevice",
"c8y_IsDevice": {},
"myList": [
{
"pid": 12345,
"type": "test"
},
{
"pid": 123456,
"type": "test2"
}
]
}
テンプレート作成:
10,999,GET,INVENTORY,,true
11,888,,,"$.myList[*].type"
クライアントからのパブリッシュ:
999,12345
クライアントへの受信情報:
888,test,test2
デフォルトコレクションの使用
トピックの一部としてX-IDを使用すると、複数のテンプレート コレクションを簡単に使用できますが、メッセージごとにバイトが追加されます。
いずれにしても、デバイスがほとんど(または完全に)単一のコレクションを使用する場合は、このコレクションをデフォルトのコレクションとして指定することをお勧めします。
デフォルトのコレクションを指定すると、クライアントは X-ID を必要としない特別なトピックを使用でき、代わりにサーバーは前に指定された X-ID を使用します。トピックは、パブリッシュの場合は s/ud、サブスクライブの場合は s/dd です。
MQTT ClientId 内で X-ID を指定できます(MQTT 実装 参照)。
MQTT ClientId は、次のようになります。
d:myDeviceSerial:myDefaultTemplateXID
d:
を含める必要があります。MQTT 接続の確立時に、デフォルトのテンプレートが存在する必要はありません(クライアントが使用すると検証されます)。