Поделиться через


Обнаружение удаленных устройств

Ваше приложение может использовать беспроводную сеть, Bluetooth и облачное подключение для обнаружения устройств Windows, которые входят в систему с той же учетной записью Майкрософт, что и устройство, выполняющее обнаружение. Удаленные устройства не должны устанавливать специальное программное обеспечение для обнаружения.

Замечание

В этом руководстве предполагается, что вы уже получили доступ к функции удаленных систем, выполнив действия, описанные в запуске удаленного приложения.

Фильтрация набора обнаруженных устройств

Вы можете сузить набор обнаруживаемых устройств, используя RemoteSystemWatcher с фильтрами. Фильтры могут обнаруживать тип обнаружения (проксимальные и локальные сети и облачное подключение), тип устройства (настольный компьютер, мобильное устройство, Xbox, Концентратор и Holographic) и состояние доступности (состояние доступности устройства для использования функций удаленной системы).

Объекты фильтра должны быть созданы до или во время инициализации объекта RemoteSystemWatcher, так как они передаются в качестве параметра в его конструктор. Следующий код создает фильтр каждого типа, а затем добавляет их в список.

Замечание

Для работы кода в этих примерах требуется, чтобы в вашем файле была инструкция using Windows.System.RemoteSystems.

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

Замечание

Значение фильтра "проксимальный" не гарантирует степень физического взаимодействия. Для сценариев, требующих надежного физического взаимодействия, используйте значение RemoteSystemDiscoveryType.SpatiallyProximal в фильтре. В настоящее время этот фильтр разрешает только устройства, обнаруженные Bluetooth. Поскольку поддерживаются новые механизмы обнаружения и протоколы, гарантирующие физическое близкое взаимодействие, они также будут включены здесь.
Существует также свойство в классе RemoteSystem, указывающее, находится ли обнаруженное устройство в физической близости: RemoteSystem.IsAvailableBySpatialProximity.

Замечание

Если вы планируете обнаруживать устройства через локальную сеть (определяется выбранным фильтром типов обнаружения), сеть должна использовать профиль "частный" или "домен". Устройство не обнаружит другие устройства через "общедоступную" сеть.

После того как создан список объектов IRemoteSystemFilter, его можно передать в конструктор RemoteSystemWatcher.

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

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

При вызове метода Старт этого наблюдателя он вызовет событие RemoteSystemAdded только в том случае, если обнаружено устройство, соответствующее всем следующим критериям:

  • Он доступен для обнаружения по проксимальному соединению
  • Это рабочий стол или телефон
  • Он классифицируется как доступный

Оттуда процедура обработки событий, извлечение объектов RemoteSystem и подключение к удаленным устройствам такой же, как в запуск удаленного приложения. Короче говоря, объекты RemoteSystem хранятся как свойства объектов RemoteSystemAddedEventArgs, которые передаются с каждым событием RemoteSystemAdded.

Обнаружение устройств по вводу адреса

Некоторые устройства могут не быть связаны с пользователем или обнаруживаемыми с помощью сканирования, но их все равно можно достичь, если приложение обнаружения использует прямой адрес. Класс hostName используется для представления адреса удаленного устройства. Это часто хранится в виде IP-адреса, но некоторые другие форматы разрешены (дополнительные сведения см. в конструкторе hostName ).

Объект RemoteSystem извлекается, если предоставлен допустимый объект HostName. Если данные адреса недействительны, будет возвращена ссылка на объект 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;
}

Запрос возможностей в удаленной системе

Несмотря на то что фильтрация во время обнаружения является отдельным процессом, опрос возможностей устройств может быть важной частью процесса обнаружения. С помощью метода RemoteSystem.GetCapabilitySupportedAsync можно запросить обнаруженные удаленные системы для поддержки определенных возможностей, таких как подключение к удаленному сеансу или общий доступ к пространственным сущностям (голографическим). См. класс KnownRemoteSystemCapabilities для списка возможностей, доступных для запросов.

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

Перекрёстное обнаружение пользователей

Разработчики могут указать обнаружение всех устройств вблизи клиентского устройства, а не только устройств, прикреплённых к одному пользователю. Это реализуется с помощью специального IRemoteSystemFilter, RemoteSystemAuthorizationKindFilter. Он реализован так же, как и другие типы фильтров:

// Construct a user type filter that includes anonymous devices
RemoteSystemAuthorizationKindFilter authorizationKindFilter = new RemoteSystemAuthorizationKindFilter(RemoteSystemAuthorizationKind.Anonymous);
// then add this filter to the RemoteSystemWatcher
  • Значение RemoteSystemAuthorizationKind анонимного анонимного позволит обнаружить все проксимальные устройства, даже ненадежные пользователи.
  • Значение SameUser фильтрует обнаружение только на устройства, зарегистрированные на того же пользователя, что и клиентское устройство. Это поведение по умолчанию.

Проверка параметров общего доступа между пользователями

Помимо указанного выше фильтра, в приложении обнаружения, само клиентское устройство также должно быть настроено для предоставления общего опыта с устройствами, на которых вошли в систему другие пользователи. Это системный параметр, который можно запросить со статическим методом в классе 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".
}

Чтобы изменить этот параметр, пользователь должен открыть приложение Настройки. В меню System>Общий опыт>Поделиться между устройствами, есть раскрывающийся список, где пользователь может указать, с какими устройствами его система может делиться.

страница параметров общего интерфейса