Features von übermorgen: die Generic Sensor API

Tales from the Web side  –  1 Kommentare

Das Einbeziehen von Sensorinformationen wird auch bei der Entwicklung von Webanwendungen immer wichtiger.

In den vergangenen Jahren haben sich beim W3C verschiedene Spezifikationen angesammelt, in denen Schnittstellen zu bestimmten Arten von Sensoren beschrieben werden, beispielsweise die Device Orientation API, die Geolocation API, die Proximity Events API oder die Ambient Light Sensor API.

Einführung

Leider liegt den genannten APIs keine gemeinsame Schnittstellenbeschreibung zugrunde, sodass die Verwendung von API zu API unterschiedlich ist. Das ist genau der Punkt, an dem die vor kurzem von der Device and Sensors Working Group als Working Draft veröffentlichte Generic Sensor API ansetzt: Sie hat das Ziel, eine einheitliche, generische Schnittstelle für Sensoren aller Art zu definieren.

Interfaces

Dazu definiert die Generic Sensor API folgende Interfaces:

  • Sensor: repräsentiert einen Sensor und stellt das Basisinterface dar, von dem weitere Sensor-APIs ableitende Interfaces definieren (beispielsweise AmbientLightSensor).
  • SensorOptions: genau genommen kein Interface, sondern ein Konfigurationsobjekt, das die Konfigurationen für einen Sensor repräsentiert. Standardmäßig ist dort momentan lediglich die Eigenschaft frequency vorgesehen, welche die Auslesefrequenz für den Sensor angibt. Auch hier sind ableitende APIs frei, weitere Konfigurationsparameter hinzuzufügen.
  • SensorReading: repräsentiert die aktuell vom Sensor ausgelesenen Werte. Die an diesem Interface abzugreifende Eigenschaft timestamp gibt den Zeitpunkt an, zu dem die Werte gelesen wurden. Ableitende Interfaces würden je nach Sensortyp weitere Eigenschaften definieren (z.B. AmbientLightSensorReading mit der Eigenschaft illuminance).
  • SensorReadingEvent: repräsentiert ein Ereignis, das beim Auslesen von Sensorwerten ausgelöst wird.
  • SensorErrorEvent: repräsentiert ein Ereignis, welches ausgelöst wird, wenn beim Auslesen eines Sensors ein Fehler auftritt.

Für das Starten und Stoppen der Ausleseprozesse an einem Sensors stehen am Interface Sensor die Methoden start() und stop() zur Verfügung. Insgesamt kann ein Sensor während seines Lebenszyklus einen der Zustände „idle“, „activating“, „active“ und „errored“ einnehmen (der aktuelle Zustand ist in der Eigenschaft state hinterlegt). Über den Event-Handler onstatechange kann auf Zustandsänderungen reagiert werden, über den Event-Handler onerror auf Fehler und über den Event-Handler onchange auf Änderungen der Sensorwerte. Letztere sind am Sensorobjekt über die Eigenschaft reading beziehungsweise das darin hinterlegte Objekt vom Typ SensorReading hinterlegt.

Beispiel: Messung des Umgebungslichts

Die Ambient Light Sensor API ist die einzige der genannten APIs, die bereits auf der Generic SensorAPI basiert. Es definiert die beiden Interfaces AmbientLightSensor und AmbientLightSensorReading, welche entsprechend von den allgemeinen Interfaces Sensor beziehungsweise SensorReading ableiten. Folgendes Listing zeigt ein Beispiel für die Verwendung der APIs (allerdings wird das API momentan lediglich von Firefox unterstützt).

let sensor = new AmbientLightSensor();
sensor.onchange = (event) => {
console.log(event.reading.illuminance);
};
sensor.onerror = (event) => {
console.error(event.error.name, event.error.message);
};
sensor.start();
Beispiel: Messung der Orientierung eines Endgeräts

Die Device Orientation API, welche den Zugriff auf Informationen bezüglich der Orientierung eines Endgeräts definiert, basiert momentan dagegen nicht auf der Generic Sensor API. Um die Orientierung eines Endgeräts festzustellen, würde man daher wie folgt vorgehen und einen Event-Listener für das deviceorientation-Event registrieren:

window.addEventListener('deviceorientation', (event) => {
console.log(event.alpha);
console.log(event.beta);
console.log(event.gamma);
}, true);

Würde sich diese API in Zukunft an der Generic Sensor API orientieren, sähe die Verwendung dagegen wie folgt aus:

let sensorOptions = { /* Hier sensorspezifische Optionen */ };
let sensor = new DeviceOrientationSensor(sensorOptions);
sensor.onchange = (event) => {
// Sensorspezifische Werte
let reading = event.reading;
console.log(reading.alpha);
console.log(reading.beta);
console.log(reading.gamma);
}
sensor.onerror = (event) => {
console.error(event.error.name, event.error.message);
}
sensor.onstatechange = (state) => {
console.log(state);
}
sensor.start();
// Später: sensor.stop();
Fazit

Die Generic Sensor API definiert eine generische Schnittstelle für das Arbeiten mit Sensoren. Die einzige API, die momentan von ihr ableitet, ist die Ambient Light Sensor API. Andere, etwa die Proximity Events API, sollen in Zukunft entsprechend angepasst werden. Den aktuellen Stand der Dinge sowie die Roadmap der Arbeitsgruppe beim W3C lässt sich unter https://www.w3.org/2009/dap/ einsehen.