Anpassade datakanaler med holografisk fjärrkommunikation och Windows Mixed Reality-API:et

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 den möjliggör kommunikation mellan de två anpassade apparna.

Tips

Ett enkelt pingisexempel finns i fjärr- och spelarexemplen i github-lagringsplatsen Holographic Remoting-exempel. Ta bort kommentarer #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE i SampleRemoteApp.h/SamplePlayerMain.h-filerna för att aktivera exempelkoden.

Skapa en anpassad datakanal

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

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 tillhandahåller en CreateDataChannel() metod 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 vilken prioritetsdata för den här kanalen överförs till den andra sidan. På fjärrsidan sträcker sig giltiga kanal-ID:t från 0 upp till och med 63. På spelarsidan är giltiga kanal-ID:t 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

För att 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 båda sidor och tillhandahåller ett IDataChannel objekt som kan användas för att skicka och ta emot data över den här kanalen.

Så här registrerar du 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 händelsen för objektet IDataChannel 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 över en anpassad datakanal använder du IDataChannel::SendData() metoden . Den första parametern är en winrt::array_view<const uint8_t> till 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 OnClosed händelsen när den anpassade datakanalen har stängts.

m_customDataChannel.Close();

Se även