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


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

Ваше приложение может использовать беспроводной сети, 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);

При вызове метода 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".
}

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

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