Compartir a través de


Detección de 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 supone que ya se le ha concedido acceso a la característica Sistemas remotos siguiendo los pasos descritos en Iniciar una aplicación remota.

Filtrar el conjunto de dispositivos detectables

Puede restringir el conjunto de dispositivos detectables mediante un RemoteSystemWatcher con filtros. Los filtros pueden detectar el tipo de detección (próximo vs. red local vs. conexión en la nube), el tipo de dispositivo (escritorio, dispositivo móvil, Xbox, Hub y Holográfico) y el estado de disponibilidad (el estado de disponibilidad de un dispositivo para usar las funciones del sistema remoto).

Los objetos de filtro se deben construir antes o mientras se inicializa el objeto RemoteSystemWatcher, ya que se pasan como parámetro 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 instrucción using Windows.System.RemoteSystems 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 una proximidad física: RemoteSystem.IsAvailableBySpatialProximity.

Nota:

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

Una vez que se ha creado una lista de objetos de tipo 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 observador, se generará el evento RemoteSystemAdded solo si se detecta un dispositivo que cumpla 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 manejar 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 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);

Descubrimiento entre usuarios

Los desarrolladores pueden especificar el descubrimiento de todos los dispositivos que se encuentren en proximidad al dispositivo cliente, no solo los dispositivos registrados al mismo usuario. Esto se implementa mediante 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 RemoteSystemAuthorizationKind valor de Anonymous permitirá la detección de todos los dispositivos proximales, incluso los de usuarios no confiables.
  • Un valor de SameUser filtra la detección solo a los dispositivos registrados al mismo usuario que el dispositivo cliente. Este es el comportamiento predeterminado.

Revisando la configuración de uso compartido entre diferentes 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 de Ajustes. En el menú System>Experiencias compartidas>Compartir 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