Sdílet prostřednictvím


Vlastní datové kanály s Holographic Remoting a rozhraním API Windows Mixed Reality

K odesílání vlastních dat přes navázané vzdálené připojení použijte vlastní datové kanály.

Důležité

Vlastní datové kanály vyžadují vlastní vzdálenou aplikaci a aplikaci vlastního přehrávače, protože umožňují komunikaci mezi těmito dvěma vlastními aplikacemi.

Tip

Jednoduchý příklad ping-pong najdete v ukázkách remote a player v úložišti GitHubu s ukázkami Holographic Remoting. Zrušte komentář #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE v souborech SampleRemoteApp.h / SamplePlayerMain.h a povolte vzorový kód.

Vytvoření vlastního datového kanálu

K vytvoření vlastního datového kanálu se vyžadují následující pole:

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;

Po úspěšném navázání připojení můžete vytvořit nové datové kanály ze vzdálené strany, ze strany přehrávače nebo z obou. RemoteContext i PlayerContext poskytují metodu CreateDataChannel() pro vytváření datových kanálů. Prvním parametrem je ID kanálu, které se používá k identifikaci datového kanálu v pozdějších operacích. Druhý parametr je priorita, která určuje, s jakou prioritou se data tohoto kanálu přenesou na druhou stranu. Na straně vzdáleného připojení jsou platná ID kanálů v rozsahu od 0 do 63 včetně. Na straně přehrávače jsou platná ID kanálů od 64 do 127 včetně. Platné priority jsou Low, Mediumnebo High.

Zahájení vytváření datového kanálu na vzdálené straně:

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

Zahájení vytváření datového kanálu na straně hráče :

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

Poznámka

Pokud chcete vytvořit nový vlastní datový kanál, musí metodu CreateDataChannel volat pouze jedna strana (vzdálený nebo přehrávač).

Zpracování událostí vlastního datového kanálu

Pokud chcete vytvořit vlastní datový kanál, OnDataChannelCreated musí být událost zpracována (na straně přehrávače i na vzdálené straně). Aktivuje se, když byl na obou stranách vytvořen kanál uživatelských dat, a poskytuje IDataChannel objekt, který lze použít k odesílání a přijímání dat přes tento kanál.

Registrace naslouchacího procesu pro OnDataChannelCreated událost:

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

Pokud chcete dostávat oznámení o přijetí dat, zaregistrujte se k OnDataReceived události objektu IDataChannel poskytnutého obslužnou rutinou OnDataChannelCreated . Zaregistrujte se k OnClosed události, abyste dostali oznámení o zavření datového kanálu.

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

Odesílání dat

Pokud chcete odesílat data přes vlastní datový kanál, použijte metodu IDataChannel::SendData() . Prvním parametrem je parametr pro winrt::array_view<const uint8_t> data, která se mají odesílat. Druhý parametr určuje, kam se mají data znovu odeslat, dokud druhá strana nepotvrdí příjem.

Důležité

V případě špatných podmínek sítě může stejný datový paket přijít více než jednou. Přijímající kód musí být schopný tuto situaci zvládnout.

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

Zavření vlastního datového kanálu

K zavření vlastního datového kanálu použijte metodu IDataChannel::Close() . Obě strany budou událostí upozorněny, OnClosed jakmile se vlastní datový kanál zavře.

m_customDataChannel.Close();

Viz také