Freigeben über


Benutzerdefinierte Datenkanäle mit Holographic Remoting und der Windows Mixed Reality-API

Verwenden Sie benutzerdefinierte Datenkanäle, um benutzerdefinierte Daten über eine bestehende Remotingverbindung zu senden.

Wichtig

Benutzerdefinierte Datenkanäle erfordern eine benutzerdefinierte Remote-App und eine benutzerdefinierte Player-App, da sie die Kommunikation zwischen den beiden benutzerdefinierten Apps ermöglicht.

Tipp

Ein einfaches Ping-Pong-Beispiel finden Sie in den Remote- und Playerbeispielen im GitHub-Repository für Holographic Remoting-Beispiele. Heben Sie die Auskommentierung #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE innerhalb der Dateien SampleRemoteApp.h / SamplePlayerMain.h auf, um den Beispielcode zu aktivieren.

Erstellen eines benutzerdefinierten Datenkanals

Zum Erstellen eines benutzerdefinierten Datenkanals sind die folgenden Felder erforderlich:

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;

Nachdem eine Verbindung erfolgreich hergestellt wurde, können Sie neue Datenkanäle entweder auf der Remoteseite, auf der Playerseite oder auf beiden Seiten erstellen. Sowohl RemoteContext als auch PlayerContext stellen eine CreateDataChannel() Methode zum Erstellen von Datenkanälen bereit. Der erste Parameter ist die Kanal-ID, die verwendet wird, um den Datenkanal in späteren Vorgängen zu identifizieren. Der zweite Parameter ist die Priorität, die angibt, mit welcher Priorität Daten dieses Kanals an die andere Seite übertragen werden. Auf der Remoteseite reichen gültige Kanal-IDs von 0 bis einschließlich 63. Auf der Spielerseite sind gültige Kanal-IDs von 64 bis einschließlich 127. Gültige Prioritäten sind Low, Mediumoder High.

So starten Sie die Erstellung eines Datenkanals auf der Remoteseite :

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

So starten Sie die Erstellung eines Datenkanals auf der Playerseite :

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

Hinweis

Um einen neuen benutzerdefinierten Datenkanal zu erstellen, muss nur eine Seite (remote oder player) die CreateDataChannel -Methode aufrufen.

Behandeln von benutzerdefinierten Datenkanalereignissen

Um einen benutzerdefinierten Datenkanal einzurichten, muss das OnDataChannelCreated Ereignis (sowohl auf der Player- als auch auf der Remoteseite) behandelt werden. Es wird ausgelöst, wenn ein Benutzerdatenkanal von beiden Seiten erstellt wurde, und stellt ein IDataChannel -Objekt bereit, das zum Senden und Empfangen von Daten über diesen Kanal verwendet werden kann.

So registrieren Sie einen Listener für das OnDataChannelCreated Ereignis:

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

Um beim Empfang von Daten benachrichtigt zu werden, registrieren Sie sich für das OnDataReceived -Ereignis für das objekt, das IDataChannelOnDataChannelCreated vom Handler bereitgestellt wird. Registrieren Sie sich für das OnClosed Ereignis, um benachrichtigt zu werden, wenn der Datenkanal geschlossen wurde.

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

Senden von Daten

Verwenden Sie die IDataChannel::SendData() -Methode, um Daten über einen benutzerdefinierten Datenkanal zu senden. Der erste Parameter ist ein winrt::array_view<const uint8_t> für die Daten, die gesendet werden sollen. Der zweite Parameter gibt an, wohin die Daten erneut senden sollen, bis die andere Seite den Empfang bestätigt.

Wichtig

Bei schlechten Netzwerkbedingungen kann dasselbe Datenpaket mehrmals eintreffen. Der empfangende Code muss in der Lage sein, diese Situation zu bewältigen.

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

Schließen eines benutzerdefinierten Datenkanals

Verwenden Sie die IDataChannel::Close() -Methode, um einen benutzerdefinierten Datenkanal zu schließen. Beide Seiten werden vom OnClosed Ereignis benachrichtigt, sobald der benutzerdefinierte Datenkanal geschlossen wurde.

m_customDataChannel.Close();

Siehe auch