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