アプリケーション開発

イベントメッセージ

デバイスによっては、リクエスト・レスポンス型のサービスだけでなく、非同期にイベント情報を通知するサービスもあります。Symphony はダッシュボードとの間で非同期イベント通知に対応するため、WebSocket チャネルを提供しています。

WebSocket で Symphony と接続した直後に、Symphony からセッションキーが与えられます。非同期イベント通知を提供するサービスに対してリクエストを送る際に、このセッションキーをパラメータとして送信する必要があります (パラメータ名: sessionKey)。リクエストが成立すると、デバイスからの非同期イベント情報は、WebSocket チャネルを通して送られてきます。

利用可能なサービスのうち、非同期イベント通知のリクエストに対応したサービスかどうかを知るには、ActionProfileInfo オブジェクトの x-type プロパティの値を確認します。この値が "event" であれば、非同期イベント通知に対応したサービスです。通常、通知開始はメソッドが "put"、通知停止は "delete" です。

非同期イベント通知開始のサービスプロファイル情報の例
{
  "/ticktack": {
    "put": {
      "summary": "クロック開始",
      "x-type": "event",
      "parameters": [...],
      ...
    }
  }
}
非同期イベント通知停止のサービスプロファイル情報の例
{
  "/ticktack": {
    "delete": {
      "summary": "クロック停止",
      "x-type": "event",
      "parameters": [...],
      ...
    }
  }
}

requestAction() メソッドを使うと、WebSocket 接続、セッションキー受信、および、リクエスト時のセッションキー送信といった一連の手順はすべて自動的に行われます。非同期メッセージを受信するためには、setOnWebSocketListener メソッドでリスナーをセットします。

// 非同期イベント通知を提供するサービスにリクエストを送信
SymphonyObject actionParam = new SymphonyObject.Builder()
    .put("actionId", "ac-AB6C1C34E5101D6DB2F7EEBE9F0975F1")
    .build();
dSymphony.requestAction(actionParam).thenAccept(res -> {
    // 非同期イベント通知受信のイベントハンドラをセット
    dSymphony.setOnWebSocketListener(new OnWebSocketListener() {
        @Override
        public void onMessage(SymphonyObject message) {
            Log.d(TAG, "Received message: " + message);
        }
        @Override
        public void onClose() {
            Log.d(TAG, "WebSocket closed.");
        }
    });
}).exceptionally(ex -> {
    Log.e(TAG, "", ex);
});

一方、request() メソッドを使う場合は、手動で一連の手順を実行する必要があります。openWebSocket() メソッドを使って WebSocket チャネルを用意します。WebSocket チャネル確立に成功するとセッションキーが得られます。そのセッションキーを request() メソッドにパラメータとして与えます。

// WebSocket 接続
dSymphony.openWebSocket().thenCompose(sessionKey -> {
    // 非同期イベント通知を提供するサービスにリクエストを送信
    SymphonyObject param = new SymphonyObject.Builder()
        .put("path", "/clock/ticktack")
        .put("method", "put")
        .put("thingId", thingId)
        .put("parameters", new SymphonyObject.Builder().put("sessionKey", sessionKey).build())
        .build();
    return dSymphony.request(param);
}).thenAccept(res -> {
    // 非同期イベント通知受信のイベントハンドラをセット
    dSymphony.setOnWebSocketListener(new OnWebSocketListener() {
        @Override
        public void onMessage(SymphonyObject message) {
            Log.d(TAG, "Received message: " + message);
        }
        @Override
        public void onClose() {
            Log.d(TAG, "WebSocket closed.");
        }
    });
}).exceptionally(ex -> {
    Log.e(TAG, "", ex);
	return null;
});

requestAction()request() メソッドのいずれの場合も、WebSocket チャネルを自動的に切断することはしません。もし非同期イベント通知を停止したら、closeWebSocket() メソッドを呼び出してください。

setOnWebSocketListener()

このメソッドは、本 SDK のインスタンスに OnWebSocketListenerを設定します。OnWebSocketListenerによって、WebSocketチャネル経由で通知される非同期メッセージ、およびWebSocketチャネルの切断イベントを受信できます。

dSymphony.setOnWebSocketListener(new OnWebSocketListener() {
    @Override
    public void onMessage(SymphonyObject message) {
        Log.d(TAG, "Received message: " + message);
    }

    @Override
    public void onClose() {
        Log.d(TAG, "WebSocket closed.");
    }
});

getWebSocketSession()

このメソッドは、WebSocket チャネルが確立済みの場合、セッションキーを返します。そうでない場合、nullを返します。

openWebSocket()

このメソッドは Symphony と WebSocket チャネルを確立します。このメソッドは、CompletableFuture オブジェクトを返します。WebSocket チャネルの確立に成功すると、コールバック関数にはセッションキーが引き渡されます。

dSymphony.openWebSocket().thenAccept(session_key -> {
    Log.d(TAG, session_key);
}).exceptionally(ex -> {
    Log.e(TAG, "", ex);
    return null;
});

closeWebSocket()

このメソッドは Symphony との WebSocket チャネルを切断します。

dSymphony.closeWebSocket().thenAccept(() -> {
    Log.d(TAG, "WebSocket closed");
}).exceptionally(ex -> {
    Log.e(TAG, "Failed to close WebSocket", ex);
    return null;
});