Enumerar dispositivos
Las API Windows.Devices.Enumeration permiten encontrar dispositivos que están conectados internamente al sistema, conectados externamente o detectables a través de protocolos inalámbricos o de red.
Ejemplos
La manera más fácil de enumerar todos los dispositivos disponibles es tomar una instantánea con el comando FindAllAsync (se explica más adelante en una sección siguiente).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Consulta el ejemplo de enumeración y emparejamiento de dispositivos para obtener un ejemplo más avanzado de las API Windows.Devices.Enumeration .
API de enumeración
El espacio de nombres Windows.Devices.Enumeration permite encontrar dispositivos que están conectados internamente al sistema, conectados externamente o detectables a través de protocolos inalámbricos o de red. Algunas de las características admitidas por estas API incluyen:
- Búsqueda de un dispositivo para conectarse a con la aplicación.
- Obtener información sobre los dispositivos conectados o detectables por el sistema.
- Hacer que una aplicación reciba notificaciones cuando se agreguen dispositivos, conéctese, desconecte, cambie el estado en línea o cambie otras propiedades.
- Hacer que una aplicación reciba desencadenadores en segundo plano cuando los dispositivos se conecten, desconecten, cambien el estado en línea o cambien otras propiedades.
Estas API pueden enumerar dispositivos a través de cualquiera de los siguientes protocolos y autobuses, siempre que el dispositivo individual y el sistema que ejecuta la aplicación admitan esa tecnología. Esta no es una lista exhaustiva y otros protocolos pueden ser compatibles con un dispositivo específico.
- Buses conectados físicamente. Esto incluye PCI y USB. Por ejemplo, cualquier cosa que pueda ver en el Administrador de dispositivos.
- UPnP
- Digital Living Network Alliance (DLNA)
- Detección e inicio (DIAL)
- Detección de servicios DNS (DNS-SD)
- Servicios web en dispositivos (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- Punto de servicio
En muchos casos, no tendrá que preocuparse por usar las API de enumeración. Esto se debe a que muchas API que usan dispositivos seleccionarán automáticamente el dispositivo predeterminado adecuado o proporcionarán una API de enumeración más simplificada. Por ejemplo, MediaElement usará automáticamente el dispositivo representador de audio predeterminado. Siempre que la aplicación pueda usar el dispositivo predeterminado, no es necesario usar las API de enumeración de la aplicación. Las API de enumeración proporcionan una manera general y flexible de detectar y conectarse a los dispositivos disponibles. En este tema se proporciona información sobre cómo enumerar dispositivos y se describen las cuatro formas comunes de enumerar dispositivos.
- Uso de la interfaz de usuario de DevicePicker
- Enumeración de una instantánea de dispositivos actualmente detectables por el sistema
- Enumeración de dispositivos que se pueden detectar actualmente y observar los cambios
- Enumeración de dispositivos que se pueden detectar actualmente y observar los cambios en una tarea en segundo plano
Objetos DeviceInformation
Al trabajar con las API de enumeración, con frecuencia necesitará usar objetos DeviceInformation . Estos objetos contienen la mayor parte de la información disponible sobre el dispositivo. En la tabla siguiente se explican algunas de las propiedades DeviceInformation que le interesarán. Para obtener una lista completa, consulte la página de referencia de DeviceInformation.
Propiedad | Comentarios |
---|---|
DeviceInformation.Id | Este es el identificador único del dispositivo y se proporciona como una variable de cadena. En la mayoría de los casos, se trata de un valor opaco que simplemente pasará de un método a otro para indicar el dispositivo específico que le interesa. También puedes usar esta propiedad y la propiedad DeviceInformation.Kind después de cerrar la aplicación y volver a abrirla. Esto garantizará que pueda recuperar y reutilizar el mismo objeto DeviceInformation . |
DeviceInformation.Kind | Esto indica el tipo de objeto de dispositivo representado por el objeto DeviceInformation . No es la categoría o el tipo de dispositivo. Un único dispositivo se puede representar mediante varios objetos DeviceInformation diferentes de diferentes tipos. Los valores posibles para esta propiedad se enumeran en DeviceInformationKind , así como en cómo se relacionan entre sí. |
DeviceInformation.Properties | Este contenedor de propiedades contiene información solicitada para el objeto DeviceInformation . Se hace referencia a las propiedades más comunes como propiedades del objeto DeviceInformation, como con DeviceInformation.Name. Para obtener más información, consulte Propiedades de información del dispositivo. |
Interfaz de usuario de DevicePicker
DevicePicker es un control proporcionado por Windows que crea una interfaz de usuario pequeña que permite al usuario seleccionar un dispositivo de una lista. Se puede personalizar de varias maneras, como:
- Para controlar los dispositivos que se muestran en la interfaz de usuario, agregue supportedDeviceSelectors, SupportedDeviceClasses o ambos a DevicePicker.Filter. En la mayoría de los casos, solo tiene que agregar un selector o clase, pero si necesita más de uno, puede agregar varios. Si agrega varios selectores o clases, se combina con una función lógica OR.
- Especifique las propiedades que desea recuperar para los dispositivos. Para ello, agregue propiedades a DevicePicker.RequestedProperties.
- Modifique la apariencia de DevicePicker mediante Apariencia.
- Especifique el tamaño y la ubicación del DevicePicker cuando se muestre.
Mientras se muestra DevicePicker, el contenido de la interfaz de usuario se actualizará automáticamente si los dispositivos se agregan, quitan o actualizan.
Nota No se puede especificar DeviceInformationKind mediante DevicePicker. Si quiere tener dispositivos de un deviceInformationKind específico, deberá crear un DeviceWatcher y proporcionar su propia interfaz de usuario.
La conversión de contenido multimedia y DIAL también proporcionan sus propios selectores si desea usarlos. Son CastingDevicePicker y DialDevicePicker, respectivamente.
Enumerar una instantánea de dispositivos
En algunos escenarios, DevicePicker no será adecuado para sus necesidades y necesita algo más flexible. Quizás quiera crear su propia interfaz de usuario o necesite enumerar dispositivos sin mostrar una interfaz de usuario al usuario. En estas situaciones, podría enumerar una instantánea de los dispositivos. Esto implica examinar los dispositivos que están conectados o emparejados actualmente con el sistema. Sin embargo, debe tener en cuenta que este método solo examina una instantánea de los dispositivos que están disponibles, por lo que no podrá encontrar dispositivos que se conecten después de enumerar a través de la lista. Tampoco se le notificará si se actualiza o quita un dispositivo. Otra posible desventaja de tener en cuenta es que este método retendrá los resultados hasta que se complete toda la enumeración. Por este motivo, no debe usar este método cuando esté interesado en los objetos AssociationEndpoint, AssociationEndpointContainer o AssociationEndpointService , ya que se encuentran a través de una red o protocolo inalámbrico. Esto puede tardar hasta 30 segundos en completarse. En ese escenario, debe usar un objeto DeviceWatcher para enumerar los posibles dispositivos.
Para enumerar a través de una instantánea de dispositivos, use el método FindAllAsync. Este método espera hasta que se complete todo el proceso de enumeración y devuelva todos los resultados como un objeto DeviceInformationCollection. Este método también se sobrecarga para proporcionarle varias opciones para filtrar los resultados y limitarlos a los dispositivos que le interesan. Para ello, proporcione deviceClass o pase un selector de dispositivos. El selector de dispositivos es una cadena de sintaxis de consulta avanzada (AQS) que especifica los dispositivos que desea enumerar. Para obtener más información, consulte Compilación de un selector de dispositivos.
Además de limitar los resultados, también puede especificar las propiedades que desea recuperar para los dispositivos. Si lo hace, las propiedades especificadas estarán disponibles en el contenedor de propiedades para cada uno de los objetos DeviceInformation devueltos en la colección. Es importante tener en cuenta que no todas las propiedades están disponibles para todos los tipos de dispositivos. Para ver qué propiedades están disponibles para qué tipos de dispositivo, consulte Propiedades de información del dispositivo.
Enumerar y ver dispositivos
Un método más potente y flexible de enumerar dispositivos es crear un monitor de dispositivos. Esta opción proporciona la mayor flexibilidad al enumerar dispositivos. Permite enumerar los dispositivos que están presentes actualmente y también recibir notificaciones cuando los dispositivos que coinciden con el selector de dispositivos se agregan, quitan o cambian las propiedades. Al crear un DeviceWatcher, se proporciona un selector de dispositivos. Para obtener más información sobre los selectores de dispositivos, consulte Compilación de un selector de dispositivos. Después de crear el monitor, recibirá las siguientes notificaciones para cualquier dispositivo que coincida con los criterios proporcionados.
- Agregue una notificación cuando se agregue un nuevo dispositivo.
- Notificación de actualización cuando se cambia una propiedad que le interesa.
- Quite la notificación cuando un dispositivo ya no esté disponible o ya no coincida con el filtro.
En la mayoría de los casos en los que se usa deviceWatcher, se mantiene una lista de dispositivos y se agrega a él, se quitan elementos de él o se actualizan los elementos a medida que el monitor recibe actualizaciones de los dispositivos que está viendo. Cuando reciba una notificación de actualización, la información actualizada estará disponible como un objeto DeviceInformationUpdate. Para actualizar la lista de dispositivos, primero busque el deviceInformation adecuado que cambió. A continuación, llame al método Update para ese objeto y proporcione el objeto DeviceInformationUpdate. Esta es una función útil que actualizará automáticamente el objeto DeviceInformation .
Dado que un DeviceWatcher envía notificaciones a medida que llegan los dispositivos y cuando cambian, debe usar este método de enumeración de dispositivos cuando esté interesado en los objetos AssociationEndpoint, AssociationEndpointContainer o AssociationEndpointService, ya que se enumeran a través de redes o protocolos inalámbricos.
Para crear un DeviceWatcher, use uno de los métodos CreateWatcher. Estos métodos se sobrecargan para permitirle especificar los dispositivos que le interesan. Para ello, proporcione deviceClass o pase un selector de dispositivos. El selector de dispositivos es una cadena de AQS que especifica los dispositivos que desea enumerar. Para obtener más información, consulte Compilación de un selector de dispositivos. También puede especificar las propiedades que desea recuperar para los dispositivos y que le interesen. Si lo hace, las propiedades especificadas estarán disponibles en el contenedor de propiedades para cada uno de los objetos DeviceInformation devueltos en la colección. Es importante tener en cuenta que no todas las propiedades están disponibles para todos los tipos de dispositivos. Para ver qué propiedades están disponibles para qué tipos de dispositivo, consulte Propiedades de información del dispositivo.
Inspección de dispositivos como una tarea en segundo plano
Ver los dispositivos como una tarea en segundo plano es muy similar a crear un DeviceWatcher como se ha descrito anteriormente. De hecho, deberá crear primero un objeto DeviceWatcher normal, como se describe en la sección anterior. Una vez creado, llama a GetBackgroundTrigger en lugar de DeviceWatcher.Start. Al llamar a GetBackgroundTrigger, debe especificar cuál de las notificaciones que le interesan: agregar, quitar o actualizar. No se puede solicitar la actualización ni la eliminación sin solicitar también agregar. Una vez registrado el desencadenador, DeviceWatcher comenzará a ejecutarse inmediatamente en segundo plano. Desde este punto de vista, siempre que reciba una nueva notificación para la aplicación que coincida con los criterios, la tarea en segundo plano se desencadenará y le proporcionará los cambios más recientes desde que desencadenó la aplicación por última vez.
Importante La primera vez que un DeviceWatcherTrigger desencadena la aplicación será cuando el monitor alcance el estado EnumerationCompleted . Esto significa que contendrá todos los resultados iniciales. Cualquier momento futuro que desencadene la aplicación, solo contendrá las notificaciones de adición, actualización y eliminación que se han producido desde el último desencadenador. Esto es ligeramente diferente de un objeto DeviceWatcher en primer plano porque los resultados iniciales no se incluyen de uno en uno y solo se entregan en un lote después de que se alcance EnumerationCompleted.
Algunos protocolos inalámbricos se comportan de forma diferente si están explorando en segundo plano frente al primer plano, o es posible que no admitan el examen en segundo plano en absoluto. Hay tres posibilidades con respecto al examen en segundo plano. En la tabla siguiente se enumeran las posibilidades y los efectos que puede tener en la aplicación. Por ejemplo, Bluetooth y Wi-Fi Direct no admiten exámenes en segundo plano, por lo que por extensión, no admiten un DeviceWatcherTrigger.
Comportamiento | Impacto |
---|---|
Mismo comportamiento en segundo plano | None |
Solo se pueden realizar exámenes pasivos en segundo plano | El dispositivo puede tardar más tiempo en detectarse mientras espera a que se produzca un examen pasivo. |
No se admiten exámenes en segundo plano | DeviceWatcherTrigger no podrá detectar ningún dispositivo y no se notificará ninguna actualización. |
Si deviceWatcherTrigger incluye un protocolo que no admite el examen como tarea en segundo plano, el desencadenador seguirá funcionando. Sin embargo, no podrá obtener actualizaciones ni resultados a través de ese protocolo. Las actualizaciones de otros protocolos o dispositivos se seguirán detectando normalmente.
Uso de DeviceInformationKind
En la mayoría de los escenarios, no tendrá que preocuparse por deviceInformationKind de un objeto DeviceInformation. Esto se debe a que el selector de dispositivos devuelto por la API de dispositivo que usa a menudo garantiza que obtiene los tipos correctos de objetos de dispositivo que se van a usar con su API. Sin embargo, en algunos escenarios querrá obtener DeviceInformation para dispositivos, pero no hay una API de dispositivo correspondiente para proporcionar un selector de dispositivos. En estos casos, deberá crear su propio selector. Por ejemplo, los servicios web en dispositivos no tienen una API dedicada, pero puede detectar esos dispositivos y obtener información sobre ellos mediante las API Windows.Devices.Enumeration y, a continuación, usarlas mediante las API de socket.
Si va a crear su propio selector de dispositivos para enumerar a través de objetos de dispositivo, DeviceInformationKind será importante para que lo comprenda. Todos los tipos posibles, así como cómo se relacionan entre sí, se describen en la página de referencia de DeviceInformationKind. Uno de los usos más comunes de DeviceInformationKind es especificar qué tipo de dispositivos está buscando al enviar una consulta junto con un selector de dispositivos. Al hacerlo, se asegura de que solo se enumeran los dispositivos que coinciden con deviceInformationKind proporcionados. Por ejemplo, podría encontrar un objeto DeviceInterface y, a continuación, ejecutar una consulta para obtener la información del objeto Device primario. Ese objeto primario puede contener información adicional.
Es importante tener en cuenta que las propiedades disponibles en el contenedor de propiedades de un objeto DeviceInformation variarán en función de DeviceInformationKind del dispositivo. Algunas propiedades solo están disponibles con determinados tipos. Para obtener más información sobre qué propiedades están disponibles para qué tipos, consulte Propiedades de información del dispositivo. Por lo tanto, en el ejemplo anterior, la búsqueda del dispositivo primario le proporcionará acceso a más información que no estaba disponible en el objeto de dispositivo DeviceInterface. Por este motivo, al crear las cadenas de filtro de AQS, es importante asegurarse de que las propiedades solicitadas están disponibles para los objetos DeviceInformationKind que está enumerando. Para obtener más información sobre cómo crear un filtro, consulte Compilación de un selector de dispositivos.
Al enumerar objetos AssociationEndpoint, AssociationEndpointContainer o AssociationEndpointService , se enumera a través de un protocolo inalámbrico o de red. En estas situaciones, se recomienda no usar FindAllAsync y, en su lugar, usar CreateWatcher. Esto se debe a que la búsqueda a través de una red suele dar lugar a operaciones de búsqueda que no agotarán el tiempo de espera durante 10 o más segundos antes de generar EnumerationCompleted. FindAllAsync no completa su operación hasta que se desencadene EnumerationCompleted . Si usa un DeviceWatcher, obtendrá resultados más cercanos al tiempo real, independientemente de cuándo se llame a EnumerationCompleted.
Guardar un dispositivo para usarlo más adelante
Cualquier objeto DeviceInformation se identifica de forma única mediante una combinación de dos fragmentos de información: DeviceInformation.Id y DeviceInformation.Kind. Si mantiene estos dos fragmentos de información, puede volver a crear un objeto DeviceInformation después de que se pierda proporcionando esta información a CreateFromIdAsync. Si lo haces, puedes guardar las preferencias de usuario de un dispositivo que se integre con la aplicación.