Canais de dados personalizados de comunicação remota holográficaCustom Holographic Remoting data channels

Observação

Estas diretrizes são específicas para a comunicação remota do Holographic no HoloLens 2.This guidance is specific to Holographic Remoting on HoloLens 2.

Use canais de dados personalizados para enviar dados personalizados por meio de uma conexão remota estabelecida.Use custom data channels to send custom data over an established remoting connection.

Importante

Os canais de dados personalizados exigem um aplicativo remoto personalizado e um aplicativo de player personalizado, pois ele permite a comunicação entre os dois aplicativos personalizados.Custom data channels require a custom remote app and a custom player app, as it allows for communication between the two custom apps.

Dica

Um exemplo simples de pingue-pongue pode ser encontrado nos exemplos remoto e de Player dentro do repositório GitHub de exemplos de comunicação remota do Holographic.A simple ping-pong example can be found in the remote and player samples inside the Holographic Remoting samples github repository. Remova os comentários nos #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE arquivos SampleRemoteMain. h/SamplePlayerMain. h para habilitar o código de exemplo.Uncomment #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE inside the SampleRemoteMain.h / SamplePlayerMain.h files to enable the sample code.

Criar um canal de dados personalizadoCreate a custom data channel

Para criar um canal de dados personalizado, são necessários os seguintes campos:To create a custom data channel, the following fields are required:

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 é estabelecida com êxito, você pode criar novos canais de dados do lado remoto, do lado do jogador ou de ambos.After a connection is successfully established, you can create new data channels from either the remote side, the player side, or both. O RemoteContext e o PlayerContext fornecem um CreateDataChannel() método para a criação de canais de dados.Both the RemoteContext and the PlayerContext provide a CreateDataChannel() method for creating data channels. O primeiro parâmetro é a ID do canal, que é usada para identificar o canal de dados em operações subsequentes.The first parameter is the channel ID, which is used to identify the data channel in subsequent operations. O segundo parâmetro é a prioridade, que especifica a prioridade com a qual os dados desse canal são transferidos para o outro lado.The second parameter is the priority, which specifies the priority with which data of this channel is transferred to the other side. As IDs de canal válidas no lado remoto são de 0 até e incluindo 63 e 64 até e incluindo 127 para o lado do jogador.Valid channel IDs on the remote side are from 0 up to and including 63, and 64 up to and including 127 for the player side. As prioridades válidas são Low , Medium ou High (em ambos os lados).Valid priorities are Low, Medium, or High (on both sides).

Para iniciar a criação de um canal de dados no lado remoto :To start the creation of a data channel on the remote side:

// 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 :To start the creation of a data channel on the player side:

// 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.To create a new custom data channel, only one side (either remote or player) needs to call the CreateDataChannel method.

Manipulando eventos de canal de dados personalizadosHandling custom data channel events

Para estabelecer um canal de dados personalizado, o OnDataChannelCreated evento precisa ser tratado (tanto no Player quanto no lado remoto).To establish a custom data channel, the OnDataChannelCreated event needs to be handled (on both the player and the remote side). Ele é disparado quando um canal de dados do usuário é criado por um dos lados e fornece um IDataChannel objeto, que pode ser usado para enviar e receber dados por esse canal.It triggers when a user data channel has been created by either side and provides a IDataChannel object, which can be used to send and receive data over this channel.

Para registrar um ouvinte no OnDataChannelCreated evento:To register a listener on the OnDataChannelCreated event:

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, registre-se OnDataReceived no evento no IDataChannel objeto fornecido pelo OnDataChannelCreated manipulador.To get notified when data is received, register to the OnDataReceived event on the IDataChannel object provided by the OnDataChannelCreated handler. Registre-se no OnClosed evento para ser notificado quando o canal de dados tiver sido fechado.Register to the OnClosed event, to get notified when the data channel has been closed.

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 dadosSending data

Para enviar dados por um canal de dados personalizado, use o IDataChannel::SendData() método.To send data over a custom data channel, use the IDataChannel::SendData() method. O primeiro parâmetro é um winrt::array_view<const uint8_t> para os dados que devem ser enviados.The first parameter is a winrt::array_view<const uint8_t> to the data that should be send. O segundo parâmetro especifica onde os dados devem ser reenviados, até o outro lado reconhecer a recepção.The second parameter specifies where the data should be resend, until the other side acknowledge the reception.

Importante

No caso de condições de rede inadequadas, o mesmo pacote de dados pode chegar mais de uma vez.In case of bad network conditions, the same data packet might arrive more than once. O código de recebimento deve ser capaz de lidar com essa situação.The receiving code must be able to handle this situation.

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

Fechando um canal de dados personalizadoClosing a custom data channel

Para fechar um canal de dados personalizado, use o IDataChannel::Close() método.To close a custom data channel, use the IDataChannel::Close() method. Os dois lados serão notificados pelo OnClosed evento depois que o canal de dados personalizado for fechado.Both sides will be notified by the OnClosed event once the custom data channel has been closed.

m_customDataChannel.Close();

Consulte TambémSee Also