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


Перечисление устройств

API-интерфейсы Windows.Devices.Enumeration позволяют находить устройства, подключенные к системе, внешние подключения или обнаруживаемые через беспроводные или сетевые протоколы.

Примеры

Самый простой способ перечисления всех доступных устройств — сделать моментальный снимок с помощью команды FindAllAsync (описано далее в разделе ниже).

async void enumerateSnapshot(){
  DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}

Пример перечисления и связывания устройств см. в более расширенном примере API Windows.Devices.Enumeration.

API перечисления

Пространство имен Windows.Devices.Enumeration позволяет находить устройства, подключенные внутренне к системе, внешние подключения или обнаруживаемые по беспроводным или сетевым протоколам. Ниже перечислены некоторые функции, поддерживаемые этими API:

  • Поиск устройства для подключения к приложению.
  • Получение сведений о устройствах, подключенных к системе или доступных для обнаружения.
  • Получайте уведомления о добавлении устройств, подключении, отключении, изменении состояния сети или изменении других свойств.
  • Получение фоновых триггеров приложения при подключении, отключении, изменении состояния сети или изменении других свойств.

Эти API-интерфейсы могут перечислять устройства по любому из следующих протоколов и автобусов, предоставив отдельное устройство и систему, на которой работает эта технология. Это не исчерпывающий список, а другие протоколы могут поддерживаться определенным устройством.

Во многих случаях вам не нужно беспокоиться об использовании API перечисления. Это связано с тем, что многие API, использующие устройства, автоматически выбирают соответствующее устройство по умолчанию или предоставляют более упрощенный API перечисления. Например, MediaElement автоматически будет использовать устройство отрисовщика звука по умолчанию. Если приложение может использовать устройство по умолчанию, в приложении нет необходимости использовать API перечисления в приложении. API перечисления предоставляют общий и гибкий способ обнаружения и подключения к доступным устройствам. В этом разделе содержатся сведения о перечислении устройств и описаны четыре распространенных способа перечисления устройств.

  • Использование пользовательского интерфейса DevicePicker
  • Перечисление моментального снимка устройств, доступных в настоящее время системой
  • Перечисление устройств, которые в настоящее время доступны для обнаружения и отслеживания изменений
  • Перечисление устройств, доступных для обнаружения и отслеживания изменений в фоновой задаче

Объекты DeviceInformation

Работа с API перечисления часто требуется использовать объекты DeviceInformation . Эти объекты содержат большую часть доступных сведений об устройстве. В следующей таблице описаны некоторые свойства DeviceInformation , которые вам нужны. Полный список см. на странице справки по DeviceInformation.

Свойство Комментарии
DeviceInformation.Id Это уникальный идентификатор устройства и предоставляется в виде строковой переменной. В большинстве случаев это непрозрачное значение, которое вы просто передаете из одного метода в другой, чтобы указать конкретное устройство, которое вы хотите. Вы также можете использовать это свойство и свойство DeviceInformation.Kind после закрытия приложения и повторного его открытия. Это обеспечит восстановление и повторное использование одного и того же объекта DeviceInformation .
DeviceInformation.Kind Это означает тип объекта устройства, представленного объектом DeviceInformation . Это не категория устройства или тип устройства. Одно устройство может быть представлено несколькими различными объектами DeviceInformation различных типов. Возможные значения этого свойства перечислены в DeviceInformationKind , а также как они связаны друг с другом.
DeviceInformation.Properties Этот контейнер свойств содержит сведения, запрашиваемые для объекта DeviceInformation . Наиболее распространенные свойства легко ссылаются в качестве свойств объекта DeviceInformation, например с DeviceInformation.Name. Дополнительные сведения см. в разделе "Свойства сведений об устройстве".

 

Пользовательский интерфейс DevicePicker

DevicePicker — это элемент управления, предоставляемый Windows, который создает небольшой пользовательский интерфейс, позволяющий пользователю выбрать устройство из списка. Его можно настроить несколькими способами, например:

  • Управление устройствами, отображаемыми в пользовательском интерфейсе, путем добавления поддерживаемых объектовDeviceSelectors, supportedDeviceClasses или обоих устройств в DevicePicker.Filter. В большинстве случаев необходимо добавить только один селектор или класс, но если вам потребуется несколько, можно добавить несколько. При добавлении нескольких селекторов или классов они связаны с помощью функции логики OR.
  • Укажите свойства, которые нужно получить для устройств. Это можно сделать, добавив свойства в DevicePicker.RequestedProperties.
  • Измените внешний вид DevicePicker с помощью внешнего вида.
  • Укажите размер и расположение УстройстваPicker при отображении.

При отображении DevicePicker содержимое пользовательского интерфейса будет автоматически обновляться при добавлении, удалении или обновлении устройств.

Примечание. Нельзя указать DeviceInformationKind с помощью DevicePicker. Если у вас есть устройства определенного DeviceInformationKind, вам потребуется создать DeviceWatcher и предоставить собственный пользовательский интерфейс.

 

Приведение содержимого мультимедиа и DIAL также предоставляет собственные средства выбора, если вы хотите их использовать. Они являются CastingDevicePicker и DialDevicePicker соответственно.

