Разговор с USB-устройствами, начало работы (приложение UWP)

В этой статье представлено комплексное пошаговое руководство по созданию приложения UWP, которое взаимодействует с USB-устройством.

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

Здесь мы описываем, как приложение UWP может реализовывать эти задачи, а также ссылаться на примеры, демонстрирующие использование классов, включенных в Windows.Devices.Usb. Мы рассмотрим возможности устройства, необходимые в манифесте приложения, и как запустить приложение при подключении устройства. И мы покажем, как запустить задачу передачи данных в фоновом режиме даже при приостановке работы приложения для экономии заряда батареи.

Пошаговое руководство. Написание приложения UWP для USB-устройств

Выполните действия, описанные в этой статье, или перейдите непосредственно к примеру доступа к пользовательскому USB-устройству. В примере компаньона реализованы все шаги, но для того, чтобы не перемещаться, мы не работаем с кодом. Некоторые шаги содержат поиск в примере раздела, чтобы быстро найти код. Структура исходных файлов примера является простой и плоской, поэтому вы можете легко найти код без необходимости детализации на нескольких уровнях исходных файлов. Но вы можете предпочесть разбить и упорядочить собственный проект по-другому.

Установка драйвера Microsoft WinUSB

Установите драйвер WinUSB, предоставленный Корпорацией Майкрософт, в качестве драйвера функции для вашего устройства.

Краткое руководство. Установка WinUSB (Winusb.sys)

Вы можете установить Winusb.sys следующим образом:

  • При подключении устройства вы можете заметить, что Windows загружает Winusb.sys автоматически, так как устройство является устройством WinUSB.
  • Установите драйвер, указав класс устройства, предоставляемый системой, в диспетчер устройств.
  • Установите драйвер с помощью пользовательского INF-файла. Inf можно получить двумя способами:
    • Получите INF от поставщика оборудования.
    • Напишите пользовательский INF-файл, ссылающийся на предоставленный Корпорацией Майкрософт файл Winusb.inf. Дополнительные сведения см. в статье об установке WinUSB (Winusb.sys).

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

Получите идентификатор GUID интерфейса устройства, идентификатор оборудования и сведения о классе устройства.

Эти сведения можно получить от производителя устройства.

  • Идентификаторы поставщика и продукта

    В диспетчер устройств просмотрите свойства устройства. На вкладке "Сведения" просмотрите значение свойства "Идентификатор оборудования". Это значение является сочетанием этих двух идентификаторов. Например, для устройства SuperMUTT идентификатор оборудования — "USB\VID_045E&PID_F001"; — "0x045E", а идентификатор продукта — "0xF001".

  • Класс устройства, подкласс и коды протоколов

  • GUID интерфейса устройства

Кроме того, можно просмотреть сведения о реестре. Дополнительные сведения см. в разделах реестра USB-устройств.

Определение того, разрешен ли набор API USB устройства, подкласс и протокол.

Приложение UWP можно написать, если класс устройства, подкласс и код протокола устройства находится в следующем списке:

  • name:cdcControl, classId:02 * *
  • name:physical, classId:05 * *
  • name:personalHealthcare, classId:0f 00 00
  • name:activeSync, classId:ef 01 01
  • name:palmSync, classId:ef 01 02
  • name:deviceFirmwareUpdate, classId:fe 01 01
  • name:irda, classId:fe 02 00
  • name:measurement, classId:fe 03 *
  • name:vendorSpecific, classId:ff * *

Создание базового проекта Visual Studio

Создайте базовый проект Visual Studio, который можно расширить в этом руководстве.

Дополнительные сведения см. в статье "Начало работы с приложениями UWP".

Добавление возможностей USB-устройства в манифест приложения

Узнайте, как добавить возможности USB-устройства в манифест приложения.

Краткое руководство. Добавление возможностей USB-устройства в манифест приложения

Откройте файл Package.appxmanifest в текстовом редакторе и добавьте элемент DeviceCapability с атрибутом Name, равным usb, как показано в этом примере.

Примечание.

Невозможно изменить возможности USB-устройства в Visual Studio. Щелкните правой кнопкой мыши файл Package.appxmanifest в Обозреватель решений и выберите "Открыть с...", а затем редактор XML (текст). Файл открывается в формате обычного XML.

