Udostępnij przez


Odnajdywanie urządzeń zdalnych

Aplikacja może używać sieci bezprzewodowej, połączenia Bluetooth i połączenia w chmurze, aby odnaleźć urządzenia z systemem Windows, które są zalogowane przy użyciu tego samego konta Microsoft, co urządzenie odnajdujące. Urządzenia zdalne nie muszą mieć zainstalowanego specjalnego oprogramowania, aby można je było odnaleźć.

Uwaga / Notatka

W tym przewodniku założono, że masz już udzielony dostęp do funkcji Systemy zdalne, wykonując kroki opisane w temacie Uruchamianie aplikacji zdalnej.

Filtrowanie zestawu odnajdwalnych urządzeń

Zestaw odnajdwalnych urządzeń można zawęzić przy użyciu elementu RemoteSystemWatcher z filtrami. Filtry mogą wykrywać typ odnajdywania (bliskie, sieć lokalna lub połączenie z chmurą), typ urządzenia (komputer, urządzenie przenośne, konsola Xbox, Hub i urządzenie holograficzne) oraz stan dostępności (stan, w jakim urządzenie jest dostępne do korzystania z funkcji systemu zdalnego).

Obiekty filtru należy skonstruować przed zainicjowaniem obiektu RemoteSystemWatcher lub podczas jego inicjowania, ponieważ są przekazywane jako parametr do konstruktora. Poniższy kod tworzy filtr każdego dostępnego typu, a następnie dodaje go do listy.

Uwaga / Notatka

Kod w tych przykładach wymaga deklaracji using Windows.System.RemoteSystems w pliku.

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

Uwaga / Notatka

Wartość filtra "proximal" nie gwarantuje stopnia fizycznej bliskości. W przypadku scenariuszy wymagających niezawodnej odległości fizycznej użyj wartości RemoteSystemDiscoveryType.SpatiallyProximal w filtrze. Obecnie ten filtr zezwala tylko na urządzenia, które są odnajdywane przez funkcję Bluetooth. W miarę jak obsługiwane są nowe mechanizmy odnajdywania i protokoły gwarantujące bliskość fizyczną, będą one tutaj również uwzględniane.
Istnieje również właściwość w klasie RemoteSystem , która wskazuje, czy odnalezione urządzenie znajduje się w rzeczywistości w fizycznej odległości: RemoteSystem.IsAvailableBySpatialProximity.

Uwaga / Notatka

Jeśli zamierzasz odnajdywać urządzenia w sieci lokalnej (określone przez wybór filtru typu odnajdywania), Twoja sieć musi korzystać z profilu "prywatnego" lub "domenowego". Urządzenie nie odnajduje innych urządzeń za pośrednictwem sieci "publicznej".

Po utworzeniu listy obiektów IRemoteSystemFilter, można ją przekazać do konstruktora RemoteSystemWatcher.

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

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

Po wywołaniu metody Start tego obserwatora, zostanie wywołane zdarzenie RemoteSystemAdded tylko wtedy, gdy wykryte zostanie urządzenie, które spełnia wszystkie następujące kryteria:

  • Można go odnaleźć za pomocą połączenia proximalnego
  • Jest to komputer stacjonarny lub telefon
  • Jest klasyfikowana jako dostępna

W tym miejscu procedura obsługi zdarzeń, pobierania obiektów RemoteSystem i nawiązywania połączenia z urządzeniami zdalnymi jest dokładnie taka sama jak w temacie Uruchamianie aplikacji zdalnej. Krótko mówiąc, obiekty RemoteSystem są przechowywane jako właściwości obiektów RemoteSystemAddedEventArgs, które są przekazywane z każdym zdarzeniem RemoteSystemAdded.

Odkrywanie urządzeń poprzez wprowadzenie adresu

Niektóre urządzenia mogą nie być skojarzone z użytkownikiem ani nie dawać się wykryć przez skanowanie, ale nadal można się z nimi połączyć, jeśli aplikacja odnajdująca używa bezpośredniego adresu. Klasa HostName służy do reprezentowania adresu urządzenia zdalnego. Jest to często przechowywane w postaci adresu IP, ale kilka innych formatów jest dozwolonych (zobacz konstruktor HostName , aby uzyskać szczegółowe informacje).

Obiekt RemoteSystem jest pobierany, jeśli podano prawidłowy obiekt HostName . Jeśli dane adresu są nieprawidłowe, null zwracane jest odwołanie do obiektu.

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

Wykonywanie zapytań dotyczących możliwości w systemie zdalnym

Chociaż oddzielone od filtrowania w procesie odkrywania, zapytania dotyczące możliwości urządzeń mogą być ważną częścią procesu odkrywania. Korzystając z metody RemoteSystem.GetCapabilitySupportedAsync , można wykonywać zapytania dotyczące odnalezionych systemów zdalnych w celu obsługi niektórych funkcji, takich jak łączność sesji zdalnej lub udostępnianie jednostki przestrzennej (holograficznej). Zobacz KnownRemoteSystemCapabilities, aby zapoznać się z listą możliwości do wykonywania zapytań.

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

Wzajemne odkrywanie użytkowników

Deweloperzy mogą określić odnajdywanie wszystkich urządzeń znajdujących się w pobliżu urządzenia klienckiego, a nie tylko urządzeń zarejestrowanych dla tego samego użytkownika. Implementuje się to za pomocą specjalnego IRemoteSystemFilter, RemoteSystemAuthorizationKindFilter. Jest on implementowany jak inne typy filtrów:

// Construct a user type filter that includes anonymous devices
RemoteSystemAuthorizationKindFilter authorizationKindFilter = new RemoteSystemAuthorizationKindFilter(RemoteSystemAuthorizationKind.Anonymous);
// then add this filter to the RemoteSystemWatcher
  • Wartość RemoteSystemAuthorizationKindAnonymous umożliwi odnajdywanie wszystkich bliskich urządzeń, nawet tych od niezaufanych użytkowników.
  • Wartość SameUser ogranicza wyszukiwanie tylko do urządzeń zarejestrowanych na tego samego użytkownika, co urządzenie klienta. Jest to zachowanie domyślne.

Sprawdzanie ustawień udostępniania między użytkownikami

Oprócz powyższego filtru określonego w aplikacji odnajdywania urządzenie klienckie musi być również skonfigurowane tak, aby zezwalało na udostępnianie środowisk z urządzeń zalogowanych innym użytkownikom. Jest to ustawienie systemowe, które można zapytać, używając metody statycznej w klasie 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".
}

Aby zmienić to ustawienie, użytkownik musi otworzyć pozycję Ustawienia. W menu systemu Udostępniane doświadczeniaUdostępniaj na urządzeniach znajduje się pole rozwijane, za pomocą którego użytkownik może określić, z którymi urządzeniami system może się udostępniać.

strona ustawień wspólnych doświadczeń