Mi Scale 2 dans Gadgetbridge : A la découverte de Bluetooth Low Energy

Jean-Francois Greffier
11/03/2019

Dans cet article, nous allons voir comment reconnaître et se connecter à la balance connectée de Xiaomi grâce au reverse-engineering de sa connexion Bluetooth.

La Xiaomi Body Composition Scale, ou Mi Scale 2, est la deuxième itération de la balance connectée du constructeur chinois. Comme son nom l’indique, elle est capable d’analyser la composition du corps via la mesure de l’impédance. Elle est plutôt précise et comme d’habitude avec le Xiaomi elle est disponible à un prix serré.
Hélas le pèse-personne impose l’utilisation de l’application propriétaire du constructeur. Mi Fit, c’est son nom, ne permet pas d’exporter ses données (mis à part dans Google Fit). Enfin, certains n’ont tout simplement pas envie de partager leur données personnelles avec une application qui se synchronise dans le cloud.
Heureusement des alternatives existent. Par exemple l’excellent openScale, une application spécialisée dans les balances connectées.

Gadgetbridge

Gadgetbridge est une application Android open-source permettant d’utiliser des objets connectés de type fitness comme la Pebble, l’Amazfit Bip, les devices HPlus… Et ce sans utiliser l’application propriétaire du constructeur. Vos données restent ainsi personnelles et locales à votre téléphone.
Hélas, Gadgetbridge ne supporte pas encore les balances connectées et donc pas les Mi Scale. Dans cet article, nous partons à la découverte de Bluetooth Low Energy dans le but d’ajouter le support de la Mi Scale dans Gadgetbridge.

Bluetooth Low Energy

Bluetooth 4.0 a été standardisé en 2010 et ajoute le protocole Bluetooth Low Energy, ou BLE. C’est une nouvelle stack dont le but est de fonctionner avec des appareils à basse consommation, par exemple alimenté avec une pile-bouton, avec un débit réduit mais une portée similaire au Bluetooth classique.
BLE ajoute aussi les profils GATT (Generic Attribute Profile), une collection codifiées de Service, Characteristic, Descriptor et de modes de lectures. Nous allons le voir, ce mode de fonctionnement normalisé va grandement nous aider à comprendre comment notre balance connectée communique.

Reverse-engineering de la Mi Scale

Comment reconnaître la Mi Scale ? (Discovery)

La première étape consiste à implémenter le nécessaire à la découverte de l’appareil. Notre problème ici sera de reconnaître l’appareil de façon certaine. Pour cela, nous devons récolter un maximum d’informations mais en fait, que connaissons-nous de cet appareil ?

  • Un tour vers le site du constructeur indique sobrement Bluetooth 4.0, il y a bien sûr toutes les chances qu’il s’agit de BLE mais il faudra le vérifier

  • Le dos de ma balance (chinoise) indique le nom du constructeur : “安徽华米信息科技有限公司”. Il s’agit en fait de Huami, le constructeur derrière les Mi Band ou les produits Amazfit.

Continuons nos investigations avec l’application Android nRF Connect for Mobile
C’est un outil qui permet de scanner et d’explorer des appareils BLE, c’est je trouve le plus complet. Il donne des informations lisibles mais laisse les données brutes visibles. On notera aussi LightBlue Explorer et Bluetooth LE Scanner qui valent la peine d’être essayé.

nRF Connect for Mobile - Apps on Google Play

