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
, 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 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 IDataChannel
OnDataChannelCreated
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
- Übersicht über holographic Remoting
- 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
- Lizenzbedingungen für Holographic Remoting-Software
- Microsoft-Datenschutzbestimmungen