Delen via


Aangepaste gegevenskanalen met holografische externe communicatie en de Windows Mixed Reality-API

Gebruik aangepaste gegevenskanalen om aangepaste gegevens te verzenden via een tot stand gebrachte externe verbinding.

Belangrijk

Voor aangepaste gegevenskanalen is een aangepaste externe app en een aangepaste speler-app vereist, omdat hiermee communicatie tussen de twee aangepaste apps mogelijk is.

Tip

Een eenvoudig ping-pong voorbeeld is te vinden in de externe en speler voorbeelden in de Holographic Remoting samples github repository. Verwijder de opmerking #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE in de bestanden SampleRemoteApp.h /SamplePlayerMain.h om de voorbeeldcode in te schakelen.

Een aangepast gegevenskanaal maken

Als u een aangepast gegevenskanaal wilt maken, zijn de volgende velden vereist:

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;

Nadat een verbinding tot stand is gebracht, kunt u nieuwe gegevenskanalen maken vanaf de externe kant, de spelerzijde of beide. Zowel de RemoteContext als de PlayerContext bieden een CreateDataChannel() methode voor het maken van gegevenskanalen. De eerste parameter is de kanaal-id, die wordt gebruikt om het gegevenskanaal in latere bewerkingen te identificeren. De tweede parameter is de prioriteit waarmee wordt aangegeven met welke prioriteitsgegevens van dit kanaal naar de andere kant worden overgebracht. Aan de externe kant variëren geldige kanaal-id's van 0 tot en met 63. Aan de spelerzijde zijn geldige kanaal-id's van 64 tot en met 127. Geldige prioriteiten zijn Low, Mediumof High.

Het maken van een gegevenskanaal aan de externe zijde starten:

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

Het maken van een gegevenskanaal aan de kant van de speler starten:

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

Notitie

Als u een nieuw aangepast gegevenskanaal wilt maken, hoeft slechts één kant (extern of speler) de CreateDataChannel methode aan te roepen.

Aangepaste gegevenskanaal-gebeurtenissen verwerken

Als u een aangepast gegevenskanaal tot stand wilt brengen, moet de OnDataChannelCreated gebeurtenis worden verwerkt (zowel aan de speler als aan de externe zijde). Het wordt geactiveerd wanneer een gebruikersgegevenskanaal aan beide zijden is gemaakt en biedt een IDataChannel -object dat kan worden gebruikt om gegevens via dit kanaal te verzenden en te ontvangen.

Een listener registreren voor de OnDataChannelCreated gebeurtenis:

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

Als u een melding wilt ontvangen wanneer gegevens worden ontvangen, registreert u zich bij de OnDataReceived gebeurtenis op het IDataChannel object dat door de OnDataChannelCreated handler is opgegeven. Registreer u voor de OnClosed gebeurtenis om een melding te ontvangen wanneer het gegevenskanaal is gesloten.

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

Gegevens verzenden

Gebruik de IDataChannel::SendData() methode om gegevens te verzenden via een aangepast gegevenskanaal. De eerste parameter is een winrt::array_view<const uint8_t> voor de gegevens die moeten worden verzonden. De tweede parameter geeft aan waar de gegevens opnieuw moeten worden verzonden, totdat de andere kant de ontvangst bevestigt.

Belangrijk

In het geval van slechte netwerkomstandigheden kan hetzelfde gegevenspakket meer dan één keer binnenkomen. De ontvangende code moet deze situatie kunnen afhandelen.

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

Een aangepast gegevenskanaal sluiten

Gebruik de IDataChannel::Close() methode om een aangepast gegevenskanaal te sluiten. Beide zijden worden door de gebeurtenis op de OnClosed hoogte gesteld zodra het aangepaste gegevenskanaal is gesloten.

m_customDataChannel.Close();

Zie ook