<Capabilities>
  <!--When the device's classId is FF * *, there is a predefined name for the class.
      You can use the name instead of the class id.
      There are also other predefined names that correspond to a classId.-->
  <m2:DeviceCapability Name="usb">
    <!--SuperMutt Device-->
    <m2:Device Id="vidpid:045E 0611">
      <!--<wb:Function Type="classId:ff * *"/>-->
      <m2:Function Type="name:vendorSpecific"/>
    </m2:Device>
  </m2:DeviceCapability>
</Capabilities>

Найдите его в примере: возможности USB-устройства находятся в файле Package.appxmanifest.

Открытие устройства для связи

Расширьте приложение, чтобы открыть устройство для обмена данными.

Краткое руководство. Подключение к USB-устройству (приложению UWP)

  1. Найдите устройство, создав строку расширенного синтаксиса запросов (AQS), содержащую условия поиска для поиска устройства в перечисленной коллекции устройств.
  2. Откройте устройство одним из двух способов:
  3. Получите экземпляр устройства из свойства DeviceInformation.Id.
  4. Вызов FromIdAsync путем передачи строки экземпляра устройства и получения объекта UsbDevice.

Найдите его в примере: просмотр файлов с именем Scenario1_DeviceConnect.

Изучение макета USB-устройства

Изучите макет USB-устройства.

Ознакомьтесь с основными понятиями USB о настройке устройства и выполнении передачи данных: основные понятия для всех разработчиков USB.

Просмотрите дескриптор конфигурации устройства, дескрипторы интерфейса для каждого поддерживаемого альтернативного параметра и дескрипторы конечных точек. С помощью USBView можно просматривать все USB-контроллеры и USB-устройства, подключенные к ним, а также проверять конфигурацию устройства.

Получение и отображение дескрипторов USB в пользовательском интерфейсе

Расширьте приложение, чтобы получить и показать дескрипторы USB в пользовательском интерфейсе.

Краткое руководство. Как получить дескрипторы USB (приложение UWP)

  • Получите дескриптор устройства, получив значение UsbDevice.DeviceDescriptor.

  • Получите дескриптор конфигурации, получив значение UsbConfiguration.ConfigurationDescriptor.

    • Получите полный набор дескрипторов конфигурации, получив свойство UsbConfiguration.Descriptors.
  • Получите массив интерфейсов в конфигурации, получив свойство UsbConfiguration.UsbInterfaces.

  • Получите массив альтернативных параметров, получив UsbInterface.InterfaceSettings.

  • В активном альтернативном параметре перечислите каналы и получите связанные конечные точки.

    Эти объекты представляют дескрипторы конечных точек:

Найдите его в примере: см. файлы с именем Scenario5_UsbDescriptors.

Отправка передачи usb-элемента управления, определяемого поставщиком

Расширьте приложение для отправки передачи usb-элементов управления, определенных поставщиком.

Краткое руководство. Отправка запроса на передачу USB-элемента управления (приложение UWP)

  1. Получите команду поставщика из спецификации оборудования устройства.
  2. Создайте объект UsbSetupPacket и заполните пакет установки, задав различные свойства.
  3. Запустите асинхронную операцию для отправки передачи элемента управления этими методами в зависимости от направления передачи:

Найдите его в примере: см. файлы с именем Scenario2_ControlTransfer.

Чтение или запись массовых данных

Расширение приложения для чтения или записи массовых данных.

Краткое руководство. Отправка запроса массовой передачи USB (приложение UWP)

  1. Получите объект массового канала (UsbBulkOutPipe или UsbBulkInPipe).
  2. Настройте массовый канал для задания параметров политики.
  3. Настройте поток данных с помощью объекта DataReader или DataWriter.
  4. Запустите асинхронную операцию передачи, вызвав DataReader.LoadAsync или DataWriter.StoreAsync.
  5. Получение результатов операции передачи.

Найдите его в примере: см. файлы с именем Scenario4_BulkPipes.

Получение данных о прерывании оборудования

Расширьте приложение, чтобы получить данные о прерывании оборудования.

Краткое руководство. Отправка запроса на передачу прерываний USB (приложение UWP)

  1. Получите объект канала прерывания (UsbInterruptInPipe или UsbInterruptOutPipe).
  2. Реализуйте обработчик прерываний для события DataReceived.
  3. Зарегистрируйте обработчик событий для начала получения данных.
  4. Отмена регистрации обработчика событий для остановки получения данных.

Найдите его в примере: см. файлы с именем Scenario3_InterruptPipes.

Выберите параметр интерфейса, который сейчас не активен

Расширьте приложение, чтобы выбрать параметр интерфейса, который сейчас не активен.

