Compartir a través de


Detectar dispositivos remotos

La aplicación puede usar la red inalámbrica, Bluetooth y la conexión en la nube para detectar dispositivos Windows que han iniciado sesión con la misma cuenta de Microsoft que el dispositivo de detección. Los dispositivos remotos no necesitan tener instalado ningún software especial para poder detectarlos.

Nota:

En esta guía se da por supuesto que ya se le ha concedido acceso a la característica Sistemas remotos siguiendo los pasos descritos en Inicio de una aplicación remota.

Filtrar el conjunto de dispositivos detectables

Puede restringir el conjunto de dispositivos detectables mediante remoteSystemWatcher con filtros. Los filtros pueden detectar el tipo de detección (proxy frente a la red local frente a la conexión en la nube), el tipo de dispositivo (escritorio, dispositivo móvil, Xbox, Hub y Holographic) y el estado de disponibilidad (el estado de disponibilidad de un dispositivo para usar las características del sistema remoto).

Los objetos filter se deben construir antes o mientras se inicializa el objeto RemoteSystemWatcher , ya que se pasan como parámetros a su constructor. El código siguiente crea un filtro de cada tipo disponible y, a continuación, los agrega a una lista.

Nota:

El código de estos ejemplos requiere que tenga una using Windows.System.RemoteSystems instrucción en el archivo.

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

Nota:

El valor del filtro "proximal" no garantiza el grado de proximidad física. Para escenarios que requieren proximidad física confiable, use el valor RemoteSystemDiscoveryType.SpatiallyProximal en el filtro. Actualmente, este filtro solo permite dispositivos detectados por Bluetooth. A medida que se admiten nuevos mecanismos y protocolos de detección que garantizan la proximidad física, también se incluirán aquí.
También hay una propiedad en la clase RemoteSystem que indica si un dispositivo detectado está de hecho dentro de la proximidad física: RemoteSystem.IsAvailableBySpatialProximity.

Nota:

Si piensa detectar dispositivos a través de una red local (determinado por la selección de filtro de tipo de detección), la red debe usar un perfil "privado" o "dominio". El dispositivo no detectará otros dispositivos a través de una red "pública".

Una vez creada una lista de objetos IRemoteSystemFilter, se puede pasar al constructor de un RemoteSystemWatcher.

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

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

Cuando se llama al método Start de este monitor, generará el evento RemoteSystemAdded solo si se detecta un dispositivo que cumple todos los criterios siguientes:

  • Se puede detectar mediante la conexión proximal.
  • Es un escritorio o teléfono
  • Se clasifica como disponible

Desde allí, el procedimiento para controlar eventos, recuperar objetos RemoteSystem y conectarse a dispositivos remotos es exactamente el mismo que en Iniciar una aplicación remota. En resumen, los objetos RemoteSystem se almacenan como propiedades de los objetos RemoteSystemAddedEventArgs , que se pasan con cada evento RemoteSystemAdded .

Detección de dispositivos por entrada de dirección

Es posible que algunos dispositivos no estén asociados a un usuario o que se puedan detectar con un examen, pero todavía se pueden acceder si la aplicación de detección usa una dirección directa. La clase HostName se usa para representar la dirección de un dispositivo remoto. Esto se almacena a menudo en forma de una dirección IP, pero se permiten otros formatos (consulte el constructor HostName para obtener más información).

Se recupera un objeto RemoteSystem si se proporciona un objeto HostName válido. Si los datos de dirección no son válidos, se devuelve una null referencia de objeto.

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

Consulta de una funcionalidad en un sistema remoto

Aunque es independiente del filtrado de detección, las funcionalidades del dispositivo de consulta pueden ser una parte importante del proceso de detección. Con el método RemoteSystem.GetCapabilitySupportedAsync , puede consultar los sistemas remotos detectados para admitir determinadas funcionalidades, como la conectividad de sesión remota o el uso compartido de entidades espaciales (holográficas). Consulte la clase KnownRemoteSystemCapabilities para obtener la lista de funcionalidades consultables.

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

Detección entre usuarios

Los desarrolladores pueden especificar la detección de todos los dispositivos en proximidad al dispositivo cliente, no solo los dispositivos registrados en el mismo usuario. Esto se implementa a través de un IRemoteSystemFilter especial, RemoteSystemAuthorizationKindFilter. Se implementa como los otros tipos de filtro:

// Construct a user type filter that includes anonymous devices
RemoteSystemAuthorizationKindFilter authorizationKindFilter = new RemoteSystemAuthorizationKindFilter(RemoteSystemAuthorizationKind.Anonymous);
// then add this filter to the RemoteSystemWatcher
  • Un valor RemoteSystemAuthorizationKind de Anonymous permitirá la detección de todos los dispositivos proximales, incluso los de usuarios que no son de confianza.
  • Un valor de SameUser filtra la detección solo a los dispositivos registrados en el mismo usuario que el dispositivo cliente. Este es el comportamiento predeterminado.

Comprobación de la configuración uso compartido entre usuarios

Además del filtro anterior que se especifica en la aplicación de detección, el propio dispositivo cliente también debe configurarse para permitir experiencias compartidas de dispositivos que han iniciado sesión con otros usuarios. Se trata de una configuración del sistema que se puede consultar con un método estático en la clase 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".
}

Para cambiar esta configuración, el usuario debe abrir la aplicación Configuración . En el menú Compartir experiencias>compartidas del sistema>entre dispositivos, hay un cuadro desplegable con el que el usuario puede especificar con qué dispositivos puede compartir su sistema.

página de configuración de experiencias compartidas