Xiaomi Kettle est basé sur le MCU QN9020 qui utilise le GATT sur Bluetooth Low Energy pour communiquer avec l'application mobile.
Le protocole permet de contrôler certains paramètres et d'obtenir des mises à jour d'état. Il est fermé, j'ai donc utilisé mon cerveau et quelques outils pour décompiler et analyser l'application MI Home et la bibliothèque native qui gère le cryptage.
Je ne donne aucune garantie que cela fonctionnera pour vous.
Je devrais probablement commencer par de mauvaises nouvelles.
Au début, il vous suffit de vous connecter à votre bouilloire via BLE.
Vous pouvez utiliser n'importe quel langage de programmation et n'importe quelle bibliothèque BLE qui prend en charge les caractéristiques de l'écriture / de lecture et de leur abonnement.
J'ai utilisé Go et CurrantLabs / BLE, mais je ne vais pas publier mon code maintenant car ce n'est pas parfait.
Connecté avec succès? Authentirons alors.
Vous aurez besoin de certaines variables et fonctions pour commencer:
reversedMac est l'adresse de votre bouilloire mais inversée, 6 octets. Par exemple, inversedmac pour aa: bb: cc: dd: ee: ff est 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa.productID est toujours 131 je suppose.token est le ... jeton utilisé pour authentifier votre bouilloire, 12 octets! Vous pouvez générer des jetons aléatoires chaque auth, peu importe. Si vous souhaitez également utiliser Mi Home, associez-vous à la maison MI avec votre bouilloire et utilisez le jeton à partir de celui-ci.cipher , mixA , mixB sont des fonctions de la bibliothèque native de Xiaomi. Ils sont communs pour de nombreux appareils et utilisés pour chiffrer les paquets d'authentification. J'ai une implémentation GO.Commençons.
0x90, 0xCA, 0x85, 0xDE octets à authInitCharacteristic .authCharacteristic .cipher(mixA(reversedMac, productID), token) à authCharacteristic .authCharacteristic . Vous devez attendre cette notification avant de passer à l'étape suivante. Les données de notification peuvent être ignorées ou utilisées pour vérifier une intégrité, ceci est facultatif . Si vous souhaitez effectuer un chèque, comparez cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) où res est reçue la charge utile avec votre token , elles doivent être égales.0x92, 0xAB, 0x54, 0xFA à authCharacteristic .verCharacteristics . Vous pouvez ignorer les données de réponse, il vous suffit d'effectuer une lecture pour terminer le processus d'authentification.Vous êtes authentifié maintenant, vous pouvez donc vous abonner des mises à jour d'état et / ou des commandes d'envoi.
Si vous souhaitez recevoir des mises à jour d'état, vous devez vous abonner statusCharacteristic . Après l'avoir abonné, vous commencerez à recevoir des notifications avec des charges utiles.
Voici le système de charge utile:
| Index d'octets | Description | Valeurs |
|---|---|---|
| 0 | Action | 0 - inactif 1 - Chauffage 2 - refroidissement 3 - Garder au chaud |
| 1 | Mode (correspondant aux LED) | 255 - Aucun 1 - bouillir 2 - Gardez au chaud |
| 2-3 | Inconnu | |
| 4 | Gardez la température du réglage chaud | 40-95 en ° C |
| 5 | Température actuelle | 0-100 en ° C |
| 6 | Garder un type chaud | 0 - bouillir et refroidir pour régler la température 1 - Il suffit de chauffer pour régler la température |
| 7-8 | Gardez le temps au chaud | Le temps passé en quelques minutes depuis que le maintien au chaud a été activé |
| Description | Caractéristiques | Charge utile | Lisible | Scrutin |
|---|---|---|---|---|
| Gardez le temps chaud | timeCharacteristic | De 0 à 12 heures multiplié par 2. 7,5 heures est de 15, par exemple | + | + |
| Gardez le type chaud et la température | setupCharacteristic | Premier octet: Type, 0 ou 1 Deuxième octet: température, 40-95 | - | + |
| Éteindre après bouillir | boilModeCharacteristic | 0 - Non 1 - Oui | + | + |
| Version du firmware | mcuVersionCharacteristic | chaîne | + | - |
| Nom | Uuid |
|---|---|
authInitCharacteristic | 0010 |
authCharacteristic | 0001 |
verCharacteristics | 0004 |
setupCharacteristic | AA01 |
statusCharacteristic | aa02 |
timeCharacteristic | AA04 |
boilModeCharacteristic | AA05 |
mcuVersionCharacteristic | 2A28 |
J'ai utilisé le protocole Xiaomi Kettle pour développer le pont Kettle <-> MQTT en Go qui me permet d'intégrer ma bouilloire avec l'assistant à domicile.
L'icône la plus à gauche montre la température actuelle.
Je peux "activer" ou "désactiver" ma bouilloire en basculant l'icône la plus à droite. En fait, je continue à garder le mode chaud toujours activé sur ma bouilloire, ce qui signifie simplement "régler la température à 85 ° C via setupCharacteristic ", OFF signifie "régler la température à 40 ° C" car 40 ° C est le minimum.
Mon type à chaud est toujours 1 (chauffer pour régler la température sans bouillir).
Lorsque je quitte ma maison ou que je m'endors, l'assistant à domicile "désactive" la bouilloire automatiquement pour qu'il repose à 40 ° C. Quand je rentre à la maison ou que je me réveille, l'assistant à domicile prépare 85 ° C pour moi!
Je peux également taper et maintenir l'icône la plus à gauche et cela fera bouillir ma bouilloire l'eau (peu importe si le mode 85 ° C est "ON" ou "OFF"). C'est ainsi que je le fais bouillir:
setupCharacteristic .Quand il est prêt à la maison, l'assistant à domicile m'envoie également "le message de télégramme" la bouilloire est "pour que je puisse le récupérer. Je n'utilise pas ma fonction d'ébullition fréquemment parce que mon réglage à 85 ° C est généralement suffisant pour faire du thé. J'ai besoin de 100 ° C d'eau uniquement lorsque je veux des herbes apaisantes.
L'assistant à domicile a un composant HomeKit, donc ma bouilloire est également disponible avec Apple Home App et Siri. Je peux crier "Hey Siri, bouillir", "Hey Siri, allumer / désactiver la bouilloire" ou "Hey Siri, Température de bouilloire actuelle" à mon homepod: d.
Bien sûr, comme expliqué dans les mises en garde, j'ai toujours besoin d'allumer mon mode de maintien chaud en appuyant sur le bouton physique lorsque des passes limites de 12 heures ou lorsque je remplisse la bouilloire à l'eau froide, pour faire fonctionner toutes ces choses magiques.
Le travail est effectué par Anna Prosvetova.
Merci à JADX-GUI pour APK Decompilation, Ida Pro pour la bibliothèque native Disasseling et mon cher ami @scorpi pour le soutien moral et beaucoup d'aide.
Êtes-vous russe? Vous pouvez vous abonner à ma chaîne télégramme <3.