Skip to main content
swissICT Booster  |  M&F Academy  |  M&F Events   |  +41 44 747 44 44  | 
6 Minuten Lesezeit (1152 Worte)

Industrial IoT auf Umwegen: Über Bluetooth und Mobilgeräte in die Cloud

M&F Engineering ist auf Softwaredienstleistungen im Industriebereich spezialisiert. In diesem Arbeitsfeld begegnen wir Kunden, die den Schritt Richtung Industrie 4.0 machen wollen. Sie wollen die Betriebsdaten ihres Maschinenparks in der Cloud sammeln und anschliessend analysieren können. Was aber, wenn sich diese Maschinen oder Sensoren an Orten ohne Internetzugang befinden? Einige Beispiele könnten grosse Fabrikgelände, Kanalisationen, Schiffe oder Flugzeuge sein. Auch in solchen Situationen kann es sehr wertvoll sein, schnell und komfortabel Informationen über den Betrieb zu erhalten.

M&F arbeitet an einer Lösung, um auch in solchen Situationen eine Unterstützung anbieten zu können. Wir möchten zukünftig eine Progressive Web App (PWA) mit Bluetooth Funktionalität anbieten. Denn eine PWA hat verschiedene Vorteile:

  • Eine PWA ist plattformunabhängig (Windows, macOS, Linux, Android, iOS)
  • Eine PWA ist offlinefähig
  • Eine PWA unterstützt Bluetooth Low Energy
  • Eine PWA verhält sich wie eine native App

Über die PWA gelangen dann auch die Daten in die Cloud. Von dort aus können sie als Datenbasis für beispielsweise Dashboards dienen.

Setup

In einer Prototypen-Studie wollten wir die grundsätzliche Machbarkeit dieser Idee testen. Dafür nutzten wir ein Raspberry Pi, welches als Bluetooth Peripheral Device genutzt wurde. Es wurde ein Device simuliert, das alle 5 Sekunden einen anderen Batteriestatus publiziert. Es ist nicht zwingend, dass ein Raspberry Pi benötigt wird. Jedes BLE/ GATT fähige Gerät kann funktionieren.

Damit alles einwandfrei funktioniert, sollte die Web App auf einem https-fähigen Server gehostet werden. Im Rahmen unseres Projektes haben wir dafür Azure Webservices gebraucht. Um die PWA-Fähigkeit sicherzustellen, wurde die PWA auf einem Android-Handy installiert und von dort aus genutzt.

Wir konnten so erfolgreich die (simulierten) Batteriedaten des Raspberry Pi empfangen. 

Hier sieht man einige Bilder des Prototypen:

 

 

Bluetooth ist nicht gleich Bluetooth

In einer PWA werden Bluetooth Geräte über die Web Bluetooth API angesprochen. Um mit dieser API effektiv arbeiten zu können, muss man sich zuerst mit einigen Begriffen vertraut machen:

Die Web Bluetooth API unterstützt nur Bluetooth Low Energy (BLE) und das GAP/ GATT Protokoll. BLE ist ein Subset des Bluetoothstandard 4.0. Das bedeutet, dass Geräte mit früheren Bluetoothstandards nicht angesprochen werden können. Und da BLE ein Subset von Bluetooth 4.0 ist, gibt es auch modernere Geräte, die nicht kompatibel zur Web Bluetooth API sind.

Die Web Bluetooth API lehnt sich in ihren Begrifflichkeiten stark an das unterstützte GATT Protokoll an. Ein GATT Server, ein Bluetooth Peripheral, verschickt regelmässig eine Meldung in seine Umwelt. Der Server informiert darüber, welche Profile er anbietet. Diese Profile sind durch eine ID (einen String oder eine UUID) definiert. Verbindet sich nun ein Central Device, beispielsweise ein Computer oder Smartphone, mit dem GATT Server, so kann ausgewählt werden welches Profil gerade interessant ist. Der GATT Server schickt anschliessend Informationen über die im Profil  enthaltenen Services. Ein Profil kann einen oder mehrere Services haben. Die Services wiederum enthalten Characteristics. Unter einer Characteristic versteht man einen Wert vom immer gleichen Typ. Je nach Einstellung der Characteristics ist es möglich, nur zu lesen oder auch den Wert zu überschreiben. Es gibt auch Characteristics, die immer wieder einen neuen Wert publizieren. Ist ein Gerät verbunden, welches sich für diese Characteric interessiert, werden die neuen Werte immer an dieses Gerät geschickt.

Profile, Services und Characterics werden alle durch eine einzigartige Zeichenfolge oder eine UUID identifiziert. In der Prototypen-Studie wurde der Batteriestand ausgelesen. In diesem Fall besagt die Spezifikation, dass sowohl Profil als auch Service unter dem Namen "battery_service" zu finden sein sollen. Die Characteristic wird identifiziert durch den Namen "battery_level". In der Spezifikation der BSIG (Bluetooth Special Interest Group) ist definiert, dass die Characterstic ein Batteriewert zwischen 0 und 100% sein soll. Ebenfalls ist es möglich Benachrichtigungen von dieser Charactertic zu erhalten. Die BSIG definiert für gewisse Namen und vorgefertigte Profile. Es ist aber auch ohne Probleme möglich, über firmenintern definierte Profile zu kommunizieren. 

 

