passion:driving

So könnt ihr euren BMW i3 „hacken“ und die BMW-API nutzen!

November 28, 2015 Aus dem Leben eines Enthusiasten, Technik 27 Kommentare

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 BMW i3!

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.

Schlüssel zum Glück: die BMW i3 Remote App

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