Xiaomi Kettle ขึ้นอยู่กับ QN9020 MCU ที่ใช้ GATT ผ่าน Bluetooth Low Energy เพื่อสื่อสารกับแอพมือถือ
โปรโตคอลอนุญาตให้ควบคุมการตั้งค่าบางอย่างและรับการอัปเดตสถานะ มันปิดดังนั้นฉันจึงใช้สมองและเครื่องมือบางอย่างในการสลายตัวและวิเคราะห์แอพ MI Home และห้องสมุดพื้นเมืองที่จัดการกับการเข้ารหัส
ฉันไม่ได้รับประกันใด ๆ ว่าสิ่งนี้จะเหมาะกับคุณ
ฉันควรจะเริ่มต้นด้วยข่าวร้าย
ตอนแรกคุณเพียงแค่ต้องเชื่อมต่อกับกาต้มน้ำผ่าน BLE
คุณสามารถใช้ภาษาการเขียนโปรแกรมใด ๆ และห้องสมุด BLE ใด ๆ ที่สนับสนุนลักษณะการเขียน/การอ่านและสมัครรับข้อมูล
ฉันใช้ไปและ Currantlabs/ble แต่ฉันจะไม่เผยแพร่รหัสของฉันตอนนี้เนื่องจากมันไม่สมบูรณ์แบบ
เชื่อมต่อสำเร็จ? มารับรองความถูกต้องกันเถอะ
คุณจะต้องมีตัวแปรและฟังก์ชั่นเพื่อเริ่มต้น:
reversedMac เป็นที่อยู่ของกาต้มน้ำ แต่กลับด้าน 6 ไบต์ ตัวอย่างเช่น ReversedMac สำหรับ AA: BB: CC: DD: EE: FF คือ 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaaproductID เป็น 131 เสมอฉันเดาtoken คือ ... โทเค็นที่ใช้ในการรับรองความถูกต้องของกาต้มน้ำ 12 ไบต์! คุณสามารถสร้างโทเค็นแบบสุ่มทุกการรับรองความถูกต้องไม่ว่า หากคุณต้องการใช้ MI Home ด้วยให้จับคู่ MI ที่บ้านกับกาต้มน้ำของคุณและใช้โทเค็นจากมันcipher , mixA , mixB เป็นฟังก์ชั่นจาก Library Native Native Xiaomi เป็นเรื่องธรรมดาสำหรับอุปกรณ์จำนวนมากและใช้ในการเข้ารหัสแพ็คเก็ตรับรองความถูกต้อง ฉันมีการนำไปใช้เริ่มกันเถอะ
0x90, 0xCA, 0x85, 0xDE ไบต์ไปยัง authInitCharacteristicauthCharacteristiccipher(mixA(reversedMac, productID), token) ไปยัง authCharacteristicauthCharacteristic คุณต้องรอการแจ้งเตือนนี้ก่อนดำเนินการไปยังขั้นตอนต่อไป ข้อมูลการแจ้งเตือนสามารถถูกละเว้นหรือใช้เพื่อตรวจสอบความสมบูรณ์ ซึ่งเป็นทางเลือก หากคุณต้องการทำการตรวจสอบให้เปรียบเทียบ cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) ที่ res ได้รับน้ำหนักบรรทุกด้วย token ของคุณ0x92, 0xAB, 0x54, 0xFA ไปยัง authCharacteristicverCharacteristics คุณสามารถเพิกเฉยต่อข้อมูลการตอบกลับคุณเพียงแค่ดำเนินการอ่านเพื่อให้เสร็จสิ้นกระบวนการตรวจสอบความถูกต้องคุณได้รับการรับรองความถูกต้องแล้วดังนั้นคุณสามารถสมัครรับการอัปเดตสถานะและ/หรือส่งคำสั่ง
หากคุณต้องการรับการอัปเดตสถานะคุณต้องสมัครสมาชิก statusCharacteristic หลังจากที่คุณสมัครสมาชิกแล้วคุณจะเริ่มได้รับการแจ้งเตือนด้วย payloads
นี่คือรูปแบบเพย์โหลด:
| ดัชนีไบต์ | คำอธิบาย | ค่า |
|---|---|---|
| 0 | การกระทำ | 0 - ไม่ได้ใช้งาน 1 - ความร้อน 2 - ความเย็น 3 - รักษาความอบอุ่น |
| 1 | โหมด (สอดคล้องกับ LED) | 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 Kettle เพื่อพัฒนา Kettle <-> Bridge MQTT ใน Go ที่ช่วยให้ฉันสามารถรวมกาต้มน้ำกับผู้ช่วยที่บ้าน
ไอคอนซ้ายสุดแสดงอุณหภูมิปัจจุบัน
ฉันสามารถ "เปิดใช้งาน" หรือ "ปิดการใช้งาน" กาต้มน้ำของฉันโดยสลับไอคอนด้านขวาสุด ที่จริงแล้วฉันยังคงโหมดอุ่นที่เปิดใช้งานบนกาต้มน้ำของฉันเสมอดังนั้นนี่หมายถึง "ตั้งอุณหภูมิเป็น 85 ° C ผ่าน setupCharacteristic " ปิดหมายถึง "ตั้งอุณหภูมิเป็น 40 ° C" เนื่องจาก 40 ° C เป็นค่าต่ำสุด
ประเภทที่อบอุ่นของฉันคือ 1 เสมอ (ร้อนขึ้นถึงอุณหภูมิโดยไม่เดือด)
เมื่อฉันออกจากบ้านหรือเข้านอนผู้ช่วยที่บ้าน "ปิด" กาต้มน้ำโดยอัตโนมัติดังนั้นมันจะอยู่ที่ 40 ° C เมื่อฉันกลับบ้านหรือตื่นขึ้นมาผู้ช่วยที่บ้านเตรียมน้ำ 85 ° C สำหรับฉัน!
ฉันยังสามารถแตะไอคอนซ้ายสุดและมันจะทำให้กาต้มน้ำของฉันต้มน้ำ (ไม่ว่าโหมด 85 ° C คือ "เปิด" หรือ "ปิด") นี่คือวิธีที่ฉันทำให้เดือด:
setupCharacteristicเมื่อผู้ช่วยที่บ้านพร้อมแล้วส่งข้อความโทรเลข "The Kettle กำลังเดือด" มาให้ฉันเพื่อที่ฉันจะได้รับมัน ฉันไม่ได้ใช้คุณสมบัติการต้มบ่อยครั้งเพราะการตั้งค่า 85 ° C ของฉันมักจะเพียงพอที่จะทำชา ฉันต้องการน้ำ 100 ° C เฉพาะเมื่อฉันต้องการสมุนไพรที่ผ่อนคลาย
Home Assistant มีองค์ประกอบ HomeKit ดังนั้นกาต้มน้ำของฉันจึงพร้อมใช้งานกับ Apple Home App และ Siri ฉันสามารถตะโกน "เฮ้ซิริต้ม", "เฮ้ซิริ, เปิด/ปิดกาต้มน้ำ" หรือ "เฮ้ซิริ, อุณหภูมิกาต้มน้ำปัจจุบัน" ที่ homepod ของฉัน: d
แน่นอนตามที่อธิบายไว้ในข้อแม้ฉันต้องเปิดโหมดรักษาความอบอุ่นของฉันเสมอโดยกดปุ่มทางกายภาพเมื่อ จำกัด 12 ชั่วโมงหรือเมื่อฉันเติมกาต้มน้ำด้วยน้ำเย็นเพื่อให้สิ่งมหัศจรรย์เหล่านี้ทำงานได้
งานทำโดย Anna Prosvetova
ขอบคุณ JADX-GUI สำหรับ APK Decompiling, IDA Pro สำหรับห้องสมุดพื้นเมืองที่แยกชิ้นส่วนและเพื่อนรักของฉัน @scorpi สำหรับการสนับสนุนทางศีลธรรมและความช่วยเหลือมากมาย
คุณเป็นภาษารัสเซีย? คุณสามารถสมัครสมาชิกช่องโทรเลขของฉัน <3