Xiaomi Kettle didasarkan pada QN9020 MCU yang memanfaatkan GATT atas Bluetooth Low Energy untuk berkomunikasi dengan aplikasi seluler.
Protokol memungkinkan untuk mengontrol beberapa pengaturan dan mendapatkan pembaruan status. Itu ditutup jadi saya menggunakan otak saya dan beberapa alat untuk mendekompilasi dan menganalisis aplikasi MI Home dan perpustakaan asli yang menangani enkripsi.
Saya tidak memberikan jaminan bahwa ini akan berhasil untuk Anda.
Saya mungkin harus mulai dengan berita buruk.
Pada awalnya Anda hanya perlu terhubung ke ketel Anda melalui ble.
Anda dapat menggunakan bahasa pemrograman apa pun dan perpustakaan apa pun yang mendukung karakteristik penulisan/membaca dan berlangganan.
Saya telah menggunakan Go dan Currantlabs/BLE tetapi saya tidak akan mempublikasikan kode saya sekarang karena tidak sempurna.
Berhasil terhubung? Mari kita otentikasi kalau begitu.
Anda akan membutuhkan beberapa variabel dan fungsi untuk memulai:
reversedMac adalah alamat ketel Anda tetapi terbalik, 6 byte. Misalnya, ReversedMac untuk AA: BB: CC: DD: EE: FF adalah 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa.productID selalu 131 kurasa.token adalah ... token yang digunakan untuk mengotentikasi ketel Anda, 12 byte! Anda dapat menghasilkan token acak setiap auth, tidak peduli. Jika Anda ingin menggunakan MI Home juga, maka pasangkan Mi Home dengan ketel Anda dan gunakan token dari itu.cipher , mixA , mixB adalah fungsi dari perpustakaan asli Xiaomi. Mereka umum untuk banyak perangkat dan digunakan untuk memfitnah paket auth. Saya memiliki implementasi GO.Mari kita mulai.
0x90, 0xCA, 0x85, 0xDE byte ke authInitCharacteristic .authCharacteristic .cipher(mixA(reversedMac, productID), token) ke authCharacteristic .authCharacteristic . Anda harus menunggu pemberitahuan ini sebelum melanjutkan ke langkah berikutnya. Data pemberitahuan dapat diabaikan atau digunakan untuk memeriksa integritas, ini opsional . Jika Anda ingin melakukan cek, bandingkan cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) di mana res menerima muatan dengan token Anda, mereka harus sama.0x92, 0xAB, 0x54, 0xFA ke authCharacteristic .verCharacteristics . Anda dapat mengabaikan data respons, Anda hanya perlu melakukan proses otentikasi baca untuk menyelesaikan.Anda diautentikasi sekarang, sehingga Anda dapat berlangganan pembaruan status dan/atau mengirim perintah.
Jika Anda ingin menerima pembaruan status, Anda perlu berlangganan statusCharacteristic . Setelah Anda berlangganan, Anda akan mulai menerima pemberitahuan dengan muatan.
Inilah skema muatannya:
| Indeks byte | Keterangan | Nilai |
|---|---|---|
| 0 | Tindakan | 0 - idle 1 - Pemanasan 2 - Pendinginan 3 - Tetap Hangat |
| 1 | Mode (sesuai dengan LED) | 255 - tidak ada 1 - Rebus 2 - Tetap Hangat |
| 2-3 | Tidak dikenal | |
| 4 | Pertahankan suhu set hangat | 40-95 di ° C. |
| 5 | Suhu saat ini | 0-100 di ° C. |
| 6 | Jaga tipe yang hangat | 0 - Rebus dan dinginkan untuk mengatur suhu 1 - Panaskan saja untuk mengatur suhu |
| 7-8 | Pertahankan waktu yang hangat | Waktu berlalu dalam hitungan menit karena tetap hangat diaktifkan |
| Keterangan | Ciri | Muatan | Dapat dibaca | Dapat ditulis |
|---|---|---|---|---|
| Jaga batas waktu yang hangat | timeCharacteristic | Dari 0 hingga 12 jam dikalikan 2. 7,5 jam adalah 15, misalnya | + | + |
| Jaga jenis dan suhu yang hangat | setupCharacteristic | Byte Pertama: Ketik, 0 atau 1 Byte kedua: suhu, 40-95 | - | + |
| Matikan setelah mendidih | boilModeCharacteristic | 0 - Tidak 1 - ya | + | + |
| Versi firmware | mcuVersionCharacteristic | rangkaian | + | - |
| Nama | UUID |
|---|---|
authInitCharacteristic | 0010 |
authCharacteristic | 0001 |
verCharacteristics | 0004 |
setupCharacteristic | AA01 |
statusCharacteristic | AA02 |
timeCharacteristic | AA04 |
boilModeCharacteristic | AA05 |
mcuVersionCharacteristic | 2A28 |
Saya menggunakan protokol ketel Xiaomi untuk mengembangkan ketel <-> MQTT Bridge in Go yang memungkinkan saya untuk mengintegrasikan ketel saya dengan asisten rumah.
Ikon paling kiri menunjukkan suhu saat ini.
Saya dapat "mengaktifkan" atau "menonaktifkan" ketel saya dengan mengubah ikon paling kanan. Sebenarnya, saya tetap menjaga mode hangat selalu diaktifkan pada ketel saya sehingga ini hanya berarti "mengatur suhu ke 85 ° C melalui setupCharacteristic ", OFF berarti "mengatur suhu ke 40 ° C" karena 40 ° C adalah minimum.
Jenis saya yang tetap hangat selalu 1 (Panaskan ke atas untuk mengatur suhu tanpa mendidih).
Ketika saya meninggalkan rumah atau pergi tidur, asisten rumah "mematikan" ketel secara otomatis sehingga terletak pada 40 ° C. Ketika saya pulang atau bangun, asisten rumah menyiapkan air 85 ° C untuk saya!
Saya juga dapat mengetuk & menahan ikon paling kiri dan itu akan membuat ketel saya merebus air (tidak peduli jika mode 85 ° C "aktif" atau "off"). Beginilah cara saya membuatnya mendidih:
setupCharacteristic .Ketika siap, asisten rumah juga mengirimi saya pesan telegram "ketel itu mendidih" sehingga saya dapat mengambilnya. Saya tidak sering menggunakan fitur boil saya karena pengaturan 85 ° C saya biasanya cukup untuk membuat teh. Saya perlu air 100 ° C hanya ketika saya ingin beberapa bumbu yang menenangkan.
Home Assistant memiliki komponen HomeKit sehingga ketel saya juga tersedia dengan Apple Home App dan Siri. Saya bisa berteriak "Hei Siri, Boil", "Hei Siri, nyalakan ketel/off" atau "Hei Siri, suhu ketel saat ini" di homepod saya: D.
Tentu saja, seperti yang dijelaskan dalam peringatan, saya selalu perlu menyalakan mode tetap hangat dengan menekan tombol fisik ketika batas 12 jam lulus atau ketika saya mengisi ulang ketel dengan air dingin, untuk membuat semua hal ajaib ini berhasil.
Pekerjaan dilakukan oleh Anna Prosvetova.
Terima kasih kepada JADX-GUI untuk APK Dekompompilasi, Ida Pro untuk Pembongkaran Perpustakaan Asli dan teman baik saya @Scorpi untuk dukungan moral dan banyak bantuan.
Apakah Anda Rusia? Anda dapat berlangganan saluran telegram saya <3.