Hoe ik mijn fiets gehackt heb

Dankzij mijn werkgever kan ik sinds vorig jaar een fiets voor woonwerkverkeer leasen. Nu is Antwerpen-Brussel te ver om met een gewone fiets op regelmatige basis te rijden, maar perfect doenbaar tegen 45 km/u op een speedelec.

Toen ik op zoek ging naar een goede speedelec viel mijn oog al snel op het Zwitsers merk Stromer. Hun fietsen hebben niet enkel een krachtige motor, maar komen ook met ingebouwde GPS, 3G-verbinding en uiteraard een app. Iets wat mij als gadgetfreak natuurlijk direct aanspreekt.

st2s.jpg

Na 6 maanden wachten werd mijn Stromer ST2 S eindelijk geleverd en na de eerste rit hier naar het werk viel me al direct een pijnpuntje op. Terwijl de fiets aan het opladen was kreeg ik in de app geen updates van de batterijstatus. Pas als ik naar beneden ging en de fiets uit zijn slaapstand haalde werd het batterijpercentage geupdate. Heel lastig, want als iemand per ongeluk uw kabel uitstoot geraak je niet thuis.

Dus besloot ik even te kijken hoe die app werkt. Dankzij mitmproxy, een tooltje dat je op je laptop draait en al het verkeer tussen je telefoon en het Internet onderschept en toont.

mitm.png

Het eerste dat opviel was dat de fabrikant een mooie Oauth-flow heeft opgezet voor de authenticatie. Dit wil dus ook zeggen dat het redelijk gemakkelijk gaat zijn om hier op in te pikken en zelf iets te maken. Een tweede ding dat ik zag, was dat achter elke request ?cached=true staat, hij vraagt dus oude gegevens op, en dat zou wel eens de oorzaak van mijn probleem kunnen zijn.

Op het Stromerforum ontdekte ik dat er iemand anders ook al bezig was met hetzelfde. Hij had een implementatie geschreven in Python, maar aangezien ik daar geen grote fan van ben heb ik mijn eigen Javascript-implementatie geschreven.

Mijn batterijpercentage opvragen is nu zo simpel als:

const Stromer = require('stromer-api');

const api = new Stromer({
username: "xxxxx",
password: "xxxxxx",
client_id: "xxxxxxx",
client_secret: "xxxxxxx"
});

api.bike.state.get().then(state => {
  console.log(`Batterij: ${state.battery_SOC}%`);
});

cli.png

De fiets wordt even wakker, stuurt het batterijpercentage door over 3G en gaat weer slapen. Nu enkel terug beter wee buiten.

Natuurlijk kan je hier nog een hele hoop andere dingen mee:

  • de locatie van de fiets ophalen in real-time
  • de serienummers van alle onderdelen opvragen (iets dat niet in de app kan)
  • de instellingen van de fiets opvragen en aanpassen
  • de lichten controleren
  • de fiets op slot zetten of los maken

De broncode en documentatie staan hier, installeren kan met npm install stromer-api --save of yarn add stromer-api.

(Ik ben ook heel trots op de Facebook share image van deze post dus die deel ik hieronder nog eens.)

og.jpg

Gepubliceerd op 9 Jan 2019

Creative coder bij het VRT creative lab.
Tim Broddin on Twitter