nRF Connect for Mobile is a powerful generic tool that allows you to scan, advertise and explore your Bluetooth low energy (BLE) devices and communicate with them. nRF Connect supports number of Bluetooth SIG adopted profiles together with Device Firmware Update profile (DFU) from Nordic Semiconductors and Mcu Manager on Zephyr and Mynewt. Features: - Scans for Bluetooth low energy (BLE) devices - Parses advertisement data - Shows RSSI graph, allows export to CSV and Excel formats - Connects to a connectible the Bluetooth LE device - Discoveries and parses services and characteristics - Allows to read and write characteristics - Allows to enable and disable notifications and indications - Supports Reliable Write - Parses number of characteristics adopted by Bluetooth SIG - BTLE advertising (Android 5+ required) - Read and update PHY (Android 8+ required) - GATT Server configuration - Supports Device Firmware Update profile which let the user to upload a new application, SoftDevice or a bootloader over-the-air (OTA) from a HEX file - Supports the Nordic UART Service - Allow to record and replay common operations using Macros - Allows to perform automated tests defined in XML file on Bluetooth Smart devices. Visit the GitHub page: https://github.com/NordicSemiconductor/Android-nRF-Connect for more information about automated tests and creating init packets for the DFU. Note: - Supported on Android version 4.3 or later. - nRF51 or nRF52 Development kits can be ordered from http://www.nordicsemi.com/eng/Buy-Online . - The nRF51 and nRF52 SDKs and SoftDevices are available on-line at http://developer.nordicsemi.com Works well with nRF Logger application, that will store your logs in case something bad happens with nRF Connect. Download nRF Logger from: https://play.google.com/store/apps/details?id=no.nordicsemi.android.log

Tout d’abord il faut s’assurer que la balance soit visible, en effet celle-ci se met en veille après quelques minutes. Il suffit de mettre un poids pour la réveiller, ensuite nous lançons le scan.

Tout d’abord nous observons qu’il y a beaucoup de devices Bluetooth à proximité ; c’est un vrai problème de vie privée puisqu’il est facile de déduire la présence de quelqu’un voire ses activités grâce à ses appareils. On peut voir l’Apple TV du voisin, ou savoir s’il est là grâce à son casque sans fil ou son bracelet connecté… La balance est visible sous le nom MIBCS pour Mi Body Composition Scale.

On connaît aussi son adresse MAC, ce qui peut aider à identifier le constructeur via le OUI (Organizationally Unique Identifier). Les 3 premiers octets de l’adresse MAC sont constitué de cet identifiant unique.
Dans notre cas l’adresse MAC commence par C1:68:02, hélas ce n’est pas un constructeur enregistré dans le système du OUI https://api.macvendors.com/C1:68:02
Le OUI du Mi Band 1 renvoyait lui les bonnes informations https://api.macvendors.com/88:0F:10 Dommage.

Ne nous liassons pas décourager, l’appareil diffuse un Company Identifier. Bingo ! La balance nous donne 0x0157 ce qui correspond bien au constructeur Anhui Huami tInformation Technology Co., Ltd. comme on peut le voir dans les spécifications Bluetooth. nRF Connect for Mobile affiche directement le nom de l’entreprise.

Extrait de https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers

La balance connectée liste aussi une partie des services qu’elle supporte. Pour être plus précise, elle en liste un : 0x181B.
Il s’agit d’un service GATT, et là est tout l’intérêt de la normalisation des services et caractéristiques. En lisant la documentation on tombe sur le Body Composition, ce service expose des données relatives à la composition du corps mesurée depuis un appareil de healthcare ou de fitness. Ca correspond très exactement à notre appareil.
https://www.bluetooth.com/specifications/gatt/services

Voici les critères sur lesquels nous pourrons nous baser pour dire qu’un appareil est une Mi Scale 2 :

  • Un appareil Bluetooth LE

  • Annonçant le service GATT Body Composition (0x181B)

  • Ayant le Company Identifier de Huami (0x0157)

  • Et dont le nom est “MIBCS”

Reverse engineering (Communication)

Nous avons maintenant les critères pour reconnaître la Mi Scale 2. Allons plus loin et connectons-nous à la balance.

Une fois connecté, nous avons accès à l’ensemble des services :
0x1800 Generic Access
0x1801 Generic Attribute
0x180a Device Information
0x181b Body Composition
0x1530 Unknown service

Le Device Information est intéressant, il permettra de récupérer la révision hardware de la balance et la version de son firmware. C’est dommage que la balance ne permet pas de connaître le niveau de charge de la batterie, via le Battery Service.

