小米水壶基于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。