Xiaomi Kettle se basa en QN9020 MCU que hace uso de GATT sobre Bluetooth Low Energy para comunicarse con la aplicación móvil.
El protocolo permite controlar algunas configuraciones y obtener actualizaciones de estado. Está cerrado, así que utilicé mi cerebro y algunas herramientas para descompilar y analizar la aplicación MI Home y la biblioteca nativa que maneja el cifrado.
No doy ninguna garantía de que esto funcione para usted.
Probablemente debería comenzar con malas noticias.
Al principio solo necesita conectarse a su tetera a través de BLE.
Puede usar cualquier lenguaje de programación y cualquier biblioteca BLE que admita las características de escritura/lectura y suscribirlas.
He usado Go y CurrantLabs/BLE, pero no voy a publicar mi código ahora, ya que no es perfecto.
Conectado con éxito? Autenticamos entonces.
Necesitará algunas variables y funciones para comenzar:
reversedMac es la dirección de su hervidor de hervidor pero invertido, 6 bytes. Por ejemplo, InversedMac para AA: BB: CC: DD: EE: FF es 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa.productID siempre es 131, supongo.token es el ... Token usado para autenticar tu tetera, ¡12 bytes! Puede generar token aleatorio cada autenticación, sin importar. Si también desea usar mi hogar, combina mi casa con tu tettle y usa el token de ella.cipher , mixA , mixB son funciones de la biblioteca nativa de Xiaomi. Son comunes para muchos dispositivos y se usan para cifran los paquetes de autores. Tengo una implementación de Go.Comencemos.
0x90, 0xCA, 0x85, 0xDE bytes a authInitCharacteristic .authCharacteristic .cipher(mixA(reversedMac, productID), token) a authCharacteristic .authCharacteristic . Debe esperar esta notificación antes de continuar con el siguiente paso. Los datos de notificación se pueden ignorar o usar para verificar una integridad, esto es opcional . Si desea realizar un cheque, compare cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) donde res se recibe la carga útil con su token , deben igual.0x92, 0xAB, 0x54, 0xFA a authCharacteristic .verCharacteristics . Puede ignorar los datos de respuesta, solo tiene que realizar una lectura para completar el proceso de autenticación.Ahora se autentica, por lo que puede suscribir actualizaciones de estado y/o enviar comandos.
Si desea recibir actualizaciones de estado, debe suscribir statusCharacteristic . Después de suscribirlo, comenzará a recibir notificaciones con cargas útiles.
Aquí está el esquema de carga útil:
| Índice de bytes | Descripción | Valores |
|---|---|---|
| 0 | Acción | 0 - inactivo 1 - Calefacción 2 - enfriamiento 3 - Mantener caliente |
| 1 | Modo (correspondiente a LED) | 255 - Ninguno 1 - Hervir 2 - Mantenga caliente |
| 2-3 | Desconocido | |
| 4 | Mantenga la temperatura de establecer cálida | 40-95 en ° C |
| 5 | Temperatura actual | 0-100 en ° C |
| 6 | Mantenga el tipo cálido | 0 - Hervir y enfriar para establecer la temperatura 1 - Simplemente caliente para establecer la temperatura |
| 7-8 | Mantenga el tiempo cálido | El tiempo pasó en minutos desde que Keep Warm se habilitó |
| Descripción | Característica | Carga útil | Legible | Escondido |
|---|---|---|---|---|
| Mantenga el límite de tiempo cálido | timeCharacteristic | De 0 a 12 horas multiplicado por 2. 7.5 horas son 15, por ejemplo | + + | + + |
| Mantenga el tipo cálido y la temperatura | setupCharacteristic | Primer byte: tipo, 0 o 1 Segundo byte: temperatura, 40-95 | - | + + |
| Apagarse después de hervir | boilModeCharacteristic | 0 - No 1 - SÍ | + + | + + |
| Versión de firmware | mcuVersionCharacteristic | cadena | + + | - |
| Nombre | Uuid |
|---|---|
authInitCharacteristic | 0010 |
authCharacteristic | 0001 |
verCharacteristics | 0004 |
setupCharacteristic | AA01 |
statusCharacteristic | AA02 |
timeCharacteristic | AA04 |
boilModeCharacteristic | AA05 |
mcuVersionCharacteristic | 2a28 |
Utilicé el protocolo Xiaomi Kettle para desarrollar el puente Kettle <-> MQTT en Go que me permite integrar mi hervidor con el Asistente Home.
El icono más a la izquierda muestra la temperatura de corriente.
Puedo "habilitar" o "deshabilitar" mi tettle alternando el icono más adecuado. En realidad, mantengo el modo cálido siempre habilitado en mi tetera, por lo que esto solo significa "establecer la temperatura a 85 ° C a través de setupCharacteristic ", OFF significa "Temperatura establecida a 40 ° C" ya que 40 ° C es el mínimo.
Mi tipo de mantenimiento cálido es siempre 1 (calentar hasta la temperatura sin hervir).
Cuando salgo de mi casa o me voy a dormir, el asistente doméstico "apaga" automáticamente para que descanse a 40 ° C. Cuando llego a casa o me despierto, el asistente de casa me prepara agua de 85 ° C para mí.
También puedo tocar y mantener el icono más a la izquierda y hará que mi hervidor hervir el agua (no importa si el modo de 85 ° C está "encendido" o "apagado"). Así es como lo hago hervir:
setupCharacteristic .Cuando está listo, el Asistente de inicio también me envía el mensaje Telegram "Hervida está hirviendo" para que pueda recogerlo. No uso mi función de ebullición con frecuencia porque mi configuración de 85 ° C suele ser suficiente para hacer té. Necesito agua de 100 ° C solo cuando quiero algunas hierbas relajantes.
Home Assistant tiene un componente HomeKit, por lo que mi hervidor también está disponible con Apple Home App y Siri. Puedo gritar "Hola Siri, hervir", "Hola Siri, encender/apagar" o "Hola Siri, temperatura actual del hervidor" en mi homepod: d.
Por supuesto, como se explica en las advertencias, siempre necesito encender mi modo de mantener cálido al presionar el botón físico cuando pasa el límite de 12 horas o cuando vuelvo a rellenar la tetera con agua fría, para que todas estas cosas mágicas funcionen.
El trabajo es realizado por Anna Prosvetova.
Gracias a Jadx-Gui por la descomposición de APK, IDA Pro por el desmontaje de la biblioteca nativa y mi querido amigo @Scorpi por su apoyo moral y mucha ayuda.
¿Eres ruso? Puedes suscribir mi canal de telegrama <3.