Hablar con dispositivos USB, empezar a finalizar (aplicación para UWP)
En este artículo se proporciona un tutorial completo sobre cómo crear una aplicación para UWP que se comunica con un dispositivo USB.
Usa las API de Windows Runtime para escribir aplicaciones para UWP que proporcionan a los usuarios acceso a su dispositivo USB periférico. Estas aplicaciones pueden conectarse a un dispositivo en función de los criterios especificados por el usuario, obtener información sobre el dispositivo, enviar datos al dispositivo y, por el contrario, obtener flujos de datos del dispositivo y sondear el dispositivo para obtener datos de interrupción.
Aquí se describe cómo la aplicación para UWP puede implementar esas tareas y vincular a ejemplos que muestran el uso de clases incluidas en Windows.Devices.Usb. Veremos las funcionalidades del dispositivo necesarias en el manifiesto de la aplicación y cómo iniciar la aplicación cuando se conecte el dispositivo. Y mostraremos cómo ejecutar una tarea de transferencia de datos en segundo plano incluso cuando la aplicación se suspende para conservar la duración de la batería.
Tutorial: Escritura de una aplicación para UWP para dispositivos USB
Siga los pasos descritos en este artículo o vaya directamente al ejemplo de acceso a dispositivos USB personalizados. El ejemplo complementario implementa todos los pasos aquí, pero para mantener las cosas en movimiento, no se recorre el código. Algunos pasos tienen un elemento Find it en la sección de ejemplo para ayudarle a encontrar el código rápidamente. La estructura de los archivos de código fuente del ejemplo es sencilla y plana, por lo que puede encontrar fácilmente código sin tener que explorar en profundidad varias capas de archivos de código fuente. Pero es posible que prefiera dividir y organizar su propio proyecto de forma diferente.
Instalación del controlador De Microsoft WinUSB
Instale el controlador WinUSB proporcionado por Microsoft como controlador de función para el dispositivo.
Inicio rápido: Instalación de WinUSB (Winusb.sys)
Puede instalar Winusb.sys de estas maneras:
- Al conectar el dispositivo, es posible que observe que Windows carga Winusb.sys automáticamente porque el dispositivo es un dispositivo WinUSB.
- Instale el controlador especificando la clase de dispositivo proporcionada por el sistema en Administrador de dispositivos.
- Instale el controlador mediante un INF personalizado. Puede obtener el INF de cualquiera de estas dos maneras:
- Obtenga el INF del proveedor de hardware.
- Escriba un INF personalizado que haga referencia al archivo Winusb.inf proporcionado por Microsoft. Para obtener más información, consulte Instalación de WinUSB (Winusb.sys).
Obtener información sobre el dispositivo
Obtenga el GUID de la interfaz de dispositivo, el identificador de hardware y la información de clase de dispositivo sobre el dispositivo.
Puede obtener esa información del fabricante del dispositivo.
Identificadores de proveedor y producto
En Administrador de dispositivos, vea las propiedades del dispositivo. En la pestaña Detalles , vea el valor de la propiedad Id. de hardware. Ese valor es una combinación de esos dos identificadores. Por ejemplo, para el dispositivo SuperMUTT, el id. de hardware es "USB\VID_045E&PID_F001"; el identificador de proveedor es "0x045E" y el identificador de producto es "0xF001".
Códigos de protocolo, subclase y clase de dispositivo
GUID de interfaz de dispositivo
Como alternativa, puede ver la información del Registro. Para obtener más información, consulte Entradas del Registro de dispositivos USB.
Determinar si el conjunto de API USB permite la clase de dispositivo, la subclase y el protocolo
Puedes escribir una aplicación para UWP, si la clase de dispositivo, la subclase y el código de protocolo del dispositivo se encuentra en la lista siguiente:
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 * *
Creación de un proyecto básico de Visual Studio
Cree un proyecto básico de Visual Studio que pueda ampliar en este tutorial.
Para obtener más información, consulta Introducción a las aplicaciones para UWP.
Adición de funcionalidades de dispositivo USB al manifiesto de la aplicación
Obtenga información sobre cómo agregar funcionalidades de dispositivo USB al manifiesto de la aplicación.
Inicio rápido: Adición de funcionalidades de dispositivo USB al manifiesto de la aplicación
Abra el archivo Package.appxmanifest en un editor de texto y agregue el elemento DeviceCapability con el atributo Name establecido en "usb", como se muestra en este ejemplo.
Nota:
No se puede modificar la funcionalidad del dispositivo USB en Visual Studio. Debe hacer clic con el botón derecho en el archivo Package.appxmanifest en Explorador de soluciones y seleccionar Abrir con...y, a continuación, editor XML (texto). El archivo se abre en XML sin formato.
<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>
Busque en el ejemplo: Las funcionalidades del dispositivo USB se encuentran en el archivo Package.appxmanifest.
Apertura del dispositivo para la comunicación
Amplíe la aplicación para abrir el dispositivo para la comunicación.
Inicio rápido: Conexión a un dispositivo USB (aplicación para UWP)
- Busque el dispositivo mediante la creación de una cadena de sintaxis de consulta avanzada (AQS) que contenga criterios de búsqueda para buscar el dispositivo en la colección de dispositivos enumerada.
- Abra el dispositivo de una de estas dos maneras:
Al pasar AQS a FindAllAsync y obtener el objeto DeviceInformation para el dispositivo.
Para obtener más información, consulte Inicio rápido: enumeración de dispositivos usados habitualmente.
Mediante el uso de un objeto DeviceWatcher para detectar cuándo se agrega o quita el dispositivo del sistema.
- Pase AQS a CreateWatcher y obtenga un objeto DeviceWatcher.
- Registre controladores de eventos en el objeto DeviceWatcher.
- Obtenga el objeto DeviceInformation del dispositivo en el controlador de eventos agregado.
- Inicie y detenga el objeto DeviceWatcher.
Para obtener más información, consulte Cómo obtener notificaciones si se agregan, quitan o cambian los dispositivos.
- Obtenga la instancia del dispositivo de la propiedad DeviceInformation.Id.
- Llame a FromIdAsync pasando la cadena de instancia del dispositivo y obtenga el objeto UsbDevice.
Busque en el ejemplo: vea los archivos denominados Scenario1_DeviceConnect.
Estudio del diseño del dispositivo USB
Estudie el diseño del dispositivo USB.
Revise los conceptos básicos de USB sobre cómo configurar el dispositivo y realizar transferencias de datos: conceptos para todos los desarrolladores de USB.
Vea el descriptor de configuración del dispositivo, los descriptores de interfaz para cada configuración alternativa admitida y sus descriptores de punto de conexión. Mediante USBView, puede examinar todos los controladores USB y los dispositivos USB conectados a ellos e inspeccionar también la configuración del dispositivo.
Obtener y mostrar descriptores USB en la interfaz de usuario
Amplíe la aplicación para obtener y mostrar descriptores USB en la interfaz de usuario.
Inicio rápido: Cómo obtener descriptores USB (aplicación para UWP)
Obtenga el descriptor de dispositivo obteniendo el valor UsbDevice.DeviceDescriptor.
Obtenga el descriptor de configuración obteniendo el valor UsbConfiguration.ConfigurationDescriptor.
- Obtenga el descriptor de configuración completo establecido obteniendo la propiedad UsbConfiguration.Descriptors.
Obtenga la matriz de interfaces dentro de la configuración obteniendo la propiedad UsbConfiguration.UsbInterfaces.
Obtenga la matriz de opciones alternativas obteniendo UsbInterface.InterfaceSettings.
Dentro de la configuración alternativa activa, enumere canalizaciones y obtenga los puntos de conexión asociados.
Estos objetos representan descriptores de punto de conexión:
Óselo en el ejemplo: vea los archivos denominados Scenario5_UsbDescriptors.
Envío de transferencias de control USB definidas por el proveedor
Amplíe la aplicación para enviar transferencias de control USB definidas por el proveedor.
Inicio rápido: Envío de una solicitud de transferencia de control USB (aplicación para UWP)
- Obtenga el comando de proveedor de la especificación de hardware del dispositivo.
- Cree un objeto UsbSetupPacket y rellene el paquete de instalación estableciendo varias propiedades.
- Inicie una operación asincrónica para enviar la transferencia de control por estos métodos en función de la dirección de la transferencia:
Énselo en el ejemplo: vea los archivos denominados Scenario2_ControlTransfer.
Lectura o escritura de datos masivos
Amplíe la aplicación para leer o escribir datos masivos.
Inicio rápido: Envío de una solicitud de transferencia masiva USB (aplicación para UWP)
- Obtenga el objeto de canalización masiva (UsbBulkOutPipe o UsbBulkInPipe).
- Configure la canalización masiva para establecer parámetros de directiva.
- Configure el flujo de datos mediante el objeto DataReader o DataWriter.
- Inicie una operación de transferencia asincrónica llamando a DataReader.LoadAsync o DataWriter.StoreAsync.
- Obtiene los resultados de la operación de transferencia.
Óselo en el ejemplo: vea los archivos denominados Scenario4_BulkPipes.
Obtención de datos de interrupción de hardware
Amplíe la aplicación para obtener datos de interrupción de hardware.
Inicio rápido: Envío de una solicitud de transferencia de interrupción USB (aplicación para UWP)
- Obtenga el objeto de canalización de interrupción (UsbInterruptInPipe o UsbInterruptOutPipe).
- Implemente el controlador de interrupción para el evento DataReceived.
- Registre el controlador de eventos para empezar a recibir datos.
- Anule el registro del controlador de eventos para dejar de recibir datos.
Énselo en el ejemplo: vea los archivos denominados Scenario3_InterruptPipes.
Selección de una configuración de interfaz que no está activa actualmente
Amplíe la aplicación para seleccionar una configuración de interfaz que no esté activa actualmente.
Inicio rápido: Cómo seleccionar una configuración de interfaz USB (aplicación para UWP)
Cuando se abre el dispositivo para la comunicación, se selecciona la interfaz predeterminada y su primera configuración. Si desea cambiar esa configuración, siga estos pasos:
- Obtenga la configuración activa de una interfaz USB mediante el valor UsbInterfaceSetting.Selected.
- Establezca una configuración de interfaz USB iniciando una operación asincrónica llamando a UsbInterfaceSetting.SelectSettingAsync.
Cerrar el dispositivo
Extienda la aplicación para cerrar el dispositivo.
Inicio rápido: Conexión a un dispositivo USB (aplicación para UWP)
Después de terminar de usar el objeto UsbDevice, cierre el dispositivo.
Las aplicaciones de C++ deben liberar la referencia mediante la palabra clave delete . Las aplicaciones de C#/VB deben llamar al método UsbDevice.Dispose. Las aplicaciones de JavaScript deben llamar a UsbDevice.Close.
Busque en el ejemplo: vea los archivos denominados Scenario1_DeviceConnect.
Creación de un paquete de metadatos de dispositivo
Cree un paquete de metadatos de dispositivo para la aplicación.
Herramienta: Asistente para creación de metadatos de dispositivo
- Si tiene instalado el Kit de controladores de Windows (WDK), abra Creación de metadatos> del dispositivo de controlador.>
- Si tiene instalado el SDK independiente, la herramienta se encuentra en <install_path>\bin\x86\DeviceMetadataWizardexe.
Asocie la aplicación con el dispositivo siguiendo los pasos del asistente. Escriba esta información sobre el dispositivo:
- En la página Información del dispositivo, escriba Nombre del modelo, Fabricante y Descripción.
- En la página Información de hardware, escriba el identificador de hardware del dispositivo.
Para declarar la aplicación como una aplicación con privilegios para el dispositivo, siga estas instrucciones:
En la página Información de la aplicación, en el grupo de aplicaciones con privilegios, escriba el nombre del paquete, el nombre del publicador y el identificador de la aplicación para UWP.
Nota:
No active la opción Access custom driver (Controlador personalizado de Access).
Abra la pestaña Finalizar . Active la casilla Copiar paquetes en el almacén de metadatos local del sistema.
Conecte el dispositivo, en Panel de control, abra Ver dispositivos e impresoras y compruebe que el icono del dispositivo es correcto.
Busque en el ejemplo: Consulte la carpeta DeviceMetadata.
Implementación de la activación de reproducción automática
Amplíe la aplicación mediante la implementación de la activación de Reproducción automática para iniciar la aplicación cuando el dispositivo se conecte al sistema.
Inicio rápido: Registro de una aplicación para un dispositivo de reproducción automática
Puedes agregar funcionalidades de Reproducción automática para que la aplicación se inicie cuando el dispositivo se conecte al sistema. Puedes habilitar la reproducción automática para todas las aplicaciones para UWP (con privilegios o en caso contrario).
En el paquete de metadatos del dispositivo, debe especificar cómo debe responder el dispositivo a una notificación de reproducción automática. En la pestaña Información de Windows, seleccione la opción aplicación de dispositivo para UWP y escriba la información de la aplicación como se muestra aquí:
En el manifiesto de la aplicación, agregue la declaración del dispositivo de reproducción automática e inicie la información como se muestra aquí:
En el método OnActivated de la clase App, compruebe si el dispositivo ha activado la aplicación. Si es así, el método recibe un valor de parámetro DeviceEventArgs que contiene el valor de la propiedad DeviceInformation.Id. Este es el mismo valor descrito en Abrir el dispositivo para la comunicación.
Busque en el ejemplo: Vea los archivos denominados Reproducción automática. Para JavaScript, consulte default.js.
Implementación de una tarea en segundo plano
Amplíe la aplicación para implementar una tarea en segundo plano que pueda realizar transferencias de longitud al dispositivo, como la actualización de firmware sin que la aplicación se suspenda.
Para implementar la tarea en segundo plano, necesita dos clases.
La clase de tarea en segundo plano implementa la interfaz IBackgroundTask y contiene el código real que crea para sincronizar o actualizar el dispositivo periférico. La clase de tarea en segundo plano se ejecuta cuando se desencadena la tarea en segundo plano y desde el punto de entrada proporcionado en el manifiesto de aplicación de la aplicación.
Nota:
La infraestructura de tareas en segundo plano del dispositivo proporcionada por Windows 8.1. Para obtener más información sobre las tareas en segundo plano de Windows, consulta Compatibilidad con la aplicación con tareas en segundo plano.
Clase de tarea en segundo plano
- Implementa la interfaz IBackgroundTask requerida por la infraestructura de tareas en segundo plano de Windows.
- Obtiene la instancia deviceUseDetails que se pasa a la clase en el método Run y usa esta instancia para notificar el progreso de nuevo a la aplicación de Microsoft Store y para registrarse para eventos de cancelación.
- El método Run también llama a los métodos OpenDevice y WriteToDeviceAsync privados que implementan el código de sincronización del dispositivo en segundo plano.
La aplicación para UWP registra y desencadena una tarea en segundo plano DeviceUseTrigger. El registro, desencadenador y controle el progreso de la aplicación en una tarea en segundo plano.
Nota:
El código de ejemplo siguiente se puede aplicar a la tarea en segundo plano DeviceServicingTrigger mediante el uso de los objetos correspondientes. La única diferencia entre los dos objetos de desencadenador y sus API correspondientes son las comprobaciones de directiva realizadas por Windows.
- Crea objetos DeviceUseTrigger y BackgroundTaskRegistration.
- Comprueba si alguna tarea en segundo plano se registró anteriormente en esta aplicación de ejemplo y las cancela llamando al método Unregister en la tarea.
- Registra la tarea en segundo plano que se sincroniza con el dispositivo. Se llama al método SetupBackgroundTask desde el método SyncWithDeviceAsync en el paso siguiente.
- Inicializa DeviceUseTrigger y lo guarda para su uso posterior.
- Crea un objeto BackgroundTaskBuilder y usa sus propiedades Name, TaskEntryPoint y SetTrigger y el método para registrar el objeto DeviceUseTrigger de la aplicación y el nombre de la tarea en segundo plano. La propiedad TaskEntryPoint del objeto BackgroundTaskBuilder se establece en el nombre completo de la clase de tarea en segundo plano que se ejecutará cuando se desencadene la tarea en segundo plano.
- Registra los eventos de finalización y progreso de la tarea en segundo plano para que la aplicación de Microsoft Store pueda proporcionar actualizaciones de finalización y progreso al usuario.
- El método syncWithDeviceAsync privado registra la tarea en segundo plano que se sincronizará con el dispositivo e iniciará la sincronización en segundo plano.
Llama al método SetupBackgroundTask del paso anterior y registra la tarea en segundo plano que se sincronizará con el dispositivo.
Llama al método StartSyncBackgroundTaskAsync privado que inicia la tarea en segundo plano.
Cierra el identificador de la aplicación en el dispositivo para asegurarse de que la tarea en segundo plano puede abrir el dispositivo cuando se inicia.
Nota:
La tarea en segundo plano deberá abrir el dispositivo para realizar la actualización, por lo que la aplicación de Microsoft Store debe cerrar sus conexiones al dispositivo antes de llamar a RequestAsync.
Llama al método RequestAsync del objeto DeviceUseTrigger que inicia la tarea en segundo plano y devuelve el objeto DeviceTriggerResults de RequestAsync usado para determinar si la tarea en segundo plano se inició correctamente.
Nota:
Windows comprueba que se han completado todas las comprobaciones de directiva de inicio de tareas necesarias. Si todas las comprobaciones de directivas se completan, la operación de actualización se está ejecutando ahora como una tarea en segundo plano fuera de la aplicación de Microsoft Store, lo que permite que la aplicación se suspenda de forma segura mientras la operación está en curso. Windows también aplicará los requisitos en tiempo de ejecución y cancelará la tarea en segundo plano si ya no se cumplen esos requisitos.
Usa el objeto DeviceTriggerResults devuelto desde StartSyncBackgroundTaskAsync para determinar si la tarea en segundo plano se inició correctamente. Se usa una instrucción switch para inspeccionar el resultado de DeviceTriggerResults.
- Implementa un controlador de eventos OnSyncWithDeviceProgress privado que actualizará la interfaz de usuario de la aplicación con el progreso de la tarea en segundo plano.
- Implementa un controlador de eventos OnSyncWithDeviceCompleted privado para controlar la transición de las tareas en segundo plano a la aplicación en primer plano cuando se ha completado la tarea en segundo plano.
- Usa el método CheckResults del objeto BackgroundTaskCompletedEventArgs para determinar si la tarea en segundo plano produjo alguna excepción.
- La aplicación vuelve a abrir el dispositivo para que lo use la aplicación en primer plano ahora que la tarea en segundo plano está completa y actualiza la interfaz de usuario para notificar al usuario.
- Implementa controladores de eventos de clic de botón privado desde la interfaz de usuario para iniciar y cancelar la tarea en segundo plano.
- El controlador de eventos Sync_Click privado llama al método SyncWithDeviceAsync descrito en los pasos anteriores.
- El controlador de eventos de CancelSync_Click privado llama al método Privado CancelSyncWithDevice para cancelar la tarea en segundo plano.
- El método CancelSyncWithDevice privado anula el registro y cancela las sincronizaciones de dispositivos activos para que el dispositivo se pueda volver a abrir mediante el método Unregister en el objeto BackgroundTaskRegistration.
Busque en el ejemplo: vea los archivos denominados Scenario7_Sync archivos. La clase en segundo plano se implementa en IoSyncBackgroundTask.
Ejecución del kit de certificación de aplicaciones de Windows
Ejecute el kit de certificación de aplicaciones de Windows.
Uso del Kit para la certificación de aplicaciones en Windows
Opción recomendada. Ejecutar el kit de certificación de aplicaciones de Windows te ayuda a asegurarte de que la aplicación cumple los requisitos de Microsoft Store. Debe ejecutarla cada vez que agregue la funcionalidad principal a la aplicación.
Ejemplos relacionados
- Ejemplo de acceso a dispositivos USB personalizados
- Ejemplo de control CDC de USB
- Ejemplo de dispositivo USB de actualización de firmware
Interfaz de usuario de la aplicación para UWP, empezar a finalizar (XAML)
Obtén más información sobre el diseño de la interfaz de usuario de la aplicación para UWP.
Plan de desarrollo para aplicaciones para UWP con C# y Visual Basic y Hoja de ruta para aplicaciones para UWP con C++
Obtenga más información sobre cómo crear aplicaciones para UWP con C++, C# o Visual Basic en general.
Programación asincrónica (aplicaciones para UWP)
Obtenga información sobre cómo hacer que las aplicaciones se mantengan dinámicas cuando realicen trabajos que pueden tardar un período de tiempo prolongado.