Wie manche von euch ja wissen, komme ich aus der IT. Ich mag die Möglichkeiten, die moderne Autos inzwischen bieten. Ich mag nicht, dass Hersteller aber alle ihre Schnittstellen geschlossen halten und gemäß des (nicht funktionierenden) Ansatz „Security by Obscurity“ nichts offenlegen. So auch bei BMW. der i3 bietet eine schöne API, die aber nur zeitweise für ein paar Hackathons offen war, danach aber nicht mehr. Terence Eden hat sich nun die Mühe gemacht, die Kommunikation seiner BMWi-App mit seinem i3 zu entschlüsseln.
Hack your i3!
Mehr als einen i3, ein Android Handy oder Tablet braucht es dafür nicht. In seinem Blogpost beschreibt er, wie er das Reverse Engineering der BMWi-App betrieben hat, um so herauszufinden, wie die API auf BMW-Seite funktionert. Das Resultat sind ziemlich einfache Standardzutaten: eine REST API, abgesichert mittels OAuth, den benötigten API-Key und das Token-Secret muss man sich allerdings selbst besorgen. Durch dekompilieren der des APK bzw. Mitschneiden der Kommunikation sind aber auch die herauszufinden.
Auf Basis dessen, was die BMWi-App an Funktionen nutzt, sind somit einige Methoden bekannt, etwa um aktuelle Fahrzeugdaten oder Informationen über die letzte Fahrt abzurufen. Eine umfangreiche Beschreibung der API hat Terence in einem GitHub-Projekt dokumentiert.
Automatisierung mit Fahrzeugdaten
Was damit nun möglich ist? Eine ganze Menge! Zum einen bietet die API natürlich ein paar spannende Informationen über das Auto. Die meisten Infos sind natürlich genau so auch in der BMW i3 Remote App verfügbar. Aber eigentlich ließen sich diese Daten nutzen, um sie – viel eleganter – mit anderer Logik zu verknüpfen. Folgende Infos spuckt die API beispielsweise zum Fahrzeugstatus aus:
{ "vehicleStatus": { "vin": "WAB1C23456V123456", "mileage": 1234, "updateReason": "VEHICLE_SHUTDOWN_SECURED", "updateTime": "2015-10-30T18:45:04+0100", "doorDriverFront": "CLOSED", "doorDriverRear": "CLOSED", "doorPassengerFront": "CLOSED", "doorPassengerRear": "CLOSED", "windowDriverFront": "CLOSED", "windowDriverRear": "CLOSED", "windowPassengerFront": "CLOSED", "windowPassengerRear": "CLOSED", "trunk": "CLOSED", "rearWindow": "INVALID", "convertibleRoofState": "INVALID", "hood": "CLOSED", "doorLockState": "SECURED", "parkingLight": "OFF", "positionLight": "OFF", "remainingFuel": 8.9, "remainingRangeElectric": 73, "remainingRangeElectricMls": 45, "remainingRangeFuel": 126, "remainingRangeFuelMls": 78, "maxRangeElectric": 134, "maxRangeElectricMls": 83, "fuelPercent": 99, "maxFuel": 9, "connectionStatus": "DISCONNECTED", "chargingStatus": "INVALID", "chargingLevelHv": 58, "lastChargingEndReason": "UNKNOWN", "lastChargingEndResult": "FAILED", "position": { "lat": 51.123456, "lon": -1.2345678, "heading": 211, "status": "OK" }, "internalDataTimeUTC": "2015-10-30T18:47:44" } }
Man könnte sich so relativ einfach einen kleinen Service aufsetzen, welcher in regelmäßigen Abständen den BMW Connected Drive Service abfragt und den Status des Autos beobachtet und dadurch wiederum andere Aktionen anstößt. Verknüpfen könnte man das ganz einfach mit IFTTT. Dank des neuen Maker-Channels dort ist es nämlich auch möglich, beliebige Web-Requests in einem Standardformat zu senden, um so wiederum andere Aktionen loszutreten. Ein Beispiel: irgendwo auf einem Server oder einem RaspberryPI lässt man ein kleines Programm laufen, dass regelmäßig den Status bei BMW abfragt. Wenn beispielsweise das Fahrzeug verschlossen wird uns sich innerhalb eines kleinen Umkreises um mein Haus befindet, könnte ich wiederum über IFTTT mein Licht zuhause einschalten. Oder per IFTTT das Wetter überwachen, und sofern die Temperaturen unter eine gewisse Schwelle fallen, dafür sorgen dass beim i3 dann vorheizt.
Die Automobilwelt braucht mehr offene Schnittstellen!
Es gibt sicher noch viel mehr Möglichkeiten. Und genau das ist das schöne an solchen Schnittstellen. Legt sie frei, öffnet sie und es werden sich ganz viele Leute ganz viele schöne Ideen einfallen lassen. Und die bösen Buben? Keine Sorge, würden sich diese Schnittstellen ohnehin anschauen, egal ob offen oder geschlossen – wie wir beim BMW-Hack dieses Jahr ja schon sehen konnten. Eine offene Schnittstelle wird sich aber auch eher von den guten Jungs angeschaut und hinsichtlich ihrer Sicherheit bewertet.
Ach ja, bevor nun jemand kalte Füße bekommt: über euren i3 müsst ihr euch natürlich nicht sorgen. Denn es gibt auf die hier genannte Weise keine direkte Kommunikation mit dem Auto. Es wird lediglich der Connected Drive Service von BMW angesprochen, der wiederum mit dem Auto selbst kommuniziert.
So oder so: Für mehr offene Schnittstellen! Und irgendwie habe ich nun das dringende Bedürfnis, i3 zu fahren…
Text: sb
Fotos: BMW
27 Kommentare
Ein automatisches Fahrtenbuch mit den Standortdaten (ohne Sie an Dritthersteller geben zu müssen) wäre sicher für einige ganz praktisch und ich hab jetzt auch die ein oder andere Ideen, die ich gern mal ausprobieren würde!
Ob das mit den DriveNow i3’s auch geht ? 😀 … die ham zumindest auch ne API worüber man einige Variablen (Standort, Fahrzeugmodell, Tankfüllstand, …) bekommt – natürlich gibt’s die auch nicht offiziell 😉
Zum Beispiel! Das Problem bei den DriveNow-Autos ist: Du brauchst einen mit dem Auto verknüpften Connected Drive Account, den hast Du bei den DriveNow Autos nicht, sondern i.d.R. nur bei deinem eigenen Fahrzeug. Die DriveNow Autos kannst Du nicht mit einem eigenen Account verknüpfen.
Ich korrigiere, bei DriveNow geht das nicht nur für den i3, sondern für alle Fahrzeuge: https://api2.drive-now.com/ 😉
Ok, wird die API sein, die auch von Apps genutzt wird. Ist die Frage, was da alles drübergeht. Da musst du halt auch erstmal einiges an Business-Logik nachprogrammieren (z.B. Auto buchen, bevor du dann irgendwas anderes mit diesem Auto machen darfst), dann musst du ja auch die Zuordnung zum gerade bewegten Fahrzeug herstellen usw. Also sicher, geht natürlich auch, wäre aber jetzt nochmal eine andere Baustelle 😀
Der Winter fängt ja grad erst an … da hat man wieder Zeit an sowas zu basteln 😀
…und die car2go API ist sogar dokumentiert seh ich grad: https://code.google.com/archive/p/car2go/
Ach, das ist ja sogar eine ganz normale offene API 😀 Ja, dann haben die ja alles richtig gemacht. Schieß los! 😀
Hier in aktuell 😉 https://github.com/car2go/openAPI Danke, Dominik.
Markus Winninghoff liked this on Facebook.
Faeiz Hussien liked this on Facebook.
Daniel Schmitke liked this on Facebook.
Mario von Berg liked this on Facebook.
Christian Stampfer liked this on Facebook.
Mike Schießl liked this on Facebook.
Siegfried Bauer liked this on Facebook.
Daniel Bönnighausen liked this on Facebook.
Christian Hampe der Sebastian Bauer hat nen interessanten Artikel fur dich!
Lukas Hampe liked this on Facebook.
Frank von Gasser liked this on Facebook.
BMW i3 und die BMW-API nutzen! | passion:driving https://t.co/DtEEbAXJlF
Thomas Gigold liked this on Facebook.
Gabriele Bauer liked this on Facebook.
Matthias Gill liked this on Facebook.
Markus Kiss liked this on Facebook.
Florian Speigl liked this on Facebook.
Tobias Sgoff liked this on Facebook.
was für ein sinnloser beitrag..
Aha 🙂 Und warum?