Custom Holographic Remoting-datakanaler

Om Holographic Remoting är nytt för dig kanske du vill läsa vår översikt.

Anteckning

Den här vägledningen är specifik för Holographic Remoting på HoloLens 2 och Windows datorer som kör Windows Mixed Reality.

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

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-ra-exempel finns i fjärr- och spelarexempel i Holographic Remoting-exempel på github-lagringsplatsen. Avkommentera #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE i sampleRemoteApp.h/SampleMain.h-filerna 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 CreateDataChannel() för 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 prioriteter Low är Medium , eller 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 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 har skapats av endera sidan och innehåller ett -objekt som kan användas för att skicka och IDataChannel ta emot data via den här kanalen.

Registrera en lyssnare för OnDataChannelCreated händelsen:

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 få ett meddelande när data tas emot registrerar du OnDataReceived dig för händelsen för objektet som tillhandahålls av IDataChannel 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 mottagningen.

Viktigt

Vid dåliga nätverksförhållanden kan samma datapaket komma 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