Canais de dados personalizados com comunicação remota holográfica e a API de Windows Mixed Reality

Use canais de dados personalizados para enviar dados personalizados por uma conexão de comunicação remota estabelecida.

Importante

Os canais de dados personalizados exigem um aplicativo remoto personalizado e um aplicativo player personalizado, pois permitem a comunicação entre os dois aplicativos personalizados.

Dica

Um exemplo simples de ping-pong pode ser encontrado nos exemplos remoto e de player dentro do repositório github de exemplos de Comunicação Remota Holográfica. Descompacte #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE dentro dos arquivos SampleRemoteApp.h / SamplePlayerMain.h para habilitar o código de exemplo.

Criar um canal de dados personalizado

Para criar um canal de dados personalizado, os seguintes campos são necessários:

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;

Depois que uma conexão for estabelecida com êxito, você poderá criar novos canais de dados do lado remoto, do lado do jogador ou de ambos. Tanto o RemoteContext quanto o PlayerContext fornecem um CreateDataChannel() método para criar canais de dados. O primeiro parâmetro é a ID do canal, que é usada para identificar o canal de dados em operações posteriores. O segundo parâmetro é a prioridade especificada com quais dados de prioridade desse canal são transferidos para o outro lado. No lado remoto, as IDs de canal válidas variam de 0 até e incluindo 63. No lado do jogador, as IDs de canal válidas são de 64 até e incluindo 127. As prioridades válidas são Low, Mediumou High.

Para iniciar a criação de um canal de dados no 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 a criação de um canal de dados no lado do jogador :

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

Observação

Para criar um novo canal de dados personalizado, apenas um lado (remoto ou player) precisa chamar o CreateDataChannel método .

Manipulação de eventos de canal de dados personalizados

Para estabelecer um canal de dados personalizado, o OnDataChannelCreated evento precisa ser tratado (no player e no lado remoto). Ele é disparado quando um canal de dados do usuário é criado por ambos os lados e fornece um IDataChannel objeto, que pode ser usado para enviar e receber dados por esse canal.

Para registrar um ouvinte no 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 ser notificado quando os dados forem recebidos, registre-se OnDataReceived no evento no IDataChannel objeto fornecido pelo OnDataChannelCreated manipulador. Registre-se no OnClosed evento para ser notificado quando o canal de dados tiver sido fechado.

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

Enviar dados

Para enviar dados por um canal de dados personalizado, use o IDataChannel::SendData() método . O primeiro parâmetro é um winrt::array_view<const uint8_t> para os dados que devem ser enviados. O segundo parâmetro especifica onde os dados devem ser reenviados até que o outro lado reconheça a recepção.

Importante

No caso de condições de rede incorretas, o mesmo pacote de dados pode chegar mais de uma vez. O código receptor deve ser capaz de lidar com essa situação.

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

Fechar um canal de dados personalizado

Para fechar um canal de dados personalizado, use o IDataChannel::Close() método . Ambos os lados serão notificados pelo OnClosed evento depois que o canal de dados personalizado for fechado.

m_customDataChannel.Close();

Consulte Também