Holographic Remoting ve Windows Mixed Reality API ile Özel Veri Kanalları

Yerleşik uzaktan iletişim bağlantısı üzerinden özel veri göndermek için özel veri kanallarını kullanın.

Önemli

Özel veri kanalları, iki özel uygulama arasında iletişime izin verdiğinden özel bir uzak uygulama ve özel bir oynatıcı uygulaması gerektirir.

İpucu

Holographic Remoting örnekleri github deposunun içindeki uzak ve oyuncu örneklerinde basit bir ping-pong örneği bulunabilir. #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE Örnek kodu etkinleştirmek için SampleRemoteApp.h / SamplePlayerMain.h dosyalarının açıklamasını kaldırın.

Özel veri kanalı oluşturma

Özel veri kanalı oluşturmak için aşağıdaki alanlar gereklidir:

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;

Bağlantı başarıyla kurulduktan sonra uzak taraftan, oyuncu tarafından veya her ikisinden de yeni veri kanalları oluşturabilirsiniz. Hem RemoteContext hem de PlayerContext, veri kanalları oluşturmak için bir CreateDataChannel() yöntem sağlar. İlk parametre, sonraki işlemlerde veri kanalını tanımlamak için kullanılan kanal kimliğidir. İkinci parametre, bu kanalın hangi öncelik verilerinin diğer tarafa aktarıldığını belirten önceliktir. Uzak tarafta geçerli kanal kimlikleri 0 ile 63 arasında değişir. Oyuncu tarafında geçerli kanal kimlikleri 64'ten 127'ye kadar ve 127'ye kadardır. Geçerli öncelikler , Mediumveya High'dırLow.

Uzak tarafta bir veri kanalı oluşturmaya başlamak için:

// Valid channel ids for channels created on the remote side are 0 up to and including 63
m_remoteContext.CreateDataChannel(0, DataChannelPriority::Low);

Oyuncu tarafında bir veri kanalı oluşturmaya başlamak için:

// Valid channel ids for channels created on the player side are 64 up to and including 127
m_playerContext.CreateDataChannel(64, DataChannelPriority::Low);

Not

Yeni bir özel veri kanalı oluşturmak için yalnızca bir tarafın (uzak veya oynatıcı) yöntemini çağırması CreateDataChannel gerekir.

Özel veri kanalı olaylarını işleme

Özel bir veri kanalı OnDataChannelCreated oluşturmak için olayın işlenmesi gerekir (hem oyuncuda hem de uzak tarafta). İki taraf tarafından bir kullanıcı veri kanalı oluşturulduğunda tetikler ve bu kanal üzerinden veri göndermek ve almak için kullanılabilecek bir IDataChannel nesne sağlar.

Olaya dinleyici OnDataChannelCreated kaydetmek için:

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...
    });

Veriler alındığında bildirim almak için OnDataReceived işleyici tarafından sağlanan nesnede IDataChannel olaya kaydolun OnDataChannelCreated . OnClosed Veri kanalı kapatıldığında bildirim almak için etkinliğe kaydolun.

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

Veri gönderme

Özel bir veri kanalı üzerinden veri göndermek için yöntemini kullanın IDataChannel::SendData() . İlk parametre, gönderilmesi gereken verilerin bir winrt::array_view<const uint8_t> parametresidir. İkinci parametre, diğer taraf alımı kabul edene kadar verilerin nereye yeniden gönderileceği belirtir.

Önemli

Hatalı ağ koşulları söz konusu olduğunda, aynı veri paketi birden çok kez gelebilir. Alıcı kodun bu durumu işleyebilmesi gerekir.

uint8_t data[] = {1};
m_customDataChannel.SendData(data, true);

Özel veri kanalını kapatma

Özel bir veri kanalını IDataChannel::Close() kapatmak için yöntemini kullanın. Özel veri kanalı kapatıldıktan sonra olay her iki tarafa da bildirilir OnClosed .

m_customDataChannel.Close();

Ayrıca Bkz.