Partilhar via


Canais de Dados Personalizados com Comunicação Remota Holográfica e a API de Windows Mixed Reality

Utilize canais de dados personalizados para enviar dados personalizados através de uma ligação remota estabelecida.

Importante

Os canais de dados personalizados requerem uma aplicação remota personalizada e uma aplicação de leitor personalizada, uma vez que permitem a comunicação entre as duas aplicações personalizadas.

Dica

Pode encontrar um exemplo de pingue-pongue simples nos exemplos remoto e de leitor no repositório github de exemplos de Comunicação Remota Holográfica. Anule comentários #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE nos ficheiros SampleRemoteApp.h/SamplePlayerMain.h para ativar o código de exemplo.

Criar um canal de dados personalizado

Para criar um canal de dados personalizado, são necessários os seguintes 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;

Depois de uma ligação ser estabelecida com êxito, pode criar novos canais de dados a partir do lado remoto, do lado do jogador ou de ambos. Tanto o RemoteContext como o PlayerContext fornecem um CreateDataChannel() método para criar canais de dados. O primeiro parâmetro é o ID do canal, que é utilizado para identificar o canal de dados em operações posteriores. O segundo parâmetro é a prioridade que especifica com que dados prioritários deste canal são transferidos para o outro lado. No lado remoto, os IDs de canal válidos variam entre 0 e 63. Do lado do leitor, os IDs de canal válidos são de 64 a 127, 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 do lado do leitor :

// 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 criar um novo canal de dados personalizado, apenas um lado (remoto ou leitor) tem de chamar o CreateDataChannel método.

Processar eventos de canais de dados personalizados

Para estabelecer um canal de dados personalizado, o OnDataChannelCreated evento tem de ser processado (tanto no leitor como no lado remoto). É acionado quando um canal de dados de utilizador é criado por ambos os lados e fornece um IDataChannel objeto, que pode ser utilizado para enviar e receber dados através deste canal.

Para registar um serviço de escuta 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 são recebidos, registe-se OnDataReceived no evento no IDataChannel objeto fornecido pelo OnDataChannelCreated processador. Registe-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 através de um canal de dados personalizado, utilize 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 receção.

Importante

Em caso de más condições de rede, o mesmo pacote de dados pode chegar mais do que uma vez. O código de receção tem de ser capaz de lidar com esta situação.

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

Fechar um canal de dados personalizado

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

m_customDataChannel.Close();

Consulte também