Краткое руководство. Выбор параметра USB-интерфейса (приложение UWP)

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

  1. Получите активный параметр USB-интерфейса с помощью значения UsbInterfaceSetting.Selected.
  2. Задайте параметр USB-интерфейса, запуская асинхронную операцию, вызвав UsbInterfaceSetting.SelectSettingAsync.

Закройте устройство

Расширьте приложение, чтобы закрыть устройство.

Краткое руководство. Подключение к USB-устройству (приложению UWP)

Завершив использование объекта UsbDevice, закройте устройство.

Приложения C++ должны освободить ссылку с помощью ключевого слова delete . Приложения C#/VB должны вызывать метод UsbDevice.Dispose. Приложения JavaScript должны вызывать USBDevice.Close.

Найдите его в примере: просмотр файлов с именем Scenario1_DeviceConnect.

Создание пакета метаданных устройства

Создайте пакет метаданных устройства для приложения.

Инструмент: мастер разработки метаданных устройства

  • Если у вас установлен комплект драйверов Windows (WDK), откройте файл разработки метаданных>устройства драйвера>.
  • Если установлен автономный пакет SDK, средство находится в <install_path>\bin\x86\DeviceMetadataWizardexe.

Свяжите приложение с устройством, выполнив действия мастера. Введите эти сведения об устройстве:

  • На странице сведений об устройстве введите имя модели, производитель и описание.
  • На странице сведений о оборудовании введите идентификатор оборудования устройства.

Чтобы объявить приложение привилегированным приложением для устройства, выполните следующие инструкции:

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

    Снимок экрана: Visual Studio с метаданными устройства для привилегированных приложений.

    Примечание.

    Не проверяйте параметр пользовательского драйвера Access.

  2. Откройте вкладку "Готово ". Установите флажок "Копировать пакеты" в локальное хранилище метаданных системы.

  3. Подключите устройство в панель управления, откройте представление устройств и принтеров и убедитесь, что значок устройства правильный.

Найдите его в примере: см. папку DeviceMetadata.

Реализация активации автозапуска

Расширьте приложение путем реализации активации Автозапуска, чтобы запустить приложение при подключении устройства к системе.

Краткое руководство. Регистрация приложения для устройства Автозапуска

Вы можете добавить возможности автозапуска, чтобы приложение запускалось при подключении устройства к системе. Вы можете включить автоматическое воспроизведение для всех приложений UWP (привилегированных или других).

  1. В пакете метаданных устройства необходимо указать, как устройство должно реагировать на уведомление автозапуска. На вкладке "Сведения о Windows" выберите параметр приложения устройства UWP и введите сведения о приложении, как показано ниже:

  2. В манифесте приложения добавьте объявление устройства AutoPlay и сведения о запуске, как показано ниже:

    Снимок экрана: манифест приложения с выбранными объявлениями и

  3. В методе OnActivated класса App проверьте, активировало ли устройство приложение. Если это так, метод получает значение параметра DeviceEventArgs, содержащее значение свойства DeviceInformation.Id . Это то же значение, которое описано в разделе "Открыть устройство для обмена данными".

Найдите его в примере: просмотрите файлы с именем Autoplay. Сведения о JavaScript см. в default.js.

Реализация фоновой задачи

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

Чтобы реализовать фоновую задачу, вам потребуется два класса.

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

Примечание.

Инфраструктура фоновых задач устройства, предоставляемая Windows 8.1. Дополнительные сведения о фоновых задачах Windows см. в статье "Поддержка приложения с фоновыми задачами".

Класс фоновой задачи

  1. Реализует интерфейс IBackgroundTask, необходимый инфраструктурой фоновых задач Windows.
  2. Получает экземпляр DeviceUseDetails, переданный в класс в методе Run , и использует этот экземпляр для отправки отчета о ходе выполнения в приложение Microsoft Store и регистрации для событий отмены.
  3. Метод Run также вызывает частные методы OpenDevice и WriteToDeviceAsync, реализующие код синхронизации фоновых устройств.

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

Примечание.

