Détecter des appareils distants

Votre application peut utiliser le réseau sans fil, bluetooth et la connexion cloud pour découvrir les appareils Windows connectés avec le même compte Microsoft que l’appareil de découverte. Aucun logiciel particulier n’est nécessaire sur les appareils distants pour qu’ils soient détectables.

Notes

Ce guide suppose que vous avez déjà accès à la fonctionnalité Systèmes distants, conformément à la procédure décrite dans Lancer une application sur un appareil distant.

Filtrer l’ensemble des appareils détectables

Vous pouvez affiner l’ensemble des appareils détectables à l’aide d’un RemoteSystemWatcher avec des filtres. Les filtres peuvent détecter le type de découverte (proximal, réseau local et connexion cloud), le type d’appareil (ordinateur de bureau, appareil mobile, Xbox, Hub et Holographique) et la disponibilité status (status de la disponibilité d’un appareil pour utiliser les fonctionnalités du système distant).

Les objets filter doivent être construits avant ou pendant l’initialisation de l’objet RemoteSystemWatcher , car ils sont passés en tant que paramètre dans son constructeur. Le code suivant crée un filtre de chaque type disponible, puis les ajoute à la liste.

Notes

Le code de ces exemples nécessite que vous ayez une using Windows.System.RemoteSystems instruction dans votre fichier.

private List<IRemoteSystemFilter> makeFilterList()
{
    // construct an empty list
    List<IRemoteSystemFilter> localListOfFilters = new List<IRemoteSystemFilter>();

    // construct a discovery type filter that only allows "proximal" connections:
    RemoteSystemDiscoveryTypeFilter discoveryFilter = new RemoteSystemDiscoveryTypeFilter(RemoteSystemDiscoveryType.Proximal);


    // construct a device type filter that only allows desktop and mobile devices:
    // For this kind of filter, we must first create an IIterable of strings representing the device types to allow.
    // These strings are stored as static read-only properties of the RemoteSystemKinds class.
    List<String> listOfTypes = new List<String>();
    listOfTypes.Add(RemoteSystemKinds.Desktop);
    listOfTypes.Add(RemoteSystemKinds.Phone);

    // Put the list of device types into the constructor of the filter
    RemoteSystemKindFilter kindFilter = new RemoteSystemKindFilter(listOfTypes);


    // construct an availibility status filter that only allows devices marked as available:
    RemoteSystemStatusTypeFilter statusFilter = new RemoteSystemStatusTypeFilter(RemoteSystemStatusType.Available);


    // add the 3 filters to the listL
    localListOfFilters.Add(discoveryFilter);
    localListOfFilters.Add(kindFilter);
    localListOfFilters.Add(statusFilter);

    // return the list
    return localListOfFilters;
}

Notes

La valeur de filtre « proximal » ne garantit pas le degré de proximité physique. Pour les scénarios qui nécessitent une proximité physique fiable, utilisez la valeur RemoteSystemDiscoveryType.SpatiallyProximal dans votre filtre. Actuellement, ce filtre autorise uniquement les appareils détectés par Bluetooth. À mesure que de nouveaux mécanismes et protocoles de découverte qui garantissent la proximité physique sont pris en charge, ils seront également inclus ici.
Il existe également une propriété dans la classe RemoteSystem qui indique si un appareil découvert se trouve en fait à proximité physique : RemoteSystem.IsAvailableBySpatialProximity.

Notes

Si vous envisagez de découvrir des appareils sur un réseau local (déterminé par votre sélection de filtre de type de découverte), votre réseau doit utiliser un profil « privé » ou « domaine ». Votre appareil ne découvrira pas d’autres appareils sur un réseau « public ».

Une fois créée, la liste des objets IRemoteSystemFilter peut être transmise au constructeur d’un RemoteSystemWatcher.

// store filter list
List<IRemoteSystemFilter> listOfFilters = makeFilterList();

// construct watcher with the list
m_remoteSystemWatcher = RemoteSystem.CreateWatcher(listOfFilters);

Lorsque la méthode Start de cet observateur est appelée, elle déclenche l’événement RemoteSystemAdded uniquement si un appareil qui répond à tous les critères suivants est détecté :

  • L’appareil est détectable par une connexion proximale.
  • Il s’agit d’un ordinateur de bureau ou d’un téléphone.
  • Il est considéré comme disponible.

