홀로그램 원격 및 Windows Mixed Reality API를 사용하는 사용자 지정 데이터 채널
사용자 지정 데이터 채널을 사용하여 설정된 원격 연결을 통해 사용자 지정 데이터를 보냅니다.
중요
사용자 지정 데이터 채널에는 두 사용자 지정 앱 간의 통신을 허용하므로 사용자 지정 원격 앱과 사용자 지정 플레이어 앱이 필요합니다.
팁
간단한 ping-pong 예제는 홀로그램 원격 샘플 github 리포지토리 내의 원격 및 플레이어 샘플에서 찾을 수 있습니다. 샘플 코드를 사용하도록 설정하기 위해 SampleRemoteApp.h/SamplePlayerMain.h 파일 내에서 주석 #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
처리를 제거합니다.
사용자 지정 데이터 채널 만들기
사용자 지정 데이터 채널을 만들려면 다음 필드가 필요합니다.
std::recursive_mutex m_customDataChannelLock;
winrt::Microsoft::Holographic::AppRemoting::IDataChannel m_customDataChannel = nullptr;
winrt::Microsoft::Holographic::AppRemoting::IDataChannel::OnDataReceived_revoker m_customChannelDataReceivedEventRevoker;
winrt::Microsoft::Holographic::AppRemoting::IDataChannel::OnClosed_revoker m_customChannelClosedEventRevoker;
연결이 성공적으로 설정되면 원격 쪽, 플레이어 쪽 또는 둘 다에서 새 데이터 채널을 만들 수 있습니다. RemoteContext와 PlayerContext는 모두 데이터 채널을 만드는 방법을 제공합니다 CreateDataChannel()
. 첫 번째 매개 변수는 이후 작업에서 데이터 채널을 식별하는 데 사용되는 채널 ID입니다. 두 번째 매개 변수는 이 채널의 우선 순위 데이터가 다른 쪽으로 전송되는 우선 순위를 지정하는 우선 순위입니다. 원격 쪽에서 유효한 채널 ID 범위는 0에서 63까지입니다. 플레이어 쪽에서 유효한 채널 ID는 64개에서 127개까지입니다. 유효한 우선 순위는 , Medium
또는 High
입니다Low
.
원격 쪽에서 데이터 채널 만들기를 시작하려면 다음을 수행합니다.
// Valid channel ids for channels created on the remote side are 0 up to and including 63
m_remoteContext.CreateDataChannel(0, DataChannelPriority::Low);
플레이어 쪽에서 데이터 채널 만들기를 시작하려면 다음을 수행합니다.
// Valid channel ids for channels created on the player side are 64 up to and including 127
m_playerContext.CreateDataChannel(64, DataChannelPriority::Low);
참고
새 사용자 지정 데이터 채널을 만들려면 한 쪽(원격 또는 플레이어)만 메서드를 CreateDataChannel
호출해야 합니다.
사용자 지정 데이터 채널 이벤트 처리
사용자 지정 데이터 채널을 OnDataChannelCreated
설정하려면 이벤트를 처리해야 합니다(플레이어와 원격 쪽 모두에서). 양쪽에서 사용자 데이터 채널을 만들 때 트리거되고 이 채널을 통해 데이터를 보내고 받는 데 사용할 수 있는 개체를 제공합니다 IDataChannel
.
이벤트에 수신기를 등록하려면 다음을 OnDataChannelCreated
수행합니다.
m_onDataChannelCreatedEventRevoker = m_remoteContext.OnDataChannelCreated(winrt::auto_revoke,
[this](const IDataChannel& dataChannel, uint8_t channelId)
{
std::lock_guard lock(m_customDataChannelLock);
m_customDataChannel = dataChannel;
// Register to OnDataReceived and OnClosed event of the data channel here, see below...
});
데이터가 수신될 때 알림을 받으려면 처리기에서 제공하는 OnDataChannelCreated
개체의 IDataChannel
이벤트에 등록 OnDataReceived
합니다. 이벤트에 등록하여 OnClosed
데이터 채널이 닫혔을 때 알림을 받습니다.
m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived(winrt::auto_revoke,
[this]()
{
// React on data received via the custom data channel here.
});
m_customChannelClosedEventRevoker = m_customDataChannel.OnClosed(winrt::auto_revoke,
[this]()
{
// React on data channel closed here.
std::lock_guard lock(m_customDataChannelLock);
if (m_customDataChannel)
{
m_customDataChannel = nullptr;
}
});
데이터 전송
사용자 지정 데이터 채널을 통해 데이터를 보내려면 메서드를 IDataChannel::SendData()
사용합니다. 첫 번째 매개 변수는 전송해야 하는 데이터에 대한 입니다 winrt::array_view<const uint8_t>
. 두 번째 매개 변수는 다른 쪽이 수신을 승인할 때까지 데이터를 다시 전송할 위치를 지정합니다.
중요
네트워크 상태가 좋지 않으면 동일한 데이터 패킷이 두 번 이상 도착할 수 있습니다. 수신 코드는 이 상황을 처리할 수 있어야 합니다.
uint8_t data[] = {1};
m_customDataChannel.SendData(data, true);
사용자 지정 데이터 채널 닫기
사용자 지정 데이터 채널을 닫려면 메서드를 IDataChannel::Close()
사용합니다. 사용자 지정 데이터 채널이 닫힌 후에는 이벤트에 의해 OnClosed
양쪽에 알림이 표시됩니다.
m_customDataChannel.Close();