Codebeispiel Javascript

Der Code, den es in Javascript braucht, um sich zu einem Bluetooth Gerät zu verbinden ist vergleichsweise einfach:

console.log('Requesting Bluetooth Device...');
navigator.bluetooth.requestDevice({filters: [{services: ['battery_service']}]})
.then(device => {
    console.log('Connecting to GATT Server...');
    return device.gatt.connect();
}).then(server => {
    console.log('Getting Service...');
    return server.getPrimaryService('battery_service');
}).then(service => {
    console.log('Getting Characteristic...');
    return service.getCharacteristic('battery_level');
}).then(characteristic => {
     myCharacteristic = characteristic;
     return myCharacteristic.startNotifications().then(_ => {
     console.log('> Notifications started');
     myCharacteristic.addEventListener('characteristicvaluechanged',
        handleNotifications);
     });
}).catch(error => {
    console.log('Argh! ' + error);
});

Die Schwierigkeit liegt eher darin, dass alle externen Faktoren für diesen Code stimmen (Korrektes Bluetooth Protokoll auf dem Gerät, Browser mit eingeschaltetem Bluetooth, https-Verbindung).

Der Techstack bei M&F bestimmt, dass im Frontend Angular genutzt wird. Für dieses Framework wird ein npm-Packet angeboten, mit dem man ebenfalls auf die Bluetooth Web API zugreifen kann.

constructor(private bleCore: BluetoothCore) {
// Constructor code omitted for brevity.
}
​
public connectToBatteryService() {
    this.batteryLevel$ = this.bleCore.discover$(
        {acceptAllDevices: true, optionalServices: ['battery_service']}
    ).pipe(
        // 2) get that service
        mergeMap((gatt: BluetoothRemoteGATTServer) => {
          this.log('Connected To Device...');
          return this.bleCore.getPrimaryService$(gatt,AppComponent.GATT_PRIMARY_SERVICE);
        }),
​
        // 3) get a specific characteristic on that service
        mergeMap((primaryService: BluetoothRemoteGATTService) => {
          this.log('Getting Service ...');
          return this.bleCore.getCharacteristic$(primaryService, AppComponent.GATT_CHARACTERISTIC_BATTERY_LEVEL);
        }),
​
        // 4) ask for the value of that characteristic (will return a DataView)
        mergeMap((characteristic: BluetoothRemoteGATTCharacteristic) => {
          this.log('Getting Characteristic ...');
          return this.bleCore.observeValue$(characteristic);
        }),
​
        // 5) on that DataView, get the right value
        map((value: DataView) => value.getUint8(0))
      );
​
    this.batteryLevel$.subscribe(n => {
        this.batteryLevel = n;
        this.log('Battery Level: ' + n + '%');
      });
  }

 

Ausblick und Ideen

Ausgehend von diesem einfachen Beispiel sind viele verschiedene Anwendungsmöglichkeiten denkbar.

  • In der Industrie wird oft über UART mit seriellen Schnittstellen kommuniziert. Es gibt den Kommunikationsstandart Bluetooth UART. Dieser baut auf dem GATT Protokoll auf. Das heisst es ist möglich, dass man über die Web Bluetooth API auf die Buskommunikation von seriellen Geräten zugreifen. kann. Ein Beispiel hierfür wurde auf der Open-Source Plattform Github publiziert.
  • Viele Sportgeräte sind ebenfalls über die Web Bluetooth API ansprechbar. Es gibt auch vordefinierte Profile für Dinge wie Herzfrequenzmesser.
  • Anwendungen für Haushaltsgeräte, Tools für E-Bikes und E-Scooter, Mess- und Laborgeräte, Spielzeuge etc.

 

Schwierigkeiten

Um anderen Entwicklern Kopfschmerzen bei der Entwicklung zu ersparen, erwähne ich hier noch einige Dinge, die man beachten sollte, bevor man ein Projekt startet:

  • Die verwendeten Geräte müssen BLE-fähig sein. Ansonsten kann es nicht funktionieren.
  • Die Website muss über eine HTTPS-Verbindung aufgerufen werden. Sonst ist die Web Bluetooth API blockiert.
  • Firefox und Safari unterstützen die Web Bluetooth API nicht. Die Web Bluetooth API gilt noch als experimentelle Technologie. Im MDN werden die kompatiblen Browser aufgelistet.

Wenn man diese Punkte beachtet, kann man mit der Web Bluetooth API viel Spass haben und die Mächtigkeit von modernen Browsern für viele zukünftige Projekte effektiv nutzen. Gerne unterstützen wir Sie bei Ihrem Projekt!

0
Rückblick 2020 – vom Strategie-Meeting in den Lock...
Einblick ins Game Design

Ähnliche Beiträge

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Donnerstag, 09. Mai 2024

Sicherheitscode (Captcha)