USB 디바이스와 통신, 완료 시작(UWP 앱)
이 문서에서는 USB 디바이스와 대화하는 UWP 앱을 만드는 엔드투엔드 연습을 제공합니다.
Windows 런타임 API를 사용하여 사용자에게 주변 USB 디바이스에 대한 액세스 권한을 부여하는 UWP 앱을 작성합니다. 이러한 앱은 사용자 지정 기준에 따라 디바이스에 연결하고, 디바이스에 대한 정보를 얻고, 디바이스로 데이터를 보내고, 반대로 디바이스에서 데이터 스트림을 가져와서 디바이스에서 인터럽트 데이터를 폴링할 수 있습니다.
여기서는 UWP 앱이 이러한 작업을 구현하는 방법을 설명하고 Windows.Devices.Usb에 포함된 클래스의 사용을 보여 주는 예제에 연결합니다. 앱 매니페스트에 필요한 디바이스 기능과 디바이스가 연결되면 앱을 시작하는 방법을 살펴보겠습니다. 또한 앱이 배터리 수명을 절약하기 위해 일시 중단된 경우에도 백그라운드에서 데이터 전송 작업을 실행하는 방법을 보여 줍니다.
연습 - USB 디바이스용 UWP 앱 작성
이 문서의 단계를 따르거나 사용자 지정 USB 디바이스 액세스 샘플로 직접 건너뜁니다. 도우미 샘플은 여기에서 모든 단계를 구현하지만 계속 움직이기 위해 코드를 안내하지 않습니다. 특정 단계에는 코드를 빠르게 찾는 데 도움이 되는 찾기가 샘플 섹션에 있습니다. 샘플 소스 파일의 구조는 간단하고 평평하므로 여러 소스 파일 계층을 드릴다운하지 않고도 코드를 쉽게 찾을 수 있습니다. 그러나 프로젝트를 분리하고 다르게 구성하는 것을 선호할 수 있습니다.
Microsoft WinUSB 드라이버 설치
Microsoft에서 제공하는 WinUSB 드라이버를 디바이스의 함수 드라이버로 설치합니다.
빠른 시작: WinUSB(Winusb.sys) 설치
다음과 같은 방법으로 Winusb.sys 설치할 수 있습니다.
- 디바이스를 연결할 때 디바이스가 WinUSB 디바이스이므로 Windows가 자동으로 Winusb.sys 로드하는 것을 알 수 있습니다.
- 장치 관리자 시스템 제공 디바이스 클래스를 지정하여 드라이버를 설치합니다.
- 사용자 지정 INF를 사용하여 드라이버를 설치합니다. 다음 두 가지 방법 중 하나에서 INF를 가져올 수 있습니다.
- 하드웨어 공급업체에서 INF를 가져옵니다.
- Microsoft에서 제공한 Winusb.inf 파일을 참조하는 사용자 지정 INF를 작성합니다. 자세한 내용은 WinUSB(Winusb.sys) 설치를 참조하세요.
디바이스에 대한 정보 가져오기
디바이스에 대한 디바이스 인터페이스 GUID, 하드웨어 ID 및 디바이스 클래스 정보를 가져옵니다.
디바이스 제조업체에서 해당 정보를 가져올 수 있습니다.
공급업체 및 제품 식별자
장치 관리자 디바이스 속성을 봅니다. 세부 정보 탭에서 하드웨어 ID 속성 값을 봅니 다. 이 값은 이러한 두 식별자의 조합입니다. 예를 들어 SuperMUTT 디바이스 의 경우 하드웨어 ID 는 "USB\VID_045E&PID_F001"이고 공급업체 ID는 "0x045E"이고 제품 ID는 "0xF001"입니다.
디바이스 클래스, 하위 클래스 및 프로토콜 코드
디바이스 인터페이스 GUID
또는 레지스트리 정보를 볼 수 있습니다. 자세한 내용은 USB 디바이스 레지스트리 항목을 참조 하세요.
USB API 집합에서 디바이스 클래스, 서브클래스 및 프로토콜을 허용하는지 확인
디바이스의 디바이스 클래스, 하위 클래스 및 프로토콜 코드가 다음 목록에 있는 경우 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 파일을 열고 이 예제와 같이 Name 특성이 "usb"로 설정된 DeviceCapability 요소를 추가합니다.
참고 항목
Visual Studio에서는 USB 디바이스 기능을 수정할 수 없습니다. 솔루션 탐색기 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 앱)
- 열거된 디바이스 컬렉션에서 디바이스를 찾기 위한 검색 조건을 포함하는 AQS(고급 쿼리 구문) 문자열을 빌드하여 디바이스를 찾습니다.
- 다음 두 가지 방법 중 하나로 디바이스를 엽니다.
AQS를 FindAllAsync에 전달하고 디바이스에 대한 DeviceInformation 개체를 가져옵니다.
자세한 내용은 빠른 시작: 일반적으로 사용되는 디바이스 열거를 참조하세요.
DeviceWatcher 개체를 사용하여 디바이스가 시스템에서 추가되거나 제거되는 시기를 감지합니다.
- AQS를 CreateWatcher에 전달하고 DeviceWatcher 개체를 가져옵니다.
- DeviceWatcher 개체에 이벤트 처리기를 등록합니다.
- 추가된 이벤트 처리기에서 디바이스에 대한 DeviceInformation 개체를 가져옵니다.
- DeviceWatcher 개체를 시작하고 중지합니다.
자세한 내용은 디바이스가 추가, 제거 또는 변경된 경우 알림을 받는 방법을 참조하세요.
- DeviceInformation.Id 속성에서 디바이스 인스턴스를 가져옵니다.
- 디바이스 인스턴스 문자열을 전달하여 FromIdAsync를 호출하고 UsbDevice 개체를 가져옵니다.
샘플에서 찾을 수 있습니다. Scenario1_DeviceConnect 파일을 참조하세요.
USB 디바이스 레이아웃 연구
USB 디바이스 레이아웃을 연구합니다.
디바이스 구성 및 데이터 전송 수행에 대한 기본 USB 개념, 즉 모든 USB 개발자를 위한 개념을 검토합니다.
지원되는 각 대체 설정에 대한 디바이스 구성 설명자, 인터페이스 설명자 및 해당 엔드포인트 설명자를 봅니다. USBView를 사용하여 연결된 모든 USB 컨트롤러 및 USB 디바이스를 찾아보고 디바이스 구성도 검사할 수 있습니다.
UI에서 USB 설명자 가져오기 및 표시
앱을 확장하여 UI에 USB 설명자를 가져와 표시합니다.
빠른 시작: USB 설명자를 가져오는 방법(UWP 앱)
UsbDevice.DeviceDescriptor 값을 가져와 디바이스 설명자를 가져옵니다.
UsbConfiguration.ConfigurationDescriptor 값을 가져와 서 구성 설명자를 가져옵니다.
- UsbConfiguration.Descriptors 속성을 가져와 전체 구성 설명자 집합을 가져옵니다.
UsbConfiguration.UsbInterfaces 속성을 가져와 서 구성 내의 인터페이스 배열을 가져옵니다.
UsbInterface.InterfaceSettings를 가져와 대체 설정의 배열을 가져옵니다.
활성 대체 설정 내에서 파이프를 열거하고 연결된 엔드포인트를 가져옵니다.
이러한 개체는 엔드포인트 설명자를 나타냅니다.
샘플에서 찾을 수 있습니다. Scenario5_UsbDescriptors 파일을 참조하세요.
공급업체에서 정의한 USB 제어 전송 보내기
공급업체에서 정의한 USB 제어 전송을 보내도록 앱을 확장합니다.
빠른 시작: USB 제어 전송 요청을 보내는 방법(UWP 앱)
- 디바이스의 하드웨어 사양에서 공급업체 명령을 가져옵니다.
- UsbSetupPacket 개체를 만들고 다양한 속성을 설정하여 설치 패킷을 채웁니다.
- 전송 방향에 따라 이러한 메서드에 의해 컨트롤 전송을 보내도록 비동기 작업을 시작합니다.
샘플에서 찾을 수 있습니다. Scenario2_ControlTransfer 파일을 참조하세요.
대량 데이터 읽기 또는 쓰기
대량 데이터를 읽거나 쓰도록 앱을 확장합니다.
빠른 시작: USB 대량 전송 요청을 보내는 방법(UWP 앱)
- 대량 파이프 개체(UsbBulkOutPipe 또는 UsbBulkInPipe)를 가져옵니다.
- 정책 매개 변수를 설정하도록 대량 파이프를 구성합니다.
- DataReader 또는 DataWriter 개체를 사용하여 데이터 스트림을 설정합니다.
- DataReader.LoadAsync 또는 DataWriter.StoreAsync를 호출하여 비동기 전송 작업을 시작합니다.
- 전송 작업의 결과를 가져옵니다.
샘플에서 찾을 수 있습니다. Scenario4_BulkPipes 파일을 참조하세요.
하드웨어 인터럽트 데이터 가져오기
하드웨어 인터럽트 데이터를 가져오기 위해 앱을 확장합니다.
빠른 시작: USB 인터럽트 전송 요청을 보내는 방법(UWP 앱)
- 인터럽트 파이프 개체(UsbInterruptInPipe 또는 UsbInterruptOutPipe)를 가져옵니다.
- DataReceived 이벤트에 대한 인터럽트 처리기를 구현합니다.
- 이벤트 처리기를 등록하여 데이터 수신을 시작합니다.
- 데이터 수신을 중지하도록 이벤트 처리기를 등록 취소합니다.
샘플에서 찾을 수 있습니다. Scenario3_InterruptPipes 파일을 참조하세요.
현재 활성화되지 않은 인터페이스 설정 선택
앱을 확장하여 현재 활성화되지 않은 인터페이스 설정을 선택합니다.
빠른 시작: USB 인터페이스 설정을 선택하는 방법(UWP 앱)
통신을 위해 디바이스를 열면 기본 인터페이스와 첫 번째 설정이 선택됩니다. 해당 설정을 변경하려면 다음 단계를 수행합니다.
- UsbInterfaceSetting.Selected 값을 사용하여 USB 인터페이스의 활성 설정을 가져옵니다.
- UsbInterfaceSetting.SelectSettingAsync를 호출하여 비동기 작업을 시작하여 USB 인터페이스 설정을 지정합니다.
디바이스 닫기
앱을 확장하여 디바이스를 닫습니다.
빠른 시작: USB 디바이스에 연결하는 방법(UWP 앱)
UsbDevice 개체 사용을 마친 후 디바이스를 닫습니다.
C++ 앱은 delete 키워드를 사용하여 참조를 해제해야 합니다. C#/VB 앱은 UsbDevice.Dispose 메서드를 호출해야 합니다. JavaScript 앱은 UsbDevice.Close를 호출해야 합니다.
샘플에서 찾을 수 있습니다. Scenario1_DeviceConnect 파일을 참조하세요.
디바이스 메타데이터 패키지 만들기
앱에 대한 디바이스 메타데이터 패키지를 만듭니다.
- WDK(Windows 드라이버 키트)가 설치된 경우 드라이버>디바이스 메타데이터>작성을 엽니다.
- 독립 실행형 SDK가 설치된 경우 도구는 install_path>\bin\x86\DeviceMetadataWizardexe에 있습니다<.
마법사의 단계에 따라 앱을 디바이스와 연결합니다. 디바이스에 대한 다음 정보를 입력합니다.
- 디바이스 정보 페이지에서 모델 이름, 제조업체 및 설명을 입력합니다.
- 하드웨어 정보 페이지에서 디바이스의 하드웨어 ID를 입력합니다.
디바이스에 대한 권한 있는 앱으로 앱을 선언하려면 다음 지침을 따릅니다.
앱 정보 페이지의 Privileged 애플리케이션 그룹에서 패키지 이름, 게시자 이름 및 UWP 앱 ID를 입력합니다.
참고 항목
Access 사용자 지정 드라이버 옵션을 선택하지 마세요.
마침 탭을 엽니다. 시스템의 로컬 메타데이터 저장소에 패키지 복사 확인란을 선택합니다.
디바이스를 연결하고 제어판 디바이스 및 프린터 보기를 열고 디바이스 아이콘이 올바른지 확인합니다.
샘플 에서 찾을 수 있습니다. DeviceMetadata 폴더를 참조하세요.
자동 실행 활성화 구현
자동 실행 활성화를 구현하여 앱을 확장하여 디바이스가 시스템에 연결할 때 앱을 시작합니다.
빠른 시작: 자동 실행 디바이스에 대한 앱 등록
디바이스가 시스템에 연결되면 앱이 시작되도록 자동 실행 기능을 추가할 수 있습니다. 모든 UWP 앱(권한 있는 앱 또는 다른 앱)에 대해 자동 실행을 사용하도록 설정할 수 있습니다.
디바이스 메타데이터 패키지에서 디바이스가 자동 실행 알림에 응답하는 방법을 지정해야 합니다. Windows 정보 탭에서 UWP 디바이스 앱 옵션을 선택하고 다음과 같이 앱 정보를 입력합니다.
앱 매니페스트에서 다음과 같이 자동 실행 디바이스 선언을 추가하고 정보를 시작합니다.
앱 클래스의 OnActivated 메서드에서 디바이스가 앱을 활성화했는지 확인합니다. 이 경우 메서드는 DeviceInformation.Id 속성 값이 포함된 DeviceEventArgs 매개 변수 값을 받습니다. 이는 통신을 위해 디바이스 열기에 설명된 것과 동일한 값입니다.
샘플 에서 찾을 수 있습니다. 자동 실행이라는 파일을 참조하세요. JavaScript는 default.js 참조하세요.
백그라운드 작업 구현
앱이 일시 중단되지 않고 펌웨어 업데이트와 같이 디바이스로의 길이 전송을 수행할 수 있는 백그라운드 작업을 구현하도록 앱을 확장합니다.
백그라운드 작업을 구현하려면 두 개의 클래스가 필요합니다.
백그라운드 작업 클래스는 IBackgroundTask 인터페이스를 구현하고 주변 디바이스를 동기화하거나 업데이트하기 위해 만든 실제 코드를 포함합니다. 백그라운드 작업 클래스는 백그라운드 작업이 트리거될 때 및 앱의 애플리케이션 매니페스트에 제공된 진입점에서 실행됩니다.
참고 항목
Windows 8.1에서 제공하는 디바이스 백그라운드 작업 인프라입니다. Windows 백그라운드 작업에 대한 자세한 내용은 백그라운드 작업으로 앱 지원을 참조하세요.
백그라운드 작업 클래스
- Windows 백그라운드 작업 인프라에 필요한 IBackgroundTask 인터페이스를 구현합니다.
- Run 메서드의 클래스에 전달된 DeviceUseDetails 인스턴스를 가져오고 이 인스턴스를 사용하여 진행 상황을 Microsoft Store 앱에 다시 보고하고 취소 이벤트를 등록합니다.
- Run 메서드는 백그라운드 디바이스 동기화 코드를 구현하는 프라이빗 OpenDevice 및 WriteToDeviceAsync 메서드도 호출합니다.
UWP 앱은 DeviceUseTrigger 백그라운드 작업을 등록하고 트리거합니다. 앱은 백그라운드 작업의 진행률을 등록, 트리거 및 처리합니다.
참고 항목
다음 예제 코드는 해당 개체를 사용하여 DeviceServicingTrigger 백그라운드 작업에 적용할 수 있습니다. 두 트리거 개체와 해당 API 간의 유일한 차이점은 Windows에서 수행한 정책 검사입니다.
- DeviceUseTrigger 및 BackgroundTaskRegistration 개체를 만듭니다.
- 이 샘플 애플리케이션에서 이전에 등록된 백그라운드 작업이 있는지 확인하고 태스크에서 등록 취소 메서드를 호출하여 취소합니다.
- 디바이스와 동기화되는 백그라운드 작업을 등록합니다. SetupBackgroundTask 메서드는 다음 단계의 SyncWithDeviceAsync 메서드에서 호출됩니다.
- DeviceUseTrigger를 초기화하고 나중에 사용하기 위해 저장합니다.
- BackgroundTaskBuilder 개체를 만들고 이름, TaskEntryPoint 및 SetTrigger 속성 및 메서드를 사용하여 앱의 DeviceUseTrigger 개체 및 백그라운드 작업 이름을 등록합니다. BackgroundTaskBuilder 개체의 TaskEntryPoint 속성은 백그라운드 작업이 트리거될 때 실행될 백그라운드 작업 클래스의 전체 이름으로 설정됩니다.
- Microsoft Store 앱이 사용자에게 완료 및 진행률 업데이트를 제공할 수 있도록 백그라운드 작업에서 완료 및 진행률 이벤트를 등록합니다.
- 프라이빗 SyncWithDeviceAsync 메서드는 디바이스와 동기화할 백그라운드 작업을 등록하고 백그라운드 동기화를 시작합니다.
이전 단계에서 SetupBackgroundTask 메서드를 호출하고 디바이스와 동기화할 백그라운드 작업을 등록합니다.
백그라운드 작업을 시작하는 private StartSyncBackgroundTaskAsync 메서드를 호출합니다.
앱의 핸들을 디바이스에 닫아 백그라운드 작업이 시작될 때 디바이스를 열 수 있는지 확인합니다.
참고 항목
백그라운드 작업은 Microsoft Store 앱이 RequestAsync를 호출하기 전에 디바이스에 대한 연결을 닫아야 하므로 업데이트를 수행하기 위해 디바이스를 열어야 합니다.
백그라운드 작업을 트리거하고 백그라운드 작업이 성공적으로 시작되었는지 확인하는 데 사용되는 RequestAsync에서 DeviceTriggerResults 개체를 반환하는 DeviceUseTrigger 개체의 RequestAsync 메서드를 호출합니다.
참고 항목
Windows는 필요한 모든 작업 시작 정책 검사가 완료되었는지 확인합니다. 모든 정책 검사가 완료되면 업데이트 작업이 Microsoft Store 앱 외부에서 백그라운드 작업으로 실행되므로 작업이 진행되는 동안 앱을 안전하게 일시 중단할 수 있습니다. 또한 Windows는 런타임 요구 사항을 적용하고 해당 요구 사항이 더 이상 충족되지 않는 경우 백그라운드 작업을 취소합니다.
StartSyncBackgroundTaskAsync에서 반환된 DeviceTriggerResults 개체를 사용하여 백그라운드 작업이 성공적으로 시작되었는지 확인합니다. switch 문은 DeviceTriggerResults의 결과를 검사하는 데 사용됩니다.
- 백그라운드 작업의 진행률로 앱 UI를 업데이트하는 프라이빗 OnSyncWithDeviceProgress 이벤트 처리기를 구현합니다.
- 백그라운드 작업이 완료되면 백그라운드 작업에서 포그라운드 앱으로의 전환을 처리하는 프라이빗 OnSyncWithDeviceCompleted 이벤트 처리기를 구현합니다.
- BackgroundTaskCompletedEventArgs 개체의 CheckResults 메서드를 사용하여 백그라운드 작업에서 예외가 throw되었는지 확인합니다.
- 백그라운드 작업이 완료되었으므로 앱이 포그라운드 앱에서 사용할 디바이스를 다시 열고 사용자에게 알리도록 UI를 업데이트합니다.
- UI에서 프라이빗 단추 클릭 이벤트 처리기를 구현하여 백그라운드 작업을 시작하고 취소합니다.
- 프라이빗 Sync_Click 이벤트 처리기는 이전 단계에서 설명한 SyncWithDeviceAsync 메서드를 호출합니다.
- 프라이빗 CancelSync_Click 이벤트 처리기는 private CancelSyncWithDevice 메서드를 호출하여 백그라운드 작업을 취소합니다.
- private CancelSyncWithDevice 메서드는 BackgroundTaskRegistration 개체의 Unregister 메서드를 사용하여 디바이스를 다시 열 수 있도록 활성 디바이스 동기화를 등록 취소하고 취소합니다.
샘플에서 찾을 수 있습니다. Scenario7_Sync 파일이라는 파일을 참조하세요. 백그라운드 클래스는 IoSyncBackgroundTask에서 구현됩니다.
Windows 앱 인증 키트 실행
Windows 앱 인증 키트를 실행합니다.
권장. Windows 앱 인증 키트를 실행하면 앱이 Microsoft Store 요구 사항을 충족하는지 확인할 수 있습니다. 앱에 주요 기능을 추가할 때마다 실행해야 합니다.
관련 샘플
UWP 앱 UI 디자인에 대해 자세히 알아봅니다.
C#을 사용하는 UWP 앱에 대한 로드맵 및 C++를 사용하는 UWP 앱에 대한 Visual Basic 및 로드맵
일반적으로 C++, C#또는 Visual Basic을 사용하여 UWP 앱을 만드는 방법에 대해 자세히 알아봅니다.
시간이 오래 걸릴 수 있는 작업을 수행할 때 앱의 응답성을 유지하는 방법에 대해 알아봅니다.