Xiaomi Gateway 2 tidak dapat disolder



Hai Habr! Dalam seri sebelumnya, saya:

  • Saya membeli perangkat dari Xiaomi untuk rumah pintar dan melalui besi solder membuatnya bekerja dengan cara yang menarik tanpa server asli melalui asisten rumah ( tautan ke pos )
  • Saya membungkus antarmuka web dari asisten rumah dalam elektron ( tautan ke pos ) dengan dukungan untuk notifikasi, menu, dotbar, dll. ( Kode di sini )

Tetapi ketika semakin banyak perangkat muncul, hal aneh mulai terbuka ...

Misalnya, Aqara Wireless Relay 2ch (LLKZMK11LM) tidak mendukung integrasi xiaomi_aqara, dan ketika Masalah dibuka pada GitHub, pemilik kode menjawab bahwa tidak mungkin untuk mendukung relay ini tanpa memperbarui firmware perangkat. "Ada yang salah di sini," pikirku, dan pergi memilah kode, bagaimana itu terjadi. Dan jadi saya terbawa bahwa saya mencuci integrasi pertama untuk bekerja dengan relay melalui xiaomi_miio ( tautan ), dan kemudian saya menerapkan dukungan untuk tombol kubus dan Xiaomi untuk integrasi ( tautan ) ini, dan sekarang saya akan memberi tahu Anda mengapa dan bagaimana.

API pengembang


Sekali waktu, Xiaomi merilis gateway (lumi.gateway.v3) dilengkapi dengan api pengembangnya dan bahkan dokumentasi untuk itu. API Pengembang adalah hal yang berkomunikasi melalui UDP pada port 4321 dan 9898. Komunitas sangat menyukai langkah ini dan merespons dengan sekelompok repositori yang mengintegrasikan perangkat ke segala sesuatu yang mungkin. Bekerja dengan pengembang ini api membentuk dasar integrasi rumah xiaomi_aqara asisten ( tautan ) dan semuanya hebat sejauh ini ...

Sementara Xiaomi tidak mengesampingkan dan mereka tidak menuntaskan dukungan api pengembang, pengidentifikasi perangkat baru berhenti muncul di dalamnya. Relai yang diinginkan ada dalam daftar perangkat yang terhubung melalui gateway ke zigbee, tetapi di sana relai muncul dengan pengenal model kosong, yang tanpanya mustahil melakukan apa pun. Kemudian, baru-baru ini, Xiaomi meluncurkan pembaruan firmware gateway setelah menginstal yang tidak mungkin untuk menyalakan api pengembang tanpa besi solder (jika tidak dinyalakan sebelum pembaruan), tautan .

Begitu berada di jantung Santa Barbara ini, saya menangis dan pergi untuk memesan dongle ZigBee ConBee2 Jerman di Amazon untuk bekerja dengan perangkat zigbee tanpa gateway. Tetapi sementara orang-orang Jerman dalam kondisi kiamat sedang bersiap untuk mengirim pesanan saya, saya, bosan menunggu, mulai menggali lebih dalam ...

Lebih banyak protokol MIIO asli


Miio adalah protokol yang lebih baru untuk bekerja dengan perangkat Xiaomi yang terhubung ke jaringan melalui wi-fi. Aplikasi Mi Home asli berkomunikasi melalui protokol ini dengan soket wi-fi, dan dengan IR Remote, dan penyedot debu, dan dengan semua orang, dan bahkan dengan xiaomi gateway v2 saya. Ini juga merupakan protokol UDP, tetapi kali ini bukan port 4321 yang terlibat, tetapi port 54321 (Saya menganggap metode yang bagus untuk memilih port). "Goofy," pikirku: "Jadi dia juga tahu protokol lain, tetapi haruskah aku mencoba menghubungkan relay menggunakan protokol baru ini?"

Protokol miio mengenkripsi semua pesan dengan token, tetapi, untungnya, metode untuk mengekstraksi token dan enkripsi / dekripsi telah ditemukan dan bekerja dengan mereka telah diimplementasikan di beberapa perpustakaan (tautan sekali , tautan dua) Saya bukan orang pertama yang mengintegrasikan perangkat baru menggunakan protokol miio, jadi jalurnya diketahui dan saya mengikutinya.

Caranya adalah ini:

  • Kami mendapatkan perangkat token keamanan dengan mengekstraknya dari log ( tautan ) atau dari aplikasi yang dimodifikasi ( tautan )
  • Kami menghapus lalu lintas antara aplikasi seluler dan perangkat
  • Kami mendekripsi paket UDP dengan token keamanan yang diterima di awal
  • Belajar kode untuk membuat paket serupa

Saya mengambil lalu lintas langsung dari router wi-fi saya, untungnya ada firmware custom asuswrt-merlin untuk itu, di mana tcpdump dapat diinstal menggunakan Entware. Utilitasnya baik - baik saja, tetapi tidak mengerti dump dari tcpdump, tetapi ia memahami json-dump yang dihasilkan oleh Wireshark. Untuk mengganti dump biner dari tcpdump ke json, saya menggunakan utilitas tshark. Setelah itu saya melihat perintah mana aplikasi rumah mi mengontrol relay. Saya menghasilkan PR dengan penambahan dukungan relay ( tautan ).

