Niestandardowe kanały danych z funkcją komunikacji zdalnie holograficznej i interfejsem API Windows Mixed Reality

Użyj niestandardowych kanałów danych, aby wysyłać niestandardowe dane za pośrednictwem ustanowionego połączenia komunikacji wirtualnej.

Ważne

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

Porada

Prosty przykład ping-ponga można znaleźć w repozytorium github przykładów zdalnego i odtwarzacza w repozytorium GitHub Holographic Remoting. Usuń komentarz #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE wewnątrz plików 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łach. Zarówno RemoteContext, jak i PlayerContext udostępniają metodę CreateDataChannel() tworzenia kanałów danych. Pierwszy parametr to identyfikator kanału, który służy do identyfikowania kanału danych w kolejnych operacjach. Drugi parametr jest priorytetem określającym, z jakim priorytetem dane tego kanału są przesyłane do drugiej strony. Po stronie zdalnej prawidłowe identyfikatory kanałów wahają się od 0 do 63. Po stronie odtwarzacza prawidłowe identyfikatory kanałów są od 64 do 127. Prawidłowe priorytety to Low, Mediumlub 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ć metodę CreateDataChannel .

Obsługa niestandardowych zdarzeń kanału danych

Aby ustanowić niestandardowy kanał danych, OnDataChannelCreated zdarzenie musi być obsługiwane (zarówno po stronie odtwarzacza, jak i zdalnego). Wyzwala on, gdy kanał danych użytkownika został utworzony obok siebie i udostępnia IDataChannel obiekt, który może służyć do wysyłania i odbierania danych za pośrednictwem tego kanału.

Aby zarejestrować odbiornik w zdarzeniu 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...
    });

Aby otrzymywać powiadomienia o odebraniu OnDataReceived danych, zarejestruj się w zdarzeniu w IDataChannel obiekcie dostarczonym OnDataChannelCreated przez program obsługi. Zarejestruj się w zdarzeniu OnClosed , aby otrzymywać powiadomienia 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 wysyłać dane za pośrednictwem niestandardowego kanału danych, użyj IDataChannel::SendData() metody . Pierwszy parametr jest parametrem winrt::array_view<const uint8_t> do danych, które powinny być wysyłane. Drugi parametr określa, gdzie dane powinny być ponownie wyślij, aż druga strona potwierdzi odbiór.

Ważne

W przypadku nieprawidłowych warunków sieciowych ten sam pakiet danych może pojawić się 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 . Obie strony będą powiadamiane przez OnClosed zdarzenie po zamknięciu niestandardowego kanału danych.

m_customDataChannel.Close();

Zobacz też