¿Cómo identificar de forma única el dispositivo de clase USB HID?

Me gustaría identificar un teclado USB de forma única (algo equivalente a una mac-id única para las tarjetas Ethernet) en una computadora. ¿El perfil USB HID tiene soporte para tal identificación? Si es así, ¿cómo se llama el campo? Entiendo que VID y PID identifican de forma única una marca de teclado de un proveedor, pero espero poder identificar cada teclado por separado.

PD: Haciendo la pregunta en Elex SE, ya que tendría que implementar este perfil USB en AVR32.

seria bus:deviceNumberuna opcion? Que yo sepa, la enumeración de puertos es estática en los reinicios.
@jippie, nunca se sabe si el orden de enumeración cambia durante un reinicio. A veces, un dispositivo se enumerará como el primer dispositivo y, a veces, será el segundo o el tercero.
@Passerby El número de dispositivo cambiará, pero cada puerto USB en el bus es identificable de forma única. Un puerto en un hub siempre tiene el mismo número.
@PeterMotensen, como se le ha señalado innumerables veces en el pasado, hacer modificaciones tan insignificantes a preguntas antiguas es todo menos beneficioso. Además, su eliminación eliminó información que era absolutamente crítica para la pregunta; sin eso, parecería referirse a un teclado listo para usar, una situación muy diferente al proyecto de teclado personalizado sobre el que realmente se trata la pregunta.

Respuestas (2)

El número de serie USB es lo que desea. Y Atmel tiene una pequeña hoja de datos sobre cómo implementarlo con su pila USB aquí .

Además, se podría utilizar cualquiera de los descriptores USB configurables por el usuario. Suponiendo que está utilizando el mismo par VID/PID, aún tiene el número de versión del dispositivo, el descriptor de cadena del fabricante (nombre del fabricante), el descriptor de cadena del producto (nombre del producto) y el descriptor del número de serie, todos los cuales van en el dispositivo USB básico descriptor que es obligatorio para cualquier dispositivo usb. Son independientes de la clase usb (HID, CDC, Propietario, etc.), todos los principales sistemas operativos pueden leerlos y pueden ser tan únicos como los necesite.

Está hablando del lado del host, creo, para usar con productos HID comerciales, y no del lado del dispositivo. Esa es una excelente información sobre cómo usar la ID única de Atmel para serializar.
Pero, ¿por qué ese número de identificación de Atmel es único?
@ScottSeidman, algunos microcontroladores atmel tienen identificadores únicos, por lo que no tiene que generarlos en el lado del código. Es solo una característica que tienen. Para USB-HID, puede usar hasta cualquier variable de 10 bytes para crear un número de serie. La hoja blanca tiene dos opciones para eso. La identificación única extraída de la Flash_read_sn(pos)función, que puede reemplazar con la suya propia, o la definición del número de serie usb_descriptors.h. Y OP obviamente está hablando de hacer un AVR con usb-hid. Su dispositivo será un esclavo, conectado a una computadora.
@Passerby, ¿está sugiriendo poner el número de serie de Atmel en el campo de número de serie del perfil HID?
@Bleamer esa es una opción. Pero no todos los dispositivos amtel tienen un número de serie único. Simplemente estoy sugiriendo usar el campo de número de serie en el descriptor usb. El número real que utilice puede ser arbitrario.

Creo que variará según el fabricante. Hay un campo de número de serie, pero muchos no lo completan. USBDeview es una aplicación gratuita que le permitirá ver todos los campos de todos los dispositivos instalados ( http://www.nirsoft.net/utils/usb_devices_view. html ). A continuación se adjunta una captura de pantalla de un dispositivo HID en mi sistema. Instálelo (en realidad, ni siquiera es necesario descomprimirlo, se ejecuta como un ejecutable) y vea si hay una identificación única en los dispositivos de los que está hablando.

ingrese la descripción de la imagen aquí

No se puede votar, pero esto definitivamente está en la dirección de la respuesta. Gracias.
Verifiqué que mi teclado HP y mi mouse Logitech tienen '0' como número de serie. VendorID:productID es único por producto. En Linux, el comando 'lsusb' revela la misma información.
VendorID y ProductID DEBERÍAN ser únicos por producto, pero todo está en el aire para productos sin el logotipo USB oficial. Puedo ver fácilmente el mismo PID que se usa para productos dentro de una pequeña empresa, o diferentes dispositivos HID que usan el mismo tablero de piratas informáticos. No debería ser así, pero podría serlo. Las grandes empresas probablemente pagan según las reglas.
Tome el md5 o sha de todas (o un subconjunto de) las propiedades estáticas enumeradas anteriormente. Si tiene un número de serie, será único. De lo contrario, la última fecha de conexión/desconexión + la otra información tenderá a hacerlo único, o al menos una aproximación cercana.
@walrii un hash que incluye una fecha que cambia constantemente (o número de puerto) o sería inútil, ya que nunca volverá a ser el mismo. No podría distinguir 1 dispositivo de 1000 dispositivos, porque cambiarían en cada arranque.
@Passerby Es por eso que especifiqué las propiedades estáticas en el comentario :)
@walrii pero luego mencionó la última fecha de conexión/desconexión.
@Passerby Tienes razón sobre el último enchufar/desenchufar. No sé con qué estaba soñando allí, definitivamente no estático.