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 Holographic Remoting-Beispiele. Heben Sie die Auskommentierung #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE in den 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 der RemoteContext als auch der PlayerContext bieten eine CreateDataChannel() Methode zum Erstellen von Datenkanälen. 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 auf 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 benutzerdefinierter Datenkanalereignisse

Zum Einrichten eines benutzerdefinierten Datenkanals 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, mit dem Daten über diesen Kanal gesendet und empfangen werden können.

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 beim OnDataReceived Ereignis für das IDataChannel vom OnDataChannelCreated Handler bereitgestellte Objekt. 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, wo die Daten erneut eingesenden werden 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 verarbeiten.

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

Weitere Informationen