Общение с 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 интерфейса устройства, идентификатор оборудования и сведения о классе устройства.

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

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

    В диспетчер устройств просмотрите свойства устройства. На вкладке Сведения просмотрите значение свойства Hardware Id . Это значение представляет собой сочетание этих двух идентификаторов. Например, для устройства 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)

Найдите его в примере: См. файлы с именем 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++ должны освободить ссылку с помощью ключевое слово удаления. Приложения C#/VB должны вызывать метод UsbDevice.Dispose . Приложения JavaScript должны вызывать UsbDevice.Close.

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

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

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

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

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

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

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

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

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

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

    Примечание

    Не проверка параметр Доступ к пользовательскому драйверу.

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

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

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

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

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

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

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

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

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

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

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

Найдите его в примере: См. файлы с именем Автозапуск. Сведения о 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. Проверяет, были ли фоновые задачи ранее зарегистрированы в этом примере приложения, и отменяет их, вызывая метод Unregister для задачи.
  3. Регистрирует фоновую задачу, которая синхронизируется с устройством. Метод SetupBackgroundTask вызывается из метода SyncWithDeviceAsync на следующем шаге.
    1. Инициализирует DeviceUseTrigger и сохраняет его для последующего использования.
    2. Создает объект BackgroundTaskBuilder и использует его свойства Name, 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. Реализует частный обработчик событий OnSyncWithDeviceProgress, который обновляет пользовательский интерфейс приложения с выполнением фоновой задачи.
  6. Реализует частный обработчик событий OnSyncWithDeviceCompleted для обработки перехода от фоновых задач к приложению переднего плана после завершения фоновой задачи.
    1. Использует метод CheckResults объекта BackgroundTaskCompletedEventArgs, чтобы определить, были ли исключения вызваны фоновой задачей.
    2. Приложение повторно открывает устройство для использования приложением переднего плана после завершения фоновой задачи и обновляет пользовательский интерфейс, чтобы уведомить пользователя.
  7. Реализует обработчики событий нажатия приватных кнопок из пользовательского интерфейса для запуска и отмены фоновой задачи.
    1. Обработчик событий частного Sync_Click вызывает метод SyncWithDeviceAsync, описанный на предыдущих шагах.
    2. Обработчик событий частного CancelSync_Click вызывает частный метод CancelSyncWithDevice для отмены фоновой задачи.
  8. Частный метод CancelSyncWithDevice отменяет регистрацию и отменяет все активные синхронизации устройств, чтобы устройство можно было повторно открыть с помощью метода Unregister объекта BackgroundTaskRegistration.

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

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

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

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

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

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

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

Дорожная карта для приложений UWP на C# и Visual Basic и дорожная карта для приложений UWP на C++

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

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

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

Важные API