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.

Suggerimento

Un semplice esempio di ping-pong è disponibile negli esempi di giocatori e remoti all'interno del repository GitHub degli esempi di Holographic Remoting. 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 di dati. Il primo parametro è l'ID canale, che viene usato per identificare il canale dati nelle operazioni successive. Il secondo parametro è la priorità che specifica con i dati di priorità di questo canale trasferiti all'altro lato. Sul lato remoto, gli ID di canale validi sono compresi tra 0 e 63. Sul lato lettore, gli ID canale validi sono compresi tra 64 e 127. 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 lettore :

// 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, è necessario chiamare il CreateDataChannel metodo un solo lato (remoto o lettore).

Gestione di eventi del canale dati personalizzati

Per stabilire un canale dati personalizzato, l'evento OnDataChannelCreated deve essere gestito (sia sul lettore che sul lato remoto). Viene attivato 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, registrarsi all'evento sull'oggetto OnDataReceivedIDataChannel fornito dal OnDataChannelCreated gestore. Registrarsi 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 ai dati che devono essere inviati. Il secondo parametro specifica dove inviare di nuovo i dati, fino a quando l'altro lato non conferma la ricezione.

Importante

In caso di condizioni di rete non ottimali, lo stesso pacchetto di dati potrebbe arrivare più volte. 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 verranno informati dall'evento OnClosed dopo la chiusura del canale dati personalizzato.

m_customDataChannel.Close();

Vedere anche