Saya membatalkan pesanan untuk ConBee2, karena metode perangkat lunaknya lebih cepat dan lebih menyenangkan ...

Mengapa kita membutuhkan pandai besi?


Dan itu berarti bahwa saya, dengan tanda hubung, menemukan diri saya dalam situasi di mana semuanya tampak berfungsi, tetapi sekarang di asisten rumah saya Xiamo Gateway 2 diwakili oleh dua entitas, satu di bawah protokol api pengembang (integrasi xiaomi_aqara) dan satu lagi di bawah tusukan miio (integrasi xiaomi_miio ) . Dan saya tidak suka menyolder, saya ingin menyederhanakan hidup saya dan diri saya sendiri. Itu perlu untuk mengimplementasikan bagian perangkat yang hilang di xiaomi_miio.

Sebagian besar, setelah membuat tegap perangkat lunak, ini adalah pekerjaan mekanis:

  1. tcpdump diaktifkan
  2. membuat tindakan otomatisasi dalam aplikasi Mi Home yang ingin saya lacak
  3. memulai otomatisasi ini
  4. mendekripsi dump
  5. salin-tempel dari dekripsi ke kode
  6. kirim perintah dari konsol
  7. finishing file untuk bersinar

Tapi tangan gatal, dan panggilan petualangan ...

Perangkat miio palsu


Autopsi menunjukkan bahwa tidak ada mekanisme panggilan balik dalam protokol miio. Sensor dapat ditarik sekali setiap 20 detik, tetapi untuk pengoperasian tombol dan kubus yang benar, adalah ide yang buruk untuk menginterogasi perangkat 10 kali per detik. Dalam paradoks ini, saya melihat kegiatan yang menarik, tetapi saya tidak benar-benar ingin berurusan dengan penyandian mekanis dari paket yang ditangkap.

Sebuah studi di perpustakaan lain yang bekerja dengan protokol miio ( tautan ) mengejutkan saya. Para penulis telah mengumpulkan pemanen yang berkomunikasi dengan perangkat melalui protokol miio, tetapi menggunakan api pengembang untuk mencegat peristiwa dari kubus dan tombol. Pendekatan ini benar-benar membuat saya tegang, itu mengarah pada fakta bahwa bagian dari fungsi mulai bekerja segera, tetapi untuk sebagian itu perlu untuk menyolder perangkat ...

Dipersenjatai lagi dengan tcpdump dan, setelah memodifikasi dekoder dengan fungsi dekripsi dari semua perangkat dalam sekali jalan, saya mulai mendengarkan segala sesuatu yang terbang melalui jaringan ke port UDP 54321. Dan saya melihat gambar yang agak menarik. Ketika saya membuat otomatisasi seperti "Jika Anda mengaktifkan zigbee cube, nyalakan soket wi-fi", json dikirim dari aplikasi ke gateway menggunakan protokol miio di dalam bidang data yang jsonnya dikodekan dalam string; "DSL" - pikir Stirlitz, untuk beberapa alasan, sejak jaman dahulu, semua orang telah berkemas dengan cara ini ... Detail ada di sini .

Melihat isi dari baris ini menunjukkan bahwa reaksi terhadap tindakan tidak ditransmisikan ke suatu tempat ke awan, secara langsung dalam program json ini muncul alamat ip dan token enkripsi dari soket wi-fi (paragraf ini bertentangan dengan paragraf dari seri pertama, saya salah di sana; (gate) ia berkomunikasi dengan perangkat ramah dirinya -. tanpa bantuan awan) Ya, dan script itu sendiri menyerupai otomatisasi dari asisten rumah, ada parameter pemicu, ada ip mana untuk mengirim reaksi Artinya, tidak ada pub / sub protokol dapat ditemukan dalam kesedihan..

Tapi ide itu lahir dari segala sesuatu untuk menangkap semua acara yang diperlukan dari tombol dan kubus:

  1. Kami meniru perangkat miio dalam aplikasi, merespons aplikasi PING dan permintaan dari gateway
  2. Kami menulis generator skrip untuk gateway untuk menghasilkan satu per pasang ~ (perangkat, acara)
  3. Kami mengirim skrip sehingga ketika suatu peristiwa terjadi, permintaan miio mendatangi emulator

Butuh beberapa hari untuk menyadari hal ini dan membawanya ke bentuk ilahi.

Saat ini, perpustakaan python-miio dapat bekerja dengan relay dan dengan kubus dan dengan tombol, tautan .

Tetap menempel pembaruan ini ke asisten rumah dan dimungkinkan untuk bekerja dengan Xiaomi gateway 2 tanpa menyolder dan pengembang api.

Jika ada yang siap untuk menguji pada perangkat mereka dan / atau menambahkan dukungan untuk yang baru - gabung :)

Masih dijual adalah penyedot debu Xiaomi 1C yang megah di sini dan kekurangan ( tautan ) untuk integrasi ke dalam asisten rumah. Saya pikir untuk mengambil ... Apakah Anda membutuhkannya?

All Articles