次の方法で共有


Holographic Remoting と Windows Mixed Reality API を使用したカスタム データ チャネル

カスタム データ チャネルを使用して、確立されたリモート処理接続経由でカスタム データを送信します。

重要

カスタム データ チャネルでは、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 までの範囲です。 有効な優先順位は、 LowMedium、または 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();

関連項目