Перечисление моментального снимка устройств

В некоторых сценариях Устройство DevicePicker не подходит для ваших потребностей, и вам потребуется что-то более гибкое. Возможно, вам нужно создать собственный пользовательский интерфейс или перечислить устройства без отображения пользовательского интерфейса пользователю. В таких ситуациях можно перечислить моментальный снимок устройств. Это включает в себя просмотр устройств, которые в настоящее время подключены к системе или связаны с ней. Однако необходимо учитывать, что этот метод просматривает только моментальный снимок доступных устройств, поэтому вы не сможете найти устройства, которые подключаются после перечисления по списку. Вы также не будете получать уведомления, если устройство обновляется или удаляется. Еще одним потенциальным недостатком является то, что этот метод будет удерживать любые результаты до завершения всего перечисления. По этой причине этот метод не следует использовать, если вы заинтересованы в объектах AssociationEndpoint, AssociationEndpointContainer или AssociationEndpointService , так как они найдены по сетевому или беспроводному протоколу. Это может занять до 30 секунд. В этом сценарии необходимо использовать объект DeviceWatcher для перечисления с помощью возможных устройств.

Чтобы перечислить снимок устройств, используйте метод FindAllAsync . Этот метод ожидает завершения всего процесса перечисления и возвращает все результаты в виде одного объекта DeviceInformationCollection. Этот метод также перегружен, чтобы предоставить вам несколько вариантов фильтрации результатов и ограничения их на интересующие вас устройства. Это можно сделать, предоставив DeviceClass или передав селектор устройства. Селектор устройства — это строка расширенного синтаксиса запросов (AQS), указывающая устройства, которые необходимо перечислить. Дополнительные сведения см. в разделе "Создание селектора устройства".

Помимо ограничения результатов, можно также указать свойства, которые требуется получить для устройств. Если это сделать, указанные свойства будут доступны в контейнере свойств для каждого объекта DeviceInformation , возвращаемого в коллекции. Важно отметить, что не все свойства доступны для всех типов устройств. Чтобы узнать, какие свойства доступны для типов устройств, см. сведения о свойствах сведений об устройстве.

Перечисление и просмотр устройств

Более мощный и гибкий метод перечисления устройств создает DeviceWatcher. Этот параметр обеспечивает большую гибкость при перечислении устройств. Он позволяет перечислять устройства, которые в настоящее время присутствуют, а также получать уведомления, когда устройства, соответствующие селектору устройств, добавляются, удаляются или изменяются свойства. При создании DeviceWatcher вы предоставляете селектор устройств. Дополнительные сведения о селекторах устройств см. в разделе "Создание селектора устройств". После создания наблюдателя вы получите следующие уведомления для любого устройства, соответствующего заданным критериям.

  • Добавьте уведомление при добавлении нового устройства.
  • Обновите уведомление об изменении интересующего вас свойства.
  • Удалите уведомление, когда устройство больше не доступно или больше не соответствует фильтру.

В большинстве случаев, когда вы используете DeviceWatcher, вы храните список устройств и добавляете к нему, удаляя элементы из него или обновляя элементы, когда наблюдатель получает обновления от устройств, которые вы просматриваете. При получении уведомления об обновлении обновленные сведения будут доступны как объект DeviceInformationUpdate. Чтобы обновить список устройств, сначала найдите соответствующее устройство DeviceInformation , которое изменилось. Затем вызовите метод Update для этого объекта, предоставляя объект DeviceInformationUpdate . Это удобная функция, которая автоматически обновляет объект DeviceInformation .

Так как DeviceWatcher отправляет уведомления по мере поступления устройств и при их изменении, следует использовать этот метод перечисления устройств, если вы заинтересованы в AssociationEndpoint, AssociationEndpointContainer или AssociationEndpointService, так как они перечисляются по сетевым или беспроводным протоколам.

Чтобы создать DeviceWatcher, используйте один из методов CreateWatcher. Эти методы перегружены, чтобы указать интересующие вас устройства. Это можно сделать, предоставив DeviceClass или передав селектор устройства. Селектор устройства — это строка AQS, указывающая устройства, которые требуется перечислить. Дополнительные сведения см. в разделе "Создание селектора устройства". Вы также можете указать свойства, которые вы хотите получить для устройств и заинтересованы в них. Если это сделать, указанные свойства будут доступны в контейнере свойств для каждого объекта DeviceInformation , возвращаемого в коллекции. Важно отметить, что не все свойства доступны для всех типов устройств. Сведения о доступных свойствах устройств см. в разделе "Свойства сведений об устройстве"

Просмотр устройств в качестве фоновой задачи

Отслеживание устройств в качестве фоновой задачи очень похоже на создание DeviceWatcher , как описано выше. На самом деле необходимо создать обычный объект DeviceWatcher , как описано в предыдущем разделе. Создав его, вы вызываете GetBackgroundTrigger вместо DeviceWatcher.Start. При вызове GetBackgroundTrigger необходимо указать, какие уведомления вам нужны: добавление, удаление или обновление. Вы также не можете запросить обновление или удаление без запроса на добавление. После регистрации триггера устройство DeviceWatcher начнет работать сразу же в фоновом режиме. С этого момента каждый раз, когда он получает новое уведомление для приложения, соответствующего вашим критериям, фоновая задача будет запускаться, и она предоставит последние изменения, так как оно в последний раз активировало приложение.

