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
, Medium
ou 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
- Descrição Geral da Comunicação Remota Holográfica
- Escrever uma aplicação remota holográfica remota com Windows Mixed Reality APIs
- Writing a Holographic Remoting remote app using OpenXR APIs
- Escrever uma aplicação de leitor Holographic Remoting personalizada
- Resolução de problemas e limitações da Comunicação Remota Holográfica
- Termos de licenciamento de software Holographic Remoting
- Declaração de Privacidade da Microsoft