[Platinum UPnP] 101 :: (5) Device 연결하고 Action 호출하기




파일: tutorial05.cpp


이번에는 전에 만들어 두었던 "Tutorial Device"를 찾아내어 "Print" Action을 호출하는 기능을 추가합니다. 호출하는 방법은 Control-Point의 콘솔에 문자열을 입력하면 입력된 문자열을 인자로 하여 Action을 호출하는 것으로 해보겠습니다.

    미리 추가해 두었던 TutorialListener 클래스에는 OnDeviceAdded와 OnDeviceRemoved라는 한 쌍의 콜백 함수가 있습니다. OnDeviceAdded 함수는 Control-Point를 실행 했을 때 Network에 이미 존재하는 UPnP Device들 또는 Control-Point가 실행된 후 Network에 새롭게 등장한 Device들을 알려줍니다. 반면에 OnDeviceRemoved 함수는 Network에서 기존의 Device들이 사라지게 되면 알려줍니다.

    이 두 함수에 "Tutorial Device"를 찾으면 멤버변수로 저장해 두는 기능을 추가해 보겠습니다. 코드는 아래와 같습니다.


class TutorialListener : public PLT_CtrlPointListener
{
public:
	virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device)
	{
		if (device->GetFriendlyName() == "Tutorial Device") {
			printf("[Tutorial Device] added\n");
			device_ = device;
		}
		return NPT_SUCCESS;
	}

	virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device)
	{
		if (device->GetFriendlyName() == "Tutorial Device") {
			printf("[Tutorial Device] removed\n");
			device_ = 0;
		}
		return NPT_SUCCESS;
	}

	// ...

private:
	PLT_DeviceDataReference device_;
};


    먼저 Device의 정보가 담겨있는 PLT_DeviceData 객체를 저장할 멤버변수를 추가합니다. OnDeviceAdded() 함수에서는 추가된 Device가 "Tutorial Device"인지 확인하고, 맞다면 멤버변수에 저장합니다. OnDeviceRemoved() 함수에서는 사라진 Device가 "Tutorial Device"라면 멤버변수를 NULL 값으로 초기화 합니다.

    이제 콘솔의 입력을 받아 Device의 Action을 호출하는 기능을 구현하려고 합니다. 이에 앞서 콘솔의 입력을 받고 Control-Point의 조작은 main 함수에서 일어나는데 반해 Device의 정보는 TutorialListener 객체가 갖고 있습니다. 따라서 TutorialListener 객체로부터 Device 정보를 얻어오는 함수를 아래와 같이 TutorialListener 클래스에 추가합니다.


PLT_DeviceData* device(void) const
{
	return device_.AsPointer();
}


    마지막으로 main() 함수에 아래와 같이 콘솔에서 입력된 값으로 Action을 호출하는 코드를 작성합니다.


PLT_DeviceData* device = listener.device();
if (device != 0) {
	PLT_Service* service;
	device->FindServiceById("urn:upnp-org:serviceId:Tutorial.001", service);
	PLT_ActionDesc* desc = service->FindActionDesc("Print");
	PLT_ActionReference action(new PLT_Action(*desc));
	action->SetArgumentValue("String", input.c_str());
	ctrlpoint->InvokeAction(action);
}


    지금까지 작성한 코드를 빌드한 후 실행시켜 봅니다. 앞서 만든 "Tutorial Device"가 이미 실행되고 있거나, 지금 만든 Control-Point를 실행시킨 후 실행한다면, 콘솔에 "[Tutorial Device] Added"가 출력되는 것을 볼 수 있습니다. 이제 콘솔에 문자열을 입력하면, Device의 콘솔 창에 Contorol-Point에서 입력한 문자열을 입력 값으로 한 Action이 호출되었다는 정보가 출력될 것입니다.