小米水壺基於QN9020 MCU,它利用Gatt在藍牙低能方面與移動應用程序進行通信。
該協議允許控制某些設置並獲取狀態更新。它已經關閉,因此我使用了大腦和一些工具來解碼和分析MI家庭應用程序和處理加密的本地庫。
我不保證這對您有用。
我可能應該從壞消息開始。
首先,您只需要通過BLE連接到水壺。
您可以使用任何支持寫作/閱讀特徵並訂閱它們的編程語言和任何BLE庫。
我已經使用了go和grantlabs/ble,但是我現在不會發布我的代碼,因為它並不完美。
成功連接?然後,讓我們進行身份驗證。
您將需要一些變量和函數才能開始:
reversedMac是您的水壺的地址,但反轉,6個字節。例如,為AA:BB:CC:DD:EE:FF為0xff,0xee,0xDD,0xDD,0xCC,0xBB,0xBB,0xAA。productID總是131。token是...用於對您的水壺進行身份驗證的象徵,12個字節!無論如何,您都可以生成隨機令牌。如果您也想使用Mi Home,請將Mi Home與您的水壺配對,然後將其從中使用。cipher , mixA , mixB是小米本地庫的函數。它們對於大量設備很常見,並且用於密碼auth數據包。我有一個實施。讓我們開始。
0x90, 0xCA, 0x85, 0xDE字節到authInitCharacteristic 。authCharacteristic 。cipher(mixA(reversedMac, productID), token)發送到authCharacteristic 。authCharacteristic的通知。您必須等待此通知,然後再進行下一步。通知數據可以忽略或用於檢查完整性,這是可選的。如果要執行檢查,請比較cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res))在其中與您的token接收res載荷,它們必須等於。0x92, 0xAB, 0x54, 0xFA到authCharacteristic 。verCharacteristics閱讀。您可以忽略響應數據,只需執行讀取即可完成身份驗證過程。您現在已進行身份驗證,因此您可以訂閱狀態更新和/或發送命令。
如果您想接收狀態更新,則需要訂閱statusCharacteristic查看。訂閱後,您將開始接收有效載荷的通知。
這是有效載荷方案:
| 字節索引 | 描述 | 值 |
|---|---|---|
| 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 |
我使用小米水壺協議來開發go中的水壺<-> mqtt橋,這使我能夠將水壺與家庭助理集成在一起。
最左的圖標顯示當前溫度。
我可以通過切換最右的圖標來“啟用”或“禁用”水壺。實際上,我保持保暖模式總是在水壺上啟用,因此這僅表示“將溫度設置為85°C,通過setupCharacteristic為85°C”,因為40°C是最小值,因此,將“設置溫度設置為40°C”。
我的溫暖類型總是1(加熱到設定的溫度而不沸騰)。
當我離開家或入睡時,家庭助理會自動“關閉”水壺,以便在40°C下休息。當我回家或醒來時,家庭助理為我準備了85°C的水!
我還可以點擊並握住最左邊的圖標,這將使我的水壺煮沸水(無論85°C模式是“ on”或“ off”)。這就是我沸騰的方式:
setupCharacteristic為0設置保持溫暖類型為0。當它準備就緒時,家居助理還會給我發送“水壺沸騰”的電報消息,以便我可以撿起它。我不經常使用燒烤功能,因為我的85°C設置通常足以釀造茶。我只有在想要一些舒緩的草藥時才需要100°C的水。
Home Assistant擁有HomeKit組件,因此我的水壺也可以配備Apple Home App和Siri。我可以大喊“嘿Siri,煮沸”,“嘿Siri,將水壺打開/關閉”或“ Hey Siri,當前的水壺溫度”:D。
當然,正如警告中解釋的那樣,當12小時限制通過或用冷水重新填充水壺時,我總是需要通過按下物理按鈕來打開我的保暖模式,以使所有這些神奇的事物都起作用。
這項工作是由Anna Prosvetova完成的。
感謝JADX-GUI的APK反編譯,Ida Pro的本地圖書館拆卸,我親愛的朋友@Scorpi提供了道德支持和很多幫助。
你是俄羅斯人嗎?您可以訂閱我的電報頻道<3。