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

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

Примечание

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

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

Набор доступных для обнаружения устройств можно ограничить, используя RemoteSystemWatcher с фильтрами. Фильтры могут определять тип обнаружения (подключение близкого радиуса действия или локальная сеть или облачное подключение), типа устройства (компьютер, мобильное устройство, Xbox, Hub и 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;
}

Примечание

Значение фильтра "proximal" не гарантирует степень физической близости. Для сценариев, которым требуется надежная физическая близость, используйте значение 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);

При вызове метода Start этого наблюдателя он инициирует событие 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 параметра Anonymous будет разрешать обнаружение всех ближайших устройств, даже устройств от ненадежных пользователей.
  • Значение 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".
}

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

страница параметров общих возможностей