Signatur
Beschreibung
Die schreibgeschützte Eigenschaft configurations der Schnittstelle USBDevice liefert ein Array von USBConfiguration-Objekten. Jedes davon steht für eine Konfiguration, die das Gerät in seinen Konfigurationsdeskriptoren meldet. Eine Konfiguration legt fest, welche Schnittstellen (USBInterface) und Endpunkte (USBEndpoint) verfügbar sind, und bestimmt zum Beispiel auch die Stromaufnahme.
Die meisten Geräte bieten nur eine Konfiguration an. Einige Geräte haben aber mehrere, etwa einen Modus mit Busversorgung und einen mit eigenem Netzteil oder verschiedene Funktionsprofile. Mit configurations sehen Sie sich alle Möglichkeiten an, bevor Sie mit USBDevice.selectConfiguration() eine davon auswählen und mit claimInterface() eine Schnittstelle belegen.
Die Eigenschaft steht sofort zur Verfügung, wenn Sie das USBDevice über navigator.usb.requestDevice() oder navigator.usb.getDevices() erhalten. Das Gerät muss dafür nicht geöffnet sein. Die gerade aktive Konfiguration steht dagegen in USBDevice.configuration (Einzahl).
Rückgabewert
USBConfiguration-Objekten. Jedes Objekt hat die Eigenschaften configurationValue, configurationName und interfaces.Beispiele
Alle Konfigurationen eines Geräts auflisten
// Muss durch eine Nutzeraktion ausgelöst werden (z. B. Klick)
document.querySelector('#verbinden').addEventListener('click', async () => {
const device = await navigator.usb.requestDevice({ filters: [] });
console.log(`${device.productName}: ${device.configurations.length} Konfiguration(en)`);
for (const config of device.configurations) {
console.log(`#${config.configurationValue} – ${config.configurationName ?? '(ohne Namen)'}`);
console.log(` Schnittstellen: ${config.interfaces.length}`);
}
});
Konfiguration mit einer bestimmten Schnittstellenklasse auswählen
const VENDOR_CLASS = 0xff; // herstellerspezifische Klasse
const connect = async (device) => {
// passende Konfiguration über die Alternates der Schnittstellen suchen
const config = device.configurations.find((c) =>
c.interfaces.some((iface) =>
iface.alternates.some((alt) => alt.interfaceClass === VENDOR_CLASS)
)
);
if (!config) throw new Error('Keine passende Konfiguration gefunden');
await device.open();
if (device.configuration?.configurationValue !== config.configurationValue) {
await device.selectConfiguration(config.configurationValue);
}
const iface = config.interfaces.find((i) =>
i.alternates.some((alt) => alt.interfaceClass === VENDOR_CLASS)
);
await device.claimInterface(iface.interfaceNumber);
return iface.interfaceNumber;
};
const [device] = await navigator.usb.getDevices();
if (device) console.log('Belegte Schnittstelle:', await connect(device));
Endpunkte aller Konfigurationen tabellarisch ausgeben
const [device] = await navigator.usb.getDevices();
const rows = device.configurations.flatMap((config) =>
config.interfaces.flatMap((iface) =>
iface.alternate.endpoints.map((ep) => ({
config: config.configurationValue,
interface: iface.interfaceNumber,
endpoint: ep.endpointNumber,
direction: ep.direction,
type: ep.type,
packetSize: ep.packetSize
}))
)
);
console.table(rows);
// Wichtig · Fallstricke
- Nicht mit
configurationverwechseln:configurationsenthält alle verfügbaren Konfigurationen.configurationist die gerade aktive Konfiguration und istnull, solange keine ausgewählt wurde. iface.alternategibt es erst, wenn das Gerät geöffnet ist und die Konfiguration aktiv ist. Bei inaktiven Konfigurationen verwenden Sie besseriface.alternates.configurationNamekannnullsein, wenn das Gerät keinen String-Deskriptor mitliefert.- Browser-Unterstützung: Die WebUSB-API gibt es nur in Chromium-Browsern (Chrome, Edge, Opera), nicht in Firefox und Safari. Sie setzt einen sicheren Kontext (HTTPS) voraus.
requestDevice()muss durch eine Nutzeraktion ausgelöst werden, und die Permissions-Policyusbkann die API in iframes sperren. Prüfen Sie vorher mit'usb' in navigator, ob die API vorhanden ist. - Geräte mit geschützten Klassen (z. B. HID, Massenspeicher, Audio) blockiert der Browser. Deren Schnittstellen können Sie nicht belegen, auch wenn sie in
configurationsauftauchen.