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 microsoft que el dispositivo de detección. Los dispositivos remotos no necesitan tener instalado ningún software especial para que se puedan reconocer.

Nota:

Esta guía da por hecho que ya has concedido acceso a la característica de sistemas remotos siguiendo los pasos de Iniciar una aplicación remota.

Filtrar el conjunto de dispositivos reconocibles

Puede restringir el conjunto de dispositivos detectables mediante un RemoteSystemWatcher con filtros. Los filtros pueden detectar el tipo de detección (proximal frente a red local frente a 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 un parámetro a su constructor. El siguiente código crea un filtro de cada tipo disponible y luego 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 de 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 admitan 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 en 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 que se crea una lista de objetos IRemoteSystemFilter, se puede pasar en el 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 Inicio de este observador, se genera el evento RemoteSystemAdded solo si se detecta un dispositivo que cumpla con todos los criterios siguientes:

  • Es reconocible por conexión de proximidad
  • Es un escritorio o un teléfono
  • Se clasifica como disponible

Desde allí, el procedimiento para controlar los eventos, recuperar objetos RemoteSystem y conectarse a dispositivos remotos es exactamente igual que el de 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 .

Detectar dispositivos mediante entrada de dirección

Es posible que algunos dispositivos no estén asociados a un usuario o no sean detectables mediante un examen, pero se puede llegar a ellos igualmente si la aplicación detectada usa una dirección directa. La clase HostName se usa para representar la dirección de un dispositivo remoto. A menudo se almacena en forma de una dirección IP, pero se permiten varios otros formatos (consulta el constructor de HostName para obtener información detallada).

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

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 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 proxy, incluso los de usuarios que no son de confianza.
  • Un valor de SameUser filtra la detección en solo los dispositivos registrados en el mismo usuario que el dispositivo cliente. Este es el comportamiento predeterminado.

Comprobación de la configuración de 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ú Compartirexperiencias> 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