-
Notifications
You must be signed in to change notification settings - Fork 9
Manager Plugin Communication Format
ここでは、Device Connect Managerとプラグインの間で行われる通信のフォーマットについて説明を行います。
Device Connect Managerは、HTTPリクエストで受信した命令を、DConnectRequestMessageに変換して、各プラグインに配送します。
各プラグインは、Device Connect Managerから送れてきたDConnectRequestMessageからリクエスト情報を取得して、処理を行います。
そして、処理の結果をレスポンスをDConnectResponseMessageに格納して、Device Connect Managerに返却します。
Device Connect Managerは、プラグインから送られてきたDConnectResponseMessageからレスポンス情報を取得し、JSONに変換して、HTTPレスポンスのボディに格納してアプリに返却します。
Device Connect システムのWebAPIでは、以下のようにHTTPリクエストが定義してあります。
{METHOD} http://localhost:4035/{api}/{profile}/{interface}/{attribute}?{key1}={value1}&{key2}={value2}
Device Connect Managerでは、HTTPリクエストを解析し、DConnectRequestMessageに変換して、各プラグインに配送します。
ここでは、HTTPリクエストからDConnectRequestMessageに変換する方法を解説します。
- HTTPメソッドをDConnectRequestMessageのactionに格納します。
- URLパスは、api, profile, interface, attributeから成り立ち、それぞれDConnectRequestMessageのパラメータに格納します。
- URLのクエリパラメータは、そのままDConnectRequestMessageのパラメータとしてします。
HTTPメソッドは、以下のように変換して、DConnectRequestMessageのactionに格納します。
| HTTPメソッド | DConnectRequestMessageのaction |
|---|---|
| GET | DConnectMessageActionTypeGet |
| PUT | DConnectMessageActionTypePutT |
| POST | DConnectMessageActionTypePost |
| DELETE | DConnectMessageActionTypeDelete |
HTTPリクエストのパスは、各セグメントを以下のようにapi、profile、interfce、attributeのパラメータ名に変換して、DConnectRequestMessageのパラメータに格納します。
| DConnectRequestMessageのキー | DConnectRequestMessageのバリュー |
|---|---|
| api | {api} |
| profile | {profile} |
| interface | {interface} |
| attribute | {attribute} |
interface、attributeについては、省略されることがあります。
省略された時には、これらの要素はDConnectRequestMessageには含みません。
HTTPリクエストのクエリパラメータは、そのままDConnectRequestMessageのパラメータに格納します。
| DConnectRequestMessageのキー | DConnectRequestMessageのバリュー |
|---|---|
| {key1} | {key1} |
| {key2} | {key2} |
例) アクセストークンを要求するHTTPリクエストをDConnectRequestMessageに変換します。
HTTPリクエスト
GET http://lcoalhost:4035/gotapi/authorization/accessToken?clientId=xxxxx&scope=battery,serviceDiscovery,serviceInformation&applicationName=アプリ名
DConnectRequestMessageリクエスト
| DConnectRequestMessageキー | DConnectRequestMessageバリュー |
|---|---|
| action | DConnectMessageActionTypeGet |
| api | gotapi |
| profile | authorization |
| attribute | accessToken |
| clientId | xxxxx |
| scope | battery,serviceDiscovery,serviceInformation |
| applicationName | アプリ名 |
URLパスは、/gotapi/authorization/accessTokenと定義されており、interfaceが省略されています。
HTTPリクエストから送られてくるデータには、型データがありません。
その為に、型のチェックは、各プラグインがプロファイルに配送する時に、Swaggerの定義ファイルを用いて確認を行っています。
Device Connect Managerでは、プラグインからのDConnectResponseMessageのレスポンスをの値をJSONに変換して、レスポンスボディとして返却します。
ここでは、DConnectResponseMessageからJSONに変換する方法を説明します。
- DConnectResponseMessageは、JSONのルートオブジェクト(JSONObject)として格納します。
- DConnectResponseMessageに格納されたkey-valueは、JSONのルートオブジェクトにkey-valuとして格納します。
- DConnectMessageは、JSONのオブジェクト(JSONObject)として格納します。
- 配列は、JSONの配列(JSONArray)として格納します。
DConnectResponseMessageのExtraは、JSONObjectのルートオブジェクトになります。
何も追加しない場合には、JSONObjectのみになります。
{
}
プリミティブは、そのままJSONObjectに格納します。
[response setInteger:0 forKey:@"result"];
[response setFloat:0.5f forKey:@"level"];
[response setString:@"name" forKey:@"name"];
{
"result": 0,
"level": 0.5,
"name": "name"
}
DConnectMessage型がExtraに格納されていた場合には、JSONObjectに変換します。
DConnectMessageの中身は、DConnectResponseMessageと同じように変換され格納します。
DConnectMessage *message = [DConnectMessage new];
[message setInteger:0 forKey:@"result"];
[response setMessage:b forKey:@"message"];
{
"message": {
"result": 0
}
}
DConnectMessageの中にDConnectMessageが格納された場合には、JSONObjectが階層になります。
DConnectMessage *innerMessage = [DConnectMessage new];
[innerMessage setInteger:0 forKey:@"result"];
DConnectMessage *message = [DConnectMessage new];
[message setMessage:innerMessage forKey:@"message"];
[response setMessage:message forKey:@"message"];
{
"message": {
"message": {
"result": 0
}
}
}
NSArray型がDConnectMessageに格納されていた場合には、JSONArrayに変換します。
DConnectArray *list = [DConnectArray initWithArray:@[@"AA", @"BB", @"CC"]];
[response setArray:list forKey:@"name"];
{
"name": [
"AA", "BB", "CC"
]
}
NSArray型の中に、DConnectMessage型が格納されいた場合には、JSONObjectの配列にして格納します。
DConnectMessage *message1 = [DConnectMessage new];
[message1 setInteger:0 forKey:@"result"];
DConnectMessage *message2 = [DConnectMessage new];
[message2 setInteger:1 forKey:@"result"];
DConnectArray *list = [DConnectArray initWithArray:@[message1, message2]];
[response setArray:list forKey:@"messages"];
{
"messages": [
{
"result": 0
},
{
"result": 1
}
]
}
uriが含まれている場合には、Filesプロファイルへのパスに変換して格納します。
HTTPリクエスト先がブラウザや外部IPからの場合には、ファイルではアクセスすることができません。
その問題を回避するためにDevice Connect Managerでは、ファイルパスをDevice Connect Managerのサーバ経由でアクセスできるように変換して返却します。
[response setString@"/private/var/mobile/Containers/Data/Application/XXXX-XXXXX/abcdef012344567" forKey:@"uri"];
{
"uri": "http://localhost:4035/files?uri=/private/var/mobile/Containers/Data/Application/XXXX-XXXXX/abcdef012344567"
}
例) DConnectMessageをDConnectArrayに持つレスポンスをJSONオブジェクトに変換します。
DConnectMessage *message1 = [DConnectMessage new];
[message1 setString:@"xxxx/xxxx.png" forKey:@"path"];
[message1 setString:@"image/png" forKey:@"mimeType"];
[message1 setInteger:0 forKey:@"fileType"];
[message1 setString:@"xxxx.png" forKey:@"fileName"];
[message1 setLong:1234567890 forKey:@"updateDate"];
DConnectMessage *message2 = [DConnectMessage new];
[message2 setString:@"xxxx/oooo.png" forKey:@"path"];
[message2 setString:@"image/png" forKey:@"mimeType"];
[message2 setInteger:0 forKey:@"fileType"];
[message2 setString:@"oooo.png" forKey:@"fileName"];
[message2 setLong:1234567890 forKey:@"updateDate"];
DConnectArray *list = [DConnectArray initWithArray:@[message1, message2]];
[response setArray:list forKey:@"files"];
[response setInteger:0 forKey:@"result"];
{
"result": 0,
"files": [
{
"path": "xxxx/xxxx.png",
"mimeType": "image/png",
"fileType": 0,
"fileName": "xxxx.png",
"updateDate": 1234567890
},
{
"path": "xxxx/oooo.png",
"mimeType": "image/png",
"fileType": 0,
"fileName": "oooo.png",
"updateDate": 1234567890
}
]
}
例) ファイルパスを持つレスポンスをJSONオブジェクトに変換します。
[response setInteger:0 forKey:@"result"];
[response setString:@"/private/var/mobile/Containers/Data/Application/XXXX-XXXXX/abcdef012344567/test.png" forKey:@"uri"];
{
"result": 0,
"uri": "http://localhost:4035/files?uri=c/private/var/mobile/Containers/Data/Application/XXXX-XXXXX/abcdef012344567/test.png"
}