홀로그램 원격 및 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();

참고 항목