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
, Medium
oder 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
- Holographic Remoting – Übersicht
- Schreiben einer Holographic Remoting-Remote-App mit Windows Mixed Reality-APIs
- Schreiben einer Holographic Remoting-Remote-App mithilfe von OpenXR-APIs
- Schreiben einer benutzerdefinierten Holographic Remoting Player-App
- Holographic Remoting: Problembehandlung und Einschränkungen
- Holographic Remoting-Software – Lizenzbedingungen
- Datenschutzerklärung von Microsoft