Windows. Devices.Enumeration API를 사용하면 시스템에 내부적으로 연결되거나, 외부에 연결되거나, 무선 또는 네트워킹 프로토콜을 통해 검색 가능한 디바이스를 찾을 수 있습니다.
샘플
사용 가능한 모든 디바이스를 열거하는 가장 쉬운 방법은 FindAllAsync 명령을 사용하여 스냅샷을 만드는 것입니다(아래 섹션에서 자세히 설명).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Windows.Devices.Enumeration API의 보다 고급 예제는 장치 열거 및 페어링 샘플을 참조하세요.
열거형 API
Windows. Devices.Enumeration 네임스페이스를 사용하면 시스템에 내부적으로 연결되거나, 외부에 연결되거나, 무선 또는 네트워킹 프로토콜을 통해 검색 가능한 디바이스를 찾을 수 있습니다. 이러한 API에서 지원하는 기능 중 일부는 다음과 같습니다.
- 애플리케이션에 연결할 디바이스를 찾습니다.
- 시스템에 연결되거나 시스템에서 검색할 수 있는 디바이스에 대한 정보를 가져옵니다.
- 장치가 추가되거나, 연결되거나, 연결이 끊기거나, 온라인 상태가 변경되거나, 다른 속성이 변경될 때 앱이 알림을 받게 합니다.
- 디바이스 연결, 연결 끊기, 온라인 상태 변경 또는 기타 속성 변경 시 앱이 백그라운드 트리거를 받도록 합니다.
이러한 API는 개별 디바이스와 앱을 실행하는 시스템이 해당 기술을 지원하는 경우 다음 프로토콜 및 버스에 디바이스를 열거할 수 있습니다. 이 목록은 전체 목록이 아니며 특정 디바이스에서 다른 프로토콜을 지원합니다.
- 물리적으로 연결된 버스. 여기에는 PCI 및 USB가 포함됩니다. 예를 들어 장치 관리자에서 볼 수 있는 모든 항목입니다.
- Upnp
- DLNA(Digital Living Network Alliance)
- 발견 및 실행(DIAL)
- DNS 서비스 검색(DNS-SD)
- WSD(Web Services on Devices)
- Bluetooth
- Wi-Fi Direct
- WiGig
- 서비스포인트
대부분의 경우 열거형 API 사용에 대해 걱정할 필요가 없습니다. 디바이스를 사용하는 많은 API가 자동으로 적절한 기본 디바이스를 선택하거나 보다 간소화된 열거형 API를 제공하기 때문입니다. 예를 들어 MediaElement 자동으로 기본 오디오 렌더러 디바이스를 사용합니다. 앱이 기본 디바이스를 사용할 수 있는 한 애플리케이션에서 열거형 API를 사용할 필요가 없습니다. 열거형 API는 사용 가능한 디바이스를 검색하고 연결할 수 있는 일반적이고 유연한 방법을 제공합니다. 이 항목에서는 디바이스 열거에 대한 정보를 제공하고 디바이스를 열거하는 네 가지 일반적인 방법을 설명합니다.
- DevicePicker UI 사용
- 시스템에서 현재 검색할 수 있는 디바이스의 스냅샷 열거
- 현재 검색할 수 있는 디바이스 열거 및 변경 내용 감시
- 현재 검색 가능한 디바이스 열거 및 백그라운드 작업의 변경 내용 감시
DeviceInformation 개체들
열거형 API를 사용하는 경우 DeviceInformation 개체를 자주 사용해야 합니다. 이러한 개체에는 디바이스에 대해 사용 가능한 대부분의 정보가 포함됩니다. 다음 표에서는 관심 있는 DeviceInformation 속성 중 일부를 설명합니다. 전체 목록은 DeviceInformation에 대한 참조 페이지를 참조하세요.
| Property | 코멘트 |
|---|---|
| DeviceInformation.Id | 디바이스의 고유 식별자이며 문자열 변수로 제공됩니다. 대부분의 경우 이 값은 관심 있는 특정 디바이스를 나타내기 위해 한 메서드에서 다른 메서드로 전달하는 불투명 값입니다. 앱을 닫고 다시 연 후 이 속성과 DeviceInformation.Kind 속성을 사용할 수도 있습니다. 이렇게 하면 동일한 DeviceInformation 개체를 복구하고 다시 사용할 수 있습니다. |
| DeviceInformation.Kind | 이는 DeviceInformation 개체로 표시되는 디바이스 개체의 종류를 나타냅니다. 디바이스 범주 또는 디바이스 유형이 아닙니다. 단일 디바이스는 다양한 종류의 여러 DeviceInformation 개체로 나타낼 수 있습니다. 이 속성에 사용할 수 있는 값은 DeviceInformationKind 뿐만 아니라 서로 관련되는 방식에도 나열됩니다. |
| DeviceInformation.Properties | 이 속성 모음에는 DeviceInformation 개체에 대해 요청된 정보가 포함되어 있습니다. 가장 일반적인 속성은 deviceInformation 개체의 속성(예: DeviceInformation.Name)으로 쉽게 참조됩니다. 자세한 내용은 디바이스 정보 속성을 참조하세요. |
DevicePicker 사용자 인터페이스
DevicePicker 사용자가 목록에서 디바이스를 선택할 수 있는 작은 UI를 만드는 Windows 제공하는 컨트롤입니다. 다음과 같은 몇 가지 방법으로 사용자 지정할 수 있습니다.
- SupportedDeviceSelectors, SupportedDeviceClasses 또는 둘 다를 DevicePicker.Filter에 추가하여 UI에 표시되는 디바이스를 제어합니다. 대부분의 경우 선택기 또는 클래스를 하나만 추가하면 되지만 둘 이상이 필요한 경우 여러 선택기를 추가할 수 있습니다. 여러 선택기 또는 클래스를 추가하면 OR 논리 함수를 사용하여 연결됩니다.
- 디바이스에 대해 검색할 속성을 지정합니다. DevicePicker.RequestedProperties에 속성을 추가하여 이 작업을 수행할 수 있습니다.
- DevicePicker의 모양을 Appearance를 사용하여 변경합니다.
- 표시될 때 DevicePicker의 크기와 위치를 지정합니다.
DevicePicker 표시되지만 디바이스가 추가, 제거 또는 업데이트되면 UI의 내용이 자동으로 업데이트됩니다.
메모
DevicePicker를 사용하여 DeviceInformationKind를 지정할 수 없습니다. 특정 DeviceInformationKind 디바이스를 사용하려면 DeviceWatcher를 빌드하고 고유한 UI를 제공해야 합니다.
미디어 콘텐츠 캐스팅과 DIAL도 이를 사용하려는 경우 각각 자체 선택기를 제공합니다. 각각 CastingDevicePicker 및 DialDevicePicker입니다.
장치 스냅샷 나열
일부 시나리오에서는 DevicePicker 요구 사항에 적합하지 않으며 보다 유연한 것이 필요합니다. 사용자 고유의 UI를 빌드하거나 사용자에게 UI를 표시하지 않고 디바이스를 열거해야 할 수 있습니다. 이러한 상황에서는 디바이스의 스냅샷을 열거할 수 있습니다. 여기에는 현재 시스템에 연결되거나 페어링된 디바이스를 살펴보는 작업이 포함됩니다. 그러나 이 메서드는 사용 가능한 디바이스의 스냅샷만 확인하므로 목록을 열거한 후에는 연결되는 디바이스를 찾을 수 없습니다. 디바이스가 업데이트되거나 제거된 경우에도 알림이 표시되지 않습니다. 주의해야 할 또 다른 단점은 이 메서드가 전체 열거가 완료될 때까지 모든 결과를 보류한다는 것입니다. 이러한 이유로 AssociationEndpoint, AssociationEndpointContainer 또는 AssociationEndpointService 개체가 네트워크 또는 무선 프로토콜을 통해 발견되므로 이 메서드를 사용하면 안 됩니다. 완료하는 데 최대 30초가 걸릴 수 있습니다. 이 시나리오에서는 DeviceWatcher 개체를 사용하여 가능한 디바이스를 열거해야 합니다.
디바이스의 스냅샷을 열거하려면 FindAllAsync 메서드를 사용합니다. 이 메서드는 전체 열거 프로세스가 완료될 때까지 대기하고 모든 결과를 하나의 DeviceInformationCollection 개체로 반환합니다. 또한 이 메서드는 결과를 필터링하고 관심 있는 디바이스로 제한하는 몇 가지 옵션을 제공하기 위해 오버로드됩니다. 이 작업은 DeviceClass 제공하거나 디바이스 선택기를 전달하여 수행할 수 있습니다. 디바이스 선택기는 열거하려는 디바이스를 지정하는 AQS(고급 쿼리 구문) 문자열입니다. 자세한 내용은 디바이스 선택기 빌드를 참조하세요.
결과를 제한하는 것 외에도 디바이스에 대해 검색할 속성을 지정할 수도 있습니다. 이 경우 컬렉션에 반환된 각 DeviceInformation 개체의 속성 모음에서 지정된 속성을 사용할 수 있습니다. 모든 디바이스 종류에 모든 속성을 사용할 수 있는 것은 아닙니다. 어떤 디바이스 종류에 사용할 수 있는 속성을 보려면 디바이스 정보 속성을 참조하세요.
디바이스 열거 및 감시
디바이스를 열거하는 보다 강력하고 유연한 방법은 DeviceWatcher 만드는 것입니다. 이 옵션은 디바이스를 열거할 때 가장 유연하게 사용할 수 있습니다. 현재 있는 디바이스를 열거하고 디바이스 선택기와 일치하는 디바이스가 추가, 제거 또는 속성이 변경될 때 알림을 받을 수 있습니다. DeviceWatcher를 만들 때 디바이스 선택기를 제공합니다. 디바이스 선택기에 대한 자세한 내용은 디바이스 선택기 빌드를 참조하세요. 감시자를 만든 후에는 제공된 조건과 일치하는 모든 디바이스에 대해 다음 알림을 받게 됩니다.
- 새 디바이스가 추가되면 알림을 추가합니다.
- 관심 있는 속성이 변경되면 알림을 업데이트합니다.
- 디바이스를 더 이상 사용할 수 없거나 필터와 더 이상 일치하지 않는 경우 알림을 제거합니다.
대부분의 경우 DeviceWatcher를 사용하는 경우 디바이스 목록을 유지 관리하고 추가하거나, 항목을 제거하거나, 감시자가 보고 있는 장치에서 업데이트를 받을 때 항목을 업데이트합니다. 업데이트 알림을 받으면 업데이트된 정보를 DeviceInformationUpdate 개체로 사용할 수 있습니다. 디바이스 목록을 업데이트하려면 먼저 변경된 적절한 DeviceInformation을 찾습니다. 그런 다음, DeviceInformationUpdate 개체를 제공하여 해당 개체에 대한 Update 메서드를 호출합니다. DeviceInformation 개체를 자동으로 업데이트하는 편리한 함수입니다.
DeviceWatcher는 디바이스가 도착할 때 알림을 보내고 변경되면 AssociationEndpoint에 관심이 있을 때 디바이스를 열거하는 이 방법을 사용해야 합니다. AssociationEndpointContainer 또는 AssociationEndpointService 개체는 네트워킹 또는 무선 프로토콜을 통해 열거되므로
DeviceWatcher 만들려면 CreateWatcher 메서드 중 하나를 사용합니다. 이러한 메서드는 관심 있는 디바이스를 지정할 수 있도록 오버로드됩니다. 이 작업은 DeviceClass 제공하거나 디바이스 선택기를 전달하여 수행할 수 있습니다. 디바이스 선택기는 열거하려는 디바이스를 지정하는 AQS 문자열입니다. 자세한 내용은 디바이스 선택기 빌드를 참조하세요. 디바이스에 대해 가져오려는 속성과 관심 있는 속성을 지정할 수도 있습니다. 이 경우 컬렉션에 반환된 각 DeviceInformation 개체의 속성 모음에서 지정된 속성을 사용할 수 있습니다. 모든 디바이스 종류에 모든 속성을 사용할 수 있는 것은 아닙니다. 어떤 디바이스 종류에 사용할 수 있는 속성을 보려면 디바이스 정보 속성을 참조하세요.
백그라운드 작업으로 디바이스 감시
디바이스를 백그라운드 작업으로 보는 것은 위에서 설명한 대로 DeviceWatcher 만드는 것과 매우 유사합니다. 실제로 이전 섹션에서 설명한 대로 먼저 일반 DeviceWatcher 개체를 만들어야 합니다. 만든 후에는 DeviceWatcher.Start 대신 GetBackgroundTrigger를 호출합니다. GetBackgroundTrigger를 호출할 때 관심 있는 알림(추가, 제거 또는 업데이트)을 지정해야 합니다. 추가를 요청하지 않고는 업데이트를 요청하거나 제거할 수 없습니다. 트리거를 등록하면 DeviceWatcher 가 백그라운드에서 즉시 실행하기 시작합니다. 이 시점부터는 조건에 맞는 애플리케이션에 대한 새 알림을 받을 때마다 백그라운드 작업이 트리거되고 애플리케이션을 마지막으로 트리거한 이후 최신 변경 내용을 제공합니다.
Important
DeviceWatcherTrigger가 애플리케이션을 트리거하는 첫 번째 시간은 감시자가 EnumerationCompleted 상태에 도달할 때입니다. 즉, 모든 초기 결과가 포함됩니다. 나중에 애플리케이션을 트리거할 때마다 마지막 트리거 이후 발생한 추가, 업데이트 및 제거 알림만 포함됩니다. 이는 초기 결과가 한 번에 하나씩 들어오지 않고 EnumerationCompleted에 도달한 후에야 묶음으로 전달되기 때문에 포그라운드 DeviceWatcher 개체와는 약간 다릅니다.
일부 무선 프로토콜은 백그라운드와 전경에서 스캔하는 경우 다르게 동작하거나 백그라운드에서 스캔을 전혀 지원하지 않을 수 있습니다. 백그라운드 검사와 관련된 세 가지 가능성이 있습니다. 다음 표에서는 애플리케이션에 미칠 수 있는 가능성과 영향을 나열합니다. 예를 들어 Bluetooth 및 Wi-Fi Direct는 백그라운드 검사를 지원하지 않으므로 확장상 DeviceWatcherTrigger 지원하지 않습니다.
| Behavior | Impact |
|---|---|
| 배경에서 동일한 동작 | None |
| 백그라운드에서 수동 검사만 가능 | 수동 검색이 발생할 때까지 기다리는 동안 디바이스를 검색하는 데 시간이 더 오래 걸릴 수 있습니다. |
| 백그라운드 검색이 지원되지 않음 | DeviceWatcherTrigger 디바이스를 검색할 수 없으며 업데이트가 보고되지 않습니다. |
DeviceWatcherTrigger에 백그라운드 작업에서 검색을 지원하지 않는 프로토콜이 포함되어 있더라도 해당 트리거는 계속 작동합니다. 그러나 해당 프로토콜을 통해 업데이트 또는 결과를 가져올 수 없습니다. 다른 프로토콜 또는 디바이스에 대한 업데이트는 여전히 정상적으로 검색됩니다.
DeviceInformationKind 사용하기
대부분의 시나리오에서는 DeviceInformation 개체의 DeviceInformationKind에 대해 신경 쓸 필요가 없습니다. 사용 중인 디바이스 API에서 반환된 디바이스 선택기가 API와 함께 사용할 올바른 종류의 디바이스 개체를 가져오는 경우가 많기 때문입니다. 그러나 일부 시나리오에서는 디바이스에 대한 DeviceInformation 을 가져올 수 있지만 디바이스 선택기를 제공하는 해당 디바이스 API는 없습니다. 이러한 경우 사용자 고유의 선택기를 빌드해야 합니다. 예를 들어, 디바이스의 웹 서비스에는 전용 API가 없지만 Windows.Devices.Enumeration API를 사용하여 해당 디바이스를 검색하고 해당 디바이스에 대한 정보를 가져온 다음, 소켓 API를 사용하여 이를 이용할 수 있습니다.
디바이스 개체를 열거하기 위해 사용자 고유의 디바이스 선택기를 빌드하는 경우 DeviceInformationKind 를 이해하는 것이 중요합니다. 가능한 모든 종류와 이러한 종류가 서로 어떻게 관련되어 있는지는 DeviceInformationKind의 참조 페이지에 설명되어 있습니다. DeviceInformationKind의 가장 일반적인 용도 중 하나는 디바이스 선택기와 함께 쿼리를 제출할 때 검색할 디바이스 종류를 지정하는 것입니다. 이렇게 하면 제공된 DeviceInformationKind와 일치하는 디바이스만 열거합니다. 예를 들어 DeviceInterface 개체를 찾은 다음 쿼리를 실행하여 부모 Device 개체에 대한 정보를 가져올 수 있습니다. 해당 부모 개체에는 추가 정보가 포함될 수 있습니다.
DeviceInformation 개체의 속성 모음에서 사용할 수 있는 속성은 디바이스의 DeviceInformationKind 따라 달라집니다. 특정 속성은 특정 종류에서만 사용할 수 있습니다. 어떤 종류의 속성에 사용할 수 있는지에 대한 자세한 내용은 디바이스 정보 속성을 참조하세요. 따라서 위의 예제에서 부모 디바이스를 검색하면 DeviceInterface디바이스 개체에서 사용할 수 없는 추가 정보에 액세스할 수 있습니다. 따라서 AQS 필터 문자열을 만들 때 열거 중인 DeviceInformationKind 개체에 대해 요청된 속성을 사용할 수 있는지 확인해야 합니다. 필터 빌드에 대한 자세한 내용은 디바이스 선택기 빌드를 참조하세요.
AssociationEndpoint, AssociationEndpointContainer 또는 AssociationEndpointService 개체를 열거하는 경우 무선 또는 네트워크 프로토콜을 통해 열거합니다. 이러한 상황에서는 FindAllAsync 를 사용하지 않고 대신 CreateWatcher를 사용하는 것이 좋습니다. 네트워크를 통해 검색하면 EnumerationCompleted를 생성하기 전에 10초 이상 시간 초과되지 않는 검색 작업이 발생하는 경우가 많기 때문입니다. FindAllAsync 는 EnumerationCompleted 가 트리거될 때까지 작업을 완료하지 않습니다. DeviceWatcher를 사용하는 경우 EnumerationCompleted 호출되는 시기에 관계없이 실시간으로 더 가까운 결과를 얻을 수 있습니다.
나중에 사용할 수 있는 디바이스 저장
모든 DeviceInformation 개체는 두 가지 정보의 조합, 즉 DeviceInformation.Id 및 DeviceInformation.Kind로 고유하게 식별됩니다. 이러한 두 가지 정보를 유지하면 CreateFromIdAsync에 이 정보를 제공하여 DeviceInformation 개체가 손실된 후 다시 만들 수 있습니다. 이렇게 하면 앱과 통합되는 디바이스에 대한 사용자 기본 설정을 저장할 수 있습니다.
Windows developer