Ensuite, la procédure de traitement des événements, de récupération des objets RemoteSystem et de connexion aux appareils distants est exactement le même que dans Lancer une application sur un appareil distant. En bref, les objets RemoteSystem sont stockés en tant que propriétés des objets RemoteSystemAddedEventArgs , qui sont passés avec chaque événement RemoteSystemAdded .

Détecter des appareils par entrée d’adresse

Certains appareils ne peuvent pas être associés à un utilisateur ou détectés par un balayage, mais ils restent accessibles si l’application détectrice utilise une adresse directe. La classe HostName permet de représenter l’adresse d’un appareil distant. Cela est souvent stocké sous la forme d’une adresse IP, mais plusieurs autres formats sont autorisés (voir le constructeur HostName pour plus d’informations).

Un objet RemoteSystem est récupéré si un objet HostName valide est fourni. Si l’adresse n’est pas valide, une référence d’objet null est renvoyée.

private async Task<RemoteSystem> getDeviceByAddressAsync(string IPaddress)
{
    // construct a HostName object
    Windows.Networking.HostName deviceHost = new Windows.Networking.HostName(IPaddress);

    // create a RemoteSystem object with the HostName
    RemoteSystem remotesys = await RemoteSystem.FindByHostNameAsync(deviceHost);

    return remotesys;
}

Interrogation d’une fonctionnalité sur un système distant

Bien que distinct du filtrage de découverte, l’interrogation des fonctionnalités d’appareil peut être une partie importante du processus de découverte. À l’aide de la méthode RemoteSystem.GetCapabilitySupportedAsync , vous pouvez interroger les systèmes distants découverts pour la prise en charge de certaines fonctionnalités telles que la connectivité de session à distance ou le partage d’entités spatiales (holographiques). Pour obtenir la liste des fonctionnalités interrogeables, consultez la classe KnownRemoteSystemCapabilities .

// Check to see if the given remote system can accept LaunchUri requests
bool isRemoteSystemLaunchUriCapable = remoteSystem.GetCapabilitySupportedAsync(KnownRemoteSystemCapabilities.LaunchUri);

Découverte inter-utilisateurs

Les développeurs peuvent spécifier la découverte de tous les appareils à proximité de l’appareil client, pas seulement des appareils inscrits auprès du même utilisateur. Cela est implémenté par le biais d’un IRemoteSystemFilter spécial, RemoteSystemAuthorizationKindFilter. Elle est implémentée comme les autres types de filtres :

// Construct a user type filter that includes anonymous devices
RemoteSystemAuthorizationKindFilter authorizationKindFilter = new RemoteSystemAuthorizationKindFilter(RemoteSystemAuthorizationKind.Anonymous);
// then add this filter to the RemoteSystemWatcher
  • Une valeur RemoteSystemAuthorizationKindd’Anonymous permet la découverte de tous les appareils proximaux, même ceux d’utilisateurs non approuvés.
  • La valeur SameUser filtre la découverte sur les appareils inscrits auprès du même utilisateur que l’appareil client. Il s'agit du comportement par défaut.

Vérification des paramètres de partage entre utilisateurs

Outre le filtre ci-dessus spécifié dans votre application de découverte, l’appareil client lui-même doit également être configuré pour autoriser les expériences partagées à partir d’appareils connectés avec d’autres utilisateurs. Il s’agit d’un paramètre système qui peut être interrogé avec une méthode statique dans la classe RemoteSystem :

if (!RemoteSystem.IsAuthorizationKindEnabled(RemoteSystemAuthorizationKind.Anonymous)) {
	// The system is not authorized to connect to cross-user devices. 
	// Inform the user that they can discover more devices if they
	// update the setting to "Anonymous".
}

Pour modifier ce paramètre, l’utilisateur doit ouvrir l’application Paramètres . Dans le menu Expériencespartagées>système>Partager entre les appareils, il existe une zone de liste déroulante dans laquelle l’utilisateur peut spécifier les appareils avec lesquels son système peut partager.

page des paramètres d’expériences partagées