Condividi tramite


Canali dati personalizzati con Holographic Remoting e l'API Windows Mixed Reality

Usare canali dati personalizzati per inviare dati personalizzati tramite una connessione remota stabilita.

Importante

I canali dati personalizzati richiedono un'app remota personalizzata e un'app lettore personalizzata, in quanto consente la comunicazione tra le due app personalizzate.

Consiglio

Un semplice esempio ping-pong è disponibile negli esempi remoti e dei giocatori all'interno del repository github degli esempi di comunicazione remota holografica. Rimuovere il commento #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE all'interno dei file SampleRemoteApp.h /SamplePlayerMain.h per abilitare il codice di esempio.

Creare un canale dati personalizzato

Per creare un canale dati personalizzato, sono necessari i campi seguenti:

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;

Dopo aver stabilito una connessione, è possibile creare nuovi canali dati dal lato remoto, dal lato lettore o da entrambi. Sia RemoteContext che PlayerContext forniscono un CreateDataChannel() metodo per la creazione di canali dati. Il primo parametro è l'ID canale, usato per identificare il canale dati nelle operazioni successive. Il secondo parametro è la priorità che specifica con quale dati di priorità di questo canale viene trasferito sull'altro lato. Sul lato remoto, gli ID canale validi sono compresi tra 0 e 63 inclusi. Sul lato giocatore, gli ID canale validi sono compresi tra 64 e 127 inclusi. Le priorità valide sono Low, Mediumo High.

Per avviare la creazione di un canale dati sul lato remoto :

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

Per avviare la creazione di un canale dati sul lato giocatore :

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

Nota

Per creare un nuovo canale dati personalizzato, solo un lato (remoto o lettore) deve chiamare il CreateDataChannel metodo .

Gestione degli eventi del canale dati personalizzato

Per stabilire un canale dati personalizzato, l'evento OnDataChannelCreated deve essere gestito (sia sul lettore che sul lato remoto). Si attiva quando un canale dati utente è stato creato da entrambi i lati e fornisce un IDataChannel oggetto che può essere usato per inviare e ricevere dati su questo canale.

Per registrare un listener nell'evento 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...
    });

Per ricevere una notifica quando vengono ricevuti i dati, eseguire la registrazione all'evento OnDataReceived sull'oggetto IDataChannel fornito dal OnDataChannelCreated gestore. Eseguire la registrazione all'evento OnClosed per ricevere una notifica quando il canale dati è stato chiuso.

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

Invio di dati

Per inviare dati su un canale dati personalizzato, usare il IDataChannel::SendData() metodo . Il primo parametro è un winrt::array_view<const uint8_t> oggetto per i dati che devono essere inviati. Il secondo parametro specifica dove inviare nuovamente i dati, finché l'altro lato non riconosce la ricezione.

Importante

In caso di condizioni di rete non ottimali, lo stesso pacchetto di dati potrebbe arrivare più di una volta. Il codice ricevente deve essere in grado di gestire questa situazione.

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

Chiusura di un canale dati personalizzato

Per chiudere un canale dati personalizzato, usare il IDataChannel::Close() metodo . Entrambi i lati riceveranno una notifica dall'evento OnClosed dopo la chiusura del canale dati personalizzato.

m_customDataChannel.Close();

Vedere anche