カスタム データ チャネルを使用して、確立されたリモート処理接続経由でカスタム データを送信します。
重要
カスタム データ チャネルでは、2 つのカスタム アプリ間の通信が可能であるため、カスタム リモート アプリとカスタム プレイヤー アプリが必要です。
ヒント
簡単な ping-pong の例は、 Holographic Remoting サンプル github リポジトリ内のリモート サンプルとプレイヤー サンプルにあります。 SampleRemoteApp.h/SamplePlayerMain.h ファイル内のコメントを解除 #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE 、サンプル コードを有効にします。
カスタム データ チャネルを作成する
カスタム データ チャネルを作成するには、次のフィールドが必要です。
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;
接続が正常に確立されたら、リモート側、プレイヤー側、またはその両方から新しいデータ チャネルを作成できます。 RemoteContext と PlayerContext の両方に、データ チャネルを作成するための CreateDataChannel() メソッドが用意されています。 最初のパラメーターはチャネル ID で、後の操作でデータ チャネルを識別するために使用されます。 2 番目のパラメーターは、このチャネルの優先順位データを他方の側に転送する優先順位を指定する優先順位です。 リモート側では、有効なチャネル ID の範囲は 0 から 63 までです。 プレイヤー側では、有効なチャネル ID は 64 から 127 までの範囲です。 有効な優先順位は、 Low、 Medium、または Highです。
リモート側でデータ チャネルの作成を開始するには、
// Valid channel ids for channels created on the remote side are 0 up to and including 63
m_remoteContext.CreateDataChannel(0, DataChannelPriority::Low);
プレイヤー側でデータ チャネルの作成を開始するには:
// Valid channel ids for channels created on the player side are 64 up to and including 127
m_playerContext.CreateDataChannel(64, DataChannelPriority::Low);
注:
新しいカスタム データ チャネルを作成するには、 CreateDataChannel メソッドを呼び出す必要があるのは 1 つの側 (リモートまたはプレーヤー) だけです。
カスタム データ チャネル イベントの処理
カスタム データ チャネルを確立するには、 OnDataChannelCreated イベントを (プレーヤーとリモート側の両方で) 処理する必要があります。 これは、ユーザー データ チャネルがどちらかの側で作成され、このチャネル経由でデータを送受信するために使用できる IDataChannel オブジェクトを提供するときにトリガーされます。
OnDataChannelCreated イベントにリスナーを登録するには:
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...
});
データが受信されたときに通知を受け取るには、OnDataChannelCreated ハンドラーによって提供されるIDataChannel オブジェクトのOnDataReceived イベントに登録します。 データ チャネルが閉じられたときに通知を受け取るには、 OnClosed イベントに登録します。
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;
}
});
データの送信
カスタム データ チャネル経由でデータを送信するには、 IDataChannel::SendData() メソッドを使用します。 最初のパラメーターは、送信する必要があるデータへの winrt::array_view<const uint8_t> です。 2 番目のパラメーターは、相手側が受信を確認するまで、データを再送信する場所を指定します。
重要
ネットワークの状態が悪い場合、同じデータ パケットが複数回到着する可能性があります。 受信コードは、この状況を処理できる必要があります。
uint8_t data[] = {1};
m_customDataChannel.SendData(data, true);
カスタム データ チャネルを閉じる
カスタム データ チャネルを閉じるには、 IDataChannel::Close() メソッドを使用します。 カスタム データ チャネルが閉じられると、 OnClosed イベントによって両方の側に通知されます。
m_customDataChannel.Close();