Anpassade datakanaler med Holographic Remoting och WINDOWS MIXED REALITY-API:et

Använd anpassade datakanaler för att skicka anpassade data via en upprättad fjärranslutning.

Viktigt

Anpassade datakanaler kräver en anpassad fjärrapp och en anpassad spelarapp, eftersom det möjliggör kommunikation mellan de två anpassade apparna.

Tips

Ett enkelt ping-jag-exempel finns i fjärr- och spelar-exemplen på GitHub-lagringsplatsen Holographic Remoting Samples. Avkommentera #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE i filerna SampleRemoteApp.h/SamplePlayMain.h för att aktivera exempelkoden.

Skapa en anpassad datakanal

Följande fält krävs för att skapa en anpassad datakanal:

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;

När en anslutning har upprättats kan du skapa nya datakanaler från antingen fjärrsidan, spelarsidan eller båda. Både RemoteContext och PlayerContext är en metod för CreateDataChannel() att skapa datakanaler. Den första parametern är kanal-ID:t, som används för att identifiera datakanalen i senare åtgärder. Den andra parametern är den prioritet som anger med vilka prioritetsdata för den här kanalen som överförs till den andra sidan. På fjärrsidan sträcker sig giltiga kanal-ID:er från 0 upp till och med 63. På spelarsidan är giltiga kanal-ID:er från 64 upp till och med 127. Giltiga prioriteringar är Low, Mediumeller High.

Så här startar du skapandet av en datakanal på fjärrsidan :

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

Så här startar du skapandet av en datakanal på spelarsidan :

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

Anteckning

Om du vill skapa en ny anpassad datakanal behöver bara en sida (antingen en fjärr- eller spelare) anropa CreateDataChannel metoden .

Hantera anpassade datakanalhändelser

För att upprätta en anpassad datakanal OnDataChannelCreated måste händelsen hanteras (både på spelaren och på fjärrsidan). Den utlöses när en användardatakanal IDataChannel har skapats av endera sidan och tillhandahåller ett -objekt som kan användas för att skicka och ta emot data via den här kanalen.

Registrera en lyssnare på händelsen 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...
    });

Om du vill bli meddelad när data tas emot registrerar du till OnDataReceived händelsen på IDataChannel objektet som tillhandahålls av OnDataChannelCreated hanteraren. Registrera dig för OnClosed händelsen för att få ett meddelande när datakanalen har stängts.

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

Skicka data

Om du vill skicka data via en anpassad datakanal använder du IDataChannel::SendData() metoden . Den första parametern är winrt::array_view<const uint8_t> en för de data som ska skickas. Den andra parametern anger var data ska skickas igen tills den andra sidan bekräftar mottagandet.

Viktigt

I händelse av dåliga nätverksförhållanden kan samma datapaket tas emot mer än en gång. Den mottagande koden måste kunna hantera den här situationen.

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

Stänga en anpassad datakanal

Om du vill stänga en anpassad datakanal använder du IDataChannel::Close() metoden . Båda sidor meddelas av händelsen OnClosed när den anpassade datakanalen har stängts.

m_customDataChannel.Close();

Se även