Start · Sprachen · JavaScript · Referenz · BluetoothRemoteGATTService.isPrimary

BluetoothRemoteGATTService.isPrimary

Eigenschaft

Schreibgeschützte Eigenschaft, die als <code>boolean</code> angibt, ob ein GATT-Dienst ein primärer Dienst (<code>true</code>) oder ein sekundärer bzw. eingebundener Dienst (<code>false</code>) ist.

seit JavaScript Web Bluetooth API: Chrome/Edge 56+, Opera 43+; nic Kategorie: webapi

Signatur

BluetoothRemoteGATTService.isPrimary

Beschreibung

Die Eigenschaft isPrimary eines BluetoothRemoteGATTService-Objekts gibt an, ob der Dienst auf dem entfernten Bluetooth-Low-Energy-Gerät ein primärer Dienst ist. Primäre Dienste stellen die Hauptfunktion eines Geräts dar, etwa heart_rate oder battery_service. Man findet sie über BluetoothRemoteGATTServer.getPrimaryService() oder getPrimaryServices().

Sekundäre Dienste (isPrimary === false) gibt es nicht eigenständig. Sie werden von anderen Diensten als eingebundene Dienste (Included Services) referenziert und über BluetoothRemoteGATTService.getIncludedService() bzw. getIncludedServices() abgerufen.

Nützlich ist die Eigenschaft vor allem beim Erkunden unbekannter Geräte, beim Debuggen von GATT-Profilen oder wenn Tools die Dienststruktur eines Geräts als Baum darstellen sollen. Der Wert ist schreibgeschützt und bleibt für die Lebensdauer des Dienstobjekts gleich.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn es sich um einen primären Dienst handelt, sonst false (sekundärer bzw. eingebundener Dienst).

Beispiele

Primären Dienst abfragen und prüfen

const button = document.querySelector('#connect');

button.addEventListener('click', async () => {
  // requestDevice erfordert eine Nutzergeste
  const device = await navigator.bluetooth.requestDevice({
    filters: [{ services: ['battery_service'] }]
  });
  const server = await device.gatt.connect();
  const service = await server.getPrimaryService('battery_service');

  console.log(`UUID: ${service.uuid}`);
  console.log(`Primär: ${service.isPrimary}`);
});
UUID: 0000180f-0000-1000-8000-00805f9b34fb Primär: true

Dienststruktur inklusive eingebundener Dienste ausgeben

const dumpServices = async (server) => {
  const services = await server.getPrimaryServices();

  for (const service of services) {
    console.log(`${service.isPrimary ? '[primär]' : '[sekundär]'} ${service.uuid}`);

    try {
      const included = await service.getIncludedServices();
      for (const inc of included) {
        console.log(`  └ ${inc.isPrimary ? '[primär]' : '[sekundär]'} ${inc.uuid}`);
      }
    } catch (err) {
      // Nicht jeder Browser bzw. jedes Gerät unterstützt Included Services
      console.warn(`  Keine eingebundenen Dienste: ${err.name}`);
    }
  }
};

document.querySelector('#scan').addEventListener('click', async () => {
  const device = await navigator.bluetooth.requestDevice({
    acceptAllDevices: true,
    optionalServices: ['heart_rate', 'battery_service', 'device_information']
  });
  const server = await device.gatt.connect();
  await dumpServices(server);
});
[primär] 0000180d-0000-1000-8000-00805f9b34fb [primär] 0000180f-0000-1000-8000-00805f9b34fb Keine eingebundenen Dienste: NotFoundError

Nur primäre Dienste filtern

const getOnlyPrimary = (services) =>
  services.filter((service) => service.isPrimary);

// Beispiel mit einer bereits geladenen Dienstliste
const primary = getOnlyPrimary(allServices);
console.log(`${primary.length} primäre Dienste gefunden`);
2 primäre Dienste gefunden

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Web Bluetooth gibt es nur in Chromium-Browsern (Chrome, Edge, Opera), und selbst dort je nach Plattform nur eingeschränkt. Firefox und Safari (auch iOS) unterstützen die API nicht. Prüfe die Unterstützung vorher mit 'bluetooth' in navigator.
  • Sicherer Kontext: Die API funktioniert nur über HTTPS (oder localhost). requestDevice() muss durch eine Nutzergeste wie einen Klick ausgelöst werden.
  • Dienste über getPrimaryService()/getPrimaryServices() liefern immer true. Interessant wird die Eigenschaft also erst bei Diensten aus getIncludedServices(), und diese Methode ist in Chrome derzeit nicht vollständig umgesetzt.
  • Dienste, die nicht in filters oder optionalServices stehen, sind nicht erreichbar. Der Versuch führt zu einem SecurityError.
  • Die Eigenschaft ist schreibgeschützt: Zuweisungen werden stillschweigend ignoriert (im Strict Mode: TypeError).