Xiaomi Kettleは、QN9020 MCUに基づいており、Bluetooth Low Energyを超えるGattを使用してモバイルアプリと通信しています。
プロトコルでは、いくつかの設定を制御し、ステータスの更新を取得できます。閉鎖されているので、脳といくつかのツールを使用して、Mi Homeアプリと暗号化を処理するネイティブライブラリを逆コンパイルして分析しました。
私はこれがあなたのために働くことを保証しません。
私はおそらく悪いニュースから始めるべきです。
最初は、BLE経由でケトルに接続する必要があります。
任意のプログラミング言語と、執筆/読み取り特性をサポートし、それらを購読するBLEライブラリを使用できます。
GoとCullantLabs/BLEを使用しましたが、完璧ではないため、今はコードを公開するつもりはありません。
接続に正常に?それでは、認証しましょう。
開始するには、いくつかの変数と関数が必要です。
reversedMacはケトルのアドレスですが、6バイトの逆です。たとえば、AA:BB:CC:DD:EE:FFは0xff、0xee、0xdd、0xcc、0xbb、0xaaです。productIDは常に131です。tokenは...トークン、ケトル、12バイトの認証に使用されます!関係なく、すべての認証をランダムに生成できます。 Mi Homeを使用したい場合は、Miをケトルとペアリングして、そこからトークンを使用してください。cipher 、 mixA 、 mixB 、Xiaomiネイティブライブラリの機能です。それらは多くのデバイスに一般的であり、認証パケットを暗号化するために使用されます。 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 | モード(LEDに対応) | 255-なし 1-沸騰 2-暖かく保ちます |
| 2-3 | 未知 | |
| 4 | 暖かいセット温度を保ちます | °Cで40-95 |
| 5 | 現在の温度 | °Cで0-100 |
| 6 | 暖かいタイプを保ちます | 0-沸騰させて冷却して温度を設定します 1-温度を設定するために加熱するだけです |
| 7-8 | 暖かい時間を保ちます | 暖かく保つことが有効になってから数分で時間が経過しました |
| 説明 | 特性 | ペイロード | 読みやすい | 書き込み可能 |
|---|---|---|---|---|
| 暖かい時間制限を維持します | timeCharacteristic | 0〜12時間に2を掛けます。 7.5時間は15です | + | + |
| 暖かいタイプと温度を保ちます | setupCharacteristic | 最初のバイト:タイプ、0または1 2番目のバイト:温度、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 Protocolを使用して、Kettle <-> MQTT Bridgeを開発しました。これにより、ケトルをホームアシスタントと統合できます。
左端のアイコンは、現在の温度を示しています。
右端のアイコンを切り替えることで、やかんを「有効」または「無効」できます。実際、私はケトルで常に暖かいモードを有効にし続けるので、これは「 setupCharacteristicを介して温度を85°Cに設定する」ことを意味します。
私のキープ暖かいタイプは常に1です(沸騰せずに温度を設定するために加熱)。
私が家を出るか、眠りにつくとき、ホームアシスタントはケトルを自動的に「オフ」して、40°Cで休みます。私が家に帰ったり目を覚ましたりすると、ホームアシスタントは私のために85°Cの水を準備します!
また、左端のアイコンをタップして保持することもでき、ケトルに水を沸騰させます(85°Cモードが「オン」または「オフ」であろうと)。これが私がそれを沸騰させる方法です:
setupCharacteristicを使用して、温かいタイプを0に設定します。準備が整ったら、ホームアシスタントが「ケトルが沸騰している」電報メッセージを送ってくれるので、私はそれを拾うことができます。私の85°Cの設定は通常、お茶を作るのに十分であるため、私は沸騰機能を頻繁に使用しません。なだめるようなハーブが欲しいときにのみ、100°Cの水が必要です。
ホームアシスタントにはHomeKitコンポーネントがあるため、私のやかんはApple HomeアプリとSiriでも利用できます。 「ちょっとシリ、沸騰」、「ヘイ・シリ、ケトルのオン/オフ」または「ヘイ・シリ、現在のケトル温度」と私のホームポッドで叫ぶことができます。
もちろん、警告で説明されているように、私は常に、12時間の制限がパスしたときに物理的なボタンを押して、やかんを冷たい水で補充するときに、常に暖かいモードをオンにする必要があります。
仕事はアンナ・プロスヴェトバによって行われます。
APKの逆コンパイル、Native LibraryのIda Pro、Ida Pro、そして私の親愛なる友人@scorpiが道徳的なサポートと多くの助けを提供してくれたJadx-Guiに感謝します。
あなたはロシア人ですか?電報チャンネル<3を購読できます。