逆向工程蓝牙智能恒温器有效载荷

逆向工程 蓝牙
2021-06-26 17:33:56

我正在尝试对我刚安装在房子里ENSTO “智能”蓝牙恒温器进行逆向工程由于一些技术和电气挑战,恒温器有时会被放置在奇怪的位置,所以我想,我正在尝试一下,看看我能走多远。

在他们的官方应用程序中,我正在玩弄一些日志,所以我设法嗅探了蓝牙包,然后使用了wireshark,注意到了一些模式,但很难真正理解它们:

在此处输入图片说明

第一个0100明确表示我们是增加还是减少,但其余的可能是什么?

欢迎任何提示、想法和建议!

我是一名全栈工程师,所有这些物联网和智能家居的东西都很新,但我会尽力而为。


ACTION  PAYLOAD
INCREASE_BY_5_IN_ONE_HOUR   Value: 01f401143c003c00
DECREASE_BY_5_IN_ONE_HOUR   Value: 00f401143c003c00
    
INCREASE_BY_3_IN_ONE_HOUR   Value: 012c010a3c003c00
DECREASE_BY_3_IN_ONE_HOUR   Value: 002c010a3c003c00
    
INCREASE_BY_1_IN_3_HOURS    Value: 01640014b400b400
DECREASE_BY_1_IN_3_HOURS    Value: 00640014b400b400

谢谢!

3个回答

答案的一些元素:
INCREASE_BY_5_IN_ONE_HOUR 值:01f401143c003c00
01=increase
f401 = 0x1f4=500 次 1/100 度数(小端)
14 =0x14=20 可能是一个步骤
0x10=60a3c = 0x10c03分钟
(2 次检查帧的有效性?)

需要更多数据才能走得更远

我将 0x3c00 和 0xb400 作为次。

>>> struct.pack("<h",60).hex() # 1 hours
'3c00'
>>> struct.pack("<h",180).hex() # 3 hours
'b400'
>>> struct.pack("<h",720).hex() # 12 hours
'd002'
>>> struct.pack("<h",1440).hex() # 24 hours
'a005'

假设数据都是小端的。我怀疑时间的 2 次重复在特定范围内(例如一天中下午 5 点到早上 8 点之间)的报告数据中扮演了一些角色。

我想我已经找到了学位。我将 f40114 换成了 Bits。我认为这是子字节格式。

ACTION  PAYLOAD
INCREASE_BY_5_IN_ONE_HOUR   Value: 01 |f40114| 3c00 3c00    01 | 111 101 00 00000001 00010100 | 3c00 3c00
DECREASE_BY_5_IN_ONE_HOUR   Value: 00 |f40114| 3c00 3c00    00 | 111 101 00 00000001 00010100 | 3c00 3c00
    
INCREASE_BY_3_IN_ONE_HOUR   Value: 01 |2c010a| 3c00 3c00    01 | 001 011 00 00000001 00001010 | 3c00 3c00
DECREASE_BY_3_IN_ONE_HOUR   Value: 00 |2c010a| 3c00 3c00    00 | 001 011 00 00000001 00001010 | 3c00 3c00
    
INCREASE_BY_1_IN_3_HOURS    Value: 01 |640014| b400 b400    01 | 011 001 00 00000000 00010100 | b400 b400
DECREASE_BY_1_IN_3_HOURS    Value: 00 |640014| b400 b400    00 | 011 001 00 00000000 00010100 | b400 b400
                                                                     ^^^Degrees                 ^^^^Minutes

所以在Ensto 网站上挖掘一些有用的东西......首先,欧洲产品,所以也许我们可以假设单位是摄氏度(至少对于这个数据集)。Extremely accurate (+/-0.1°C) and completely silent intelligent thermostat告诉我们精度。The new Beta heaters are equipped with smart electronic thermostats (for 5–30 °C) that can be controlled manually or with Ensto’s Heat Control application (for Android and iOS)告诉我们范围。就单位而言,这是 50 到 300……这是 250 个离散值,这意味着我们可能只有一个字节来表示温度。如果 OP 可以告诉我们采集这些样本时的温度,我们就可以查看消息中是否包含温度。

也许这个 API 文档会有所帮助(在今年早些时候 enstoflow 处于活动状态时设法从 github 获取它)。它记录了所有有效载荷。 https://drive.google.com/file/d/1ALbayheoGqpcOpPPEXFPCOlECvhd37kC/view?usp=sharing

文档中的一个片段:2.2.5。Boost Boost 根据 mcu 模式提供以分钟为单位的时间或以百分比表示的持续时间。还给出了升压偏移(设定值),它在 -20 到 +20 度之间。

特性 UUID ca3c0685-b708-4cd4-a049-5badd10469e7 值 BYTE[0] Boost 0=禁用,1=启用

BYTE[1-2]: Boost offset int16_t as degree (20 as 2000 and 21,5 as 2150) BYTE[3]: Boost offset int8_t百分比 BYTE[4-5]: Boost time set point in min uint8_t BYTE[6- 7]:升压时间以分钟为单位 uint8_t,返回剩余升压时间,写入无效

最好的问候,米卡