Partager via


Canaux de données personnalisés avec communication à distance holographique et l’API Windows Mixed Reality

Utilisez des canaux de données personnalisés pour envoyer des données personnalisées via une connexion à distance établie.

Importante

Les canaux de données personnalisés nécessitent une application distante personnalisée et une application de lecteur personnalisée, car elles permettent la communication entre les deux applications personnalisées.

Conseil

Vous trouverez un exemple de ping-pong simple dans les exemples distants et joueurs dans le référentiel github d’exemples de communication à distance Holographic. Supprimez les marques de #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE commentaire dans les fichiers SampleRemoteApp.h / SamplePlayerMain.h pour activer l’exemple de code.

Créer un canal de données personnalisé

Pour créer un canal de données personnalisé, les champs suivants sont requis :

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;

Une fois la connexion établie, vous pouvez créer de nouveaux canaux de données à partir du côté distant, du côté joueur ou des deux. RemoteContext et PlayerContext fournissent une CreateDataChannel() méthode pour créer des canaux de données. Le premier paramètre est l’ID de canal, qui est utilisé pour identifier le canal de données dans les opérations ultérieures. Le deuxième paramètre est la priorité qui spécifie avec quelles données de priorité de ce canal sont transférées vers l’autre côté. Du côté distant, les ID de canal valides vont de 0 à 63 inclus. Côté joueur, les ID de canal valides sont compris entre 64 et 127. Les priorités valides sont Low, Mediumou High.

Pour démarrer la création d’un canal de données du côté distant :

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

Pour commencer la création d’un canal de données côté joueur :

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

Remarque

Pour créer un canal de données personnalisé, un seul côté (distant ou lecteur) doit appeler la CreateDataChannel méthode .

Gestion des événements de canal de données personnalisés

Pour établir un canal de données personnalisé, l’événement OnDataChannelCreated doit être géré (à la fois sur le lecteur et du côté distant). Il se déclenche lorsqu’un canal de données utilisateur est créé de part et d’autre et fournit un IDataChannel objet, qui peut être utilisé pour envoyer et recevoir des données sur ce canal.

Pour inscrire un écouteur sur l’événement OnDataChannelCreated :

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

Pour recevoir une notification lors de la réception des données, inscrivez-vous à l’événement OnDataReceived sur l’objet IDataChannel fourni par le OnDataChannelCreated gestionnaire. Inscrivez-vous à l’événement OnClosed pour recevoir une notification lorsque le canal de données est fermé.

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

Envoi de données

Pour envoyer des données via un canal de données personnalisé, utilisez la IDataChannel::SendData() méthode . Le premier paramètre est un winrt::array_view<const uint8_t> vers les données qui doivent être envoyées. Le deuxième paramètre spécifie où les données doivent être redirigées jusqu’à ce que l’autre côté reconnaisse la réception.

Importante

Dans des conditions réseau incorrectes, le même paquet de données peut arriver plusieurs fois. Le code de réception doit être en mesure de gérer cette situation.

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

Fermeture d’un canal de données personnalisé

Pour fermer un canal de données personnalisé, utilisez la IDataChannel::Close() méthode . Les deux côtés sont avertis par l’événement OnClosed une fois le canal de données personnalisé fermé.

m_customDataChannel.Close();

Voir aussi