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

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

Important

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

Conseil

Un exemple de ping-pong simple peut être trouvé dans les exemples distant et lecteur à l’intérieur du référentiel github des exemples holographiques de communication à distance. 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é lecteur 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 inclus. 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 démarrer la création d’un canal de données côté lecteur :

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

Notes

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 a été 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 de données, inscrivez-vous à l’événement OnDataReceived sur l’objet IDataChannel fourni par le OnDataChannelCreated gestionnaire. Inscrivez-vous à l’événement OnClosed pour être averti lorsque le canal de données a été 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 correspond winrt::array_view<const uint8_t> aux données qui doivent être envoyées. Le deuxième paramètre spécifie l’emplacement où les données doivent être renvoyées, jusqu’à ce que l’autre côté reconnaisse la réception.

Important

En cas de mauvaises conditions réseau, 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 parties seront averties par l’événement OnClosed une fois le canal de données personnalisé fermé.

m_customDataChannel.Close();

Voir aussi