Compartir a través de


Canales de datos personalizados con comunicación remota holográfica y la API de Windows Mixed Reality

Use canales de datos personalizados para enviar datos personalizados a través de una conexión remota establecida.

Importante

Los canales de datos personalizados requieren una aplicación remota personalizada y una aplicación de reproductor personalizada, ya que permite la comunicación entre las dos aplicaciones personalizadas.

Sugerencia

Puede encontrar un ejemplo sencillo de ping-pong en los ejemplos remotos y de reproductor dentro del repositorio de github de ejemplos de Holographic Remoting. Quite la marca de comentario #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE dentro de los archivos SampleRemoteApp.h / SamplePlayerMain.h para habilitar el código de ejemplo.

Creación de un canal de datos personalizado

Para crear un canal de datos personalizado, se requieren los siguientes campos:

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;

Una vez establecida correctamente una conexión, puede crear nuevos canales de datos desde el lado remoto, el lado del jugador o ambos. Tanto RemoteContext como PlayerContext proporcionan un CreateDataChannel() método para crear canales de datos. El primer parámetro es el identificador de canal, que se usa para identificar el canal de datos en operaciones posteriores. El segundo parámetro es la prioridad que especifica con qué datos de prioridad de este canal se transfieren al otro lado. En el lado remoto, los identificadores de canal válidos oscilan entre 0 y 63. En el lado del jugador, los identificadores de canal válidos son de 64 hasta y incluyen 127. Las prioridades válidas son Low, Mediumo High.

Para iniciar la creación de un canal de datos en el lado remoto :

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

Para iniciar la creación de un canal de datos en el lado del reproductor :

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

Nota

Para crear un nuevo canal de datos personalizado, solo un lado (ya sea remoto o jugador) debe llamar al CreateDataChannel método .

Control de eventos de canal de datos personalizados

Para establecer un canal de datos personalizado, el OnDataChannelCreated evento debe controlarse (tanto en el jugador como en el lado remoto). Se desencadena cuando un canal de datos de usuario se ha creado por cualquier lado y proporciona un IDataChannel objeto , que se puede usar para enviar y recibir datos a través de este canal.

Para registrar un agente de escucha en el OnDataChannelCreated evento:

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

Para recibir notificaciones cuando se reciben datos, regístrese en el OnDataReceived evento en el IDataChannel objeto proporcionado por el OnDataChannelCreated controlador. Regístrese en el OnClosed evento para recibir una notificación cuando se haya cerrado el canal de datos.

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

Envío de datos

Para enviar datos a través de un canal de datos personalizado, use el IDataChannel::SendData() método . El primer parámetro es un winrt::array_view<const uint8_t> objeto para los datos que se deben enviar. El segundo parámetro especifica dónde se deben reenviar los datos, hasta que el otro lado confirme la recepción.

Importante

En caso de condiciones de red incorrectas, el mismo paquete de datos podría llegar más de una vez. El código receptor debe ser capaz de controlar esta situación.

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

Cerrar un canal de datos personalizado

Para cerrar un canal de datos personalizado, use el IDataChannel::Close() método . Ambos lados serán notificados por el OnClosed evento una vez cerrado el canal de datos personalizado.

m_customDataChannel.Close();

Consulte también