Xiaomi Kettle은 모바일 앱과 통신하기 위해 Bluetooth 저에너지를 통해 Gatt를 사용하는 QN9020 MCU를 기반으로합니다.
프로토콜을 사용하면 일부 설정을 제어하고 상태 업데이트를 얻을 수 있습니다. 뇌와 일부 도구를 사용하여 MI 홈 앱과 암호화를 처리하는 기본 라이브러리를 분해하고 분석했습니다.
나는 이것이 당신에게 효과가 있다는 보장을 제공하지 않습니다.
나는 아마도 나쁜 소식부터 시작해야합니다.
처음에는 BLE을 통해 주전자에 연결하면됩니다.
글쓰기/읽기 특성을 지원하고 구독하는 모든 프로그래밍 언어 및 BLE 라이브러리를 사용할 수 있습니다.
나는 Go and Currantlabs/ble을 사용했지만 완벽하지 않기 때문에 내 코드를 게시하지는 않을 것입니다.
성공적으로 연결 되었습니까? 그런 다음 인증합시다.
시작하려면 몇 가지 변수와 함수가 필요합니다.
reversedMac 은 주전자의 주소이지만 6 바이트를 반대로했습니다. 예를 들어, AA : BB : CC : DD : EE : FF는 0xff, 0xDD, 0xDD, 0xcc, 0xBB, 0XAA입니다.productID 는 항상 131입니다.token 은 ... 당신의 주전자, 12 바이트를 인증하는 데 사용되는 토큰입니다! 상관없이 모든 인증을 무작위로 생성 할 수 있습니다. Mi Home을 사용하려면 Mi 집과 주전자를 짝을 이루고 토큰을 사용하십시오.cipher , mixA , mixB 는 Xiaomi Native Library의 기능입니다. 그것들은 많은 장치에 일반적이며 인증 패킷을 암호화하는 데 사용됩니다. GO 구현이 있습니다.시작합시다.
0x90, 0xCA, 0x85, 0xDE 바이트를 authInitCharacteristic 으로 보내십시오.authCharacteristic 구독하십시오.cipher(mixA(reversedMac, productID), token) authCharacteristic 으로 보내십시오.authCharacteristic 에 대한 알림을 얻을 수 있습니다. 다음 단계로 진행하기 전에이 알림을 기다려야합니다. 알림 데이터를 무시하거나 무결성을 확인하는 데 사용할 수 있습니다. 이것은 선택 사항입니다 . 점검을 수행하려면 암호 (Mixb (ReversedMac, ProductId), 암호 ( res cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) token 으로 수신 한 페이로드를 비교하십시오.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 |
Xiaomi Kettle 프로토콜을 사용하여 주전자를 홈 어시스턴트와 통합 할 수있는 주전자 <-> MQTT 브리지를 개발했습니다.
가장 왼쪽 아이콘은 현재 온도를 보여줍니다.
가장 오른쪽 아이콘을 토글하여 주전자를 "활성화"또는 "비활성화"할 수 있습니다. 실제로, 나는 주전자에서 항상 따뜻한 모드를 유지하기 때문에 " setupCharacteristic 온도를 85 ° C로 설정하는"것을 의미합니다. 40 ° C가 최소이므로 "온도 설정"을 의미합니다.
내 따뜻한 유형은 항상 1입니다 (끓이지 않고 온도를 설정하기 위해 가열).
집을 떠나거나 잠을 자면 홈 어시스턴트는 자동으로 "끄는"주전자가 40 ° C에 놓여 있습니다. 내가 집에 오거나 일어나면 홈 조수는 85 ° C 물을 준비합니다!
또한 가장 왼쪽 아이콘을 탭하고 잡을 수 있으며 주전자가 물을 끓일 수 있습니다 (85 ° C 모드가 "켜짐"또는 "꺼짐"). 이것이 내가 끓인 방법입니다.
setupCharacteristic 통해 따뜻한 유형을 0으로 설정하십시오.준비가되면 홈 어시스턴트도 "Kettle is Boiling"Telegram 메시지를 보내므로 가져갈 수 있습니다. 85 ° C 설정이 일반적으로 차를 만들기에 충분하기 때문에 끓는 기능을 자주 사용하지 않습니다. 진정 허브를 원할 때만 100 ° C 물이 필요합니다.
Home Assistant에는 HomeKit 구성 요소가 있으므로 Apple Home App 및 Siri와 함께 Kettle을 사용할 수 있습니다. 나는 "Hey Siri, 끓인다", "Hey Siri, Kettle 켜기/끄기"또는 "Hey Siri, 현재 주전자 온도"를 내 HomePod : d.
물론, 경고에서 설명했듯이, 나는 12 시간 제한이 지나갈 때 물리적 버튼을 눌러 또는 냉수로 주전자를 리필 할 때 항상 따뜻한 모드 유지 모드를 켜야합니다.
이 작업은 Anna Prosvetova가 수행합니다.
APK 디 컴파일을위한 Jadx-Gui, 기본 도서관 분해를위한 Ida Pro 및 내 사랑하는 친구 @scorpi에게 도덕적 지원과 많은 도움을 주셔서 감사합니다.
당신은 러시아어입니까? 내 Telegram 채널 <3을 구독 할 수 있습니다.