Приведенный ниже пример кода можно применить к фоновой задаче DeviceServicingTrigger, используя соответствующие объекты. Единственное различие между двумя объектами триггера и их соответствующими API являются проверки политики, выполненные Windows.

  1. Создает объекты DeviceUseTrigger и BackgroundTaskRegistration.
  2. Проверяет, были ли фоновые задачи ранее зарегистрированы этим примером приложения и отменяют их, вызвав метод Отмены регистрации для задачи.
  3. Регистрирует фоновую задачу, синхронизированную с устройством. Метод SetupBackgroundTask вызывается из метода SyncWithDeviceAsync на следующем шаге.
    1. Инициализирует DeviceUseTrigger и сохраняет его для последующего использования.
    2. Создает объект BackgroundTaskBuilder и использует его свойства, свойства TaskEntryPoint и SetTrigger для регистрации объекта DeviceUseTrigger приложения и имени фоновой задачи. Свойство TaskEntryPoint объекта BackgroundTaskBuilder имеет полное имя фонового класса задач, который будет выполняться при активации фоновой задачи.
    3. Регистрирует события завершения и хода выполнения из фоновой задачи, чтобы приложение Microsoft Store может предоставлять обновления завершения и хода выполнения пользователю.
  4. Частный метод SyncWithDeviceAsync регистрирует фоновую задачу, которая синхронизируется с устройством и запускает фоновую синхронизацию.
    1. Вызывает метод SetupBackgroundTask из предыдущего шага и регистрирует фоновую задачу, которая будет синхронизироваться с устройством.

    2. Вызывает частный метод StartSyncBackgroundTaskAsync, который запускает фоновую задачу.

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

      Примечание.

      Фоновая задача потребуется открыть устройство для обновления, чтобы приложение Microsoft Store должно закрыть подключения к устройству перед вызовом RequestAsync.

    4. Вызывает метод RequestAsync объекта DeviceUseTrigger, который запускает фоновую задачу и возвращает объект DeviceTriggerResults из RequestAsync, используемый для определения успешности запуска фоновой задачи.

      Примечание.

      Windows проверяет, что все необходимые проверки политики запуска задач завершены. Если все проверки политики завершены, операция обновления теперь выполняется как фоновая задача за пределами приложения Microsoft Store, что позволяет приложению безопасно приостановиться во время выполнения операции. Windows также будет применять любые требования среды выполнения и отменять фоновую задачу, если эти требования больше не выполнены.

    5. Использует объект DeviceTriggerResults, возвращаемый из StartSyncBackgroundTaskAsync, чтобы определить, успешно ли запущена фоновая задача. Оператор switch используется для проверки результата из DeviceTriggerResults.

  5. Реализует частный обработчик событий OnSyncWithDeviceProgresss, который обновляет пользовательский интерфейс приложения с выполнением фоновой задачи.
  6. Реализует частный обработчик событий OnSyncWithDeviceCompleted для обработки перехода от фоновых задач к приложению переднего плана при завершении фоновой задачи.
    1. Использует метод CheckResults объекта BackgroundTaskCompletedEventArgs, чтобы определить, были ли исключения вызваны фоновой задачей.
    2. Приложение повторно открывает устройство для использования приложением переднего плана теперь, когда фоновая задача завершена и обновляет пользовательский интерфейс, чтобы уведомить пользователя.
  7. Реализует обработчики событий нажатия приватной кнопки из пользовательского интерфейса, чтобы начать и отменить фоновую задачу.
    1. Частный обработчик событий Sync_Click вызывает метод SyncWithDeviceAsync, описанный в предыдущих шагах.
    2. Частный обработчик событий CancelSync_Click вызывает частный метод CancelSyncWithDevice, чтобы отменить фоновую задачу.
  8. Частный метод CancelSyncWithDevice отменяет регистрацию и отменяет все активные синхронизации устройств, чтобы устройство можно было повторно открыть с помощью метода Unregister в объекте BackgroundTaskRegistration.

Найдите его в примере: просмотр файлов с именем Scenario7_Sync файлов. Фоновый класс реализован в IoSyncBackgroundTask.

Запуск комплекта сертификации приложений Windows

Запустите комплект сертификации приложений Windows.

Использование комплекта сертификации приложений Windows

Рекомендуется. Запуск комплекта сертификации приложений Для Windows помогает убедиться, что ваше приложение соответствует требованиям Microsoft Store. Его следует запускать всякий раз, когда вы добавляете в приложение основные функциональные возможности.

Пользовательский интерфейс приложения UWP, начало завершения (XAML)

Дополнительные сведения о разработке пользовательского интерфейса приложения UWP.

Стратегия использования приложений UWP с помощью C# и Visual Basic и Стратегии для приложений UWP с помощью C++

Дополнительные сведения о создании приложений UWP с помощью C++, C#или Visual Basic в целом.

Асинхронное программирование (приложения UWP)

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

Важные API