Кеттл Xiaomi основан на MCU QN9020, который использует GATT над Bluetooth Low Energy для связи с мобильным приложением.
Протокол позволяет управлять некоторыми настройками и получать обновления статуса. Он закрыт, поэтому я использовал свой мозг и несколько инструментов для декомпиляции и анализа приложения MI Home и нативной библиотеки, которая обрабатывает шифрование.
Я не даю никаких гарантий, что это сработает для вас.
Я, наверное, должен начать с плохих новостей.
Сначала вам просто нужно подключиться к вашему чайнику через BLE.
Вы можете использовать любой язык программирования и любую библиотеку BLE, которая поддерживает характеристики написания/чтения и подписывает их.
Я использовал Go и CurrantLabs/BLE, но сейчас я не собираюсь публиковать свой код, так как он не идеален.
Успешно подключен? Давайте аутентифицируем подлинность.
Вам понадобятся некоторые переменные и функции, чтобы начать:
reversedMac - это адрес вашего чайника, но он был перевернут, 6 байтов. Например, ReversedMac для AA: BB: CC: DD: EE: FF IS 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa.productID всегда 131 я думаю.token - это ... токен, используемый для аутентификации вашего чайника, 12 байтов! Вы можете генерировать случайный токен каждую аудиторию, независимо от. Если вы тоже хотите использовать Mi Home, то соедините Mi Home с чайником и используйте токен из него.cipher , mixA , mixB являются функциями из нативной библиотеки Xiaomi. Они распространены для множества устройств и используются для пакетов Auth Cipher Auth. У меня есть реализация Go.Давайте начнем.
0x90, 0xCA, 0x85, 0xDE байты на authInitCharacteristic .authCharacteristic .cipher(mixA(reversedMac, productID), token) в authCharacteristic .authCharacteristic . Вы должны ждать этого уведомления, прежде чем перейти к следующему шагу. Данные уведомления могут быть проигнорированы или использованы для проверки целостности, это необязательно . Если вы хотите выполнить чек, сравните cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) где res получена полезной нагрузкой с вашим token , они должны равняться.0x92, 0xAB, 0x54, 0xFA на authCharacteristic .verCharacteristics . Вы можете игнорировать данные ответа, вам просто нужно выполнить чтение для завершения процесса аутентификации.Вы сейчас аутентифицируете, так что вы можете подписаться обновления статуса и/или отправлять команды.
Если вы хотите получить обновления статуса, вам необходимо подписаться на statusCharacteristic . После того, как вы подпишитесь на него, вы начнете получать уведомления с полезными нагрузками.
Вот схема полезной нагрузки:
| Байтовый индекс | Описание | Ценности |
|---|---|---|
| 0 | Действие | 0 - холостое время 1 - отопление 2 - Охлаждение 3 - согреть |
| 1 | Режим (соответствующий светодиодам) | 255 - Нет 1 - кипятить 2 - согреться |
| 2-3 | Неизвестный | |
| 4 | Сохраняйте теплую температуру | 40-95 в ° C. |
| 5 | Тока температура | 0-100 в ° C. |
| 6 | Держите теплый тип | 0 - варить и остыть, чтобы установить температуру 1 - просто нагреть до температуры |
| 7-8 | Держите теплое время | Время прошло за считанные минуты с тех пор, как было включено согревать |
| Описание | Характеристика | Полезная нагрузка | Читаемый | Записывается |
|---|---|---|---|---|
| Сохраняйте теплое ограничение по времени | timeCharacteristic | От 0 до 12 часов умножен на 2. 7,5 часа 15, например, | + | + |
| Сохраняйте теплый тип и температуру | setupCharacteristic | Первый байт: тип, 0 или 1 Второй байт: температура, 40-95 | - | + |
| Выключить после кипения | boilModeCharacteristic | 0 - нет 1 - Да | + | + |
| Версия прошивки | mcuVersionCharacteristic | нить | + | - |
| Имя | Uuid |
|---|---|
authInitCharacteristic | 0010 |
authCharacteristic | 0001 |
verCharacteristics | 0004 |
setupCharacteristic | AA01 |
statusCharacteristic | AA02 |
timeCharacteristic | AA04 |
boilModeCharacteristic | AA05 |
mcuVersionCharacteristic | 2A28 |
Я использовал протокол чайника Xiaomi для разработки чайника <--> моста MQTT на ходу, который позволяет мне интегрировать свой чайник с домашним помощником.
Самая левая иконка показывает температуру тока.
Я могу «включить» или «отключить» свой чайник, переключая самый правый икона. На самом деле, я сохраняю теплый режим всегда включенным на моем чайнике, так что это означает, что «установить температуру до 85 ° C через setupCharacteristic », выключение означает «установленная температура до 40 ° C», поскольку 40 ° C - минимум.
Мой теплый тип всегда 1 (нагревайте до температуры без кипячения).
Когда я покидаю свой дом или иду спать, домашний помощник «автоматически выключает» чайник, поэтому он остается при 40 ° C. Когда я прихожу домой или просыпаюсь, домашний помощник готовит для меня 85 ° C!
Я также могу нажать и удерживать самый левый значок, и он заставит мой чайник варить воду (независимо от того, не является ли режим 85 ° C «ON» или «OFF»). Вот как я закипят:
setupCharacteristic .Когда он готов Home Assistant также отправляет мне сообщение «The Wettle Wrouging», чтобы я мог забрать его. Я не использую свою функцию кипения часто, потому что моей настройки 85 ° C обычно достаточно, чтобы сделать чай. Мне нужна вода 100 ° C только тогда, когда я хочу немного успокаивающих трав.
У домашнего помощника есть компонент Homekit, поэтому мой чайник также доступен с Apple Home App и Siri. Я могу кричать «Привет, Сири, кипятить», «Эй, Сири, включить чайник включен/выключить» или «Привет, Сири, текущая температура чайника» на моем HomePod: D.
Конечно, как объяснено в предостережениях, мне всегда нужно включить свой теплый режим, нажав физическую кнопку, когда проходит 12 -часовое ограничение или когда я наполняю чайник холодной водой, чтобы все эти волшебные вещи работали.
Работа выполняется Анной Проветовой.
Спасибо Jadx-Gui за декомпилирование APK, IDA Pro за разборку библиотеки и мой дорогой друг @Scorpi за моральную поддержку и большую помощь.
Вы русский? Вы можете подписаться на мой канал телеграммы <3.