アプリケーション開発
イベントメッセージ
デバイスによっては、リクエスト・レスポンス型のサービスだけでなく、非同期にイベント情報を通知するサービスもあります。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;
});