Skip to content

Manager Plugin Communication Format

TakayukiHoshi1984 edited this page Mar 27, 2017 · 1 revision

Managerとプラグイン間の通信について

ここでは、Device Connect Managerとプラグインの間で行われる通信のフォーマットについて説明を行います。

Device Connect Managerは、HTTPリクエストで受信した命令を、DConnectRequestMessageに変換して、各プラグインに配送します。

各プラグインは、Device Connect Managerから送れてきたDConnectRequestMessageからリクエスト情報を取得して、処理を行います。
そして、処理の結果をレスポンスをDConnectResponseMessageに格納して、Device Connect Managerに返却します。

Device Connect Managerは、プラグインから送られてきたDConnectResponseMessageからレスポンス情報を取得し、JSONに変換して、HTTPレスポンスのボディに格納してアプリに返却します。

HTTPリクエストからDConnectRequestMessageへ変換

Device Connect システムのWebAPIでは、以下のようにHTTPリクエストが定義してあります。

{METHOD} http://localhost:4035/{api}/{profile}/{interface}/{attribute}?{key1}={value1}&{key2}={value2}

Device Connect Managerでは、HTTPリクエストを解析し、DConnectRequestMessageに変換して、各プラグインに配送します。
ここでは、HTTPリクエストからDConnectRequestMessageに変換する方法を解説します。

変換方法

  1. HTTPメソッドをDConnectRequestMessageのactionに格納します。
  2. URLパスは、api, profile, interface, attributeから成り立ち、それぞれDConnectRequestMessageのパラメータに格納します。
  3. URLのクエリパラメータは、そのままDConnectRequestMessageのパラメータとしてします。

1. HTTPメソッド

HTTPメソッドは、以下のように変換して、DConnectRequestMessageのactionに格納します。

HTTPメソッド DConnectRequestMessageのaction
GET DConnectMessageActionTypeGet
PUT DConnectMessageActionTypePutT
POST DConnectMessageActionTypePost
DELETE DConnectMessageActionTypeDelete

2. URLパス

HTTPリクエストのパスは、各セグメントを以下のようにapi、profile、interfce、attributeのパラメータ名に変換して、DConnectRequestMessageのパラメータに格納します。

DConnectRequestMessageのキー DConnectRequestMessageのバリュー
api {api}
profile {profile}
interface {interface}
attribute {attribute}

interface、attributeについては、省略されることがあります。
省略された時には、これらの要素はDConnectRequestMessageには含みません。

3. URLクエリパラメータ

HTTPリクエストのクエリパラメータは、そのままDConnectRequestMessageのパラメータに格納します。

DConnectRequestMessageのキー DConnectRequestMessageのバリュー
{key1} {key1}
{key2} {key2}

変換例1

例) アクセストークンを要求する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の定義ファイルを用いて確認を行っています。

DConnectResponseMessageからHTTPレスポンス(JSON)への変換

Device Connect Managerでは、プラグインからのDConnectResponseMessageのレスポンスをの値をJSONに変換して、レスポンスボディとして返却します。

ここでは、DConnectResponseMessageからJSONに変換する方法を説明します。

変換方法

  1. DConnectResponseMessageは、JSONのルートオブジェクト(JSONObject)として格納します。
  2. DConnectResponseMessageに格納されたkey-valueは、JSONのルートオブジェクトにkey-valuとして格納します。
  3. DConnectMessageは、JSONのオブジェクト(JSONObject)として格納します。
  4. 配列は、JSONの配列(JSONArray)として格納します。

1. DConnectResponseMessage型

DConnectResponseMessageのExtraは、JSONObjectのルートオブジェクトになります。
何も追加しない場合には、JSONObjectのみになります。

{
}

2. プリミティブ型

プリミティブは、そのままJSONObjectに格納します。

[response setInteger:0 forKey:@"result"];
[response setFloat:0.5f forKey:@"level"];
[response setString:@"name" forKey:@"name"];
{
    "result": 0,
    "level": 0.5,
    "name": "name"
}

3. DConnectMessage型

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
        }
    }
}

4. NSArray型

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
        }
    ]
}

5. Fileのパス

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"
}

変換例1

例) DConnectMessageをDConnectArrayに持つレスポンスをJSONオブジェクトに変換します。

変換前のDConnectResponseMessageデータ
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"];
変換後のJSON
{
    "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
        }
    ]
}

変換例2

例) ファイルパスを持つレスポンスをJSONオブジェクトに変換します。

変換前のDConnectResponseMessageデータ
[response setInteger:0 forKey:@"result"];
[response setString:@"/private/var/mobile/Containers/Data/Application/XXXX-XXXXX/abcdef012344567/test.png" forKey:@"uri"];
変換後のJSON
{
    "result": 0,
    "uri": "http://localhost:4035/files?uri=c/private/var/mobile/Containers/Data/Application/XXXX-XXXXX/abcdef012344567/test.png"
}

Clone this wiki locally