On souscrit à UUIDCHARACTERISTICBODYCOMPOSITIONMEASUREMENT, c’est-à-dire qu’une callback sera appelée quand la balance à de nouvelles données. Au moment d’une mesure, on reçoit 13 octets. Pour le moment nous n’avons aucunes informations sur ces résultats qui sont dans un format propriétaire.

Quelques exemples de valeurs :

0x02 0x04 0xe3 0x07 0x02 0x06 0x0a 0x2c 0x28 0x00 0x00 0x20 0x030x02 0x84 0xe3 0x07 0x02 0x06 0x0a 0x2c 0x29 0x00 0x00 0x20 0x030x02 0x04 0xe3 0x07 0x02 0x06 0x0a 0x2d 0x03 0x00 0x00 0x84 0x030x02 0x24 0xe3 0x07 0x02 0x06 0x0a 0x2d 0x14 0xfd 0xff 0xd4 0x030x02 0xa4 0xe3 0x07 0x02 0x06 0x0a 0x2d 0x19 0xfd 0xff 0xd4 0x03

Heureusement OpenScale à déjà fait le travail sur la Mi Scale première du nom. Les formats renvoyés par les deux balances sont assez différents, mais le travail d’OpenScale va nous aider à comprendre l’octet 1 qui est spécial.

Résultats de mon reverse-engineering

L’octet 0 semble toujour avoir la valeur 0x02
L’octet 1 est un statut
Les octets 9 et 10 sont sans doute liés aux mesures d’impédance permettant de connaître la constitution du corps : graisse corporelle, eau, masse osseuse, muscle. Pour une première version, j’ai choisi de ne pas m’y intéresser dans l’immédiat.

Voyons de plus près l’octet de statut.
Les bits 0 et 4 donnent l’unité de la mesure. Bit 0 activé pour les livres, bit 4 activé pour les jin. Le jīn (斤) est une unitée de poids chinoise valant 500 grammes, le kilogramme est lui appelé gōngjīn (公斤). Si ces deux bits sont à 0, la mesure est en kilogrammes.
Le bit 5 indique si la mesure est “stable” c’est-à-dire qu’elle ne change pas, il faut donc tester ce bit pour savoir si on doit prendre en compte cette mesure ou pas.

Pour faire une mesure, il suffit donc de souscrire à la caractéristique UUIDCHARACTERISTICBODYCOMPOSITIONMEASUREMENT et vérifier si le poids est stabilisé. Enfin on récupère le poids et l’unité, avec la date de cette mesure.

Mi Scale 2 dans Gadgetbridge

Le tutoriel Gadgetbridge pour l’ajout du support d’un nouvel appareil est très détaillé et clair. Je ne me concentre ici que sur l’essentiel, pour le reste il suffit de suivre le tuto.

Part 1 : Discovery

Nous allons d’abord créer des critères de filtres qui seront utilisés par GadgetBridge pendant le scan d’appareils BLE. Pour aller plus loin et comme nous l’avons appris avec notre analyse de la balance, il faut que l’appareil soit construit par Huami et offre un service GATT Composition Body.

Enfin et pour faire la différence avec la première balance Xiaomi, on peut tout simplement utiliser le nom de l’appareil.

Part 2 : Communication

Nous faisons deux choses à l’initialisation de l’appareil : demander à récupérer les infos de la balance, et s’enregistrer pour recevoir les nouvelles mesures.

Conclusion

Dans cet article, nous avons appris les concepts sous-jacents à Bluetooth Low Energy et en particulier les profils GATT. Nous les avons mis à profit pour explorer la balance connectée de Xiaomi, et ce simplement avec une application mobile. Nous avons ensuite intégré la recherche de la balance et la récupération d’une mesure dans Gadgetbridge. Il restera encore l’intégration de ces mesures dans Gadgetbridge, et leur représentation sous forme de graphe.

Slickteam