Niestandardowe kanały danych komunikacji zdalnej holograficznej

Jeśli jesteś nowym użytkownikom systemu Holographic Remoting, zapoznaj się z naszym omówieniem.

Uwaga

Te wskazówki są specyficzne dla systemu Holographic Remoting na komputerach HoloLens 2 i Windows z systemem Windows Mixed Reality.

Niestandardowe kanały danych są wykorzystywane do wysyłania danych niestandardowych za pośrednictwem ustanowionego połączenia komunikacji zdalnej.

Ważne

Niestandardowe kanały danych wymagają niestandardowej aplikacji zdalnej i niestandardowej aplikacji odtwarzacza, ponieważ umożliwiają komunikację między dwiema niestandardowymi aplikacjami.

Porada

Prosty przykład ping-pong można znaleźć w przykładach zdalnych i odtwarzaczach w repozytorium GitHub Przykłady dotyczące komunikacji zdalnej systemu Holographic. Odłącz plik #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE SampleRemoteApp.h / SamplePlayerMain.h, aby włączyć przykładowy kod.

Tworzenie niestandardowego kanału danych

Aby utworzyć niestandardowy kanał danych, wymagane są następujące pola:

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;

Po pomyślnym nawiązaniu połączenia można utworzyć nowe kanały danych po stronie zdalnej, po stronie odtwarzacza lub obu tych kanałów. Zarówno remoteContext, jak i PlayerContext zapewniają CreateDataChannel() metodę tworzenia kanałów danych. Pierwszy parametr to identyfikator kanału, który jest używany do identyfikowania kanału danych w późniejszych operacjach. Drugi parametr to priorytet określający, za pomocą którego priorytetu dane tego kanału są przesyłane do drugiej strony. Po stronie zdalnej prawidłowy identyfikator kanału może mieć zakres od 0 do 63 włącznie. Po stronie odtwarzacza prawidłowe identyfikatory kanałów to od 64 do 127 włącznie. Prawidłowe priorytety to Low , Medium lub High .

Aby rozpocząć tworzenie kanału danych po stronie zdalnej:

// Valid channel ids for channels created on the remote side are 0 up to and including 63
m_remoteContext.CreateDataChannel(0, DataChannelPriority::Low);

Aby rozpocząć tworzenie kanału danych po stronie odtwarzacza:

// Valid channel ids for channels created on the player side are 64 up to and including 127
m_playerContext.CreateDataChannel(64, DataChannelPriority::Low);

Uwaga

Aby utworzyć nowy niestandardowy kanał danych, tylko jedna strona (zdalna lub odtwarzacz) musi wywołać CreateDataChannel metodę .

Obsługa niestandardowych zdarzeń kanału danych

Aby ustanowić niestandardowy kanał danych, wydarzenie musi być obsługiwane (zarówno po stronie odtwarzacza, jak OnDataChannelCreated i po stronie zdalnej). Jest on wyzwalany po utworzeniu kanału danych użytkownika po obu stronach i udostępnia obiekt , który może służyć do wysyłania i odbierania danych IDataChannel za pośrednictwem tego kanału.

Aby zarejestrować odbiornik w OnDataChannelCreated zdarzeniu:

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...
    });

Aby otrzymać powiadomienie o otrzymaniu danych, zarejestruj się w OnDataReceived zdarzeniu w IDataChannel obiekcie dostarczonym przez program OnDataChannelCreated obsługi. Zarejestruj się OnClosed w zdarzeniu, aby otrzymać powiadomienie o zamknięciu kanału danych.

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;
        }
    });

Wysyłanie danych

Aby wysłać dane za pośrednictwem niestandardowego kanału danych, użyj IDataChannel::SendData() metody . Pierwszy parametr jest do winrt::array_view<const uint8_t> danych, które należy wysłać. Drugi parametr określa, gdzie należy ponownie wysłać dane, do momentu potwierdzenia odbioru przez drugą stronę.

Ważne

W przypadku złych warunków sieciowych ten sam pakiet danych może zostać odebrany więcej niż raz. Kod odbierający musi być w stanie obsłużyć tę sytuację.

uint8_t data[] = {1};
m_customDataChannel.SendData(data, true);

Zamykanie niestandardowego kanału danych

Aby zamknąć niestandardowy kanał danych, użyj IDataChannel::Close() metody . Po zamknięciu niestandardowego kanału danych obie strony będą powiadamiane o OnClosed zdarzeniu.

m_customDataChannel.Close();

Zobacz też