Extension

정의되지 않은 기능을 수행하기 위한 규격

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 가 처리합니다.

  • Android
  • iOS
  • Linux

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 로 요청될 수 있습니다.

  • Android
  • iOS
  • Linux

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 로 요청할 수 있습니다.

  • Android
  • iOS
  • Linux
복사성공!
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