Start · Sprachen · JavaScript · Referenz · USBDevice.opened

USBDevice.opened

Eigenschaft

Schreibgeschützter Boolean, der angibt, ob gerade eine Sitzung mit dem gekoppelten USB-Gerät offen ist, also ob <code>open()</code> erfolgreich aufgerufen wurde.

seit JavaScript Chrome/Edge 61+, Opera 48+ (nur Chromium; kein Fir Kategorie: webapi

Signatur

USBDevice.opened

Beschreibung

Die Eigenschaft opened eines USBDevice-Objekts ist true, sobald USBDevice.open() erfolgreich abgeschlossen wurde. Nach USBDevice.close() oder wenn das Gerät getrennt wird, ist sie wieder false. Nur bei geöffnetem Gerät kann man Konfigurationen auswählen, Interfaces beanspruchen und Daten übertragen (transferIn(), transferOut(), controlTransferIn() usw.).

Typischerweise prüft man opened vor einem Aufruf von open(), damit ein Gerät, das schon geöffnet ist, nicht noch einmal geöffnet wird. Das kommt zum Beispiel vor, wenn man Geräte über navigator.usb.getDevices() wiederherstellt oder mehrere Programmteile auf dasselbe Gerät zugreifen. Ebenso kann man vor dem Aufräumen prüfen, ob close() überhaupt nötig ist.

Die Eigenschaft ist schreibgeschützt. Wenn man ihr etwas zuweist, wird das ignoriert, im Strict Mode gibt es einen TypeError. Den Zustand ändert man ausschließlich über open() und close().

Rückgabewert

Typ
boolean
Beschreibung
true, wenn eine Sitzung mit dem Gerät offen ist, sonst false.

Beispiele

Gerät auswählen und Zustand vor und nach open() prüfen

// Muss durch eine Nutzeraktion (z. B. Klick) ausgelöst werden
const button = document.querySelector('#connect');

button.addEventListener('click', async () => {
  try {
    const device = await navigator.usb.requestDevice({
      filters: [{ vendorId: 0x2341 }] // z. B. Arduino
    });
    console.log('Vor open():', device.opened);
    await device.open();
    console.log('Nach open():', device.opened);
  } catch (err) {
    console.error('USB-Fehler:', err);
  }
});
Vor open(): false Nach open(): true

Hilfsfunktion: nur öffnen, wenn nötig

const ensureOpen = async (device) => {
  if (!device.opened) {
    await device.open();
  }
  if (device.configuration === null) {
    await device.selectConfiguration(1);
  }
  await device.claimInterface(0);
  return device;
};

// Früher freigegebene Geräte ohne erneute Nachfrage wiederverwenden
const [device] = await navigator.usb.getDevices();
if (device) {
  await ensureOpen(device);
  console.log(`${device.productName} bereit:`, device.opened);
}
Arduino Uno bereit: true

Sauber schließen beim Verlassen der Seite oder beim Trennen

const closeIfOpen = async (device) => {
  if (device?.opened) {
    await device.close();
    console.log('Sitzung geschlossen:', !device.opened);
  }
};

navigator.usb.addEventListener('disconnect', (event) => {
  // Nach dem Trennen ist opened automatisch false
  console.log('Getrennt, opened =', event.device.opened);
});

const [device] = await navigator.usb.getDevices();
window.addEventListener('pagehide', () => closeIfOpen(device));
Getrennt, opened = false

// Wichtig · Fallstricke

  • Browser-Unterstützung: WebUSB gibt es nur in Chromium-Browsern auf dem Desktop und unter Android (Chrome, Edge, Opera). Firefox und Safari unterstützen die API nicht. Deshalb vorher prüfen: 'usb' in navigator.
  • Sicherer Kontext: Die API funktioniert nur über HTTPS (oder localhost). requestDevice() braucht eine Nutzeraktion. In iframes muss zusätzlich die Permissions Policy usb erlaubt sein.
  • opened === true bedeutet nicht, dass schon ein Interface beansprucht ist. claimInterface() kann trotzdem fehlschlagen, zum Beispiel wenn ein Treiber des Betriebssystems das Interface belegt (unter Windows oft ein Problem).
  • Wenn man open() auf einem bereits geöffneten Gerät aufruft, löst das Promise sofort auf. Die Prüfung verhindert also vor allem unnötige Aufrufe und Rennbedingungen, wenn mehrere open()/close()-Aufrufe gleichzeitig laufen.
  • Der Wert ändert sich asynchron erst, wenn das Promise von open() bzw. close() aufgelöst ist. Direkt nach dem Aufruf ohne await steht noch der alte Wert darin.
  • Auch in Web Workern verfügbar (Chromium), in Service Workern nur eingeschränkt.