Manchmal möchte man die Daten eines Arduinos am PC (oder MAC oder, oder…) weiter verarbeiten oder visualisieren. Im Projekt:Ardudoro habe ich dieses erfolgreich eingesetzt und nun möchte ich dieses als Microservice bereitstellen.
Was ist ein Microservice?
Ein Microservice ist ein Stück Programm was genau eine Aufgabe erledigt. Wenn man Bsp. einen Taschenrechner als Microservice sieht, dann ist jede Rechenoperation ein einzelner Microservice.
Was sind die Vorteile von Microservices?
Mit Microservices kann man die Architekturen trennen, und ermöglichen einen einfachen Technologiewechsel. Des Weiteren ist es einfacher die Vorteile verschiedener Programmiersprachen zu nutzen.
Eine Präsentation und ein Beispiel zum Thema „Microservice“ habe ich als Download bereitgestellt.
Installation & Konfiguration
Download
Das Projekt „MicroArduinoSer“ habe ich auf GitHub bereitgestellt und kann von dort geladen werden.
Bauen des Projektes
Wenn das gesamte Projekt geladen wurde muss dieses noch mit Apache Maven gebaut werden. Dazu wird auf der Konsole der Befehl
mvn clean install package
aufgerufen. Nachdem ggf. die Abhängigkeiten herruntergeladen und das gesamte Projekt gebaut wurde, wird in dem Verzeichnis „target“ ein Java Archive bereitgestellt „MicroArduinoSer-0.0.1-SNAPSHOT.jar“.
Wenn Sie dieses nicht möchten, so können Sie sich auch das Release laden und durch die beiliegende Batchdatei starten.
Starten des Projektes
Zum Starten des erstellen Java Archives wird die Batchdatei „start_Service.cmd“ aufgerufen oder es wird wiederum auf der Konsole der Befehl
java -jar MicroArduinoSer-0.0.1.jar server config.yml
aufgerufen. Wobei ggf. noch die Pfadangaben ergänzt werden müssen.
Aufrufen des Services
Der Service kann nun, nachdem erfolgreichen starten über die Adresse „http://localhost:8080/arduino“ aufgerufen werden. Sollte der Port 8080 bereits durch einen anderen Service belegt sein, so kann dieser über die Datei „config.yml“ angepasst werden.
Konfiguration
Per Default ist der Service auf folgende Parameter eingestellt:
portname: COM10 baudrate: 9600 databits: 8 stopbits: 1 parity: 0 sleep: 4000 firstCharacter: A lastCharacter: B
Die Daten können in der Datei „config.yml“ angepasst werden oder aber über Parameter in der URL.
Anpassen der Parameter über die URL
An der URL „http://localhost:8080/arduino“ können die Parameter geändert werden, ohne dass der Service extra beendet und neu gestartet werden muss.
Beispiel
Im folgenden Beispiel soll auf dem Port „COM12“ gelesen werden und alle Daten bis zum ersten Buchstaben „B“ ausgegeben werden.
http://localhost:8080/arduino?portname=COM12&lastCharacter=B
Dieses kann für alle Parameter erfolgen.
Ausgabe im Browser
Wenn man nun die URL „http://localhost:8080/arduino?portname=COM12&lastCharacter=B“ im Browser aufruft, erhält man folgende Ausgabe im JSON Format.
Es wird der Zeitstempel („recievedAt“) bereitgestellt wann die Daten („value“) gelesen wurden und die Daten selbst.
Durch das JSON Format können diese Daten Bsp. mit JavaScript oder jeder anderen beliebigen Sprache weiterverarbeitet werden.
Der Arduino Sketch
Hier nun das kleine Arduino Sketch, welches ich als Anhalt für das Projekt verwendet habe:
int index; void setup() { Serial.begin(9600); index = 0; } void loop() { Serial.print("A Hello World! - [ INDEX - "); Serial.print(++index); Serial.println(" ] B"); delay(1500); }
Hier ist gut zu erkennen das die Zeile mit dem Großbuchstaben „A“ beginnt und mit dem Buchstaben „B“ endet. Diese beiden Zeichen verwende ich in dem Service um den Anfang und das Ende zu bestimmen.
Die Pause (delay) und das Sleep aus dem Microservice sollten sich annähernd gleichen, da sonst Daten verloren gehen bzw. „verschluckt“ werden. (Dieses werde ich in einer späteren Version fixen.)
Exceptionhandling
Sollte einmal eine Exception „geworfen“ werden, so wird dieses im Browser mit der Meldung
{"code":500,"message":"There was an error processing your request. It has been logged (ID 269b244a843ca1b9)."}
quittiert.
Nun kann man mit der ID „269b244a843ca1b9“ in der Konsole prüfen welcher Fehler aufgetreten ist.
In diesem Falle habe ich einen falschen Port eingegeben:
io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: 269b244a843ca1b9 ! jssc.SerialPortException: Port name - COM11; Method name - openPort(); Exception type - Port not found.