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. Les appareils distants n’ont pas besoin d’avoir un logiciel spécial installé pour être détectables.
Remarque
Ce guide suppose que vous avez déjà été autorisé à accéder à la fonctionnalité Systèmes distants en suivant les étapes décrites dans Lancer une application distante.
Filtrer l’ensemble d’appareils détectables
Vous pouvez affiner l’ensemble d’appareils détectables à l’aide d’un RemoteSystemWatcher avec des filtres. Les filtres peuvent détecter le type de découverte (réseau local et connexion cloud par rapport au réseau local), le type d’appareil (bureau, appareil mobile, Xbox, Hub et Holographique) et l’état de disponibilité (état de la disponibilité d’un appareil pour utiliser les fonctionnalités système distantes).
Les objets de filtre 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 à une liste.
Remarque
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;
}
Remarque
La valeur de filtre « proximité » ne garantit pas le degré de proximité physique. Pour les scénarios nécessitant une proximité physique fiable, utilisez la valeur RemoteSystemDiscoveryType.SpatiallyProximal dans votre filtre. Actuellement, ce filtre autorise uniquement les appareils découverts 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 est en fait à proximité physique : RemoteSystem.IsAvailableBySpatialProximity.
Remarque
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écouvre pas d’autres appareils sur un réseau « public ».
Une fois qu’une liste d’objets IRemoteSystemFilter est créée, elle 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 est détecté qui répond à tous les critères suivants :
- Il est détectable par la connexion proximale
- Il s’agit d’un bureau ou d’un téléphone
- Il est classé comme disponible
À partir de là, la procédure de gestion des événements, la récupération d’objets RemoteSystem et la connexion à des appareils distants est exactement la même que dans Lancer une application distante. En bref, les objets RemoteSystem sont stockés en tant que propriétés des objets RemoteSystemAddedEventArgs, qui sont transmis avec chaque événement RemoteSystemAdded.
Découvrir les appareils par entrée d’adresse
Certains appareils peuvent ne pas être associés à un utilisateur ou détectables avec une analyse, mais ils peuvent toujours être atteints si l’application de découverte utilise une adresse directe. La classe HostName est utilisée pour représenter l’adresse d’un appareil distant. Il est souvent stocké sous la forme d’une adresse IP, mais plusieurs autres formats sont autorisés (consultez le constructeur HostName pour plus d’informations).
Un objet RemoteSystem est récupéré si un objet HostName valide est fourni. Si les données d’adresse ne sont pas valides, une null
référence d’objet est retourné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 qu’elles soient distinctes 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 des systèmes distants découverts pour prendre en charge certaines fonctionnalités, telles que la connectivité de session à distance ou le partage d’entités spatiales (holographiques). Consultez la classe KnownRemoteSystemCapabilities pour obtenir la liste des fonctionnalités interrogeables.
// 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 les appareils inscrits auprès du même utilisateur. Ceci est implémenté par le biais d’un IRemoteSystemFilter spécial, RemoteSystemAuthorizationKindFilter. Il est implémenté 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 RemoteSystemAuthorizationKind d’Anonymous permet la découverte de tous les appareils proximaux, même ceux des utilisateurs non approuvés.
- La valeur de SameUser filtre la découverte uniquement sur les appareils inscrits auprès du même utilisateur que l’appareil client. C’est le paramétrage 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 Partager des expériences>partagées par le système>entre les appareils, il existe une zone de liste déroulante avec laquelle l’utilisateur peut spécifier les appareils avec lesquels son système peut partager.