Compartilhar via


Descobrir dispositivos remotos

Seu aplicativo pode usar a rede sem fio, Bluetooth e conexão de nuvem para descobrir dispositivos Windows que estão conectados com a mesma conta da Microsoft que o dispositivo de descoberta. Os dispositivos remotos não precisam ter nenhum software especial instalado para serem detectáveis.

Observação

Este guia pressupõe que você já tenha recebido acesso ao recurso Sistemas Remotos seguindo as etapas em iniciar um aplicativo remoto.

Filtrar o conjunto de dispositivos detectáveis

Você pode restringir o conjunto de dispositivos detectáveis usando um RemoteSystemWatcher com filtros. Os filtros podem detectar o tipo de descoberta (proximal vs. rede local versus conexão de nuvem), tipo de dispositivo (desktop, dispositivo móvel, Xbox, Hub e Holographic) e status de disponibilidade (o status da disponibilidade de um dispositivo para usar recursos do Sistema Remoto).

Objetos de filtro devem ser construídos antes ou enquanto o objeto RemoteSystemWatcher é inicializado, pois eles são passados como um parâmetro para seu construtor. O código a seguir cria um filtro de cada tipo disponível e, em seguida, adiciona-os a uma lista.

Observação

O código nesses exemplos requer que você tenha uma instrução using Windows.System.RemoteSystems em seu arquivo.

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

Observação

O valor do filtro "proximal" não garante o grau de proximidade física. Para cenários que exigem proximidade física confiável, use o valor RemoteSystemDiscoveryType.SpatiallyProximal em seu filtro. Atualmente, esse filtro só permite dispositivos descobertos por Bluetooth. À medida que novos mecanismos de descoberta e protocolos que garantem a proximidade física têm suporte, eles também serão incluídos aqui.
Há também uma propriedade na classe RemoteSystem que indica se um dispositivo descoberto está de fato dentro da proximidade física: RemoteSystem.IsAvailableBySpatialProximity.

Observação

Se você pretende descobrir dispositivos em uma rede local (determinado pela seleção de filtro de tipo de descoberta), sua rede precisa estar usando um perfil "privado" ou "de domínio". Seu dispositivo não descobrirá outros dispositivos em uma rede "pública".

Depois que uma lista de objetos IRemoteSystemFilter for criada, ela poderá ser passada para o construtor de um RemoteSystemWatcher.

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

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

Quando o método Iniciar desse observador for chamado, ele gerará o evento RemoteSystemAdded somente se for detectado um dispositivo que atenda a todos os seguintes critérios:

  • É detectável por conexão proximal
  • É um desktop ou telefone
  • Ele é classificado como disponível

A partir daí, o procedimento para lidar com eventos, recuperar objetos RemoteSystem e conectar-se a dispositivos remotos é exatamente o mesmo que em iniciar um aplicativo remoto. Em suma, os objetos RemoteSystem são armazenados como propriedades dos objetos RemoteSystemAddedEventArgs, que são transmitidos com cada evento RemoteSystemAdded.

Descobrir dispositivos por entrada de endereço

Alguns dispositivos podem não estar associados a um usuário ou detectáveis com uma verificação, mas ainda poderão ser acessados se o aplicativo de descoberta usar um endereço direto. A classe HostName é usada para representar o endereço de um dispositivo remoto. Isso geralmente é armazenado na forma de um endereço IP, mas vários outros formatos são permitidos (consulte o construtor HostName para obter detalhes).

Um objeto RemoteSystem é recuperado se um objeto HostName válido for fornecido. Se os dados de endereço forem inválidos, uma referência de objeto null será retornada.

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

Consultando uma funcionalidade em um sistema remoto

Embora separado da filtragem de descoberta, a consulta dos recursos do dispositivo pode ser uma parte importante do processo de descoberta. Usando o método RemoteSystem.GetCapabilitySupportedAsync, você pode consultar sistemas remotos descobertos para obter suporte a determinados recursos, como conectividade de sessão remota ou compartilhamento de entidade espacial (holográfica). Consulte a classe KnownRemoteSystemCapabilities para obter a lista de recursos que podem ser consultados.

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

Descoberta entre usuários

Os desenvolvedores podem especificar a descoberta de todos os dispositivos próximos ao dispositivo cliente, não apenas dispositivos registrados para o mesmo usuário. Isso é implementado por meio de uma IRemoteSystemFilterespecial, RemoteSystemAuthorizationKindFilter. Ele é implementado como os outros 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
  • Um RemoteSystemAuthorizationKind valor de Anonymous permitirá a descoberta de todos os dispositivos próximos, mesmo aqueles de usuários não confiáveis.
  • Um valor de SameUser filtra a descoberta apenas para dispositivos registrados para o mesmo usuário que o dispositivo cliente. Esse é o comportamento padrão.

Verificando as configurações de compartilhamento entre usuários

Além do filtro acima que está sendo especificado em seu aplicativo de descoberta, o próprio dispositivo cliente também deve ser configurado para permitir experiências compartilhadas de dispositivos conectados com outros usuários. Essa é uma configuração do sistema que pode ser consultada com um método estático na 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".
}

Para alterar essa configuração, o usuário deve abrir Configurações. No menu "Sistema >Experiências Compartilhadas>Compartilhar entre dispositivos", há uma caixa suspensa na qual o usuário pode especificar com quais dispositivos seu sistema pode compartilhar.

página de configurações de experiências compartilhadas