Aangepaste Holographic Remoting-gegevenskanalen

Als u nog geen tijd hebt met Holographic Remoting, kunt u ons overzicht lezen.

Notitie

Deze richtlijnen zijn specifiek voor Holographic Remoting op HoloLens 2 en Windows pc's met Windows Mixed Reality.

Gebruik aangepaste gegevenskanalen om aangepaste gegevens te verzenden via een bestaande verbinding voor communicatie via een remoting-verbinding.

Belangrijk

Aangepaste gegevenskanalen vereisen een aangepaste externe app en een aangepaste speler-app, omdat deze communicatie tussen de twee aangepaste apps mogelijk maakt.

Tip

Een eenvoudig ping-pong-voorbeeld vindt u in de voorbeelden voor externe en speler in de GitHub-opslagplaats met Holographic Remoting-voorbeelden. Decomment in #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE de sampleRemoteApp.h / SamplePlayerMain.h bestanden om de voorbeeldcode in teschakelen.

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 remoteContext als PlayerContext bieden een methode CreateDataChannel() 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 worden overgedragen naar de andere kant. Aan de externe kant variëren geldige kanaal-ID's van 0 tot en met 63. Aan de kant van de speler zijn geldige kanaal-ID's van 64 tot en met 127. Geldige prioriteiten zijn Low , Medium of High .

Ga als volgende te werk om het maken van een gegevenskanaal aan de externe kant te starten:

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

Ga als volgende te werk om het maken van een gegevenskanaal aan de kant van de speler te 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 methode aan te CreateDataChannel roepen.

Aangepaste gegevenskanaalgebeurtenissen verwerken

Als u een aangepast gegevenskanaal tot stand wilt brengen, moet de gebeurtenis worden verwerkt (zowel op de OnDataChannelCreated speler als op de externe zijde). Het wordt triggers wanneer een gebruikersgegevenskanaal aan beide zijden is gemaakt en biedt een -object dat kan worden gebruikt om gegevens via dit kanaal te verzenden IDataChannel 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 object dat door de IDataChannel OnDataChannelCreated handler wordt geleverd. Registreer u bij OnClosed de 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

Als u gegevens wilt verzenden via een aangepast gegevenskanaal, gebruikt u de IDataChannel::SendData() methode . De eerste parameter is een winrt::array_view<const uint8_t> voor de gegevens die moeten worden verzenden. De tweede parameter geeft aan waar de gegevens opnieuw moeten worden ontvangen, 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 methode om een aangepast gegevenskanaal te IDataChannel::Close() sluiten. Beide zijden worden door de gebeurtenis gewaarschuwd OnClosed zodra het aangepaste gegevenskanaal is gesloten.

m_customDataChannel.Close();

Zie ook