Version
최신 버전은 1.1 입니다.
Version |
Date |
Description |
1.0 |
2019.11.24 |
규격 추가 |
1.1 |
2020.01.08 |
CommandIssued event 추 |
Precondition
Extension interface 를 사용한 Play 를 제작하기 위해서는 제휴담당자에게 요청하여 권한을 획득해야 합니다.
Play 개발자와 Application 개발자는 Context, Directive, Event 의 data 필드에 대한 데이터 구조를 협의해야 합니다.
SDK Interface
ExtensionAgent 사용
Extension interface 규격에 따른 디바이스의 동작 제어는 ExtensionAgent 가 처리합니다.
NuguAndroidClient instance 를 통해 ExtensionAgent instance 에 접근할 수 있습니다.
복사성공!
1
|
val extensionAgent = nuguAndroidClient.extensionAgent
|
NuguAndroidClient 생성시 ExtensionAgentInterface.Client 를 추가합니다.
복사성공!
1
2
3
4
5
|
class MyExtensionAgentClient: ExtensionAgentInterface.Client {
...
}
NuguAndroidClient.Builder(...)
.enableExtension(MyExtensionAgentClient())
|
NuguClient instance 를 통해 ExtensionAgent instance 에 접근할 수 있습니다.
복사성공!
1
|
let extensionAgent = nuguClient.extensionAgent
|
CapabilityFactory::makeCapability 함수로 ExtensionAgent 를 생성하고 NuguClient 에 추가해 주어야합니다.
복사성공!
1
2
3
4
5
6
|
auto extension_handler(std::shared_ptr<IExtensionHandler>(
CapabilityFactory::makeCapability<ExtensionAgent, IExtensionHandler>()));
nugu_client->getCapabilityBuilder()
->add(extension_handler.get())
->construct();
|
Context 구성 및 기능 실행
Play 에서 알아야 하는 디바이스/Application 의 정보를 Context 에 포함시켜 주어야 합니다.
특정 기능의 실행이 Action directive 로 요청될 수 있습니다.
ExtensionAgentInterface.Client 를 구현합니다.
복사성공!
1
2
3
4
5
6
7
8
9
10
|
class MyExtensionAgentClient : ExtensionAgentInterface.Client {
override fun getData(): String? {
// json string
...
}
override fun action(data: String, playServiceId: String): Boolean {
...
}
}
|
ExtensionAgentDelegate 를 추가합니다.
복사성공!
1
2
3
4
5
6
7
8
9
10
|
class MyExtensionAgentDelegate: ExtensionAgentDelegate {
func extensionAgentRequestContext() -> [String: AnyHashable]? {
...
}
func extensionAgentDidReceiveAction(data: [String: AnyHashable], playServiceId: String, dialogRequestId: String, completion: @escaping (Bool) -> Void) {
...
}
}
extensionAgent.delegate = MyExtensionAgentDelegate()
|
IExtensionListener를 추가합니다.
복사성공!
1
2
3
4
5
6
7
8
9
10
11
|
class ExtensionListener : public IExtensionListener {
public:
...
void receiveAction(const std::string& data, const std::string& ps_id, const std::string& dialog_id) override
{
...
}
};
auto extension_listener(std::make_shared<ExtensionListener>());
CapabilityFactory::makeCapability<ExtensionAgent, IExtensionHandler>(extension_listener.get());
|
기능 요청
특정 기능 실행을 CommandIssued event 로 요청할 수 있습니다.
복사성공!
1
|
extensionAgent.issueCommand(playServiceId, data, callback)
|
복사성공!
1
|
extentionAgent.requestCommand(data: data, playServiceId: playServiceId)
|
1
|
extension_handler->commandIssued(play_service_id, data)
|
Context
복사성공!
1
2
3
4
5
6
|
{
"Extension": {
"version": "1.1",
"data": {}
}
}
|
parameter |
type |
mandatory |
description |
data |
object |
N |
임의의 JSON object |
Directive
Action
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"header": {
"namespace": "Extension",
"name": "Action",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}",
"version": "1.0"
},
"payload": {
"playServiceId": "{{STRING}}",
"data": {}
}
}
|
parameter |
type |
mandatory |
description |
data |
object |
Y |
임의의 JSON object |
Event
ActionSucceeded
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"header": {
"namespace": "Extension",
"name": "ActionSucceeded",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}",
"version": "1.0"
},
"payload": {
"playServiceId": "{{STRING}}"
}
}
|
ActionFailed
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"header": {
"namespace": "Extension",
"name": "ActionFailed",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}",
"version": "1.0"
},
"payload": {
"playServiceId": "{{STRING}}"
}
}
|
CommandIssued
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"header": {
"namespace": "Extension",
"name": "CommandIssued",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}",
"version": "1.1"
},
"payload": {
"playServiceId": "{{STRING}}",
"data": {}
}
}
|
parameter |
type |
mandatory |
description |
data |
object |
Y |
임의의 JSON object |