Важное значение, когда устройство DeviceWatcherTrigger активирует приложение, когда наблюдатель достигнет состояния ПеречисленияCompleted. Это означает, что он будет содержать все начальные результаты. В любое время, когда оно активирует приложение, оно будет содержать только уведомления о добавлении, обновлении и удалении уведомлений, которые произошли с момента последнего триггера. Это немного отличается от объекта DeviceWatcher переднего плана, так как начальные результаты не приходят одновременно и доставляются только в пакете после достижения перечисленияCompleted.

 

Некоторые беспроводные протоколы ведут себя по-разному, если они сканируются в фоновом режиме и переднем плане, или они могут вообще не поддерживать сканирование в фоновом режиме. Существует три возможности с отношением к фоновому сканированию. В следующей таблице перечислены возможности и последствия, которые могут оказаться в приложении. Например, Bluetooth и Wi-Fi Direct не поддерживают фоновые проверки, поэтому по расширению они не поддерживают Устройство DeviceWatcherTrigger.

Поведение Воздействие
То же поведение в фоновом режиме нет
Только пассивные проверки, возможные в фоновом режиме Устройство может занять больше времени для обнаружения во время ожидания пассивной проверки.
Фоновые проверки не поддерживаются Устройства не будут обнаруживаться устройством DeviceWatcherTrigger, и обновления не будут сообщаться.

 

Если deviceWatcherTrigger включает протокол, который не поддерживает сканирование в качестве фоновой задачи, триггер по-прежнему будет работать. Однако вы не сможете получать какие-либо обновления или результаты по протоколу. Обновления для других протоколов или устройств по-прежнему обнаруживаются обычно.

Использование DeviceInformationKind

В большинстве случаев вам не придется беспокоиться об устройстве DeviceInformationKind объекта DeviceInformation. Это связано с тем, что селектор устройства, возвращаемый API устройства, который вы используете, часто гарантирует, что вы получаете правильные виды объектов устройств для использования с их API. Однако в некоторых сценариях вы хотите получить DeviceInformation для устройств, но нет соответствующего API устройства для предоставления селектора устройств. В этих случаях вам потребуется создать собственный селектор. Например, веб-службы на устройствах не имеют выделенного API, но вы можете обнаружить эти устройства и получить сведения о них с помощью API Windows.Devices.Enumeration, а затем использовать их с помощью API сокета.

Если вы создаете собственный селектор устройств для перечисления с помощью объектов устройств, DeviceInformationKind будет важно понимать. Все возможные виды, а также как они связаны друг с другом, описаны на справочной странице DeviceInformationKind. Одним из наиболее распространенных способов использования DeviceInformationKind является указание типа устройств, которые вы ищете при отправке запроса в сочетании с селектором устройств. При этом вы можете перечислить только устройства, соответствующие предоставленному DeviceInformationKind. Например, можно найти объект DeviceInterface , а затем запустить запрос, чтобы получить сведения для родительского объекта Device . Этот родительский объект может содержать дополнительные сведения.

Важно отметить, что свойства, доступные в контейнере свойств для объекта DeviceInformation , будут отличаться в зависимости от Устройства DeviceInformationKind устройства. Некоторые свойства доступны только с определенными типами. Дополнительные сведения о том, какие свойства доступны для каких типов, см. в разделе "Свойства сведений об устройстве". Таким образом, в приведенном выше примере поиск родительского устройства даст вам доступ к дополнительным сведениям, недоступным из объекта устройства DeviceInterface . Из-за этого при создании строк фильтра AQS важно убедиться, что запрошенные свойства доступны для перечисленных объектов DeviceInformationKind . Дополнительные сведения о создании фильтра см. в разделе "Создание селектора устройства".

При перечислении объектов AssociationEndpoint, AssociationEndpointContainer или AssociationEndpointService выполняется перечисление по беспроводному или сетевому протоколу. В этих ситуациях рекомендуется не использовать FindAllAsync и вместо этого использовать CreateWatcher. Это связано с тем, что поиск по сети часто приводит к операциям поиска, которые не будут время ожидания в течение 10 или более секунд до создания ПеречисленияCompleted. FindAllAsync не завершает свою операцию до активации ПеречисленияCompleted . Если вы используете DeviceWatcher, вы получите результаты ближе к реальному времени независимо от вызова ПеречисленияCompleted.

Сохранение устройства для последующего использования

Любой объект DeviceInformation однозначно определяется сочетанием двух частей информации: DeviceInformation.Id и DeviceInformation.Kind. Если вы храните эти два фрагмента информации, вы можете повторно создать объект DeviceInformation после его потери, указав эти сведения в CreateFromIdAsync. При этом можно сохранить параметры пользователя для устройства, которое интегрируется с приложением.